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 在我自己创建时改变了一些正确的东西缓存断路器更改。无论哪种情况,它现在似乎都有效。
在我的
本地测试
这是机器人消息发送代码(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 在我自己创建时改变了一些正确的东西缓存断路器更改。无论哪种情况,它现在似乎都有效。