From bd4a9cdae40f801d01029e5782170fa690652d8d Mon Sep 17 00:00:00 2001 From: danogentili Date: Wed, 6 Jan 2016 17:11:56 +0100 Subject: [PATCH] Adding missing telegram methods... --- JSON.sh | 8 ++++ README.md | 26 +++++++++++++ bashbot.sh | 107 ++++++++++++++++++++++++++++++++++++++++++----------- 3 files changed, 119 insertions(+), 22 deletions(-) diff --git a/JSON.sh b/JSON.sh index 75f8715..3728708 100755 --- a/JSON.sh +++ b/JSON.sh @@ -8,6 +8,7 @@ throw () { BRIEF=0 LEAFONLY=0 PRUNE=0 +NO_HEAD=0 NORMALIZE_SOLIDUS=0 usage() { @@ -17,6 +18,7 @@ usage() { echo "-p - Prune empty. Exclude fields with empty values." echo "-l - Leaf only. Only show leaf nodes, which stops data duplication." 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 "-h - This help text." echo @@ -39,6 +41,8 @@ parse_options() { ;; -p) PRUNE=1 ;; + -n) NO_HEAD=1 + ;; -s) NORMALIZE_SOLIDUS=1 ;; ?*) echo "ERROR: Unknown option." @@ -170,6 +174,8 @@ parse_value () { ;; esac [ "$value" = '' ] && return + [ "$NO_HEAD" -eq 1 ] && [ -z "$jpath" ] && return + [ "$LEAFONLY" -eq 0 ] && [ "$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 @@ -194,3 +200,5 @@ then parse_options "$@" tokenize | parse fi + +# vi: expandtab sw=2 ts=2 diff --git a/README.md b/README.md index 1f34751..2ddaa61 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,32 @@ git clone https://github.com/topkecleon/telegram-bot-bash Paste the token on line 12 (instead of tokenhere). 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 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" ``` + 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```. If some thing doesn't work as it should, debug with ```bash -x bashbot.sh```. diff --git a/bashbot.sh b/bashbot.sh index 4f0b0a9..c9e1817 100755 --- a/bashbot.sh +++ b/bashbot.sh @@ -14,11 +14,25 @@ TOKEN='tokenhere' URL='https://api.telegram.org/bot'$TOKEN + +FORWARD_URL=$URL'/forwardMessage' + MSG_URL=$URL'/sendMessage' 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'/' UPD_URL=$URL'/getUpdates?offset=' +GET_URL=$URL'/getFile' OFFSET=0 +declare -A USER URLS CONTACT LOCATION send_message() { local chat="$1" @@ -52,25 +66,37 @@ send_photo() { 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() { local copname="$1" - local TARGET="$2" + local USER="$2" mkdir -p "$copname" 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') echo $pid>$copname/pid while ps aux | grep -v grep | grep -q $pid;do read -t 10 line - [ "$line" != "" ] && send_message "$TARGET" "$line" + [ "$line" != "" ] && send_message "${USER[ID]}" "$line" line= done <$copname/out } + inproc() { local copname="$1" local copid="$2" local MESSAGE="$3" - local PHOTO_ID="$4" shift 2 tmux send-keys -t $copname "$MESSAGE " @@ -78,23 +104,19 @@ inproc() { } process_client() { - local MESSAGE=$1 - local TARGET=$2 - local PHOTO_ID=$3 - local msg="" - local copname="CO$TARGET" + local copname="CO${USER[ID]}" local copidname="$copname/pid" local copid="$(cat $copidname 2>/dev/null)" if [ "$copid" = "" ]; then case $MESSAGE in '/question') - startproc "$copname" "$TARGET"& + startproc "$copname" "${USER[ID]}"& ;; '/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') - 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. Can serve as an interface for cli programs. 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 else case $MESSAGE in '/cancel') kill $copid 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 fi } while true; do { - res=$(curl -s $UPD_URL$OFFSET) - - 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') + res=$(curl -s $UPD_URL$OFFSET | ./JSON.sh -s) + # 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)) 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 }; done +