Facebook Graph API - Instagram - Доступ к общедоступному контенту страницы - PullRequest
0 голосов
/ 12 сентября 2018

Я разрабатываю API в NodeJS, чтобы показывать фиды в социальных сетях на моей собственной странице. Я могу показать Facebook, Twitter и Instagram (через Facebook Graph API), но последний не отображается и возвращает ошибку:

sdk.js: 122

Uncaught TypeError: Невозможно прочитать свойство 'id' из неопределенного

в: 19: 55

в .__ обертке .a .__ обертке (sdk.js: 122)

при F (sdk.js: 139)

на Object.b.onload (sdk.js: 134)

на sdk.js: 134

в sdk.js: 50 at XMLHttpRequest.c.onreadystatechange (sdk.js: 134)

Это происходит только тогда, когда я добавляю изображение на страницу. Поскольку обработка изображений немного особенная, я считаю, что существует конфликт URL между Facebook SDK и моим get paths в узле.

Мой код:

const express = require('express');
const https = require('https');
const fs = require('fs');
const app = express();

const config = require('./config');

var webId;

var options = {
  key: fs.readFileSync(config.paths.certificate.key),
  cert: fs.readFileSync(config.paths.certificate.crt),
  requestCert: false,
  rejectUnauthorized: false
};

app.use(function (req, res, next) {
  console.log(req.url);

  res.setHeader("Access-Control-Allow-Origin", "*");
  res.setHeader("Access-Control-Allow-Credentials", "true");
  res.setHeader("Access-Control-Allow-Methods", "GET, HEAD, OPTIONS, POST, PUT");
  res.setHeader("Access-Control-Allow-Headers", "Accept, Access-Control-Allow-Headers, Access-Control-Request-Headers, Access-Control-Request-Method, Authorization, Content-Type, Origin, X-Requested-With");
  next();
});

/**
 * HTTP GET for skip favicon request
 */
app.get('/favicon.ico', function(req, res) {
  res.status(404).send('No favicon found');
});

/**
 * HTTP GET for views from base path
 */
app.get(/^(\/\w+.\b(html|htm|xhtml)\b)/g, function(req, res) {
  let lastBar = req.url.lastIndexOf('/');
  let page = req.url.substr(lastBar);

  res.sendFile(page, {root: config.paths.webs + webId});
});

/**
 * HTTP GET for resources (images)
 */
app.get(/^(\/\b(web_resources)\b)/g, function(req, res) {
  if (typeof(webId) === undefined) {
    webId = req.params.id; 
  }
  res.sendFile(req.url, {root: config.paths.resources});
});

/**
 * HTTP GET for files (.js, .css, etc.) from another folder level
 */
app.get('/:folder/:file', function(req, res) {
  if (typeof(webId) === undefined) {
    webId = req.params.id; 
  }
  let folder = req.params.folder;
  let file = req.params.file;

  res.sendFile(file, {root: config.paths.webs + webId + '/' + folder});
});

/**
 * HTTP GET for .js files from the base path
 */
app.get(/\/\w+.\b(js)/, function(req, res) {
  let lastBar = req.url.lastIndexOf('/');
  let script = req.url.substr(lastBar);

  res.sendFile(script, {root: config.paths.webs});
});

/**
 * HTTP GET for index page
 */
app.get('/:id', function(req, res) {
  webId = req.params.id;
  res.sendFile('index.html', {root: config.paths.webs + webId});
});

/**
 * Server creation listening at secure port 443
 */
https.createServer(options, app).listen(443, function() {
  console.clear();
  console.log("NodeJS secure server started at port 443");
});

UPDATE

Я мог бы свести проблему к точному куску кода:

FB.getLoginStatus(function (response) {
  if (response.status === "connected") {
    FB.api(
      "/" + id + "/",
      "GET", { "fields": "instagram_business_account" },
      // ***** THE PROBLEM IS HERE ***** //
      function (response) {
        if (response.error && response.error !== '') {
          console.log("Error recovering 'instagram_business_account':");
          console.log(response.error);
        } else {
          FB.api(
            "/" + response.instagram_business_account.id + "/media",
            "GET", { "fields": "shortcode" },
            function (response) {
              for (var i = 0; i < response.data.length; i++) {
                var xhttp = new XMLHttpRequest();

                xhttp.onreadystatechange = function() {
                  if (this.readyState == 4 && this.status == 200) {
                    html = JSON.parse(this.response).html.replace('<script async defer src="//www.instagram.com/embed.js"></script>', '');
                    document.getElementById("ig-posts").innerHTML += html;
                  }
                };

                xhttp.open("GET", "https://api.instagram.com/oembed/?url=http://instagr.am/p/" + response.data[i].shortcode + "/", true);
                xhttp.send();
              }
            }
          );
        }

      }
    );
  } else {
    console.log("Error recovering access token: Not connected.")
    console.log(response)
  }
});

Как я указал в коде, проблема в том, что я не могу получить 'instagram_business_account', потому что:

(# 10) Чтобы использовать «Доступ к общедоступному контенту страницы», вы используете эту конечную точку должен быть рассмотрен и одобрен Facebook. Чтобы отправить эту страницу публично Доступ к контенту »для ознакомления, пожалуйста, прочитайте нашу документацию на Возможности просмотра: https://developers.facebook.com/docs/apps/review

Что может иметь смысл, но это происходит только тогда, когда я добавляю изображение на страницу, где я хочу отобразить свой канал в Instagram. В остальном работает отлично.

...