【问题标题】:Telegram bot does not get updates from webhookTelegram bot 未从 webhook 获取更新
【发布时间】:2018-12-09 01:37:00
【问题描述】:

将我的机器人移动到新服务器后,我遇到了以下问题。我使用 webhook 来获取更新,但现在机器人没有从电报服务器获取它们。我尝试从删除服务器发送带有 curl 的 POST 请求,机器人以正常方式处理它。我使用 getWebhookInfo 检查了 webhook,它返回了一个具有非空 url 且 pending_update_count 等于 74 且没有错误的对象。我想,这意味着电报服务器由于某种原因无法向我的主机发送 POST 请求。

我的服务器的操作系统是 Arch Linux。

我使用 pyTelegramBotAP。

CONFIG = ConfigParser()
CONFIG.read(os.path.join('data', 'config.ini'))

# webhook url
URL_BASE = "https://{}:{}".format(CONFIG['server']['ip'], CONFIG.getint('server', 'port'))
URL_PATH = "/{}/".format(CONFIG['telegram bot']['token'])

BOT = telebot.TeleBot(CONFIG['telegram bot']['token'])

# server that will listen for new messages
APP = web.Application()

URL = URL_BASE + URL_PATH

BOT.set_webhook(url=URL, certificate=open(CONFIG['ssl']['certificate'], 'rb'))

# Build ssl context
CONTEXT = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
CONTEXT.load_cert_chain(CONFIG['ssl']['certificate'], CONFIG['ssl']['private key'])

# Start aiohttp server
web.run_app(
    APP,
    host=CONFIG['server']['listen'],
    port=CONFIG['server']['port'],
    ssl_context=CONTEXT,
)

请帮忙!

【问题讨论】:

    标签: python server webhooks telegram-bot


    【解决方案1】:

    Telegram webhook 只与 https 端点通信,所以我建议检查你的服务器是否有 https 连接。

    此外,getWebhookInfo 调用会返回一个状态对象,其中包含您端点的最新错误信息。查看该错误信息,可能会找到确切的问题。

    【讨论】:

    • getWebhookInfo 不返回任何错误:{'url': 'MY_IP:MY_PORT/MY_BOT_TOKEN', 'has_custom_certificate': True, 'pending_update_count': 55, 'last_error_date': None, 'last_error_message': None, 'max_connections':40,'allowed_updates':无}
    • 您可以通过 ngrok.io 进行检查
    • 我试过 ngrok.io 但收到 SSL 错误。我不确定我是否正确使用它。当我创建公钥时,我将 ngrok 给我的域名作为通用名称,并使用来自 ngrok + /token/ 的 url 设置 webhook
    • getWebHookinfo 中没有错误信息意味着电报服务器无法访问您的服务器。您的服务器 https 设置似乎有问题。
    • 尝试使用letsencrypt免费ssl证书
    【解决方案2】:

    请检查您服务器上的防火墙,您服务器上的防火墙很可能没有将消息传递给您的应用程序。

    【讨论】:

      【解决方案3】:

      检查防火墙状态运行$ ufw status
      请显示没有真实 IP 的 URL_BASE。

      您的服务器上的操作系统是什么?
      您将测试请求从 CURL 发送到 Telegram 或服务器的 URL?

      如果您运行简单的应用程序,您能否从服务器获得响应?

      例子:

      from aiohttp import web
      
      async def hello(request):
          return web.Response(text='Hello world!')
      
      app = web.Application()
      app.add_routes([web.get('/', hello)])
      web.run_app(app, host='localhost', port=3003)
      

      检查响应:

      $ curl localhost:3003
      Hello world!
      

      请提供有关您如何进行故障排除的更多详细信息。

      【讨论】:

      • 我服务器的操作系统是 Arch Linux。我不使用 ufw,而 iptables 正在接受所有数据包。我尝试按照您的描述运行一个简单的服务器,它运行良好。我用wireshark捕获了数据包,并且有很多来自带有reset标志的电报服务器的tcp数据包。我从远程服务器发送了 CURL 请求。
      猜你喜欢
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      • 2017-08-03
      • 2018-03-12
      • 2020-06-20
      • 2016-08-27
      • 2017-01-11
      • 2017-07-22
      相关资源
      最近更新 更多