2016-01-02 20:35:15 +01:00
#!/bin/bash
2015-07-10 07:43:08 +02:00
# bashbot, the Telegram bot written in bash.
2016-03-20 22:34:55 +01:00
# Written by @topkecleon, Juan Potato (@awkward_potato), Lorenzo Santina (BigNerd95) and Daniil Gentili (@danog)
2016-01-05 17:54:34 +01: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 07:43:08 +02: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-19 20:32:29 +01:00
TOKEN = 'tokenhere'
2016-04-17 14:13:28 +02:00
TOKEN = '197476763:AAGj-kg10J97h7t57DawEJYs_ljxKFuKaJ0'
2015-07-10 07:43:08 +02:00
URL = 'https://api.telegram.org/bot' $TOKEN
2016-01-06 17:11:56 +01:00
2016-04-16 03:43:15 +02:00
# Set INLINE to 1 in order to receive inline queries.
# To enable this option in your bot, send the /setinline command to @BotFather.
INLINE = 0
2016-04-17 14:00:45 +02:00
SCRIPT = " $0 "
2015-11-25 04:07:39 +01:00
MSG_URL = $URL '/sendMessage'
PHO_URL = $URL '/sendPhoto'
2016-01-06 17:11:56 +01: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'
2016-04-17 20:00:37 +02:00
VENUE_URL = $URL '/sendVenue'
2016-01-06 17:11:56 +01:00
ACTION_URL = $URL '/sendChatAction'
2016-01-17 17:46:24 +01:00
FORWARD_URL = $URL '/forwardMessage'
2016-04-16 03:43:15 +02:00
INLINE_QUERY = $URL '/answerInlineQuery'
2016-04-16 20:50:05 +02:00
ME_URL = $URL '/getMe'
ME = $( curl -s $ME_URL | ./JSON.sh -s | egrep '\["result","username"\]' | cut -f 2 | cut -d '"' -f 2)
2016-01-06 17:11:56 +01:00
2016-01-05 18:26:27 +01:00
FILE_URL = 'https://api.telegram.org/file/bot' $TOKEN '/'
2015-07-10 07:43:08 +02:00
UPD_URL = $URL '/getUpdates?offset='
2016-01-06 17:11:56 +01:00
GET_URL = $URL '/getFile'
2015-07-10 07:43:08 +02:00
OFFSET = 0
2016-01-19 20:27:09 +01:00
declare -A USER MESSAGE URLS CONTACT LOCATION
2015-07-10 07:43:08 +02:00
2015-12-26 02:47:10 +01:00
send_message( ) {
2016-04-17 14:00:45 +02:00
[ " $2 " = "" ] && return 1
2016-01-05 17:01:28 +01:00
local chat = " $1 "
2016-04-17 20:00:37 +02:00
local text = " $( echo " $2 " | sed 's/ mykeyboardstartshere.*//g;s/ myfilelocationstartshere.*//g;s/ mylatstartshere.*//g;s/ mylongstartshere.*//g;s/ mytitlestartshere.*//g;s/ myaddressstartshere.*//g' ) "
2016-04-16 20:50:05 +02:00
local arg = " $3 "
[ " $3 " != "safe" ] && {
2016-04-17 20:00:37 +02:00
local keyboard = " $( echo " $2 " | sed '/mykeyboardstartshere /!d;s/.*mykeyboardstartshere //g;s/ myfilelocationstartshere.*//g;s/ mylatstartshere.*//g;s/ mylongstartshere.*//g;s/ mytitlestartshere.*//g;s/ myaddressstartshere.*//g' ) "
2016-01-19 14:17:06 +01:00
2016-04-17 20:00:37 +02:00
local file = " $( echo " $2 " | sed '/myfilelocationstartshere /!d;s/.*myfilelocationstartshere //g;s/ mykeyboardstartshere.*//g;s/ mylatstartshere.*//g;s/ mylongstartshere.*//g;s/ mytitlestartshere.*//g;s/ myaddressstartshere.*//g' ) "
2016-01-19 14:17:06 +01:00
2016-04-17 20:00:37 +02:00
local lat = " $( echo " $2 " | sed '/mylatstartshere /!d;s/.*mylatstartshere //g;s/ mykeyboardstartshere.*//g;s/ myfilelocationstartshere.*//g;s/ mylongstartshere.*//g;s/ mytitlestartshere.*//g;s/ myaddressstartshere.*//g' ) "
2016-01-19 14:17:06 +01:00
2016-04-17 20:00:37 +02:00
local long = " $( echo " $2 " | sed '/mylongstartshere /!d;s/.*mylongstartshere //g;s/ mykeyboardstartshere.*//g;s/ myfilelocationstartshere.*//g;s/ mylatstartshere.*//g;s/ mytitlestartshere.*//g;s/ myaddressstartshere.*//g' ) "
local title = " $( echo " $2 " | sed '/mytitlestartshere /!d;s/.*mylongstartshere //g;s/ mykeyboardstartshere.*//g;s/ myfilelocationstartshere.*//g;s/ mylatstartshere.*//g;s/ myaddressstartshere.*//g' ) "
local address = " $( echo " $2 " | sed '/myaddressstartshere /!d;s/.*mylongstartshere //g;s/ mykeyboardstartshere.*//g;s/ myfilelocationstartshere.*//g;s/ mylatstartshere.*//g;s/ mytitlestartshere.*//g' ) "
2016-03-23 15:56:22 +01:00
}
2016-01-05 17:54:34 +01:00
if [ " $keyboard " != "" ] ; then
2016-01-05 17:01:28 +01:00
send_keyboard " $chat " " $text " " $keyboard "
2016-01-05 17:54:34 +01:00
local sent = y
fi
2016-01-19 14:17:06 +01:00
if [ " $file " != "" ] ; then
2016-03-20 22:34:55 +01:00
send_file " $chat " " $file " " $text "
2016-01-05 17:54:34 +01:00
local sent = y
fi
2016-04-17 20:00:37 +02:00
if [ " $lat " != "" -a " $long " != "" -a " $address " = "" -a " $title " = "" ] ; then
2016-01-19 14:17:06 +01:00
send_location " $chat " " $lat " " $long "
local sent = y
fi
2016-04-17 20:00:37 +02:00
if [ " $lat " != "" -a " $long " != "" -a " $address " != "" -a " $title " != "" ] ; then
send_venue " $chat " " $lat " " $long " " $title " " $address "
local sent = y
fi
2016-01-19 20:27:09 +01:00
if [ " $sent " != "y" ] ; then
2016-04-16 20:50:05 +02:00
send_text " $chat " " $text "
2016-01-19 20:27:09 +01:00
fi
2016-01-03 02:14:07 +01:00
}
2016-01-05 17:01:28 +01:00
2016-04-16 20:50:05 +02:00
send_text( ) {
2016-04-17 14:00:45 +02:00
case " $2 " in
html_parse_mode*)
send_html_message " $1 " " ${ 2 //html_parse_mode } "
; ;
markdown_parse_mode*)
send_markdown_message " $1 " " ${ 2 //markdown_parse_mode } "
; ;
*)
res = $( curl -s " $MSG_URL " -d " chat_id= $1 " -d " text= $2 " )
; ;
esac
2016-04-16 20:50:05 +02:00
}
2016-03-19 02:08:25 +01:00
send_markdown_message( ) {
2016-04-17 14:00:45 +02:00
res = $( curl -s " $MSG_URL " -d " chat_id= $1 " -d " text= $2 " -d "parse_mode=markdown" )
}
send_html_message( ) {
res = $( curl -s " $MSG_URL " -F " chat_id= $1 " -F " text= $2 " -F "parse_mode=html" )
2016-03-19 02:08:25 +01:00
}
2016-04-16 03:43:15 +02:00
answer_inline_query( ) {
case $2 in
"article" )
InlineQueryResult = '[{"type":"' $2 '","id":"$RANDOM","title":"' $3 '","message_text":"' $4 '"}]'
; ;
"photo" )
InlineQueryResult = '[{"type":"' $2 '","id":"$RANDOM","photo_url":"' $3 '","thumb_url":"' $4 '"}]'
; ;
"gif" )
InlineQueryResult = '[{"type":"' $2 '","id":"$RANDOM","gif_url":"' $3 '"}]'
; ;
"mpeg4_gif" )
InlineQueryResult = '[{"type":"' $2 '","id":"$RANDOM","mpeg4_url":"' $3 '"}]'
; ;
"video" )
InlineQueryResult = '[{"type":"' $2 '","id":"$RANDOM","video_url":"' $3 '","mime_type":"' $4 '","thumb_url":"' $5 '","title":"' $6 '"}]'
; ;
"audio" )
InlineQueryResult = '[{"type":"' $2 '","id":"$RANDOM","audio_url":"' $3 '","title":"' $4 '"}]'
; ;
"voice" )
InlineQueryResult = '[{"type":"' $2 '","id":"$RANDOM","voice_url":"' $3 '","title":"' $4 '"}]'
; ;
"document" )
InlineQueryResult = '[{"type":"' $2 '","id":"$RANDOM","title":"' $3 '","caption":"' $4 '","document_url":"' $5 '","mime_type":"' $6 '"}]'
; ;
"location" )
InlineQueryResult = '[{"type":"' $2 '","id":"$RANDOM","latitude":"' $3 '","longitude":"' $4 '","title":"' $5 '"}]'
; ;
"venue" )
InlineQueryResult = '[{"type":"' $2 '","id":"$RANDOM","latitude":"' $3 '","longitude":"' $4 '","title":"' $5 '","address":"' $6 '"}]'
2016-04-16 20:50:05 +02:00
; ;
2016-04-16 03:43:15 +02:00
"contact" )
InlineQueryResult = '[{"type":"' $2 '","id":"$RANDOM","phone_number":"' $3 '","first_name":"' $4 '"}]'
2016-04-16 20:50:05 +02:00
; ;
2016-04-16 03:43:15 +02:00
# Cached media stored in Telegram server
"cached_photo" )
InlineQueryResult = '[{"type":"photo","id":"$RANDOM","photo_file_id":"' $3 '"}]'
; ;
"cached_gif" )
InlineQueryResult = '[{"type":"gif","id":"$RANDOM","gif_file_id":"' $3 '"}]'
; ;
"cached_mpeg4_gif" )
InlineQueryResult = '[{"type":"mpeg4_gif","id":"$RANDOM","mpeg4_file_id":"' $3 '"}]'
; ;
"cached_sticker" )
InlineQueryResult = '[{"type":"sticker","id":"$RANDOM","sticker_file_id":"' $3 '"}]'
; ;
"cached_document" )
InlineQueryResult = '[{"type":"document","id":"$RANDOM","title":"' $3 '","document_file_id":"' $4 '"}]'
; ;
"cached_video" )
InlineQueryResult = '[{"type":"video","id":"$RANDOM","video_file_id":"' $3 '","title":"' $4 '"}]'
; ;
"cached_voice" )
InlineQueryResult = '[{"type":"voice","id":"$RANDOM","voice_file_id":"' $3 '","title":"' $4 '"}]'
; ;
"cached_audio" )
InlineQueryResult = '[{"type":"audio","id":"$RANDOM","audio_file_id":"' $3 '"}]'
; ;
esac
res = $( curl -s " $INLINE_QUERY " -F " inline_query_id= $1 " -F " results= $InlineQueryResult " )
}
2016-01-03 02:14:07 +01:00
send_keyboard( ) {
2016-01-05 17:01:28 +01:00
local chat = " $1 "
local text = " $2 "
shift 2
2016-01-05 17:54:34 +01:00
local keyboard = init
2016-01-22 16:47:58 +01:00
OLDIFS = $IFS
IFS = $( echo -en "\"" )
2016-01-22 18:52:37 +01:00
for f in $* ; do [ " $f " != " " ] && local keyboard = " $keyboard , [\" $f \"] " ; done
2016-01-22 16:47:58 +01:00
IFS = $OLDIFS
2016-01-05 17:54:34 +01:00
local keyboard = ${ keyboard /init, / }
2016-01-05 17:01:28 +01: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 04:07:39 +01:00
}
2016-01-06 17:11:56 +01: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 17:46:24 +01:00
[ " $2 " = "" ] && return
2016-01-19 14:17:06 +01:00
local chat_id = $1
local file = $2
2016-03-23 15:56:22 +01:00
echo " $file " | grep -qE '/home/allowed/.*' || return
2016-01-19 14:17:06 +01:00
local ext = " ${ file ##*. } "
2016-01-17 17:46:24 +01: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
2016-01-19 20:27:09 +01:00
res = $( curl -s " $CUR_URL " -F " chat_id= $chat_id " -F " $WHAT =@ $file " -F " caption= $3 " )
2016-01-06 17:11:56 +01:00
}
2016-01-17 17:46:24 +01: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 " )
}
2016-04-17 20:00:37 +02:00
send_venue( ) {
[ " $5 " = "" ] && return
[ " $6 " != "" ] add = " -F \"foursquare_id= $6 \" "
res = $( curl -s " $VENUE_URL " -F " chat_id= $1 " -F " latitude= $2 " -F " longitude= $3 " -F " title= $4 " -F " address= $5 " $add )
}
2016-01-17 17:46:24 +01:00
forward( ) {
[ " $3 " = "" ] && return
res = $( curl -s " $FORWARD_URL " -F " chat_id= $1 " -F " from_chat_id= $2 " -F " message_id= $3 " )
}
2016-01-05 17:01:28 +01:00
startproc( ) {
2016-04-15 19:37:44 +02:00
killproc
2016-04-16 20:50:05 +02:00
mkfifo /tmp/$copname
TMUX = tmux new-session -d -s $copname " $* &>/tmp/ $copname ; echo imprettydarnsuredatdisisdaendofdacmd>/tmp/ $copname "
2016-04-17 14:00:45 +02:00
TMUX = tmux new-session -d -s sendprocess_$copname " bash $SCRIPT outproc ${ USER [ID] } $copname "
2016-01-02 21:51:45 +01:00
}
2016-01-06 17:11:56 +01:00
2016-04-15 19:37:44 +02:00
killproc( ) {
2016-04-17 14:00:45 +02:00
( tmux kill-session -t $copname ; echo imprettydarnsuredatdisisdaendofdacmd>/tmp/$copname ; tmux kill-session -t sendprocess_$copname ; rm -r /tmp/$copname ) 2>/dev/null
2016-04-15 19:37:44 +02:00
}
2016-01-03 02:14:07 +01:00
inproc( ) {
2016-01-19 20:59:15 +01:00
tmux send-keys -t $copname " $MESSAGE ${ URLS [*] }
2016-01-05 17:01:28 +01:00
"
2016-01-03 02:14:07 +01:00
}
2015-12-26 02:47:10 +01:00
process_client( ) {
2016-04-16 20:50:05 +02:00
# Message
MESSAGE = $( echo " $res " | egrep '\["result",0,"message","text"\]' | cut -f 2 | cut -d '"' -f 2)
2016-01-17 17:46:24 +01:00
# User
2016-04-16 20:50:05 +02:00
USER[ ID] = $( echo " $res " | egrep '\["result",0,"message","chat","id"\]' | cut -f 2)
2016-01-17 17:46:24 +01:00
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)
2016-04-16 20:50:05 +02:00
USER[ USERNAME] = $( echo " $res " | egrep '\["result",0,"message","chat","username"\]' | cut -f 2 | cut -d '"' -f 2)
2016-01-17 17:46:24 +01:00
# Audio
2016-01-19 20:27:09 +01:00
URLS[ AUDIO] = $( get_file $( echo " $res " | egrep '\["result",0,"message","audio","file_id"\]' | cut -f 2 | cut -d '"' -f 2) )
# Document
URLS[ DOCUMENT] = $( get_file $( echo " $res " | egrep '\["result",0,"message","document","file_id"\]' | cut -f 2 | cut -d '"' -f 2) )
2016-01-17 17:46:24 +01:00
# Photo
2016-01-19 20:27:09 +01:00
URLS[ 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 17:46:24 +01: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)
2016-01-22 16:06:41 +01:00
NAME = " $( basename ${ URLS [*] } & >/dev/null) "
2016-01-17 17:46:24 +01:00
# Tmux
2016-04-17 14:00:45 +02:00
copname = " $ME " _" ${ USER [ID] } "
2016-01-17 17:46:24 +01:00
2016-04-17 20:00:37 +02:00
source commands.sh
2016-04-17 14:00:45 +02:00
tmpcount = " COUNT ${ USER [ID] } "
cat count | grep -q " $tmpcount " || echo " $tmpcount " >>count
2016-04-16 20:50:05 +02:00
# To get user count execute bash bashbot.sh count
2015-12-26 02:47:10 +01:00
}
2016-03-20 22:34:55 +01:00
# source the script with source as param to use functions in other scripts
2016-04-17 14:13:28 +02:00
while [ " $1 " = = "startbot" ] ; do {
2015-07-10 07:43:08 +02:00
2016-01-06 17:11:56 +01:00
res = $( curl -s $UPD_URL $OFFSET | ./JSON.sh -s)
2015-07-10 07:43:08 +02:00
2016-01-06 17:11:56 +01:00
# Offset
OFFSET = $( echo " $res " | egrep '\["result",0,"update_id"\]' | cut -f 2)
2015-07-10 07:43:08 +02:00
OFFSET = $(( OFFSET+1))
2015-07-10 09:32:34 +02:00
if [ $OFFSET != 1 ] ; then
2016-01-06 17:11:56 +01:00
process_client&
2015-07-10 09:32:34 +02:00
fi
2015-07-10 07:43:08 +02:00
2016-01-05 17:01:28 +01:00
} ; done
2016-04-16 20:50:05 +02:00
case " $1 " in
"outproc" )
until [ " $line " = "imprettydarnsuredatdisisdaendofdacmd" ] ; do
line =
read -t 10 line
[ " $line " != "" -a " $line " != "imprettydarnsuredatdisisdaendofdacmd" ] && send_message " $2 " " $line "
done </tmp/$3
rm -r /tmp/$3
; ;
"count" )
2016-04-17 14:00:45 +02:00
echo " A total of $( wc -l count | sed 's/count//g' ) users used me. "
2016-04-16 20:50:05 +02:00
; ;
"broadcast" )
2016-04-17 14:00:45 +02:00
echo " Sending the broadcast $* to $( wc -l count | sed 's/count//g' ) users. "
[ $( wc -l count | sed 's/ count//g' ) -gt 300 ] && sleep = "sleep 0.5"
2016-04-16 20:50:05 +02:00
shift
for f in $( cat count) ; do send_message ${ f //COUNT } " $* " ; $sleep ; done
; ;
2016-04-17 14:13:28 +02:00
"start" )
tmux kill-session -t $ME & >/dev/null
tmux new-session -d -s $ME " bash $SCRIPT startbot " && echo " Bot started successfully. Tmux session name is $ME " || echo "An error occurred while starting the bot."
; ;
"kill" )
tmux kill-session -t $ME & >/dev/null
echo "Bot was killed successfully. "
; ;
"help" )
cat README.md
; ;
2016-04-16 20:50:05 +02:00
esac