Twitter-autohook部署后不起作用 将ngrok授权传递给Autohook 禁用ngrok

问题描述

我使用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(免费):

  1. 转到ngrok account signup page,然后创建一个帐户
  2. 在ngrok控制台中,选择身份验证➡️您的身份验证
  3. 复制身份验证令牌
  4. 如果您有.env.twitter文件,请添加NGROK_AUTH_TOKEN=(the authtoken you just copied)。这将有助于您的本地开发。
  5. 设置具有相同名称和值的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}`);
});