今天只讲Python编程语言搭建电报机器人而已,至于用Google Script搭建的教程点击这里
至于如何搭建telegram机器人请参考这篇文章步骤一

Python


步骤一

先到python官网安装python环境,在安装是记得吧PATH打开如图 接着安装Telepot:在电脑的终端(cmd)输入以下代码
1
pip install telepot

步骤二(可以跳过)

安装Python ILDE,如`PyCharm` `Visual Studio Code` `Sublime Text`等

步骤三

1.1 测试你的bot账户

你可以在python中输入如下语句来获取你的bot信息:

1
2
3
4
>>> import telepot #将telepot这个模组导入到Python中来
>>> bot = telepot.Bot('***** Your Token *****') #将bot这个在程序中使用的variable和你的bot token联系起来,在之后的程序中,每当要命令bot的时候可以直接call bot的instance
>>> bot.getMe() #getMe()是一个获取bot信息的function
{'first_name': 'Jean', 'username': 'MonsieurMadeleine', 'id': 24601} #在这里你的bot的信息将以一个dictionary的形式被print出来


1.2 接收消息
设计上,telegram bot是无法主动向用户发送消息的(主要的目的是防止spam),所以你需要主动地通过指令以获取用户的信息:

1
2
3
4
5
6
7
8
9
10
11
>>> from pprint import pprint
>>> response = bot.getUpdates()
>>> pprint(response)
[{'message': {'chat': {'first_name': 'Jean',
'id': 24601,
'type': 'private'},
'date': 1564897562,
'from': {'first_name': 'Jean', 'id': 24601},
'message_id': 104152,
'text': 'I'm a stronger man by far!'},
'update_id': 100000000}]

pprint 指pretty print,是python自带的一个可以让打印出来的dictionary更美观的一个function

getUpdates()是telegram中获取Update的方法,依据Telegram API,getUpdate会return一个以Update object组成的array。在python中,Update object是以dictionary的形式被表现出来的。

每当有用户向你的bot发送一条消息/图片/指令的时候,你都可以通过getUpdate()的方式来获取这条消息。在这条消息中,message 的key包括chat(用户的名字,ID和聊天的种类(在telegram中,聊天的种类分为三种,private, group以及channel,我们更多地是handle private的信息)),date(消息发送的日期),from(发送者的信息),message_id(一个独特的,message_id可以specify某一条信息),而text就是用户所发送消息的文本。

但是每次都使用getUpdate()来获取消息就太麻烦了,这意味着你需要连续不断地敲击运行按钮才能获取新用户发送给bot的消息,在这里telepot提供了一个非常方便的解决办法.

1.3 持续地接受消息
在telepot中,MessageLoop是一个非常方便的处理信息的方式,如下:

1
2
3
4
5
>>> from telepot.loop import MessageLoop #导入MessageLoop
>>> def handle(msg): #在这里定义handle来告诉MessageLoop应该如何处理Message
... pprint(msg) #simply print message
...
>>> MessageLoop(bot, handle).run_as_thread()

MessageLoop需要两个argument,一个是你已经specify token的’bot’,而另一个就是告诉MessageLoop如何处理信息的’method’(在这里我们将它命名为handle,你可以将此method改成任意名字,只要在定义的时候,method只接收一个argument,那就是’msg’)。

‘run_as_thread’在这里起到了,只要你启动了你的python file,那么这个MessageLoop就会永续不断地运行下去,除非遇到特殊情况(冲突或者恶性bug等等)

1.4 快速的Glance Message
telegram中的message作为一个json object,其中包含很多重要的而且可能会在一次Bot与用户的交互中多次使用的信息,而每次通过message对应的key来访问这些信息实在是有够麻烦,对此telepot提供了glance这一功能来快速获取message中的某些重要信息。

content_type, chat_type, chat_id = telepot.glance(msg)
在这条语句之后,telepot帮你快速查看了msg中的content type, chat type和chat id并且储存在了这三个variable中,在之后的代码里可以直接通过这些variable来访问相对应的信息。

Tip:glance的功能不限于只获取这三种信息(content type, chat type和chat id)而是所有在message中存在的legal key中的信息都可以获取。

1.5 向用户发送信息
在telepot中,向用户发送信息这一功能是通过bot.sendMessage() 这一function实现的,sendMessage() take in 两个arguments,一个是你希望发送的用户的chat_id,另一个是你希望发送消息的文本。
bot.sendMessage(chat_id, text)
到这里你已经掌握了搭建一个bot的所有基本操作,让我们来尝试做一个非常简单的bot吧。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import time
import telepot
from telepot.loop import MessageLoop

def handle(msg):
content_type, chat_type, chat_id = telepot.glance(msg)
print(content_type, chat_type, chat_id)

if msg['text'] == '/start':
bot.sendMessage(chat_id, '你好')
elif msg['text'] == '/test':
bot.sendMessage(chat_id, '回应测试')

TOKEN = 'Your Token'

bot = telepot.Bot(TOKEN)
MessageLoop(bot, handle).run_as_thread()
print ('Listening ...')

# Keep the program running.
while 1:
time.sleep(10)

记得把Your Token换成你机器人的token哦~

Inline Keybord

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import time
import telepot
from telepot.loop import MessageLoop
from telepot.namedtuple import InlineKeyboardMarkup, InlineKeyboardButton

def on_chat_message(msg):
content_type, chat_type, chat_id = telepot.glance(msg)

keyboard = InlineKeyboardMarkup(inline_keyboard=[
[InlineKeyboardButton(text='McFlurry', callback_data='McFlurry')],
[InlineKeyboardButton(text='Nugget', callback_data='Nugget')],
[InlineKeyboardButton(text='Coke', callback_data='Coke')],
[InlineKeyboardButton(text='Coke', callback_data='Coke')],
])

bot.sendMessage(chat_id, 'What would you like to order?', reply_markup=keyboard)

def on_callback_query(msg):
query_id, from_id, query_data = telepot.glance(msg, flavor='callback_query')
bot.answerCallbackQuery(query_id, text='Sold out!')
bot.answerCallbackQuery(query_id, text='You have ordered'+query_data)

TOKEN = 'Your Token'
bot = telepot.Bot(TOKEN)
MessageLoop(bot, {'chat': on_chat_message,
'callback_query': on_callback_query}).run_as_thread()
print('Listening ...')

while 1:
time.sleep(10)

效果:


有什么问题可以在评论区问我或者电报联系我



文章部分来自于知乎谷歌



至于nodejs的就明天写吧!