Имеет ли метод post все функции для отображения во Flask? - PullRequest
0 голосов
/ 12 марта 2019

Я пишу эти две следующие функции в своем коде, чтобы иметь возможность обрабатывать входящие сообщения и отвечать пользователю в Messenger через бота:

@app.route('/', methods=['post'])
def webhook():
    # endpoint for processing incoming messaging events
    data = request.get_json()
    print(data)  # you may not want to log every incoming message in production, but it's good for testing
    if data["object"] == "page":
        for entry in data["entry"]:
            for messaging_event in entry["messaging"]:
                if messaging_event.get("message"):  # someone sent us a message
                    sender_id = messaging_event["sender"]["id"]        # the Facebook ID of the person sending you the message
                    recipient_id = messaging_event["recipient"]["id"]  # the recipient's ID, which should be your page's facebook ID
                    message_text = messaging_event["message"]["text"]  # the message's text
                    responseai = response(message_text, sender_id)
                    send_message(sender_id, responseai)
                if messaging_event.get("delivery"):  # delivery confirmation
                    pass
                if messaging_event.get("optin"):  # optin confirmation
                    pass
                if messaging_event.get("postback"):  # user clicked/tapped "postback" button in earlier message
                    pass
    return "Ok", 200





 @app.route('/', methods=['GET'])
 def verify():
    # when the endpoint is registered as a web hook, it must echo back
    # the 'hub.challenge' value it receives in the query arguments
    if request.args.get("hub.mode") == "subscribe" and request.args.get("hub.challenge"):
        if not request.args.get("hub.verify_token") == os.environs["VERIFY_TOKEN"]:
            return "Verification token mismatch", 403
        return request.args["hub.challenge"], 200

    return "Hello World", 200

Когда я получаю доступ к своему локальному хосту: 5000, где мойFlask есть, только браузер Hello World появляется.Откуда мне знать, что функция web-hook работает?Должен ли он также отображать 'Ok'?

1 Ответ

0 голосов
/ 12 марта 2019

Ваш браузер не будет отправлять запрос POST, без некоторого дополнительного кодирования HTML и Javascript.Самый простой способ проверить, работает ли ваш хук, - это использовать клиент командной строки curl .

. Он может отправлять как запросы GET, так и POST.Проверка правильности работы вашего обработчика GET:

curl -X GET "localhost:5000/?hub.verify_token=<YOUR_VERIFY_TOKEN>&hub.challenge=CHALLENGE_ACCEPTED&hub.mode=subscribe"

должно выдать CHALLENGE_ACCEPTED в качестве вывода.Затем протестируйте обработчик POST с помощью:

curl -H "Content-Type: application/json" -X POST "localhost:5000/" -d '{"sender":{"id":"<PSID>"}, "recipient":{"id":"<PAGE_ID>"}, "timestamp":1458692752478, "message":{"mid":"mid.1457764197618:41d102a3e1ae206a38", "text":"hello, world!", "quick_reply": {"payload": "<DEVELOPER_DEFINED_PAYLOAD>"}}}'

См. Настройка вашего Webhook документации по началу работы с Messenger Platform и получено сообщение событие для получения подробной информации о том, что ожидать при обработке события сообщения.

Другой вариант - написать тесты Python , чтобы покрыть то же самое:

import os
import pytest

import your_flask_module

@pytest.fixture
def client():
    your_flask_module.app.config['TESTING'] = True
    yield your_flask_module.app.test_client()

def test_register(client):
    args = {
        'hub.verify_token': os.environ["VERIFY_TOKEN"],
        'hub.challenge': 'CHALLENGE_ACCEPTED',
        'hub.mode': 'subscribe',
    }
    rv = client.get('/', params=args)
    assert b'CHALLANGE_ACCEPTED' in rv.data

def test_message_event(client):
    event = {
        "sender": {"id": "<PSID>"},
        "recipient": {"id":"<PAGE_ID>"},
        "timestamp": 1458692752478,
        "message": {
            "mid": "mid.1457764197618:41d102a3e1ae206a38",
            "text": "hello, world!",
            "quick_reply": {
                "payload": "<DEVELOPER_DEFINED_PAYLOAD>"
            }
        }
    }
    rv = client.post('/', json=event)
    assert rv.status_code == 200
...