mirror of
https://github.com/octoleo/telegram-bot-bash.git
synced 2024-11-29 18:53:52 +00:00
Merge pull request #3 from danog/interactive
Interactive chat support, bugs fixed, added installation instructions to readme, added support for custom keyboards, made curl quiet
This commit is contained in:
commit
d5331eb4eb
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
*~
|
106
README.md
106
README.md
@ -1,4 +1,108 @@
|
|||||||
#bashbot
|
#bashbot
|
||||||
A Telegram bot written in bash.
|
A Telegram bot written in bash.
|
||||||
|
|
||||||
Uses [json.sh](https://github.com/dominictarr/JSON.sh).
|
Uses [json.sh](https://github.com/dominictarr/JSON.sh) and tmux (for interactive chats).
|
||||||
|
|
||||||
|
|
||||||
|
## Instructions
|
||||||
|
### Create your first bot
|
||||||
|
|
||||||
|
1. Message @botfather https://telegram.me/botfather with the following
|
||||||
|
text: `/newbot`
|
||||||
|
If you don't know how to message by username, click the search
|
||||||
|
field on your Telegram app and type `@botfather`, you should be able
|
||||||
|
to initiate a conversation. Be careful not to send it to the wrong
|
||||||
|
contact, because some users has similar usernames to `botfather`.
|
||||||
|
|
||||||
|
![botfather initial conversation](http://i.imgur.com/aI26ixR.png)
|
||||||
|
|
||||||
|
2. @botfather replies with `Alright, a new bot. How are we going to
|
||||||
|
call it? Please choose a name for your bot.`
|
||||||
|
|
||||||
|
3. Type whatever name you want for your bot.
|
||||||
|
|
||||||
|
4. @botfather replies with `Good. Now let's choose a username for your
|
||||||
|
bot. It must end in `bot`. Like this, for example: TetrisBot or
|
||||||
|
tetris_bot.`
|
||||||
|
|
||||||
|
5. Type whatever username you want for your bot, minimum 5 characters,
|
||||||
|
and must end with `bot`. For example: `telesample_bot`
|
||||||
|
|
||||||
|
6. @botfather replies with:
|
||||||
|
|
||||||
|
Done! Congratulations on your new bot. You will find it at
|
||||||
|
telegram.me/telesample_bot. You can now add a description, about
|
||||||
|
section and profile picture for your bot, see /help for a list of
|
||||||
|
commands.
|
||||||
|
|
||||||
|
Use this token to access the HTTP API:
|
||||||
|
<b>123456789:AAG90e14-0f8-40183D-18491dDE</b>
|
||||||
|
|
||||||
|
For a description of the Bot API, see this page:
|
||||||
|
https://core.telegram.org/bots/api
|
||||||
|
|
||||||
|
7. Note down the 'token' mentioned above.
|
||||||
|
|
||||||
|
8. Type `/setprivacy` to @botfather.
|
||||||
|
|
||||||
|
![botfather later conversation](http://i.imgur.com/tWDVvh4.png)
|
||||||
|
|
||||||
|
9. @botfather replies with `Choose a bot to change group messages settings.`
|
||||||
|
|
||||||
|
10. Type `@telesample_bot` (change to the username you set at step 5
|
||||||
|
above, but start it with `@`)
|
||||||
|
|
||||||
|
11. @botfather replies with
|
||||||
|
|
||||||
|
'Enable' - your bot will only receive messages that either start
|
||||||
|
with the '/' symbol or mention the bot by username.
|
||||||
|
'Disable' - your bot will receive all messages that people send to groups.
|
||||||
|
Current status is: ENABLED
|
||||||
|
|
||||||
|
12. Type `Disable` to let your bot receive all messages sent to a
|
||||||
|
group. This step is up to you actually.
|
||||||
|
|
||||||
|
13. @botfather replies with `Success! The new status is: DISABLED. /help`
|
||||||
|
|
||||||
|
### Install bashbot
|
||||||
|
Clone the repository:
|
||||||
|
```
|
||||||
|
git clone https://github.com/topkecleon/telegram-bot-bash
|
||||||
|
```
|
||||||
|
|
||||||
|
Paste the token on line 12 (instead of tokenhere).
|
||||||
|
Then start editing the commands.
|
||||||
|
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
To send messages use the ```send_message``` function:
|
||||||
|
```
|
||||||
|
send_message "$TARGET" "lol"
|
||||||
|
```
|
||||||
|
To send images use the ```send_photo``` function:
|
||||||
|
```
|
||||||
|
send_photo "$TARGET" "/home/user/doge.jpg"
|
||||||
|
```
|
||||||
|
To send custom keyboards use the ```send_keyboard``` function or the ```send_message``` function:
|
||||||
|
```
|
||||||
|
send_keyboard "$TARGET" "Text that will appear in chat?" "Yep" "No"
|
||||||
|
```
|
||||||
|
|
||||||
|
To create interactive chats, write (or edit the question script) a normal bash (or C or python) script, chmod +x it and then substitute ./question @ line 49 with the command you usually use to start the script.
|
||||||
|
The text that the script will output will be sent in real time to the user, and all user input will be sent to the script (as long as it's running or until the user kills it with /cancel).
|
||||||
|
To open up a keyboard in an interactive script, print out the keyboard layout in the following way:
|
||||||
|
```
|
||||||
|
echo "Text that will appear in chat? mykeyboardstartshere Yep No"
|
||||||
|
```
|
||||||
|
Same goes for images:
|
||||||
|
```
|
||||||
|
echo "Text that will appear in chat? myimagelocationstartshere /home/user/doge.jpg"
|
||||||
|
```
|
||||||
|
Or both:
|
||||||
|
```
|
||||||
|
echo "Text that will appear in chat? mykeyboardstartshere Yep No myimagelocationstartshere /home/user/doge.jpg"
|
||||||
|
```
|
||||||
|
|
||||||
|
That's it!
|
||||||
|
|
||||||
|
If you feel that there's something missing or if you found a bug, feel free to submit a pull request!
|
||||||
|
120
bashbot.sh
120
bashbot.sh
@ -1,53 +1,143 @@
|
|||||||
|
#!/bin/bash
|
||||||
# bashbot, the Telegram bot written in bash.
|
# bashbot, the Telegram bot written in bash.
|
||||||
# Written by @topkecleon, Juan Potato (@awkward_potato) and Lorenzo Santina (BigNerd95)
|
# Written by @topkecleon, Juan Potato (@awkward_potato), Lorenzo Santina (BigNerd95) and Daniil Gentili (danog)
|
||||||
# http://github.com/topkecleon/bashbot
|
# 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
|
||||||
|
|
||||||
# Depends on JSON.sh (http://github.com/dominictarr/JSON.sh),
|
|
||||||
# which is MIT/Apache-licensed.
|
|
||||||
|
|
||||||
# This file is public domain in the USA and all free countries.
|
# 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.
|
# If you're in Europe, and public domain does not exist, then haha.
|
||||||
|
|
||||||
#!/bin/bash
|
TOKEN='tokenhere'
|
||||||
|
|
||||||
TOKEN=''
|
|
||||||
URL='https://api.telegram.org/bot'$TOKEN
|
URL='https://api.telegram.org/bot'$TOKEN
|
||||||
MSG_URL=$URL'/sendMessage'
|
MSG_URL=$URL'/sendMessage'
|
||||||
PHO_URL=$URL'/sendPhoto'
|
PHO_URL=$URL'/sendPhoto'
|
||||||
|
FILE_URL='https://api.telegram.org/file/bot'$TOKEN'/'
|
||||||
UPD_URL=$URL'/getUpdates?offset='
|
UPD_URL=$URL'/getUpdates?offset='
|
||||||
OFFSET=0
|
OFFSET=0
|
||||||
|
|
||||||
send_message() {
|
send_message() {
|
||||||
res=$(curl "$MSG_URL" -F "chat_id=$1" -F "text=$2")
|
local chat="$1"
|
||||||
|
local text="$(echo "$2" | sed 's/ mykeyboardstartshere.*//g;s/ myimagelocationstartshere.*//g')"
|
||||||
|
local keyboard="$(echo "$2" | sed '/mykeyboardstartshere /!d;s/.*mykeyboardstartshere //g;s/ myimagelocationstartshere.*//g')"
|
||||||
|
local image="$(echo "$2" | sed '/myimagelocationstartshere /!d;s/.*myimagelocationstartshere //g;s/ mykeyboardstartshere.*//g;')"
|
||||||
|
if [ "$keyboard" != "" ]; then
|
||||||
|
send_keyboard "$chat" "$text" "$keyboard"
|
||||||
|
local sent=y
|
||||||
|
fi
|
||||||
|
if [ "$image" != "" ]; then
|
||||||
|
send_photo "$chat" "$image"
|
||||||
|
local sent=y
|
||||||
|
fi
|
||||||
|
if [ "$sent" != "y" ];then
|
||||||
|
res=$(curl -s "$MSG_URL" -F "chat_id=$chat" -F "text=$text")
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
send_keyboard() {
|
||||||
|
local chat="$1"
|
||||||
|
local text="$2"
|
||||||
|
shift 2
|
||||||
|
local keyboard=init
|
||||||
|
for f in $*;do local keyboard="$keyboard, [\"$f\"]";done
|
||||||
|
local keyboard=${keyboard/init, /}
|
||||||
|
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}")
|
||||||
}
|
}
|
||||||
|
|
||||||
send_photo() {
|
send_photo() {
|
||||||
res=$(curl "$PHO_URL" -F "chat_id=$1" -F "photo=@$2")
|
res=$(curl -s "$PHO_URL" -F "chat_id=$1" -F "photo=@$2")
|
||||||
|
}
|
||||||
|
|
||||||
|
startproc() {
|
||||||
|
local copname="$1"
|
||||||
|
local TARGET="$2"
|
||||||
|
mkdir -p "$copname"
|
||||||
|
mkfifo $copname/out
|
||||||
|
tmux new-session -d -n $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=
|
||||||
|
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
|
||||||
|
"
|
||||||
|
ps aux | grep -v grep | grep -q "$copid" || { rm -r $copname; };
|
||||||
}
|
}
|
||||||
|
|
||||||
process_client() {
|
process_client() {
|
||||||
local MESSAGE=$1
|
local MESSAGE=$1
|
||||||
local TARGET=$2
|
local TARGET=$2
|
||||||
|
local PHOTO_ID=$3
|
||||||
local msg=""
|
local msg=""
|
||||||
|
local copname="CO$TARGET"
|
||||||
|
local copidname="$copname/pid"
|
||||||
|
local copid="$(cat $copidname 2>/dev/null)"
|
||||||
|
if [ "$copid" = "" ]; then
|
||||||
case $MESSAGE in
|
case $MESSAGE in
|
||||||
'/info') msg="This is bashbot, the Telegram bot written entirely in bash.";;
|
'/question')
|
||||||
*) msg="$MESSAGE";;
|
startproc "$copname" "$TARGET"&
|
||||||
|
;;
|
||||||
|
'/info')
|
||||||
|
send_message "$TARGET" "This is bashbot, the Telegram bot written entirely in bash."
|
||||||
|
;;
|
||||||
|
'/start')
|
||||||
|
send_message "$TARGET" "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.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
Written by @topkecleon, Juan Potato (@awkward_potato), Lorenzo Santina (BigNerd95) and Daniil Gentili (danog)
|
||||||
|
https://github.com/topkecleon/telegram-bot-bash
|
||||||
|
"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
send_message "$TARGET" "$MESSAGE"
|
||||||
esac
|
esac
|
||||||
send_message "$TARGET" "$msg"
|
else
|
||||||
|
case $MESSAGE in
|
||||||
|
'/cancel')
|
||||||
|
kill $copid
|
||||||
|
rm -r $copname
|
||||||
|
send_message "$TARGET" "Command canceled."
|
||||||
|
;;
|
||||||
|
*) inproc "$copname" "$copid" "$MESSAGE" "$PHOTO_ID";;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
while true; do {
|
while true; do {
|
||||||
|
|
||||||
res=$(curl $UPD_URL$OFFSET)
|
res=$(curl -s $UPD_URL$OFFSET)
|
||||||
|
|
||||||
TARGET=$(echo $res | ./JSON.sh | egrep '\["result",0,"message","chat","id"\]' | cut -f 2)
|
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)
|
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)
|
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')
|
||||||
|
|
||||||
OFFSET=$((OFFSET+1))
|
OFFSET=$((OFFSET+1))
|
||||||
|
|
||||||
if [ $OFFSET != 1 ]; then
|
if [ $OFFSET != 1 ]; then
|
||||||
process_client "$MESSAGE" "$TARGET" &
|
process_client "$MESSAGE" "$TARGET" "$PHOTO_ID"&
|
||||||
fi
|
fi
|
||||||
|
|
||||||
} &>/dev/null; done
|
}; done
|
||||||
|
|
||||||
|
16
question
Executable file
16
question
Executable file
@ -0,0 +1,16 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "Why hello there.
|
||||||
|
Would you like some tea (y/n)?"
|
||||||
|
read answer
|
||||||
|
[[ $answer =~ ^([yY][eE][sS]|[yY])$ ]] && echo "OK then, here you go: http://www.rivertea.com/blog/wp-content/uploads/2013/12/Green-Tea.jpg" || echo "OK then."
|
||||||
|
until [ "$SUCCESS" = "y" ] ;do
|
||||||
|
echo "Do you like Music? mykeyboardstartshere Yass! No"
|
||||||
|
read answer
|
||||||
|
case $answer in
|
||||||
|
'Yass!') echo "Goody!";SUCCESS=y;;
|
||||||
|
'No') echo "Well that's weird.";SUCCESS=y;;
|
||||||
|
*) SUCCESS=n;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
exit
|
Loading…
Reference in New Issue
Block a user