30分钟内用Python编写的简单Telegram机器人

在哈布雷(Habré)上,不仅如此,关于机器人的评论太多了,甚至太多了。 但是几周前对这个话题开始感兴趣,我仍然找不到正常的材料:所有文章要么完全是假人,要么被限制为响应用户消息而发送消息,或者无关紧要。 这促使我写了一篇文章,向像我这样的新手解释如何编写和启动一个或多或少有意义的机器人(并可能扩展功能)。

第1部分:注册机器人


最简单,描述最多的部分。 非常简单:您需要找到@BotFather机器人,将他写为/ start/ newbot ,填写他要求的字段(机器人的名称及其简称),并获得一条带有机器人令牌的消息以及指向文档的链接。 必须保存令牌,最好是可靠的令牌,因为这是授权bot并与其进行交互的唯一密钥。

第2部分:准备编写代码


正如标题中已经提到的,我们将使用Python编写该机器人。 本文将介绍如何使用PyTelegramBotAPI(Telebot)库。 如果没有安装Python,则首先需要执行以下操作:在Linux终端中,需要输入

sudo apt-get install python python-pip 

如果使用Windows,则需要从官方站点下载Python。

之后,在Linux终端或Windows命令提示符下,输入

 pip install pytelegrambotapi 

现在您可以编写代码了。

第3部分:接收消息并说“你好”


一个小题外话。 电报可以通过两种方式向bot告知机器人有关用户操作的方式:通过对服务器请求的响应(长轮​​询),以及通过Webhook,当Telegram服务器本身发送有人写信给该bot的消息时。 第二种方法显然更好,但是需要专用的IP地址,并且服务器上已安装SSL。 在本文中,我想谈谈编写机器人,而不是设置服务器,因此我们将使用Long Poll。

打开您喜欢的文本编辑器,让我们编写机器人代码!

首先要做的是导入我们的库并连接机器人令牌:

 import telebot; bot = telebot.TeleBot('% %'); 

现在声明一种接收文本消息的方法:

 @bot.message_handler(content_types=['text']) def get_text_messages(message): 

在本节代码中,我们声明了文本消息的侦听器和用于处理文本消息的方法。 content_types字段可以采用不同的值,例如,不能只有一个

 @bot.message_handler(content_types=['text', 'document', 'audio']) 

将响应短信,文档和音频。 可以在官方文档中找到更多详细信息

现在让我们在方法中添加一些功能:如果用户给我们写了“ Hello”,那么我们会说“你好,我怎么帮您?”,如果他们给我们写了“ / help”命令,我们将告诉用户写“ Hello”:

 if message.text == "": bot.send_message(message.from_user.id, ",     ?") elif message.text == "/help": bot.send_message(message.from_user.id, " ") else: bot.send_message(message.from_user.id, "   .  /help.") 

在我看来,这段代码不需要注释。 现在,我们只需要向代码添加一行(所有方法之外)。

 bot.polling(none_stop=True, interval=0) 

现在,我们的机器人将不断询问Telegram服务器“有人给我写信了吗?”,如果我们给我们的机器人写信,则Telegram将向我们发送消息。 我们保存整个文件,然后在控制台中写入

 python bot.py 

其中bot.py是我们文件的名称。

现在您可以编写一个机器人并查看结果:

图片

第4部分:按钮和消息线程


发送消息无疑很有趣,但是与用户进行对话更有趣:向他提问并得到答案。 假设现在我们的机器人将依次询问用户的姓名,姓氏和年龄。 为此,我们将使用机器人的register_next_step_handler方法:

 name = ''; surname = ''; age = 0; @bot.message_handler(content_types=['text']) def start(message): if message.text == '/reg': bot.send_message(message.from_user.id, "  ?"); bot.register_next_step_handler(message, get_name); #  –  get_name else: bot.send_message(message.from_user.id, ' /reg'); def get_name(message): #  global name; name = message.text; bot.send_message(message.from_user.id, '   ?'); bot.register_next_step_handler(message, get_surnme); def get_surname(message): global surname; surname = message.text; bot.send_message('  ?'); bot.register_next_step_handler(message, get_age); def get_age(message): global age; while age == 0: #    try: age = int(message.text) #,     except Exception: bot.send_message(message.from_user.id, ', '); bot.send_message(message.from_user.id, ' '+str(age)+' ,   '+name+' '+surname+'?') 

因此,我们记录了用户数据。 此示例显示了一个非常简化的示例,从本质上讲,您需要在数据库中存储中间数据和用户状态,但是今天我们使用的是Bot而不是数据库。 最后一点-我们要求用户确认是否正确输入了所有内容,但不仅如此,还需要按钮! 为此,请稍微编辑get_age方法代码

 def get_age(message): global age; while age == 0: #    try: age = int(message.text) #,     except Exception: bot.send_message(message.from_user.id, ', '); keyboard = types.InlineKeyboardMarkup(); #  key_yes = types.InlineKeyboardButton(text='', callback_data='yes'); # «» keyboard.add(key_yes); #    key_no= types.InlineKeyboardButton(text='', callback_data='no'); keyboard.add(key_no); question = ' '+str(age)+' ,   '+name+' '+surname+'?'; bot.send_message(message.from_user.id, text=question, reply_markup=keyboard) 

现在我们的机器人发送了键盘,但是如果您单击它,那么什么也不会发生。 因为我们没有编写处理程序方法。 让我们写:

 @bot.callback_query_handler(func=lambda call: True) def callback_worker(call): if call.data == "yes": #call.data  callback_data,       .... #  ,    bot.send_message(call.message.chat.id, ' : )'); elif call.data == "no": ... # 

仅在文件的开头添加一行即可:

 from telebot import types 

就这样,保存并运行我们的机器人:

图片

Source: https://habr.com/ru/post/zh-CN442800/


All Articles