【Telegram机器人】今天教大家如何用编程语言制作电报机器人 发表于 2021-09-19 | 更新于 2022-04-23
| 阅读量:
今天只讲Python编程语言搭建电报机器人而已,至于用Google Script搭建的教程点击这里 至于如何搭建telegram机器人请参考这篇文章 的步骤一
Python
步骤一
先到python官网安装python环境,在安装是记得吧PATH打开如图
接着安装Telepot:在电脑的终端(cmd)输入以下代码
步骤二(可以跳过)
安装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的就明天写吧!