0

在我之前的问题中,我询问了 Facebook messenger bot 错误代码 2018144 的含义,结果证明是关于发送限制。这次我试图了解为什么从我的本地计算机发送消息有效,但在我将代码上传到 App Engine 后却非常神秘地停止工作。

本地测试

这是机器人消息发送代码(send_message.py):

import requests

def send_message():
    url = "https://graph.facebook.com/me/messages"

    querystring = {"access_token":"ACCESS TOKEN HERE"}

    payload = """{
    "message": {
        "attachment": {
            "type": "template", 
            "payload": {
                "template_type": "generic", 
                "elements": [
                    {
                        "buttons": [
                            {
                                "type": "game_play", 
                                "title": "Play"
                            }
                        ], 
                        "title": "Hello StackOverflow!"
                    }
                ]
            }
        }
    }, 
    "recipient": {
        "id": "1647209385355472"
    }
}"""
    headers = {'Content-Type': 'application/json'}

    response = requests.request("POST", url, data=payload, headers=headers, params=querystring)
    return response.text

if __name__ == '__main__':
    print send_message()

当我运行这段代码时,它会打印出来,并且我在 Facebook 上收到一条消息:

> python2.7 send_message.py
{"recipient_id":"1647209385355472","message_id":"mid.$cAACstl6Vojpotk0niFihQfeszW_t"}

在此处输入图像描述

在 App Engine 开发服务器上进行测试

要将其转换为 App Engine 应用程序,我使用与以前完全相同的代码,除了添加一个路由以在我收到 GET 请求时调用以前的代码并修补请求库以与 App Engine 一起使用。

import webapp2
from requests_toolbelt.adapters import appengine
appengine.monkeypatch()
from send_message import send_message

class MsgTest(webapp2.RequestHandler):
    def get(self):
        self.response.write(send_message())

app = webapp2.WSGIApplication([
    ('/msgtest', MsgTest)
])

当我启动 dev_appserver.py 并在浏览器中访问我的应用程序时,它也可以工作。

在此处输入图像描述

在 App Engine (Google Cloud) 上进行测试

现在,如果我部署代码(gcloud app deploy)然后访问已部署的应用程序,它应该可以工作,因为它运行的代码与以前相同。但是,即使我在两者之间打开和关闭游戏以重置任何可能的发送限制,它也总是失败。

在此处输入图像描述

这怎么可能?使用相同凭据的相同 API 调用在本地工作,但从云调用时失败。

4

1 回答 1

0

我发现某些东西(可能是 App Engine)正在缓存 POST 请求。当发布一次不起作用时,答案会被缓存,因此它似乎永远不会起作用。当我将 cache_breaker 添加到请求 URL 时,机器人消息开始工作。

POST 请求会被缓存似乎有点奇怪,而且如此强烈以至于我从来没有通过一个工作请求,所以当我进行自己的缓存断路器更改时,Facebook 也可能只是更改了某些内容。无论哪种情况,它现在似乎都有效。

于 2018-04-11T07:25:16.050 回答