使用 Python 的 Telebot
在本文中,我们将使用 Python 构建一个 Telegram 机器人,它将发送猫咪😺的照片和一些猫咪趣闻。为此,我将使用pytelegrambotapi库。
设置我们的机器人
首先,我们需要一个 Telegram 账户,如果没有,可以轻松创建一个。在 Telegram 中搜索“BotFather”。它看起来如下图所示。
然后,我们必须发送“开始”消息,并按照 BotFather 给出的指令进行操作。简而言之,/start
> /newbot
> 机器人名称 > Bot 用户名(唯一)。之后,BotFather 将提供令牌来访问我们的机器人。AUTH 令牌的格式如下:1111111111:AAA_A_aaaaaaaaaaaaaaaaaaaaa_aaaaaaaaaa。
构建机器人的步骤:
现在我们开始编写代码。首先,我们将使用 venv 创建一个虚拟环境。
💡注意:您也可以使用其他选项。
如果您知道这部分,请随意跳过⏩。
设置虚拟环境:
在终端中,打开您的目录并输入以下命令。
python -m venv venv
要激活您的虚拟环境:
venv\Scripts\activate
终端将会看起来像这样..
(venv)(项目路径)
所需依赖项:
您可以在此处找到完整的代码和要求。
pyTelegramBotAPI==3.7.9
python-dotenv==0.17.1
requests==2.25.1
代码
最后,创建一个 Python 文件来编写脚本。首先,导入所需组件。目前,我们只需导入远程机器人和传入组件,其他组件将根据需要导入。
purrrfect_bot.py
import telebot
import os
from dotenv import load_dotenv
现在我们将令牌存储在一个变量中。为此,请在同一目录中创建一个 .env 文件。并将令牌存储在 AUTH_TOKEN 变量中。
.env
AUTH_TOKEN = 'YOUR_TOKEN'
现在,我们必须在主文件中加载此令牌。
purrrfect_bot.py
load_dotenv()
token = os.getenv('AUT_TOKEN')
在此之后,我们将创建我们的机器人实例并开始轮询消息。
purrrfect_bot.py
bot = telebot.TeleBot(token) # creating a instance
def main():
bot.polling() # looking for message
if __name__ == '__main__':
main()
为了检查我们的机器人,我们将设置一个消息处理程序,以便每当我们发送/greet(命令)或/start 时,回复应该是“你好,你好吗?”。
purrrfect_bot.py
@bot.message_handler(commands = ['greet','start'])
def greet(message):
msg = ''' Hello, how are you? '''
bot.reply_to(message, msg)
在上面的章节中,每当我们向机器人发送命令 greet 或 start 时,greet
函数就会运行。
reply_to
方法发送回复到/start或/greet即消息。
为了检查我们的代码,我们将在终端中运行代码
python <main_file_name.py>
尝试向机器人发送/start或/greet,它应该回复“你好,你好吗?”
但如果我们不想回复消息,那么我们可以使用send_message
方法。
purrrfect_bot.py
@bot.message_handler(commands = ['greet','start'])
def greet(message):
msg = ''' Hello, how are you? '''
bot.send_message(message.chat.id, msg)
要使用 send_message,我们需要发送者的 ID。我们可以从消息本身获取此 ID,即message.chat.id
。
运行后会收到没有回复的消息。
现在,如果用户发送了除命令之外的任何内容,机器人将不会回复任何内容。为此,我们可以设置message_handler
一个函数,将相同的消息发送回用户。更多信息,请参阅文档。
@bot.message_handler(func=lambda m: True)
def repeat(message):
bot.send_message(message.chat.id, message.text)
💡注意:它仅适用于文本/表情符号,而不适用于贴纸或任何其他类型的媒体。
API
因此,我们的主要目标是在用户发送命令时发送猫咪图片和相关信息。为了获取猫咪图片和相关信息,我们将使用两个公共 API。
{
"id": 35,
"url": "https://i.thatcopy.pw/cat/UJzx759.jpg",
"webpurl": "https://i.thatcopy.pw/cat-webp/UJzx759.webp",
"x": 47.55,
"y": 60.05
}
{
"status": {
"verified": true,
"sentCount": 1
},
"type": "cat",
"deleted": false,
"_id": "591f9890d369931519ce353d",
"__v": 0,
"text": "The domestic cat is the only species able to hold its tail vertically while walking. You can also learn about your cat's present state of mind by observing the posture of his tail.",
"source": "api",
"updatedAt": "2020-08-23T20:20:01.611Z",
"createdAt": "2018-01-04T01:10:54.673Z",
"used": false,
"user": "5a9ac18c7478810ea6c06381"
}
两个输出均为 JSON 格式。在第一个 API 中,我们将使用url
发送图片或webpurl
猫咪贴纸😸。在第二个 API 中,我们将使用它text
发送事实。
为了向 API 发出 GET 请求,我们将使用请求模块。
purrrfect_bot.py
import telebot
import os
from dotenv import load_dotenv
import request
我们将编写函数来获取图像 URL 和事实。
purrrfect_bot.py
def get_url():
contents = requests.get('https://thatcopy.pw/catapi/rest/').json()
image_url = contents['url']
return image_url
def get_fact():
contents = requests.get('https://cat-fact.herokuapp.com/facts/random?animal_type=cat&amount=1').json()
fact = contents['text']
if len(fact) < 10:
return get_fact()
return fact
请注意,get 方法用于发出 GET 请求。由于我们的响应是 JSON 格式,request.json() 会在字典中进行转换。因此,我们可以将其作为键值对(即content['url']
和)进行访问contents['text']
。
If 语句用于不发送长度小于 10 的事实。
现在我们必须设置机器人将发送图像或事实的命令。
purrrfect_bot.py
@bot.message_handler(commands = ['meow'])
def meow(message):
url = get_url()
bot.send_photo(message.chat.id, url)
@bot.message_handler(commands = ['fact'])
def fact(message):
fact = get_fact()
bot.send_message(message.chat.id, fact)
在我的例子中,/meow会发送图片,/fact会发送事实。在get_url
函数修改中,将url改为webpurl,并在 meow 函数中使用 send_sticker 而不是send_photo
tosend_sticker
来代替图片。
💡注意:请确保这些消息处理程序位于重复上方。否则,机器人将发送命令作为回复。
为了获得有关必须使用哪些命令的更多帮助,我们还可以编辑/start消息。
purrrfect_bot.py
@bot.message_handler(commands = ['greet','start'])
def greet(message):
msg = ''' Hello, how are you?
Send /meow to get a cat image.
Send /fact to get random Cat Fact.'''
bot.send_message(message.chat.id, msg)
现在,如果我们想要的只是喵喵或事实的图像或事实,而不包含“/”(文本)。
我们可以将正则表达式添加到同一个函数中。我们可以在同一个函数上堆叠两个装饰器。编辑后,代码将如下所示
purrrfect_bot.py
@bot.message_handler(commands = ['meow'])
@bot.message_handler(regexp=r'meow')
def meow(message):
url = get_url()
bot.send_photo(message.chat.id, url)
@bot.message_handler(commands = ['fact'])
@bot.message_handler(regexp=r'fact')
def fact(message):
fact = get_fact()
bot.send_message(message.chat.id, fact)
好了,我们的机器人已经准备就绪,可以用照片的形式向我们发送快乐。您可以根据自己的喜好进行自定义,尽情享受乐趣。欢迎随时提供反馈或提出任何疑问。
存储库链接:https://github.com/PoojaGhodmode/CatBot
参考:
- pytelegrambotapi 文档
- Dzaky Widya Putra - 学习使用 Python 在 Telegram 中构建你的第一个机器人
- CS Dojo - 如何用 Python 创建电报机器人