Python keeps KeyError: 'message' when fetch data from Messenger Callback - Python/flask

Python keeps KeyError: 'message' when fetch data from Messenger Callback - Python/flask

我尝试在 Messenger 上构建一个简单的机器人,只要我们向它发送消息,它就会回显。

至此消息发送成功,但是在日志中,一直显示错误:

message_id = data['entry'][0]['messaging'][0]['message']['mid']
KeyError: 'message'

我不知道为什么会这样,这是逻辑操作:

import requests
import traceback
from flask import request

from ...config.default import VERIFY_TOKEN, ACCESS_TOKEN

ROOT_URL = "https://graph.facebook.com/v2.6/me/messages?access_token="

def reply(user_id, page_id, msg):
    data = {
        "sender": {"id": page_id},
        "recipient": {"id": user_id},
        "message": {"text": msg}
    }
    requests.post(ROOT_URL + ACCESS_TOKEN, json=data)


def verification_handler():
    if request.args['hub.verify_token'] == VERIFY_TOKEN:
        return request.args['hub.challenge'], 200
    return "Invalid verification token"


def handle_incoming_messages(data):
    try:
        # Get all data from Messenger callback - Text
        recipient_id = data['entry'][0]['messaging'][0]['recipient']['id']
        sender_id = data['entry'][0]['messaging'][0]['sender']['id']
        timestamp = data['entry'][0]['messaging'][0]['timestamp']

        message_id = data['entry'][0]['messaging'][0]['message']['mid']
        text = data['entry'][0]['messaging'][0]['message']['text']

        reply(sender_id, recipient_id, text)
    except KeyError:
        print(traceback.format_exc())

    return ''

这是路线:

from flask import Blueprint, request

from .ops import verification_handler, handle_incoming_messages


mod = Blueprint('messenger', __name__)


# Route: /messenger/
@mod.route('/', methods=['GET'])
def verify():
    """Facebook will GET request to this endpoint for verification."""
    return verification_handler()


# Route: /messenger/
@mod.route('/', methods=['POST'])
def handle():
    data = request.json
    handle_incoming_messages(data)

    return ''


# Route: /messenger/hello
@mod.route('/hello')
def hello():
    return 'hello there'

我没有足够的声誉来发表评论,所以我必须 post 在这里。

来自Python Wiki

Python raises a KeyError whenever a dict() object is requested (using the format a = adict[key]) and the key is not in the dictionary.

您确定密钥 'message' 存在吗?

我这样做是为了提取信息

if keys_exist(event, ['body']):
            event_entry=json.loads(event['body'])
            if ((len(event_entry['entry'])>0) & (keys_exist(event_entry['entry'][0],['messaging'])) ):
                messaging_event = event_entry['entry'][0]['messaging'][0]
                if (keys_exist(messaging_event,['message'])):
                    msg_txt   = messaging_event['message']['text']
                    sender_id = messaging_event['sender']['id']