开发者社区> 问答> 正文

Python烧瓶服务器获得“代码400”错误(从Telegram-webhook发送的POST请求)

我目前正在学习本教程。-带有Python教程#3的Telegram Bot:创建Bot和Webhook |项目

我已经设置了一个烧瓶服务器使用以下python代码:

from flask import Flask
from flask import request
from flask import Response
import json

app = Flask(__name__)


@app.route('/', methods=['POST', 'GET'])
def index():
    if request.method == 'POST':

        print(request)

        message = request.json()

        with open('telegram_request.json', 'w', encoding='utf-8') as filename:
            json.dump(message, filename, ensure_ascii=False, indent=4)

        # prevents telegram from spamming
        return Response('Ok', status=200)
    else:
        return """
            <h1> Flask Server </h1>
            <h2> Up and running </h2>
        """


if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=8443)

我在我的路由器中端口8443进行了转发,使服务器对外界可见(教程中的隧道步骤)。 域名“myprivatedomain.com:8443”现在重定向/指向设置的烧瓶服务器。

我正确设置了Telegram- api webhook,从Telegram得到以下响应代码:

在发送电报前的聊天:没有错误。 在聊天中发送消息后,出现以下错误:

根据本教程,您可以在Telegram发出POST请求时编写.json文件(参见示例:here)。我想保存Telegram webhook提供的message对象(如教程视频所示)。使用webhook获取更新比不断查询getUpdates()方法更好;该方法还返回旧消息。

我试着补充:

ssl_context='adhoc'

app.run(debug=True, host='0.0.0.0', port=8443)

使连接HTTPS。 虽然使用这个ssl_context,加载主页也是不可能的…

当用户在Telegram聊天中发送消息时——> Python会保存消息对象的.json文件。 问题来源StackOverflow 地址:/questions/59383792/python-flask-server-getting-code-400-errors-post-request-sent-from-telegram-w

展开
收起
kun坤 2019-12-27 10:09:39 1805 0
1 条回答
写回答
取消 提交回答
  • 为此需要启用SSL。Telegram正在尝试与服务器启动一个SSL会话,但你没有启用SSL,所以你看到了错误的请求。 ssl_context='adhoc'可能适用于测试应用程序,但我也有一个预感,telegram需要一个有效的SSL证书,而不仅仅是一个adhoc(或自签名证书)。请注意视频中URL左侧的锁以及缺少安全警告,该警告将与无效或自签名证书一起出现。 要确保SSL工作正常,请将ssl_context设置为adhoc,启动应用程序,并浏览到https://myprivatedomain.com:8443/index。如果您能浏览到它,那么Telegram也能浏览到它,当然是在获得有效证书之后。 接下来,要获得有效(且免费)的SSL证书,可以使用LetsEncrypt。 一旦您拥有了有效的SSL证书和密钥文件,您就可以将ssl_context参数传递给app.run,其中包含证书文件路径的元组和密钥文件的路径(“/path/to/fullchain”)。pem”、“路径/ / privkey.pem”) 完整运行的函数应该是这样的

    app.run(debug=True, host='0.0.0.0', port=8443, ssl_context=("/path/to/fullchain.pem", "/path/to/privkey.pem"))
    

    或者,您可以使用Apache或Nginx来使用SSL保护您的站点,并反向代理到您的bot。这些选项通常会在最终产品中使用,所以我理解,如果您现在不想使用它们,但这是一个很好的实践。 希望有帮助。

    2019-12-27 10:09:45
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
如何运维千台以上游戏云服务器 立即下载
网站/服务器取证 实践与挑战 立即下载
ECS计算与存储分离架构实践 立即下载