Adding missing telegram methods...

This commit is contained in:
danogentili 2016-01-06 17:11:56 +01:00
parent 03be1530cb
commit bd4a9cdae4
3 changed files with 119 additions and 22 deletions

View File

@ -8,6 +8,7 @@ throw () {
BRIEF=0 BRIEF=0
LEAFONLY=0 LEAFONLY=0
PRUNE=0 PRUNE=0
NO_HEAD=0
NORMALIZE_SOLIDUS=0 NORMALIZE_SOLIDUS=0
usage() { usage() {
@ -17,6 +18,7 @@ usage() {
echo "-p - Prune empty. Exclude fields with empty values." echo "-p - Prune empty. Exclude fields with empty values."
echo "-l - Leaf only. Only show leaf nodes, which stops data duplication." echo "-l - Leaf only. Only show leaf nodes, which stops data duplication."
echo "-b - Brief. Combines 'Leaf only' and 'Prune empty' options." echo "-b - Brief. Combines 'Leaf only' and 'Prune empty' options."
echo "-n - No-head. Do not show nodes that have no path (lines that start with [])."
echo "-s - Remove escaping of the solidus symbol (stright slash)." echo "-s - Remove escaping of the solidus symbol (stright slash)."
echo "-h - This help text." echo "-h - This help text."
echo echo
@ -39,6 +41,8 @@ parse_options() {
;; ;;
-p) PRUNE=1 -p) PRUNE=1
;; ;;
-n) NO_HEAD=1
;;
-s) NORMALIZE_SOLIDUS=1 -s) NORMALIZE_SOLIDUS=1
;; ;;
?*) echo "ERROR: Unknown option." ?*) echo "ERROR: Unknown option."
@ -170,6 +174,8 @@ parse_value () {
;; ;;
esac esac
[ "$value" = '' ] && return [ "$value" = '' ] && return
[ "$NO_HEAD" -eq 1 ] && [ -z "$jpath" ] && return
[ "$LEAFONLY" -eq 0 ] && [ "$PRUNE" -eq 0 ] && print=1 [ "$LEAFONLY" -eq 0 ] && [ "$PRUNE" -eq 0 ] && print=1
[ "$LEAFONLY" -eq 1 ] && [ "$isleaf" -eq 1 ] && [ $PRUNE -eq 0 ] && print=1 [ "$LEAFONLY" -eq 1 ] && [ "$isleaf" -eq 1 ] && [ $PRUNE -eq 0 ] && print=1
[ "$LEAFONLY" -eq 0 ] && [ "$PRUNE" -eq 1 ] && [ "$isempty" -eq 0 ] && print=1 [ "$LEAFONLY" -eq 0 ] && [ "$PRUNE" -eq 1 ] && [ "$isempty" -eq 0 ] && print=1
@ -194,3 +200,5 @@ then
parse_options "$@" parse_options "$@"
tokenize | parse tokenize | parse
fi fi
# vi: expandtab sw=2 ts=2

View File

@ -72,7 +72,32 @@ git clone https://github.com/topkecleon/telegram-bot-bash
Paste the token on line 12 (instead of tokenhere). Paste the token on line 12 (instead of tokenhere).
Then start editing the commands. Then start editing the commands.
### Recieve data
You can read incoming data using the following variables:
* ```$MESSAGE```: Incoming messages
* ```$CAPTION```: Captions
* ```$USER```: This array contains the First name, last name, username and user id of the sender of the current message.
* ```${USER[ID]}```: User id
* ```${USER[FIRST_NAME]}```: User's first name
* ```${USER[LAST_NAME]}```: User's last name
* ```${USER[USERNAME]}```: Username
* ```$URLS```: This array contains documents, audio files, stickers, voice recordings and stickers stored in the form of URLs.
* ```${URLS[AUDIO]}```: Audio files
* ```${URLS[VIDEO]}```: Videos
* ```${URLS[PHOTO]}```: Photos (maximum quality)
* ```${URLS[VOICE]}```: Voice recordings
* ```${URLS[STICKER]}```: Stickers
* ```${URLS[DOCUMENT]}```: Any other file
* ```$CONTACT```: This array contains info about contacts sent in a chat.
* ```${CONTACT[NUMBER]}```: Phone number
* ```${CONTACT[FIRST_NAME]}```: First name
* ```${CONTACT[LAST_NAME]}```: Last name
* ```${CONTACT[ID]}```: User id
* ```$LOCATION```: This array contains info about locations sent in a chat.
* ```${LOCATION[LONGITUDE]}```: Longitude
* ```${LOCATION[LATITUDE]}```: Latitude
### Usage ### Usage
To send messages use the ```send_message``` function: To send messages use the ```send_message``` function:
@ -103,6 +128,7 @@ Or both:
echo "Text that will appear in chat? mykeyboardstartshere Yep No myimagelocationstartshere /home/user/doge.jpg" echo "Text that will appear in chat? mykeyboardstartshere Yep No myimagelocationstartshere /home/user/doge.jpg"
``` ```
Once you're done editing start the bot with ```tmux new-session -d -s bashbot "./bashbot.sh"```. Once you're done editing start the bot with ```tmux new-session -d -s bashbot "./bashbot.sh"```.
To stop the bot run ```tmux kill-session -t bashbot```. To stop the bot run ```tmux kill-session -t bashbot```.
If some thing doesn't work as it should, debug with ```bash -x bashbot.sh```. If some thing doesn't work as it should, debug with ```bash -x bashbot.sh```.

View File

@ -14,11 +14,25 @@
TOKEN='tokenhere' TOKEN='tokenhere'
URL='https://api.telegram.org/bot'$TOKEN URL='https://api.telegram.org/bot'$TOKEN
FORWARD_URL=$URL'/forwardMessage'
MSG_URL=$URL'/sendMessage' MSG_URL=$URL'/sendMessage'
PHO_URL=$URL'/sendPhoto' PHO_URL=$URL'/sendPhoto'
AUDIO_URL=$URL'/sendAudio'
DOCUMENT_URL=$URL'/sendDocument'
STICKER_URL=$URL'/sendSticker'
VIDEO_URL=$URL'/sendVideo'
VOICE_URL=$URL'/sendVoice'
LOCATION_URL=$URL'/sendLocation'
ACTION_URL=$URL'/sendChatAction'
FILE_URL='https://api.telegram.org/file/bot'$TOKEN'/' FILE_URL='https://api.telegram.org/file/bot'$TOKEN'/'
UPD_URL=$URL'/getUpdates?offset=' UPD_URL=$URL'/getUpdates?offset='
GET_URL=$URL'/getFile'
OFFSET=0 OFFSET=0
declare -A USER URLS CONTACT LOCATION
send_message() { send_message() {
local chat="$1" local chat="$1"
@ -52,25 +66,37 @@ send_photo() {
res=$(curl -s "$PHO_URL" -F "chat_id=$1" -F "photo=@$2") res=$(curl -s "$PHO_URL" -F "chat_id=$1" -F "photo=@$2")
} }
send_audio() {
}
get_file() {
[ "$1" != "" ] && echo $FILE_URL$(curl -s "$GET_URL" -F "file_id=$1" | ./JSON.sh -s | egrep '\["result","file_path"\]' | cut -f 2 | cut -d '"' -f 2)
}
send_file() {
}
startproc() { startproc() {
local copname="$1" local copname="$1"
local TARGET="$2" local USER="$2"
mkdir -p "$copname" mkdir -p "$copname"
mkfifo $copname/out mkfifo $copname/out
tmux new-session -d -n $copname "./question 2>&1>$copname/out" tmux new-session -d -s $copname "./question 2>&1>$copname/out"
local pid=$(ps aux | sed '/tmux/!d;/'$copname'/!d;/sed/d;s/'$USER'\s*//g;s/\s.*//g') local pid=$(ps aux | sed '/tmux/!d;/'$copname'/!d;/sed/d;s/'$USER'\s*//g;s/\s.*//g')
echo $pid>$copname/pid echo $pid>$copname/pid
while ps aux | grep -v grep | grep -q $pid;do while ps aux | grep -v grep | grep -q $pid;do
read -t 10 line read -t 10 line
[ "$line" != "" ] && send_message "$TARGET" "$line" [ "$line" != "" ] && send_message "${USER[ID]}" "$line"
line= line=
done <$copname/out done <$copname/out
} }
inproc() { inproc() {
local copname="$1" local copname="$1"
local copid="$2" local copid="$2"
local MESSAGE="$3" local MESSAGE="$3"
local PHOTO_ID="$4"
shift 2 shift 2
tmux send-keys -t $copname "$MESSAGE tmux send-keys -t $copname "$MESSAGE
" "
@ -78,23 +104,19 @@ inproc() {
} }
process_client() { process_client() {
local MESSAGE=$1 local copname="CO${USER[ID]}"
local TARGET=$2
local PHOTO_ID=$3
local msg=""
local copname="CO$TARGET"
local copidname="$copname/pid" local copidname="$copname/pid"
local copid="$(cat $copidname 2>/dev/null)" local copid="$(cat $copidname 2>/dev/null)"
if [ "$copid" = "" ]; then if [ "$copid" = "" ]; then
case $MESSAGE in case $MESSAGE in
'/question') '/question')
startproc "$copname" "$TARGET"& startproc "$copname" "${USER[ID]}"&
;; ;;
'/info') '/info')
send_message "$TARGET" "This is bashbot, the Telegram bot written entirely in bash." send_message "${USER[ID]}" "This is bashbot, the Telegram bot written entirely in bash."
;; ;;
'/start') '/start')
send_message "$TARGET" "This is bashbot, the Telegram bot written entirely in bash. send_message "${USER[ID]}" "This is bashbot, the Telegram bot written entirely in bash.
Features background tasks and interactive chats. Features background tasks and interactive chats.
Can serve as an interface for cli programs. Can serve as an interface for cli programs.
Currently can send messages, custom keyboards and photos. Currently can send messages, custom keyboards and photos.
@ -110,34 +132,75 @@ https://github.com/topkecleon/telegram-bot-bash
" "
;; ;;
*) *)
send_message "$TARGET" "$MESSAGE" send_message "${USER[ID]}" "$MESSAGE"
esac esac
else else
case $MESSAGE in case $MESSAGE in
'/cancel') '/cancel')
kill $copid kill $copid
rm -r $copname rm -r $copname
send_message "$TARGET" "Command canceled." send_message "${USER[ID]}" "Command canceled."
;; ;;
*) inproc "$copname" "$copid" "$MESSAGE" "$PHOTO_ID";; *) inproc "$copname" "$copid" "$MESSAGE";;
esac esac
fi fi
} }
while true; do { while true; do {
res=$(curl -s $UPD_URL$OFFSET) res=$(curl -s $UPD_URL$OFFSET | ./JSON.sh -s)
TARGET=$(echo $res | ./JSON.sh | egrep '\["result",0,"message","chat","id"\]' | cut -f 2)
OFFSET=$(echo $res | ./JSON.sh | egrep '\["result",0,"update_id"\]' | cut -f 2)
MESSAGE=$(echo $res | ./JSON.sh -s | egrep '\["result",0,"message","text"\]' | cut -f 2 | cut -d '"' -f 2)
PHOTO_ID=$(echo $res | ./JSON.sh -s | egrep '\["result",0,"message","photo",.*,"file_id"\]' | cut -f 2 | cut -d '"' -f 2 | sed -n '$p')
# Target
USER[ID]=$(echo "$res" | egrep '\["result",0,"message","chat","id"\]' | cut -f 2)
# Offset
OFFSET=$(echo "$res" | egrep '\["result",0,"update_id"\]' | cut -f 2)
# Message
MESSAGE=$(echo "$res" | egrep '\["result",0,"message","text"\]' | cut -f 2 | cut -d '"' -f 2)
OFFSET=$((OFFSET+1)) OFFSET=$((OFFSET+1))
if [ $OFFSET != 1 ]; then if [ $OFFSET != 1 ]; then
process_client "$MESSAGE" "$TARGET" "$PHOTO_ID"& # User
USER[FIRST_NAME]=$(echo "$res" | egrep '\["result",0,"message","chat","first_name"\]' | cut -f 2 | cut -d '"' -f 2)
USER[LAST_NAME]=$(echo "$res" | egrep '\["result",0,"message","chat","last_name"\]' | cut -f 2 | cut -d '"' -f 2)
USER[USERNAME]=$(echo "$res" | egrep '\["result",0,"message","chat","username"\]' | cut -f 2 | cut -d '"' -f 2)
# Audio
AUDIO_ID=$(echo "$res" | egrep '\["result",0,"message","audio","file_id"\]' | cut -f 2 | cut -d '"' -f 2)
URLS[AUDIO]=$(get_file "$AUDIO_ID")
# Document
DOCUMENT_ID=$(echo "$res" | egrep '\["result",0,"message","document","file_id"\]' | cut -f 2 | cut -d '"' -f 2)
URLS[DOCUMENT]=$(get_file "$DOCUMENT_ID")
# Photo
PHOTO_ID=$(echo "$res" | egrep '\["result",0,"message","photo",.*,"file_id"\]' | cut -f 2 | cut -d '"' -f 2 | sed -n '$p')
URLS[PHOTO]=$(get_file "$PHOTO_ID")
# Sticker
STICKER_ID=$(echo "$res" | egrep '\["result",0,"message","sticker","file_id"\]' | cut -f 2 | cut -d '"' -f 2)
URLS[STICKER]=$(get_file "$STICKER_ID")
# Video
VIDEO_ID=$(echo "$res" | egrep '\["result",0,"message","video","file_id"\]' | cut -f 2 | cut -d '"' -f 2)
URLS[VIDEO]=$(get_file "$VIDEO_ID")
# Voice
VOICE_ID=$(echo "$res" | egrep '\["result",0,"message","voice","file_id"\]' | cut -f 2 | cut -d '"' -f 2)
URLS[VOICE]=$(get_file "$VOICE_ID")
# Contact
CONTACT[NUMBER]=$(echo "$res" | egrep '\["result",0,"message","contact","phone_number"\]' | cut -f 2 | cut -d '"' -f 2)
CONTACT[FIRST_NAME]=$(echo "$res" | egrep '\["result",0,"message","contact","first_name"\]' | cut -f 2 | cut -d '"' -f 2)
CONTACT[LAST_NAME]=$(echo "$res" | egrep '\["result",0,"message","contact","last_name"\]' | cut -f 2 | cut -d '"' -f 2)
CONTACT[USER_ID]=$(echo "$res" | egrep '\["result",0,"message","contact","user_id"\]' | cut -f 2 | cut -d '"' -f 2)
# Caption
CAPTION=$(echo "$res" | egrep '\["result",0,"message","caption"\]' | cut -f 2 | cut -d '"' -f 2)
# Location
LOCATION[LONGITUDE]=$(echo "$res" | egrep '\["result",0,"message","location","longitude"\]' | cut -f 2 | cut -d '"' -f 2)
LOCATION[LATITUDE]=$(echo "$res" | egrep '\["result",0,"message","location","latitude"\]' | cut -f 2 | cut -d '"' -f 2)
process_client&
fi fi
}; done }; done