Я заметил, что все образцы кода node.js для администратора Google Analytics и данных Google Analytics предполагают учетную запись службы и либо файл JSON, либо переменную среды GOOGLE_APPLICATION_CREDENTIALS.
например
const analyticsAdmin = require('@google-analytics/admin');
async function main() {
// Instantiates a client using default credentials.
// TODO(developer): uncomment and use the following line in order to
// manually set the path to the service account JSON file instead of
// using the value from the GOOGLE_APPLICATION_CREDENTIALS environment
// variable.
// const analyticsAdminClient = new analyticsAdmin.AnalyticsAdminServiceClient(
// {keyFilename: "your_key_json_file_path"});
const analyticsAdminClient = new analyticsAdmin.AnalyticsAdminServiceClient();
const [accounts] = await analyticsAdminClient.listAccounts();
console.info('Accounts:');
accounts.forEach(account => {
console.info(account);
});
}
Я создаю службу, которая позволяет пользователям использовать свою учетную запись для доступа к своим данным, поэтому использование служебной учетной записи не подходит.
Сначала я подумал, что смогу использовать google-api-node-client — аутентификация будет обрабатываться путем создания URL-адреса для перенаправления и танца oauth...
Использование google-api-nodejs-client:
const {google} = require('googleapis');
const oauth2Client = new google.auth.OAuth2(
YOUR_CLIENT_ID,
YOUR_CLIENT_SECRET,
YOUR_REDIRECT_URL
);
// generate a url that asks permissions for Google Analytics scopes
const scopes = [
"https://www.googleapis.com/auth/analytics", // View and manage your Google Analytics data
"https://www.googleapis.com/auth/analytics.readonly", // View your Google Analytics data
];
const url = oauth2Client.generateAuthUrl({
access_type: 'offline',
scope: scopes
});
// redirect to `url` in a popup for the oauth dance
После аутентификации Google перенаправляет на GET /oauthcallback?code = {authorizationCode}, поэтому мы собираем код и получаем токен для выполнения последующих вызовов с поддержкой OAuth2:
// This will provide an object with the access_token and refresh_token.
// Save these somewhere safe so they can be used at a later time.
const {tokens} = await oauth2Client.getToken(code)
oauth2Client.setCredentials(tokens);
// of course we need to handle the refresh token too
Это все прекрасно работает, но можно ли подключить клиент OAuth2 из кода google-api-node-client в код google-analytics-admin?
👉 Похоже, мне нужно как-то вызвать analyticsAdmin.AnalyticsAdminServiceClient() с токеном доступа, который я уже получил, но как?





Простой ответ здесь: не беспокойтесь о библиотеках Node.js для администратора Google Analytics и данных Google Analytics.
Избавьтесь от посредников и создайте очень простую оболочку, которая напрямую запрашивает REST API. Тогда у вас будет обзор всего процесса, и любые допущенные ошибки будут вашими собственными.
Если вы правильно обрабатываете токен обновления, это, вероятно, все, что вам нужно:
const getResponse = async (url, accessToken, options = {}) => {
const response = await fetch(url, {
...options,
headers: {
Authorization: `Bearer ${accessToken}`,
},
});
return response;
};
Я использую Python, но метод может быть похожим. На основе полученного токена необходимо создать объект Credentials:
credentials = google.auth.credentials.Credentials(token=YOUR_TOKEN)
Затем используйте его для создания клиента:
from google.analytics.admin import AnalyticsAdminServiceClient
client = AnalyticsAdminServiceClient(credentials=credentials)
client.list_account_summaries()