Python Flask服务器出现“代码400”错误(从Telegram-webhook发送POST请求)

问题描述 投票:2回答:1

上下文

我目前正在关注this tutorial。 -使用Python教程#3的电报机器人:创建机器人和Webhook |项目

第一步

我已经使用以下python代码设置了Flask服务器:

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获取以下响应代码:

{“ ok”:true,“ result”:true,“ description”:“已设置Webhook”}

现在

<< [之前

在电报聊天中发送消息:

没有错误。

After在聊天中发送消息,弹出以下错误:

代码400,消息HTTP / 0.9请求类型错误(“像\ x00 \ x03这样的随机字节值”)

代码400,消息错误的请求语法(“像\ x00 \ x03这样的随机字节值”)

代码400,消息错误的请求版本(“像\ x00 \ x03这样的随机字节值”)

我想

根据本教程,您可以在Telegram发出POST请求时编写一个.json文件(请参见示例:

here)。我想保存Telegram Webhook提供的消息对象(如教程视频中所示)。使用Webhook来获取更新要比不断查询getUpdates()方法要好。该方法也返回旧消息。

我尝试过的内容

我尝试添加:

ssl_context='adhoc'

to

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

建立连接HTTPS。

虽然使用此ssl_context,也无法加载主页。

首选输出

[当用户在电报聊天中发送消息时-> Python保存消息对象的.json文件。

python flask bad-request
1个回答
2
投票
ssl_context='adhoc'可能适用于测试应用程序,但我也有一种直觉,即电报需要一个

VALID SSL证书,而不仅仅是一个即席(或自签名的)证书。请注意视频中URL左侧的锁,并且缺少使用无效或自签名证书时会出现的安全警告。

要确保SSL正常运行,请将ssl_context设置为adhoc,启动应用程序,然后浏览至https://myprivatedomain.com:8443/index。如果您可以浏览到它,那么当然,在获得有效证书后,Telegram也将能够浏览到它。

下一步,要获取有效(免费)的SSL证书,可以使用LetsEncrypt

一旦有了有效的SSL证书和密钥文件,就可以将ssl_context参数传递给app.run,并带有证书文件路径和密钥文件("/path/to/fullchain.pem", "/path/to/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保护您的网站,并反向代理您的漫游器。这些选项通常会在最终产品中使用,因此我了解您是否现在不想与它们混在一起,但是无论如何都是一个好习惯。

希望有帮助。
© www.soinside.com 2019 - 2024. All rights reserved.