Сооснователь и разработчик сервиса FBTOOL.pro Кирилл Nortox рассказал, как работает API Facebook и почему не нужно бояться автоматизировать работу с ФБ.
⚡️ Телеграм-канал Afftimes — подпишись и первым получай всю годноту! ⚡️
Как работает API Facebook
API Фейсбука един для всех приложений и сайтов, однако способы взаимодействия с ним различаются:
- Graph.facebook.com — базовый путь обращения к API. Чтобы ФБ мог сопоставлять, с какого аккаунта идет обращение, требуется токен.
- Facebook.com/api/graphql — очень близок к первому способу, однако тут не нужен токен, используются cookie. Фишка метода в том, что в некоторых запросах нам удается сымитировать и подсунуть туда токен, что открывает новые возможности.
- Прослойка между пользователем и API. Те запросы, которые ФБ прячет от глаз разработчиков.

Нас интересуют те методы автоматизации, в которых используется токен — ключ доступа, несущий в себе различную информацию:

Получить токен можно двумя способами:
- Создать собственное приложение в Facebook. В основном используется в бурже сервисами для белых рекламодателей.
- Использовать токен внутреннего приложения Facebook. В случае с FBTOOL мы «выдергиваем» его из исходного кода страницы Ads Manager.
У каждого способа есть свои плюсы и минусы.
Главный плюс в приложении разработчика — безопасность и официальность. Не важно, с какого IP и User Agent будут идти запросы на API. Это самый настоящий и официальный способ взаимодействия с Facebook. Однако как разработчику вам придется постоянно обосновывать Фейсбуку необходимость каждой новой функции. Привязка карты и создание ФП через такой способ не работает.
Если бы мы для FBTOOL пошли по пути прилы разработчика, то в случае авторизации в приложении 10-15 аккаунтов, которые в будущем бы получили бан, то вся прила также бы получила полную блокировку. Нам это не подходит.

С токеном из Ads Manager ситуация другая. Сколько бы аккаунтов вы не авторизировали, связать их между собой по этому токену не получится. Однако достать токен на автомате сложнее из-за необходимости авторизации с трастового IP.

Почему вообще токен находится в исходном коде? Для того, чтобы Фейсбук мог разгрузить свои собственные сервера от рендеринга страниц. Если у вас большое количество рекламных кампаний, то вы вряд ли захотите ждать, пока вся страница прогрузится разом. Сначала обычно появляется табличка с рекламными кампаниями, затем подсасываются статусы, статистика и т.д.

Многие думают, что запросы через API — палево. Это не так, поскольку этот токен и создан для того, чтобы наладить взаимодействие между пользователем и Фейсбуком.
Выглядит это так: браузер авторизовывается по логину и паролю, либо по куки; Facebook дает нам токен, в котором есть все необходимые данные (одобрив тем самым аккаунт). Благодаря этому браузер «общается» с API, а мы просто вклиниваемся и «выдергиваем» токен.

Что видит Facebook в этот момент? Сам токен, который выдал; юзерагент браузера и IP (его мы регулируем через прокси). Информацию о железе по API Фейсбук получить не может, поскольку для этого он должен выдать JS-код, который выполнится вашим же браузером, а затем отправить ФБ. Мы можем посмотреть исходный код ответа от API и увидеть, что там передаются только данные, без каких-либо скриптов.


Что по банам? В начале работы сервиса мы загрузили огромное число разных проксей. Аккаунты, которые добавляли пользователи, распределялись по ним равномерно, при этом у нас генерировались юзерагенты, чтобы пользователям было проще взаимодействовать с сервисом — указать токен и всё.
Спустя время аккаунты некоторых пользователей стали вылетать на разлогин, селфи и чекпоинты. Мы стали разбираться, почему при равных условиях у одних всё окей, а других проблемы. Гипотезы в основном сходились к тому, что проблема в прокси.

В итоге мы поняли, что в API другие законы по отношению к IP, чем при работе с браузером. Там мы привыкли, что должна быть полная стерильность — аккаунты не должны пересекаться по IP. В случае с API, если у ФБ нет вопросов к аккаунту, он выживет на любой прокси, либо же умрёт на всех, кроме «родной» прокси.

Пообщавшись с клиентами, у которых аккаунты выкашивались пачками, нашлось несколько причин банов:

Какие прокси для API использовать?
В лучшем случае использовать те, с которых был взят токен. Многие спрашивают: если на одной мобильной проксе в браузере могут быть десятки аккаунтов, и перед входом я просто меняю IP перед входом на каждый аккаунт, сервис же свяжет все эти аккаунты по одному IP? Это не так — Facebook не умеет по API связывать несколько аккаунтов по IP.
Мы проводили много тестов: добавили в FBTOOL кучу мобильных проксей, рассчитывая на дополнительный траст. В итоге в ситуациях, когда у провайдера были проблемы, и происходили смены IP, далеко не все аккаунты их переживали. Получается, что если бы мы делали каждый раз ребут перед запросом к аккаунту (вместо того, чтобы работать с одного IP), то каждый ребут мог бы быть последним.
Если у вас нет возможности соблюсти соответствие в IP того, откуда взялся токен и того, с которого вы работаете по API, то советую просто брать самые стабильные (по соединению) прокси.
Касательно мобильных прокси: они не всегда являются панацеей от всех проблем и бед.
Многие думают, что автоматическая смена IP = имитация реального пользователя, передвигающегося по городу. Однако у реального человека IP меняется от вышки к вышке, а не в пределах одной вышки. Facebook это понимает + не так много людей заливает рекламу с мобильного интернета.

Полный доклад по ссылке. Другие материалы о ФБ можно почитать в нашем блоге. Например, мы рассказывали про аренду аккаунтов в Facebook: объясняли подводные камни и давали рекомендации, как лучше это делать.