在我之前的问题中,我询问了 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 调用在本地工作,但从云调用时失败。