Проблема с токеном доступа при запросе информации о страницах API Graph Facebook внутри скрипта Google Apps - PullRequest
0 голосов
/ 30 июня 2019

Проблема

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

[{"code":400,"body":"{\"error\":{\"message\":\"(#190) This method must be called with a Page Access Token\",\"type\":\"OAuthException\",\"code\":190,\"fbtrace_id\":\"AwSk6k26bAqpoYBJNk8bnQr\"}}"}]

Исследование

При ведении журнала я вижу, что когда я отправляю запрос "me / account" , показанный токен доступа фактически отличается от того, который используется в функции getData , которая выглядит быть токеном доступа пользователя вместо первого. Я действительно потерян в этот момент, просматривал всю документацию, чтобы увидеть, что я могу сделать по-другому, но я полностью вне своей лиги, любая помощь будет высоко ценится.

Примеры кода

Вот коды внутри проекта скриптов приложений. Я немного его почистил, чтобы вы могли сосредоточиться на этой проблеме аутентификации:

Code.gs

function getConfig(request) {
  var service = getService();
  var response = JSON.parse(UrlFetchApp.fetch('https://graph.facebook.com/v3.3/me/accounts', {
    headers: {
      Authorization: 'Bearer ' + service.getAccessToken()
    }
  }));
  var config = {
    configParams: [
      {
        type: 'SELECT_SINGLE',
        name: 'pageID',
        displayName: 'Page ID',
        helpText: 'Please select the Page ID for which you would like to retrieve the Statistics.',
        options: []
      }
    ],
    dateRangeRequired: true
  };
  response.data.forEach(function(field) {
    config.configParams[0].options.push({
      label: field.name,
      value: field.id
    });
  })
  return config;
};

// All good until here, gets everything right, the page and it's information




function getData(request) {
  var service = getService();

  // Define the interval wanted
  var dateStart = '2019-06-01';
  var dateFinish = '2019-06-15';

  // Set the information wanted: page fans and impressions
  var batch = [{'method': 'GET', 'relative_url': request.configParams.pageID + '/insights/page_fans,page_impressions?since=' + dateStart + '&until=' + dateFinish}];

  // Fetch the data with UrlFetchApp
  var url = 'https://graph.facebook.com?include_headers=false&batch=' + encodeURIComponent(JSON.stringify(batch))




  // Here is the actual request to Facebook, in which I'm getting the error
  var result = UrlFetchApp.fetch(url, {
    method: 'POST',
    headers: {    
      Authorization: 'Bearer ' + service.getAccessToken()
    }
  });
  console.log('Response: '+result); // Illustrating the response #190

  var response =  JSON.parse(result.getContentText()); 

};

// Returns the authentication method required.
function getAuthType() {
  var response = {
    'type': 'OAUTH2'
  };
  return response;
}

Oauth2_FB.gs

// Got it from https://github.com/gsuitedevs/apps-script-oauth2/blob/master/samples/Facebook.gs

// I've set this with my own information
var CLIENT_ID = '12345678901234'; 
var CLIENT_SECRET = 'abcdefghijklmnopqrstuvxyz';

// Authorizes and makes a request to the Facebook API.
function runFBAuth(e) {
  var service = getService();
  var html = '';
  if (service.hasAccess()) {
    var url = 'https://graph.facebook.com/v3.3/me';
    var response = UrlFetchApp.fetch(url, {
      headers: {
        'Authorization': 'Bearer ' + service.getAccessToken()
      }
    });
    var result = JSON.parse(response.getContentText());
    Logger.log(JSON.stringify(result, null, 2));
  } else {
    var authorizationUrl = service.getAuthorizationUrl();
    Logger.log('Open the following URL and re-run the script: %s',
        authorizationUrl);
  }
}

// Reset the authorization state, so that it can be re-tested.
function reset() {
  var service = getService();
  service.reset();
}

// Configures the service.
function getService() {
  return OAuth2.createService('Facebook')
      // Set the endpoint URLs.
      .setAuthorizationBaseUrl('https://www.facebook.com/dialog/oauth?scope=manage_pages,read_insights')
      .setTokenUrl('https://graph.facebook.com/v3.3/oauth/access_token')

      // Set the client ID and secret.
      .setClientId(CLIENT_ID)
      .setClientSecret(CLIENT_SECRET)

      // Set the name of the callback function that should be invoked to complete
      // the OAuth flow.
      .setCallbackFunction('authCallback')

      // Set the property store where authorized tokens should be persisted.
      .setPropertyStore(PropertiesService.getUserProperties());
}

// Handles the OAuth callback.
function authCallback(request) {
  var service = getService();
  var authorized = service.handleCallback(request);
  if (authorized) {
    return HtmlService.createHtmlOutput('Success! Please close the tab and continue.');
  } else {
    return HtmlService.createHtmlOutput('Denied! Please close the tab and contact the developer.');
  }
}

function get3PAuthorizationUrls() {
  var service = getService();
  if (service == null) {
    return '';
  }
  return service.getAuthorizationUrl();
}

function isAuthValid() {
  var service = getService();
  if (service == null) {
    return false; 
  }
  return service.hasAccess();
}

Что мне нужно

Я ожидаю получить ответ в формате JSON, с которым я могу работать так, как мне нужно, и он действительно должен быть таким же, как в GRAPH EXPLORER из Facebook:

{
   "data": [
      {
         "name": "page_fans",
         "period": "day",
         "values": [
            {
               "value": 17633,
               "end_time": "2019-06-27T07:00:00+0000"
            },
            {
               "value": 17639,
               "end_time": "2019-06-28T07:00:00+0000"
            }
         ],
         "title": "Lifetime Total Likes",
         "description": "Lifetime: The total number of people who have liked your Page. (Unique Users)",
         "id": "{PAGE_ID}/insights/page_fans/day"
      },
      {
         "name": "page_impressions",
         "period": "day",
         "values": [
            {
               "value": 647,
               "end_time": "2019-06-27T07:00:00+0000"
            },
            {
               "value": 63508,
               "end_time": "2019-06-28T07:00:00+0000"
            }
         ],
         "title": "Daily Total Impressions",
         "description": "Daily: The number of times any content from your Page or about your Page entered a person's screen. This includes posts, check-ins, ads, social information from people who interact with your Page and more. (Total Count)",
         "id": "{PAGE_ID}/insights/page_impressions/day"
      }
   ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...