facebook: постоянный токен доступа к странице?


193

Я работаю над проектом, в котором одним из источников данных являются страницы на Facebook. Он импортирует некоторые данные из него периодически, без участия GUI. Затем мы используем веб-приложение, чтобы показать данные, которые у нас уже есть.

Не вся информация является публичной. Это означает, что я должен получить доступ к данным один раз, а затем сохранить их. Тем не менее, я не знаю процесс, и я еще не нашел хороший учебник по этому вопросу. Я думаю, мне нужно access_token, как я могу получить его от пользователя, шаг за шагом? Пользователь является администратором страницы Facebook, должен ли он добавить какое-нибудь наше приложение FB на страницу?

РЕДАКТИРОВАТЬ: Спасибо @phwd за совет. Я сделал учебник, как получить постоянный токен доступа к странице, даже если он offline_accessбольше не существует.

РЕДАКТИРОВАТЬ: Я только что узнал, что он ответил здесь: долгосрочный токен доступа FB для сервера, чтобы получить информацию о странице FB



Это так кажется. У меня лучше заголовок, у него более подробный вопрос, и мы оба приняли примерно один и тот же ответ.
Власек

Ответы:


638

Следуя инструкциям, изложенным в документации по расширению маркеров страниц Facebook, я смог получить токен доступа к странице, срок действия которого не истек.

Я предлагаю использовать Graph API Explorer для всех этих шагов, если не указано иное.

0. Создать приложение Facebook

Если у вас уже есть приложение , перейдите к шагу 1.

  1. Перейти к моим приложениям .
  2. Нажмите «+ Добавить новое приложение».
  3. Настройте приложение для веб-сайта.

Вам не нужно менять его разрешения или что-то еще. Вам просто нужно приложение, которое не исчезнет, ​​прежде чем вы закончите с вашим токеном доступа.

1. Получить токен доступа для короткоживущего пользователя

  1. Перейдите в Graph API Explorer .
  2. Выберите приложение, для которого вы хотите получить токен доступа (в раскрывающемся меню «Приложение», а не в меню «Мои приложения»).
  3. Нажмите «Получить токен»> «Получить токен доступа пользователя».
  4. Во всплывающем окне на вкладке «Расширенные разрешения» установите флажок «manage_pages».
  5. Нажмите «Получить токен доступа».
  6. Предоставьте доступ из учетной записи Facebook, у которой есть доступ для управления целевой страницей. Обратите внимание, что если этот пользователь потеряет доступ к окончательному, несостоявшийся токен доступа, скорее всего, перестанет работать.

Токен, который появляется в поле «Токен доступа», является вашим недолговечным токеном доступа.

2. Сгенерируйте маркер доступа с длительным сроком действия

Следуя этим инструкциям из документации Facebook, сделайте запрос GET

https://graph.facebook.com/v2.10/oauth/access_token?grant_type=fb_exchange_token&client_id= {app_id} & client_secret = {app_secret} & fb_exchange_token = {short_lived_token}

ввод идентификатора и секрета вашего приложения, а также кратковременного токена, созданного на предыдущем шаге.

Вы не можете использовать Graph API Explorer . По какой-то причине он застревает на этом запросе. Я думаю, что это потому, что ответ не JSON, а строка запроса. Поскольку это запрос GET, вы можете просто перейти по URL в вашем браузере.

Ответ должен выглядеть так:

{"access_token": " ABC123 ", "token_type": "bearer", "expires_in": 5183791}

«ABC123» будет вашим долгожданным токеном доступа. Вы можете поместить его в Access Token Debugger для проверки. Под «Истекает» должно быть что-то вроде «2 месяца».

3. Получить идентификатор пользователя

Используя маркер долговременного доступа, сделайте запрос GET для

https://graph.facebook.com/v2.10/me?access_token= {long_lived_access_token}

idПоле ваш идентификатор учетной записи. Вам понадобится это для следующего шага.

4. Получить постоянный токен доступа к странице

Сделать запрос GET

https://graph.facebook.com/v2.10/ {account_id} / accounts? access_token = {long_lived_access_token}

Ответ JSON должен иметь dataполе, под которым находится массив элементов, к которым у пользователя есть доступ. Найдите элемент для страницы, с которой вы хотите получить токен постоянного доступа. access_tokenПоле должно иметь фишку ваш постоянный доступ. Скопируйте его и протестируйте в отладчике токенов доступа . В поле «Срок действия» следует указать «Никогда».


14
Facebook испортил это, так что это больше не работает. :-( После шага 1.5 выше (нажав кнопку «Получить маркер доступа») в следующем диалоговом окне появляется красное предупреждение с сообщением «Отправить для проверки входа в систему - некоторые из приведенных ниже разрешений не были одобрены для использования Facebook», а также В это же время ниже появляется замок с текстом «Это не позволяет приложению публиковать в Facebook». Таким образом, между шагами 1.5 и 1.6 выше должен быть вставлен новый шаг: «Сделайте много утомительного дерьма с вашим приложением, затем отправьте его на рассмотрение, затем помолитесь и подождите. ":-( Кто-нибудь знает способ обойти это для чистого тестового приложения?
QuestionOverflow

10
Для тех, кто добирается до последнего шага, а браузер просто возвращается: message: "(#100) Tried accessing nonexisting field (accounts) on node type (Page)", type: "OAuthException", code: 100 зайдите в FB Access Token Debugger и протестируйте свой long_lived_access_token. Неизменно я видел , что через несколько минут, если вернуться назад и снова проверьте long_lived_access_token ФБ Токен доступа Debugger будет указать , что этот маркер является постоянным (не истекает: никогда)
AdjunctProfessorFalcon

14
Клянусь, если бы я не прочитал этот ответ, я бы все еще бился головой об стену недолговечным жетоном ... К сожалению, последняя часть не работает ... Я получаю (#100) Tried accessing nonexisting field (accounts) on node type (Page)ошибку ... Не удалось перейти к шагу 5 ... Еще, спасибо ... LE: ознакомьтесь с последней частью ответа, предоставленной @Vlasec. Вы можете получить маркер постоянного доступа, запросив / {pageId}? Fields = access_token & access_token = {long_lived_access_token}, чтобы устранить проблему.
Mujnoi Дьюла Тамас

15
Пришлось использовать это для последнего шага, чтобы получить мой токен постоянного доступа, так как он говорит, что «учетные записи» не существует, даже для v2.7:https://graph.facebook.com/v2.7/{page_id}?fields=access_token&access_token={long_lived_access_token}
Reado

5
На последнем шаге я получаю следующее исключение {"error": {"message": "Синтаксическая ошибка \" Ожидаемый конец строки вместо \ "? \". \ "Для символа 11: access_toke \ u200c \ u200bn" , "type": "OAuthException", "code": 2500, "fbtrace_id": "A8 + gtSaShIO"}} Кто-нибудь знает, как решить эту проблему ????
Люси

89

Вот мое решение, использующее только Graph API Explorer и Access Token Debugger :

  1. Graph API Explorer:
    • Выберите свое приложение в правом верхнем раскрывающемся меню
    • В раскрывающемся списке «Получить токен доступа пользователя» (поле справа от маркера доступа) выберите необходимые разрешения.
    • Скопировать токен доступа пользователя
  2. Отладчик токенов доступа:
    • Вставьте скопированный токен и нажмите «Отладка»
    • Нажмите «Расширить токен доступа» и скопируйте сгенерированный долгосрочный токен доступа пользователя.
  3. Graph API Explorer:
    • Вставьте скопированный токен в поле «Токен доступа»
    • Сделайте запрос GET с помощью «PAGE_ID? Fields = access_token»
    • Найдите постоянный токен доступа к странице в ответе (узел "access_token")
  4. (Необязательно) Access Token Debugger:
    • Вставьте постоянный токен и нажмите «Отладка»
    • «Истекает» должно быть «Никогда»

(Протестировано с API версии 2.9-2.11, 3.0-3.1)


3
Нет кнопки «Расширить маркер доступа» для нажатия. Может быть, они сняли это.
Сезар

4
Я вижу кнопку «Расширить»
Эдуардо

2
После расширения токена доступа (шаг 2) и его повторной отладки он никогда не истекает. Вы можете просто пройти шаги 3 и 4.
daniel_serretti

1
Спасибо за этот ответ, который легче понять, чем большой, приведенный выше. Это было действительно полезно.
Пол Лаффитт

2
О, чувак, ты в огне! Большое спасибо! Я потратил так много времени, чтобы найти эту опцию, потому что я не мог правильно отладить приложение!
Killuminati

11

В дополнение к рекомендуемым шагам в ответе Vlasec , вы можете использовать:

  • Graph API Explorer для выполнения запросов, например/{pageId}?fields=access_token&access_token=THE_ACCESS_TOKEN_PROVIDED_BY_GRAPH_EXPLORER
  • Откройте Token Debugger, чтобы получить информацию о токене доступа.

3
Это больше не работает. Токен длится всего час
флеш-змей

@flashsnake Вы действительно проверяли это на v2.8? отладчик токенов показывает, что
срок действия

Я не помню Я мог проверить это.
Вспышка

11

Я сделал скрипт PHP, чтобы сделать его проще. Создать приложение . В Graph API Explorer выберите ваше приложение и получите токен пользователя с правами manage_pages и publish_pages. Найдите идентификатор своей страницы в нижней части страницы «О программе». Заполните config vars и запустите скрипт.

<?php
$args=[
    'usertoken'=>'',
    'appid'=>'',
    'appsecret'=>'',
    'pageid'=>''
];

echo generate_token($args);

function generate_token($args){
    $r=json_decode(file_get_contents("https://graph.facebook.com/v2.8/oauth/access_token?grant_type=fb_exchange_token&client_id={$args['appid']}&client_secret={$args['appsecret']}&fb_exchange_token={$args['usertoken']}")); // get long-lived token
    $longtoken=$r->access_token;
    $r=json_decode(file_get_contents("https://graph.facebook.com/v2.8/me?access_token={$longtoken}")); // get user id
    $userid=$r->id;
    $r=json_decode(file_get_contents("https://graph.facebook.com/v2.8/{$userid}/accounts?access_token={$longtoken}")); // get permanent token
    foreach($r->data as $d) if($d->id==$args['pageid']) return $d->access_token;
}

1
+1 Только что попробовал и среди всех этих частично обескураживающих ответов он творит чудеса! Мне нравится этот ответ, потому что будущие модификации легко с небольшим редактированием здесь и там.
Сиддхант

Извините, мне не разрешили редактировать этот ответ. Итак, для Graph API 2.9 я написал другой ответ .
Сиддхант

Похоже, что они изменили вещи с 2.9, потому что ни один из этих примеров больше не работает
Сезар

10

Другой ответ PHP, чтобы сделать жизнь проще. Обновлено для Facebook Graph API 2.9 . Просто заполните и загрузите.

<?php
$args=[
/*-- Permanent access token generator for Facebook Graph API version 2.9 --*/
//Instructions: Fill Input Area below and then run this php file
/*-- INPUT AREA START --*/
    'usertoken'=>'',
    'appid'=>'',
    'appsecret'=>'',
    'pageid'=>''
/*-- INPUT AREA END --*/
];
echo 'Permanent access token is: <input type="text" value="'.generate_token($args).'"></input>';
function generate_token($args){
    $r=json_decode(file_get_contents("https://graph.facebook.com/v2.9/oauth/access_token?grant_type=fb_exchange_token&client_id={$args['appid']}&client_secret={$args['appsecret']}&fb_exchange_token={$args['usertoken']}")); // get long-lived token
    $longtoken=$r->access_token;
    $r=json_decode(file_get_contents("https://graph.facebook.com/v2.9/me?access_token={$longtoken}")); // get user id
    $userid=$r->id;
    $r=json_decode(file_get_contents("https://graph.facebook.com/v2.9/{$userid}?fields=access_token&access_token={$longtoken}")); // get permanent token
    if($r->id==$args['pageid']) $finaltoken=$r->access_token;
    return $finaltoken;
}
?>

Приложение: (альтернатива)

На диаграмме 2.9 и далее вы можете пропустить большую часть хлопот, связанных с получением токена длительного доступа, просто щелкнув Расширить маркер доступа в нижней части средства отладчика токена доступа после отладки токена короткого доступа. Вооружившись информацией о pageidи longlivedtoken, запустите php ниже, чтобы получить токен постоянного доступа.

<?php
$args=[
/*-- Permanent access token generator for Facebook Graph API version 2.9 --*/
//Instructions: Fill Input Area below and then run this php file
/*-- INPUT AREA START --*/
    'longlivedtoken'=>'',
    'pageid'=>''
/*-- INPUT AREA END --*/
];
echo 'Permanent access token is: <input type="text" value="'.generate_token($args).'"></input>';
function generate_token($args){
$r=json_decode(file_get_contents("https://graph.facebook.com/v2.9/{$args['pageid']}?fields=access_token&access_token={$args['longlivedtoken']}"));
return $r->access_token;
}
?>

Хотя второй код избавляет вас от хлопот, я рекомендую запускать первый php-код, если вы не слишком торопитесь, потому что он перепроверяет pageid и userid. Второй код не сработает, если вы ошибочно выберете токен пользователя.

Благодаря dw1 и Робу


Нет кнопки «Расширить маркер доступа», я что-то упустил?
Сезар

@CesarBielich: сначала вы должны отладить токен короткого доступа. Он отображается под результатами при отладке короткого токена приложения. Поскольку вы не видите его, вы, должно быть, отладили токен доступа пользователя. Обратите внимание, что этот ответ не распространяется на использование токена доступа; можно использовать только токен доступа к приложению. Токены доступа пользователя не могут быть постоянными. Они могут быть сгенерированы до Длинных токенов.
Сиддхант

1
@CesarBielich Я думаю, вы что-то путаете здесь. Вы можете создавать токены доступа для пользователей, приложений и страниц. Вам нужно выбрать созданное вами приложение , а не Graph API Explorerв поле «Приложение», прежде чем вы сможете запросить токен.
Сиддхант

@CesarBielich: используйте первый метод, если второй слишком запутанный для вас. Вы просто заполняете поля ввода в первом, и все происходит автоматически :)
Siddhant Rimal

Извините, я комментировал другой пост, который я только что сделал прошлой ночью, лол. Да, по какой-то причине я не смог заставить тебя работать и сделать меня никогда не истекающим токеном. Я должен был удалить v2.9во втором звонке, и это сработало для меня. Wierd
Сезар

6

Я попробовал эти шаги: https://developers.facebook.com/docs/marketing-api/access#graph-api-explorer

Получить постоянный токен доступа к странице

  • Перейти к Graph API Explorer
  • Выберите приложение в приложении
  • Вставьте долгосрочный токен доступа в Access Token
  • Рядом с токеном доступа выберите страницу, для которой требуется токен доступа. Маркер доступа отображается в виде новой строки.
  • Нажмите i, чтобы увидеть свойства этого токена доступа
  • Снова нажмите кнопку «Открыть в Access Token Tool», чтобы открыть «Access Token Debugger», чтобы проверить свойства

Один совет, он работал только для меня, когда язык страницы английский .


1
ЭТОТ ПАРЕНЬ!!! 5 виртуальных сортов пива. Это работает, заменяя шаг 5 утвержденного ответа. График версии 2.8
Root -

1
Я потратил недели на то, чтобы использовать API Facebook. На сегодняшний день это самый запутанный и противоречивый знак, с которым я сталкивался. Это решение по-прежнему работает отлично .. Октябрь 2017
user919426

4

Если вы запрашиваете только данные страницы, вы можете использовать токен доступа к странице. Вам нужно будет только авторизовать пользователя один раз, чтобы получить токен доступа пользователя; продлите его до двух месяцев, затем запросите токен для страницы. Это все объясняется в сценарии 5 . Обратите внимание, что полученный токен доступа к странице действителен только в течение срока действия токена доступа пользователя.


Извините, может быть, я не достаточно ясно Я читал о токенах, мне просто нужно узнать, как запросить у пользователя разрешение и передать токен в мое приложение. Кажется, мне нужно создать какое-то «приложение» на Facebook, единственной целью которого является получение разрешений, верно?
Власек

1
@Viasec Исправьте единственный способ , чтобы получить маркер доступа осуществляется через приложения , как описано здесь developers.facebook.com/docs/facebook-login
phwd

Спасибо, я, должно быть, как-то проигнорировал, я предположил, что это где-то в разделе API, что было неправильно. Я посмотрю на это, я надеюсь, что это отвечает на мой вопрос.
Власек,

4

Получая токен постоянного доступа, я выполнил 5 шагов, как упоминал Donut . Однако на 5-м шаге при создании токена постоянного доступа возвращается токен долгосрочного доступа (действителен в течение 2 месяцев), а не токен постоянного доступа (срок действия которого никогда не истекает). Я заметил, что текущая версия Graph API - V2.5. Если вы пытаетесь получить токен постоянного доступа с V2.5, то он предоставляет долгоживущий токен доступа. Попробуйте выполнить вызов API с помощью V2.2 (если вы не можете изменить версию в проводнике Graph API, нажмите на вызов API https: //graph.facebook.com/v2.2/ {account_id} / accounts? access_token = {long_lived_access_token} в новой вкладке с V2.2), тогда вы получите токен постоянного доступа (который никогда не истекает)


Возвращение версий API для достижения результатов приведет только к дальнейшему увеличению работы в будущем, особенно после истечения срока действия версии API.
SlickRemix

возвращается null :( Как мы получаем токен доступа к странице?
Нэнси Тхаккар

3

В дополнение к упомянутым методам стоит упомянуть, что для межсерверных приложений вы также можете использовать эту форму токена постоянного доступа: app_id | app_secret Этот тип токена доступа называется App Token. Как правило, его можно использовать для вызова API-интерфейса Graph и запроса общедоступных узлов в бэкэнде вашего приложения. Упоминается здесь: https://developers.facebook.com/docs/facebook-login/access-tokens


1
Разрешает ли он какой-либо доступ к страницам? Я думаю, что нет, и в этом случае это действительно не отвечает на вопрос.
Власек

@Vlasec Это позволяет вам получить доступ к комментариям к общедоступному сообщению
Али Гаджани

1
Хотя это может быть достаточно для некоторых, это не отвечает на вопрос.
Власек

2

Благодаря @donut мне удалось получить бесконечный токен доступа в JavaScript.

// Initialize exchange
fetch('https://graph.facebook.com/v3.2/oauth/access_token?grant_type=fb_exchange_token&client_id={client_id}&client_secret={client_secret}&fb_exchange_token={short_lived_token}')
.then((data) => {
    return data.json();
})
.then((json) => {
    // Get the user data
    fetch(`https://graph.facebook.com/v3.2/me?access_token=${json.access_token}`)
    .then((data) => {
        return data.json();
    })
    .then((userData) => {
        // Get the page token
        fetch(`https://graph.facebook.com/v3.2/${userData.id}/accounts?access_token=${json.access_token}`)
        .then((data) => {
            return data.json();
        })
        .then((pageToken) => {
            // Save the access token somewhere
            // You'll need it at later point
        })
        .catch((err) => console.error(err))
    })
    .catch((err) => console.error(err))
})
.catch((err) => {
    console.error(err);
})

а потом я использовал сохраненный токен доступа, как это

fetch('https://graph.facebook.com/v3.2/{page_id}?fields=fan_count&access_token={token_from_the_data_array}')
.then((data) => {
    return data.json();
})
.then((json) => {
    // Do stuff
})
.catch((err) => console.error(err))

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


2

Если у вас есть приложение Facebook, вы можете попробовать с app-id & app-secret.

Подобно :

access_token={your-app_id}|{your-app_secret}

не требуется часто менять токен.


1

Достигнут предел заявки (# 4) - FB API v2.1 и выше

Этот ответ привел меня к «окончательному ответу для нас», и поэтому он очень тесно связан, поэтому я добавляю его здесь. Хотя это связано с вышеизложенным, оно отличается, и, похоже, FB несколько упростило этот процесс.

Наш счет обмена на нашем сайте перестал работать, когда FB перевернул API до версии 2.1. В нашем случае у нас уже было приложение FB, и мы НЕ использовали логин FB. Итак, нам нужно было получить токен FB APP для выполнения новых запросов. Это по состоянию на 23 августа 2016 года.

  1. Перейдите по адресу : https://developers.facebook.com/tools/explorer.
  2. Выберите версию API и затем используйте GET и вставьте следующее:

    /oauth/access_token?client_id={app-id}&client_secret={app-secret}&grant_type=client_credentials
    

    Вы хотите пойти захватить ваш идентификатор приложения и ваше приложение в тайне от вашей страницы приложения. Главная страница разработчиков FB Apps

  3. Запустите запрос графа, и вы увидите:

    {
       "access_token": "app-id|app-token",
       "token_type": "bearer"
    }
    

    куда

    «Приложение-идентификатор»
    и
    «Приложение-маркер»
    будет идентификатором вашего приложения на странице приложения FB и сгенерированным хешем приложения FB, который вы только что получили.

  4. Далее проверьте ваш новый токен доступа APP: FB Access Token tester

  5. Вы должны увидеть, вставив

    «Приложение-маркер»
    в тестер токенов, один токен на основе приложения без даты и времени истечения.

В нашем случае мы используем FB js sdk, поэтому мы изменили наш вызов так, чтобы он был таким (обратите внимание, что ТОЛЬКО получает количество акций, а не количество акций и комментариев, объединенных как раньше) :

FB.api(
    '/','GET',{
    // this is our FB app token for our FB app 
        access_token: FBAppToken,
        "id":"{$shareUrl}","fields":"id,og_object{ engagement }"
}

Теперь это работает правильно. Это потребовало много поиска и официального сообщения об ошибке с FB, чтобы подтвердить, что мы должны начать делать токенизированные запросы к API FB. Кроме того, я попросил, чтобы они (FB) добавили ключ к коду ошибки (# 4), в котором упоминается токенизированный запрос.

Я только что получил еще одно сообщение от одного из наших разработчиков, что наш счетчик комментариев FB также нарушен из-за новой потребности в токенизированных запросах, поэтому я обновлю это соответственно.


1
Пользователь приложения всегда входил в систему и разрешал доступ к приложению. В любом случае, похоже, что это не создает токен доступа к странице, поэтому я думаю, что это неправильный ответ на вопрос. Интересно, хотя - может быть, сделать Q / A самостоятельно?
Власек

1

Многие из этих примеров не работают, не уверен, что это из-за выхода 2.9v, но я бился головой. В любом случае я взял версию @ dw1 и немного ее изменил с помощью видео @KFunk, и у меня это получилось для 2.9. Надеюсь это поможет.

$args=[
/*-- Permanent access token generator for Facebook Graph API version 2.9 --*/
//Instructions: Fill Input Area below and then run this php file
/*-- INPUT AREA START --*/
    'usertoken'=>'',
    'appid'=>'',
    'appsecret'=>'',
    'pageid'=>''
/*-- INPUT AREA END --*/
];
echo 'Permanent access token is: <input type="text" value="'.generate_token($args).'"></input>';
function generate_token($args){
    $r = json_decode(file_get_contents("https://graph.facebook.com/v2.9/oauth/access_token?grant_type=fb_exchange_token&client_id={$args['appid']}&client_secret={$args['appsecret']}&fb_exchange_token={$args['usertoken']}")); // get long-lived token
    $longtoken=$r->access_token;
    $r=json_decode(file_get_contents("https://graph.facebook.com/{$args['pageid']}?fields=access_token&access_token={$longtoken}")); // get user id
    $finaltoken=$r->access_token;
    return $finaltoken;
}

Хороший фрагмент, но этот вопрос не о том, как сделать это в PHP, а о том, как использовать сам API, что также может быть сделано в Java или .NET. Например, мне нужно было сделать это на Java. Псевдокод или пошаговое руководство будет более полезным для тех, кто не использует PHP.
Власек

2
@Vlasec Я бы сказал, что этот фрагмент PHP очень близок к любому псевдокоду и его очень легко понять. Casar просто использует некоторые API, которые уже предоставлены Facebook. Остальные вещи говорят сами за себя.
Сиддхант Римал

0

По состоянию на апрель 2020 года срок действия моих ранее постоянных токенов страниц истекал между 1 и 12 часами. Я начал использовать пользовательские токены с manage_pagesразрешением для достижения предыдущей цели (опрос событий страницы). Эти токены кажутся постоянными.

Я создал скрипт Python на основе информации, найденной в этом посте, размещенной на github.com/k-funk/facebook_permanent_token , чтобы отслеживать, какие параметры требуются, и какие методы получения постоянного токена работают.


-1

Я нашел этот ответ, который относится к этому инструменту, который действительно очень помог.

Я надеюсь, что этот ответ остается в силе, когда вы читаете это.


ХОРОШО. Ответ от пончика все еще работает, или нужен какой-то дополнительный шаг?
Власек
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.