2016-01-02 19:35:15 +00:00
#!/bin/bash
2015-07-10 05:43:08 +00:00
# bashbot, the Telegram bot written in bash.
2016-01-05 16:01:28 +00:00
# Written by @topkecleon, Juan Potato (@awkward_potato), Lorenzo Santina (BigNerd95) and Daniil Gentili (danog)
2016-01-05 16:54:34 +00:00
# https://github.com/topkecleon/telegram-bot-bash
# Depends on ./JSON.sh (http://github.com/dominictarr/./JSON.sh),
# which is MIT/Apache-licensed
# And on tmux (https://github.com/tmux/tmux),
# which is BSD-licensed
2015-07-10 05:43:08 +00:00
# This file is public domain in the USA and all free countries.
# If you're in Europe, and public domain does not exist, then haha.
2016-01-05 16:54:34 +00:00
TOKEN = 'tokenhere'
2015-07-10 05:43:08 +00:00
URL = 'https://api.telegram.org/bot' $TOKEN
2016-01-06 16:11:56 +00:00
FORWARD_URL = $URL '/forwardMessage'
2015-11-25 03:07:39 +00:00
MSG_URL = $URL '/sendMessage'
PHO_URL = $URL '/sendPhoto'
2016-01-06 16:11:56 +00:00
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'
2016-01-17 16:46:24 +00:00
FORWARD_URL = $URL '/forwardMessage'
2016-01-06 16:11:56 +00:00
2016-01-05 17:26:27 +00:00
FILE_URL = 'https://api.telegram.org/file/bot' $TOKEN '/'
2015-07-10 05:43:08 +00:00
UPD_URL = $URL '/getUpdates?offset='
2016-01-06 16:11:56 +00:00
GET_URL = $URL '/getFile'
2015-07-10 05:43:08 +00:00
OFFSET = 0
2016-01-19 13:17:06 +00:00
declare -A USER MESSAGE
2015-07-10 05:43:08 +00:00
2015-12-26 01:47:10 +00:00
send_message( ) {
2016-01-05 16:01:28 +00:00
local chat = " $1 "
2016-01-19 13:17:06 +00:00
local text = " $( echo " $2 " | sed 's/ mykeyboardstartshere.*//g;s/ myfilelocationstartshere.*//g;s/ mylatstartshere.*//g;s/ mylongstartshere.*//g' ) "
local keyboard = " $( echo " $2 " | sed '/mykeyboardstartshere /!d;s/.*mykeyboardstartshere //g;s/ myfilelocationstartshere.*//g;s/ mylatstartshere.*//g;s/ mylongstartshere.*//g' ) "
local file = " $( echo " $2 " | sed '/myfilelocationstartshere /!d;s/.*myfilelocationstartshere //g;s/ mykeyboardstartshere.*//g;s/ mylatstartshere.*//g;s/ mylongstartshere.*//g' ) "
local lat = " $( echo " $2 " | sed '/mylatstartshere /!d;s/.*mylatstartshere //g;s/ mykeyboardstartshere.*//g;s/ myfilelocationstartshere.*//g;s/ mylongstartshere.*//g' ) "
local long = " $( echo " $2 " | sed '/mylongstartshere /!d;s/.*mylongstartshere //g;s/ mykeyboardstartshere.*//g;s/ myfilelocationstartshere.*//g;s/ mylatstartshere.*//g' ) "
2016-01-05 16:54:34 +00:00
if [ " $keyboard " != "" ] ; then
2016-01-05 16:01:28 +00:00
send_keyboard " $chat " " $text " " $keyboard "
2016-01-05 16:54:34 +00:00
local sent = y
fi
2016-01-19 13:17:06 +00:00
if [ " $file " != "" ] ; then
send_file " $chat " " $file "
2016-01-05 16:54:34 +00:00
local sent = y
fi
if [ " $sent " != "y" ] ; then
res = $( curl -s " $MSG_URL " -F " chat_id= $chat " -F " text= $text " )
2016-01-05 16:01:28 +00:00
fi
2016-01-19 13:17:06 +00:00
if [ " $lat " != "" -a " $long " != "" ] ; then
send_location " $chat " " $lat " " $long "
local sent = y
fi
2016-01-03 01:14:07 +00:00
}
2016-01-05 16:01:28 +00:00
2016-01-03 01:14:07 +00:00
send_keyboard( ) {
2016-01-05 16:01:28 +00:00
local chat = " $1 "
local text = " $2 "
shift 2
2016-01-05 16:54:34 +00:00
local keyboard = init
for f in $* ; do local keyboard = " $keyboard , [\" $f \"] " ; done
local keyboard = ${ keyboard /init, / }
2016-01-05 16:01:28 +00:00
res = $( curl -s " $MSG_URL " --header "content-type: multipart/form-data" -F " chat_id= $chat " -F " text= $text " -F " reply_markup={\"keyboard\": [ $keyboard ],\"one_time_keyboard\": true} " )
2015-11-25 03:07:39 +00:00
}
2016-01-06 16:11:56 +00:00
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( ) {
2016-01-17 16:46:24 +00:00
[ " $2 " = "" ] && return
2016-01-19 13:17:06 +00:00
local chat_id = $1
local file = $2
local ext = " ${ file ##*. } "
2016-01-17 16:46:24 +00:00
case $ext in
"mp3" )
CUR_URL = $AUDIO_URL
WHAT = audio
STATUS = upload_audio
; ;
png| jpg| jpeg| gif)
CUR_URL = $PHO_URL
WHAT = photo
STATUS = upload_photo
; ;
webp)
CUR_URL = $STICKER_URL
WHAT = sticker
STATUS =
; ;
mp4)
CUR_URL = $VIDEO_URL
WHAT = video
STATUS = upload_video
; ;
ogg)
CUR_URL = $VOICE_URL
WHAT = voice
STATUS =
; ;
*)
CUR_URL = $DOCUMENT_URL
WHAT = document
STATUS = upload_document
; ;
esac
send_action $chat_id $STATUS
res = $( curl -s " $CUR_URL " -F " chat_id= $chat_id " -F " $WHAT =@ $file " )
2016-01-06 16:11:56 +00:00
}
2016-01-17 16:46:24 +00:00
# typing for text messages, upload_photo for photos, record_video or upload_video for videos, record_audio or upload_audio for audio files, upload_document for general files, find_location for location
send_action( ) {
[ " $2 " = "" ] && return
res = $( curl -s " $ACTION_URL " -F " chat_id= $1 " -F " action= $2 " )
}
send_location( ) {
[ " $3 " = "" ] && return
res = $( curl -s " $LOCATION_URL " -F " chat_id= $1 " -F " latitude= $2 " -F " longitude= $3 " )
}
forward( ) {
[ " $3 " = "" ] && return
res = $( curl -s " $FORWARD_URL " -F " chat_id= $1 " -F " from_chat_id= $2 " -F " message_id= $3 " )
}
2016-01-05 16:01:28 +00:00
startproc( ) {
mkdir -p " $copname "
mkfifo $copname /out
2016-01-06 16:11:56 +00:00
tmux new-session -d -s $copname " ./question 2>&1> $copname /out "
2016-01-05 16:01:28 +00:00
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
2016-01-06 16:11:56 +00:00
[ " $line " != "" ] && send_message " ${ USER [ID] } " " $line "
2016-01-05 16:01:28 +00:00
line =
done <$copname /out
2016-01-02 20:51:45 +00:00
}
2016-01-06 16:11:56 +00:00
2016-01-03 01:14:07 +00:00
inproc( ) {
2016-01-05 17:26:27 +00:00
tmux send-keys -t $copname " $MESSAGE
2016-01-05 16:01:28 +00:00
"
ps aux | grep -v grep | grep -q " $copid " || { rm -r $copname ; } ;
2016-01-03 01:14:07 +00:00
}
2015-12-26 01:47:10 +00:00
process_client( ) {
2016-01-17 16:46:24 +00:00
# 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
2016-01-19 13:17:06 +00:00
MESSAGE[ AUDIO] = $( get_file $( echo " $res " | egrep '\["result",0,"message","audio","file_id"\]' | cut -f 2 | cut -d '"' -f 2) )
2016-01-17 16:46:24 +00:00
# Documenr
2016-01-19 13:17:06 +00:00
MESSAGE[ DOCUMENT] = $( get_file $( echo " $res " | egrep '\["result",0,"message","document","file_id"\]' | cut -f 2 | cut -d '"' -f 2) )
2016-01-17 16:46:24 +00:00
# Photo
2016-01-19 13:17:06 +00:00
MESSAGE[ PHOTO] = $( get_file $( echo " $res " | egrep '\["result",0,"message","photo",.*,"file_id"\]' | cut -f 2 | cut -d '"' -f 2 | sed -n '$p' ) )
2016-01-17 16:46:24 +00:00
# Sticker
URLS[ STICKER] = $( get_file $( echo " $res " | egrep '\["result",0,"message","sticker","file_id"\]' | cut -f 2 | cut -d '"' -f 2) )
# Video
URLS[ VIDEO] = $( get_file $( echo " $res " | egrep '\["result",0,"message","video","file_id"\]' | cut -f 2 | cut -d '"' -f 2) )
# Voice
URLS[ VOICE] = $( get_file $( echo " $res " | egrep '\["result",0,"message","voice","file_id"\]' | cut -f 2 | cut -d '"' -f 2) )
# 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)
# Tmux
copname = " CO ${ USER [ID] } "
copidname = " $copname /pid "
copid = " $( cat $copidname 2>/dev/null) "
2016-01-05 16:01:28 +00:00
if [ " $copid " = "" ] ; then
2016-01-02 20:51:45 +00:00
case $MESSAGE in
2016-01-05 16:01:28 +00:00
'/question' )
2016-01-17 16:46:24 +00:00
startproc&
2016-01-05 16:01:28 +00:00
; ;
'/info' )
2016-01-06 16:11:56 +00:00
send_message " ${ USER [ID] } " "This is bashbot, the Telegram bot written entirely in bash."
2016-01-05 16:01:28 +00:00
; ;
2016-01-05 16:05:26 +00:00
'/start' )
2016-01-06 16:11:56 +00:00
send_message " ${ USER [ID] } " " This is bashbot, the Telegram bot written entirely in bash.
2016-01-05 16:05:26 +00:00
Features background tasks and interactive chats.
Can serve as an interface for cli programs.
Currently can send messages, custom keyboards and photos.
2016-01-05 16:14:47 +00:00
Available commands:
/start: Start bot and get this message.
/info: Get shorter info message about this bot.
/question: Start interactive chat.
/cancel: Cancel any currently running interactive chats.
2016-01-05 16:05:26 +00:00
Written by @topkecleon, Juan Potato ( @awkward_potato) , Lorenzo Santina ( BigNerd95) and Daniil Gentili ( danog)
2016-01-05 16:54:34 +00:00
https://github.com/topkecleon/telegram-bot-bash
2016-01-05 16:05:26 +00:00
"
; ;
2016-01-05 16:01:28 +00:00
*)
2016-01-06 16:11:56 +00:00
send_message " ${ USER [ID] } " " $MESSAGE "
2016-01-02 20:51:45 +00:00
esac
2016-01-05 16:01:28 +00:00
else
2016-01-02 20:51:45 +00:00
case $MESSAGE in
2016-01-05 16:01:28 +00:00
'/cancel' )
kill $copid
rm -r $copname
2016-01-06 16:11:56 +00:00
send_message " ${ USER [ID] } " "Command canceled."
2016-01-05 16:01:28 +00:00
; ;
2016-01-17 16:46:24 +00:00
*) inproc; ;
2016-01-02 20:51:45 +00:00
esac
2016-01-05 16:01:28 +00:00
fi
2015-12-26 01:47:10 +00:00
}
2015-07-10 05:43:08 +00:00
while true; do {
2016-01-06 16:11:56 +00:00
res = $( curl -s $UPD_URL $OFFSET | ./JSON.sh -s)
2015-07-10 05:43:08 +00:00
2016-01-06 16:11:56 +00:00
# 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
2016-01-19 13:17:06 +00:00
MESSAGE[ MESSAGE] = $( echo " $res " | egrep '\["result",0,"message","text"\]' | cut -f 2 | cut -d '"' -f 2)
2016-01-06 16:11:56 +00:00
2015-07-10 05:43:08 +00:00
OFFSET = $(( OFFSET+1))
2015-07-10 07:32:34 +00:00
if [ $OFFSET != 1 ] ; then
2016-01-06 16:11:56 +00:00
process_client&
2015-07-10 07:32:34 +00:00
fi
2015-07-10 05:43:08 +00:00
2016-01-05 16:01:28 +00:00
} ; done