用Python写的Telegram机器人代码,一直这样,哪里的问题?

关注【相关推荐】
在您的项目目录中添加以下文件。
bot.py
requirements.txt
Procfile
bot.py文件,您可能从其名称中猜到是 Python 文件,我们将在其中编写机器人的逻辑。另一方面,requirements.txt文件以及Procfile是在 Heroku 服务器上部署机器人所需的文件。稍后我将讨论这两个文件各自负责的内容。请注意,Procfile没有扩展名!
@ 给机器人编程
作为初学者,我们将遵循如下所示的 Telegram 机器人的原始模板,并在其上构建我们的应用程序。
from telegram import *
from telegram.ext import Updater, CommandHandler, CallbackContext, \
MessageHandler, Filters
def start(update: Update, context: CallbackContext) -> None:
update.message.reply_text(text='Welcome to URL downloader!\nPlease provide a valid url')
def textHandler(update: Update, context: CallbackContext) -> None:
if update.message.parse_entities(types=MessageEntity.URL):
update.message.reply_text(text='You sent a valid URL!', quote=True)
def main():
TOKEN = "YOUR BOT TOKEN"
updater = Updater(TOKEN, use_context=True)
updater.dispatcher.add_handler(CommandHandler('start', start))
updater.dispatcher.add_handler(MessageHandler(Filters.all & ~Filters.command, textHandler, run_async=True))
updater.start_polling()
updater.idle()
if __name__ == '__main__':
main()
理解上述代码片段的作用非常重要。特别是,我们正在创建两个处理程序。一个命令处理程序( def start() ) 和一个消息处理程序( def textHandler() )。每次用户在 Telegram 聊天中发送 /start 命令时都会执行start ( )函数。每次向机器人发送文本消息时都会执行t extHandler()函数。在我们的应用程序中,我们不希望用户发送任何类型的文本。事实上,我们只想接受 URL 类型的文本。这就是我们在def textHandler()中添加以下 if 语句的原因:
if update.message.parse_entities(types=MessageEntity.URL)
现在我们已经了解了机器人的基础知识,是时候想办法获取用户发送的 URL 的下载链接了。有两种可能的方法来解决这个问题。老式的方法是创建一个网络抓取工具,该抓取工具会转到该特定 URL 并下载内容。但是,这种方法不是最有效的方法,因为它需要大量 RAM 并且速度很慢。因此,我们将坚持使用为我们完成这项工作的公共 API的新型方法。更具体地说,有很多免费的 API 可以为我们提供几乎任何视频 URL 的下载链接。请注意,这取决于 API 支持的网站。
对于我们的应用程序,我们将使用“get-video-and-audio-url” API。您可以在此处找到 API 的文档。

订阅此 API 后,您将能够连接到它并发送 get/post 请求。现在让我们将 API 集成到我们的 bot.py 文件中。
import requests
from telegram import *
from telegram.ext import Updater, CommandHandler, CallbackContext, \
MessageHandler, Filters
def get_Download_URL_From_API(url):
API_URL = "https://getvideo.p.rapidapi.com/"
querystring = {"url": f"{url}"}
headers = {
'x-rapidapi-host': "getvideo.p.rapidapi.com",
'x-rapidapi-key': "f46d0d682dmsh95ed9f4dc7225e2p146570jsn1d8f86b7de46" # This is your API key token. Keep it secret!
}
response = requests.request("GET", API_URL, headers=headers, params=querystring)
data = response.json()
return data['streams'][0]['url']
def start(update: Update, context: CallbackContext) -> None:
update.message.reply_text(text='Welcome to URL downloader!\nPlease provide a valid url')
def textHandler(update: Update, context: CallbackContext) -> None:
user_message = str(update.message.text)
if update.message.parse_entities(types=MessageEntity.URL):
download_url = get_Download_URL_From_API(user_message)
update.message.reply_text(text=f'Your download url is: {download_url}')
def main():
TOKEN = "YOUR BOT TOKEN"
updater = Updater(TOKEN, use_context=True)
updater.dispatcher.add_handler(CommandHandler('start', start))
updater.dispatcher.add_handler(MessageHandler(Filters.all & ~Filters.command, textHandler, run_async=True))
updater.start_polling()
updater.idle()
if __name__ == '__main__':
main()
所以我们刚才所做的就是在我们的文件中添加一个名为def get_Download_URL_From_API(url)的新函数。这个函数接受一个 url 参数并将这个 url 传递给 API。然后,API 返回一个 json 响应,其中包含诸如标题、网站、upload_date、持续时间、格式以及最后但并非最不重要的视频下载 url 等数据。请记住,json 数据的结构因 API 而异,因此查看 API 的 json 响应并查看您要查找的数据的位置非常重要。我们正在寻找下载网址,可以通过以下方式访问:
data[‘streams’][0][‘url’]
回顾一下代码,每次用户发送一个类型为 URL 的文本消息时,我们将调用get_Download_URL_From_API(url)函数,将用户的 url 消息作为参数传递给该函数。然后该函数将向 API 发送一个get请求,并请求视频的下载 url 并将其返回给用户。就是这样!就如此容易!让我们看看这个机器人是如何运作的。

随意向代码添加更多功能,例如打印标题、持续时间、查看次数等,使其看起来更专业,就像我在博客开头向您展示的视频一样。