mhc114514 2023-10-02 21:59 采纳率: 25%
浏览 10

Python写Telegram机器人运行出错?

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

img

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-03 08:23
    关注

    【相关推荐】



    • 这篇博客也许可以解决你的问题👉 :使用Python进行Telegram机器人开发(一)
    • 除此之外, 这篇博客: Python 实现被动收入教程之我如何使用 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 的文档。

      image.png

      订阅此 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 并将其返回给用户。就是这样!就如此容易!让我们看看这个机器人是如何运作的。

      1_WlR3Wq92URJXUDBMpYR9pQ.gif

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


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 请提交代码 10月2日
  • 创建了问题 10月2日