问题描述
我使用twitter-autohook模块和用于heroku(hobby)的服务器制作了Twitter机器人
我的机器人自动响应提及或发送dm include关键字的用户
当此应用部署到heroku 6〜7小时(不准确)时,我的机器人响应提及(使用流)但不响应dm(使用webhook) 没有错误(日志),也没有检测到dm(日志也),但是同时,它可以检测到提及(流)
我该如何解决?
解决方法
Autohook依靠ngrok将其内置的webhook服务器从本地计算机公开到Internet。几个小时后,ngrok将暂停隧道,这将阻止Autohook接收webhook事件。
有两种方法可以防止这种情况的发生。
将ngrok授权传递给Autohook
Autohook接受ngrok Authokens。 Authtoken是ngrok发行的认证密钥。如果提供一个,ngrok可以使隧道保持更长的寿命。您可以通过在ngrok上创建一个帐户来获得Authoken(免费):
- 转到ngrok account signup page,然后创建一个帐户
- 在ngrok控制台中,选择身份验证➡️您的身份验证
- 复制身份验证令牌
- 如果您有
.env.twitter
文件,请添加NGROK_AUTH_TOKEN=(the authtoken you just copied)
。这将有助于您的本地开发。 - 设置具有相同名称和值的Heroku环境变量:
heroku config:set NGROK_AUTH_TOKEN (the authtoken you just copied)
禁用ngrok
Autohook使用ngrok创建可从Internet访问的Webhook URL。部署到Heroku(或任何其他服务)时,您已经拥有一个公共服务器和一个公共URL,这意味着您完全不需要在Heroku上使用ngrok。
您的服务器的路由器必须提供Webhook路由。如果您使用的是Express,则实现起来非常简单:
app.all('/webhook/twitter',async (request,response) => {
// Fulfills the CRC check when Twitter sends a CRC challenge
if (request.query.crc_token) {
const signature = validateWebhook(request.query.crc_token,{consumer_secret: process.env.TWITTER_CONSUMER_SECRET});
response.json(signature);
} else {
// Send a successful response to Twitter
response.sendStatus(200);
// Add your logic to process the event
console.log('Received a webhook event:',request.body);
}
});
服务器启动时,不需要启动ngrok。相反,只需将URL传递到您的Heroku实例即可自动挂勾。
const HEROKU_WEBHOOK_URL = 'https://your-app-name.herokuapp.com/webhook/twitter';
const listener = server.listen(process.env.PORT,async () => {
await webhook.start(HEROKU_WEBHOOK_URL);
console.log(`Your app is listening on port ${listener.address().port}`);
});