Facebook Instant game bot 消息发送在本地有效,但在上传到 App Engine 后失败

Facebook Instant game bot message sending works locally, but fails after uploading to App Engine

在我的中询问了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 Whosebug!"
                    }
                ]
            }
        }
    }, 
    "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 请求并修补 requests[=47 时添加一个调用之前代码的路由=] 与 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 云)

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

怎么会这样?使用相同凭证的相同 API 调用在本地有效,但从云端调用时失败。

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

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