2017-05-24 129 views
0

我试图在Messenger上创建一个简单的机器人,只要我们向它发送消息就会回显。Python在使用Messenger Callback获取数据时保留KeyError:'message' - Python/flask

消息是迄今为止发送成功,但在日志中,它不断显示错误:

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' 
+0

嗨u能张贴网络挂接的要求呢? –

回答

0

我这样做是为了提取信息

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'] 
0

我没有足够的声望留下评论,所以我必须在这里发表。

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.

你确定键 '消息' 的存在?

+0

它必须存在,因为消息发送成功,意味着'text = data ['entry'] [0] ['messaging'] [0] ['message'] ['text']'工作正常。并且还提到信使文档:[https://developers.facebook.com](https://developers.facebook.com/docs/messenger-platform/webhook-reference/message) – rizkiaditya24