Проблема
Я пытаюсь получить информацию со страниц 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"
}
]
}