【问题标题】:How to get a new session access token in Facebook Messenger Bot如何在 Facebook Messenger Bot 中获取新的会话访问令牌
【发布时间】:2016-12-29 08:10:20
【问题描述】:

我更改了 Facebook 帐户的密码,我创建的 Facebook Messenger Bot 无法再回复我的消息。

这个错误出现在我的 Heroku 日志中:

2016-12-28T22:19:32.647313+00:00 heroku[router]: at=info method=POST path="/webhook" host=messengerrainbot.herokuapp.com request_id=0a347c11-4d67-4dcf-ae3b-2b8d4cc55b8d fwd="66.220.156.117" dyno=web.1 connect=0ms service=3ms status=200 bytes=196
2016-12-28T22:19:32.749540+00:00 app[web.1]: Error:  { message: 'Error validating access token: The session has been invalidated because the user has changed the password.',
2016-12-28T22:19:32.749560+00:00 app[web.1]:   type: 'OAuthException',
2016-12-28T22:19:32.749561+00:00 app[web.1]:   code: 190,
2016-12-28T22:19:32.749562+00:00 app[web.1]:   error_subcode: 460,
2016-12-28T22:19:32.749563+00:00 app[web.1]:   fbtrace_id: 'FlCFAaxy8j3' }

我在任何地方都找不到如何获取新的会话访问令牌。

我的 index.js 文件控制着一切:

var express = require('express');
var bodyParser = require('body-parser');
var request = require('request');
var app = express();

app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
app.listen((process.env.PORT || 3000));

// Server frontpage
app.get('/', function (req, res) {
  res.send('This is TestBot Server');
});

// Facebook Webhook
app.get('/webhook', function (req, res) {
  if (req.query['hub.verify_token'] === 'EAAWWpxUBMGoBANlKHUR63Dz2WLZBMHACQRi65zwj46wFSb3aJCThUV4BLwevZCciUDeyVnYpGcfgrzu0reh3XqKdTkZBxVA1HhIfrAhbQjsy5ABYfUFTbfAdck4QmH0vJV6ZCAgAcGdrBl3pMaTQa2eCrPetlsZBHXAjZBIuISOgZDZD') {
    res.send(req.query['hub.challenge']);
  } else {
    res.send('Invalid verify token');
  }
});

// handler receiving messages
app.post('/webhook', function (req, res) {
  var events = req.body.entry[0].messaging;
  for (i = 0; i < events.length; i++) {
    var event = events[i];
    if (event.message && event.message.text) {
      sendMessage(event.sender.id, {text: "Hi. Send your location"}); // event.message.text
    } else if (event.message && event.message.attachments && event.message.attachments[0] && event.message.attachments[0].payload && event.message.attachments[0].payload.coordinates) {
      urlBase = "http://api.wunderground.com/api/57fd25cc02e9da86/conditions/forecast/alert/q/"
      lat = event.message.attachments[0].payload.coordinates.lat
      lon = event.message.attachments[0].payload.coordinates.long
      totUrl = urlBase + String(lat) + "," + String(lon) + ".json"

      request({
        url: totUrl,
        json: true
      }, function (error, response, body) {

        if (!error && response.statusCode === 200) {
          var rain = body.current_observation.precip_1hr_metric
          if (rain > 0) {
            sendMessage(event.sender.id, {text: "It's gonna rain. Grab an umbrella!"});
          } else {
            sendMessage(event.sender.id, {text: "No rain ahead!"});
          }
        }
      })
    } 
    events = []
  }
  req.body.entry[0].messaging = []
  res.sendStatus(200);
});

// generic function sending messages
function sendMessage(recipientId, message) {
  request({
    url: 'https://graph.facebook.com/v2.6/me/messages',
    qs: {access_token: process.env.PAGE_ACCESS_TOKEN},
    method: 'POST',
    json: {
      recipient: {id: recipientId},
      message: message,
    }
  }, function(error, response, body) {
    if (error) {
      console.log('Error sending message: ', error);
    } else if (response.body.error) {
      console.log('Error: ', response.body.error);
    }
  });
};

和一个链接 my full Github repo 如果需要

【问题讨论】:

    标签: node.js facebook-graph-api heroku facebook-messenger facebook-messenger-bot


    【解决方案1】:

    您可以在应用程序中生成新的访问令牌:

    【讨论】:

    • 我不相信这是正确的标记。我认为该令牌用于 Facebook 与节点服务器通信。我想我需要与这个特定的 Facebook 用户(恰好是我)建立一个新会话,以获得向他们发送消息的权限。每次您的机器人的任何用户更改密码时都必须手动更改该令牌,这对我来说似乎很荒谬。
    • @PatMyron 您不需要用户访问令牌,因为您正在使用您的页面发送消息并且您没有访问用户数据。要使用端点https://graph.facebook.com/v2.6/me/messages?access_token=&lt;PAGE_ACCESS_TOKEN&gt;,您需要一个页面访问令牌:developers.facebook.com/docs/messenger-platform/…。您可以在此处查看所有令牌类型以及如何生成它们:developers.facebook.com/docs/facebook-login/access-tokens
    • 我确实认为这个 PA‌​GE_ACCESS_TOKEN 是由于密码更改而过期的令牌。我会研究这两个链接。
    • @PatMyron 没错,可能是因为您是页面或应用程序的所有者,但它不应过期。这似乎是 API 的问题。从您的应用生成新的页面令牌应该可以解决它。
    • @PatMyron 用户似乎失去了您的应用授权。在这里您可以找到您的方案以及在页面末尾获取访问令牌的代码:developers.facebook.com/blog/post/2011/05/13/…
    猜你喜欢
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    相关资源
    最近更新 更多