php instagram api авторизация
Php instagram api авторизация
Instagram PHP API V2
A PHP wrapper for the Instagram API. Feedback or bug reports are appreciated.
Please note that Instagram mainly refers to »Clients« instead of »Apps«. So »Client ID« and »Client Secret« are the same as »App Key« and »App Secret«.
I strongly advice using Composer to keep updates as smooth as possible.
Initialize the class
Authenticate user (OAuth2)
array if you want to authenticate a user and access its data:
string if you only want to access public data:
Optional scope parameters:
true : Returns only the OAuth token
false [default] : Returns OAuth token and profile data of the authenticated user
Set / Get access token
Public methods
Authenticated methods
Authenticated methods
Please note that the modifyRelationship() method requires the relationships scope.
Public methods
Public methods
Authenticated methods
Please note that the authenticated methods require the comments scope.
Public methods
Authenticated methods
All parameters are optional. If the limit is undefined, all available results will be returned.
Instagram entries are marked with a type attribute ( image or video ), that allows you to identify videos.
An example of how to embed Instagram videos by using Video.js, can be found in the /example folder.
Please note: Instagram currently doesn’t allow to filter videos.
In order to prevent that your access tokens gets stolen, Instagram recommends to sign your requests with a hash of your API secret, the called endpoint and parameters.
Go into more detail about how it works in the Instagram API Docs.
Each endpoint has a maximum range of results, so increasing the limit parameter above the limit won’t help (e.g. getUserMedia() has a limit of 90).
That’s the point where the «pagination» feature comes into play. Simply pass an object into the pagination() method and receive your next dataset:
Iteration with do-while loop.
Samples for redirect URLs
Registered Redirect URI | Redirect URI sent to /authorize | Valid? |
---|---|---|
http://yourcallback.com/ | http://yourcallback.com/ | yes |
http://yourcallback.com/ | http://yourcallback.com/?this=that | yes |
http://yourcallback.com/?this=that | http://yourcallback.com/ | no |
http://yourcallback.com/?this=that | http://yourcallback.com/?this=that&another=true | yes |
http://yourcallback.com/?this=that | http://yourcallback.com/?another=true&this=that | no |
http://yourcallback.com/callback | http://yourcallback.com/ | no |
http://yourcallback.com/callback | http://yourcallback.com/callback/?type=mobile | yes |
If you need further information about an endpoint, take a look at the Instagram API docs.
This example project, located in the example/ folder, helps you to get started. The code is well documented and takes you through all required steps of the OAuth2 process. Credit for the awesome Instagram icons goes to Ricardo de Zoete Pro.
More examples and tutorials:
Let me know if you have to share a code example, too.
Please see the changelog file for more information.
Released under the BSD License.
About
An easy-to-use PHP Class for accessing Instagram’s API.
Instagram API Basic Display — получение токена, первый запрос
API Instagram Basic Display, то есть базовый интерфейс instagram API — это API для сторонних приложений и веб сайтов, с помощью которого они могут получить данные профиля пользователя Instagram, а также его видео и изображения.
Быстрая навигация:
Принцип работы API такой: сначала вы показываете пользователю окно авторизации, где он проходит процедуру аутентификации и авторизует ваше приложение для доступа к своим данным, а так же дает определенные разрешения. После аутентификации пользователь перенаправляется обратно в ваше приложение (веб сайт), в url которого будет добавлен код авторизации. Вам нужно будет получить этот код и обменять его на access token. Получив этот токен, вы сможете делать запросы к API и использовать данные и медиа, доступ к которым разрешил вам пользователь.
Не все данные пользователя будут доступны вам сразу. Для полноценной работы вашему приложению потребуется получить от пользователя следующие разрешения:.
Для того чтобы вы смогли получать от настоящего пользователя такие разрешения, вашему приложению нужно будет пройти процесс проверки. На проверку приложение необходимо будет направить после того как вы закончите процесс разработки. Сделать это можно будет на вкладке Basic Display > Проверка приложения «Instagram Basic Display»
Давайте начнем разработку.
1 Создание facebook приложения
Для начала перейдите по ссылке https://developers.facebook.com и войдите в свой facebook аккаунт. Затем нажмите вкладку Мои приложения и создайте новое. Или нажмите кнопку Начать, если вы не создавали facebook приложений ранее.
Вы окажетесь в панели facebook для разработчиков, нажмите Настройки, затем Основное. В этой форме нам понадобится заполнить данные:
Введите адрес сайта и сохраните изменения.
2 Настройка Instagram API Basic Display
Перейдите в раздел Basic Display и внизу страницы нажмите кнопку Create New App
Перед нами форма с настройками Basic Display. Желательно заполнить в ней все поля. Приступим:
3 Добавляем тестировщика Instagram
Добавим к нашему приложению пользователя для тестов. Такие пользователи могут проверять приложение только в режиме разработки. В боковой панели нажмите Роли > Роли и прокрутите страницу вниз до раздела Тестировщики Instagram. Нажмите кнопку Добавить тестировщика
Откройте новое приватное окно браузера и войдите в instagram профиль тестировщика. А в панели для разработчиков введите id этого пользователя, чтобы пригласить его. После чего тестировщику придет уведомление, с просьбой принять запрос из вашего приложения, которое тестировщик должен подтвердить. Чтобы это сделать, нужно зайти в профиль инстаграм, нажать Редактировать профиль, выбрать вкладку Приложения и сайты > Приглашения для тестировщиков.
4 Аутентификация тестировщика
В новом окне браузера вставьте сгенерированный URL. Должно появиться окно с именем приложения и вашего тестировщика. Нажмите авторизовать, чтобы предоставить приложению доступ к данным вашего профиля. Если все пройдет успешно, вы окажитесь на странице, которую вы указывали в поле URI. Посмотрите на URL, в конце после строки ?code= будет добавлен код авторизации. Скопируйте его без символов #_ в конце и сохраните под рукой. Этот код действует в течении 1 часа.
5 Получение токена Instagram API Basic Display
Для следующего шага нам понадобится интерфейс командной строки. Для отправки cURL запроса мы будем использовать Cmder. Отправьте следующий POST запрос в Instagram API:
Если вы нигде не ошиблись, вам придет JSON объект содержащий access token и id пользователя-тестировщика. Скопируйте токен, он нам понадобится в следующем шаге.
Токены доступа пользователей Instagram не долговечны и действительны только в течении 1 часа.
6 Запрос на получения имени пользователя
Попробуем получить имя пользователя. Для этого скопируйте url ниже, и замените в нем USER-ID и ACCESS-TOKEN данными, которые мы получили ранее.
Если вы все сделали правильно, Instagram API вернет вам JSON с id и именем пользователя.
Вы также можете использовать узел Me, который сам определит id пользователя Instagram, который предоставил токен. Результат будет таким же.
Параметр fields может содержать следующие значения:
Верификация для доступа к API Instagram
Примерно с мая месяца Facebook разрешил подключения к API обмена сообщениями с Instagram, но процедура подключения несколько запутанная. Под катом некоторые нюансы и шишки прохождения процедуры верификации приложения для работы с сообщениями Instagram.
API обмена сообщениями с Instagram ничем не отличается от API обмена сообщениями с Facebook, только в теле сообщения в параметре platform будет указано «Instagram», в отличии от сообщения с Facebook, для которого в platform будет указано «page».
А вот процедура верификации приложения в случае Instagram имеет несколько отличий от верификации в случае Facebook.
1. Так же как и с Facebook, настраиваем Вебхук на наш бекэнд, только в разделе Instagram, генерируем токен, и прописываем токен на стороне бекэнда, проверяем, что вебхук подтвердился.
Напоминаю, что проверить статус токена, срок его действия, и какие на нем разрешения, можно в специальном инструменте Facebook «Access Token Debugger».
2. Для подключения к Facebook необходимо было получить разрешения «pages_messaging» и «Business Asset User Profile Access». Первое для получения и отправки сообщений, второе для считывания имени и фамилии пользователя.
В случае с Instagram необходимо получить два похожих разрешения, «instagram_manage_messages» и «instagram_basic». Аналогично, первое для получения и отправки сообщений, второе для считывания имени и фамилии пользователя. В отличии от Facebook, в Instagram имя и фамилия лежат в одном параметре.
3. При запросе разрешений, создается заявка на верификацию, такая же как и при подключении к Facebook. Но при подключении к Facebook было достаточно вложить screencast, то есть записанное видео, со следующим сценарием:
a) Входим на страницу компании в Facebook.
b) Входим на бекэнд компании, куда приходят сообщения.
c) Показываем, как сообщения со страницы попадают на бекэнд, и как уходят – приходят ответы на эти сообщения.
При этом пользователь, от которого отправляем сообщения, должен быть добавлен в роль Тестовые пользователи приложения:
В случае с Instagram, есть два существенных момента:
3.1. На текущий момент, на август 2021 г., Instagram пропускает на бекэнд сообщения только если сообщения отправляем в Instagram на страницу компании, в имени которой есть префикс test_
Так как вряд ли вы будете переименовывать официальный Instagram экаунт компании, то конечно нужно создать тестовую страницу компании в Instagram, и ее соединить с тестовой страницей компании в Facebook, и далее все это указать в настройке вебхука. На скрине префикс test_ есть и у страницы компании, куда отправляем сообщения, и на всякий случай, для верности, имя тестового пользователя, который отправляет сообщения, тоже начинается с test_:
По поводу нужен ли префикс test_ в имени тестового пользователя: в группе тех.поддержки мессенджера ответили, что нет, префикс test_ нужен только у тестовой страницы, получающей сообщения. Но до этого, при прохождении процедуры верификации, я видел, как верификатор Facebook переименовал учетку тестового пользователя, добавил префикс test_. Поэтому лишним не будет, пусть префикс test_ будет в Instagram как у отправителя, так и у получателя.
Если отправлять заявку без учетки от бекэнда, то будет вот такая куча отказов, с ссылкой «читайте документацию»:
4. После формирования запроса на доступы «instagram_manage_messages» и «instagram_basic» у приложения автоматически будут добавлены продукты «Facebook Login» и «Instagram Graph API». Хотя собственно для обмена сообщениями в этих продуктах ничего настраивать не нужно, Facebook добавляет их именно для интеграции страницы компании в Facebook со станицей компании в Instagram. Удалить эти продукты из приложения невозможно. Недостатком является то, что верификатор может начать искать на входе в бекэнд кнопку входа через учетку Facebook. Поэтому в заявке можно отметить, что продукт «Facebook Login» не используется в работе бекэнда.
5. Если в заявке на верификацию есть текст на русском языке, и/или интерфейс App Dashboard переключен на русский язык, то заявка будет несколько часов висеть в статусе «Переводится». Поэтому лучше писать заявку на английском, и кажется, интерфейс App Dashboard лучше переключить на английский.
6. После успешной верификации приложения эти самые два заветных разрешения «instagram_manage_messages» и «instagram_basic» перейдут в статус «Active».
We are currently in phase 2 of the global rollout of the Instagram Messaging. Instagram accounts with follower count between 1K-100K are able to connect to the API. We plan to include remaining accounts for the last phase by end of Q3. Please check this page for updates.
То есть, если у страницы вашей компании в Instagram подписчиков больше, чем 100К, то сообщения доходить до бекэнда не будут. Это так, и это подтвердили в группе тех.поддержки Facebook. Нужно ждать до конца Q3.
7. Вопросы по подключению к Messaging Platform можно задавать в официальной группе Facebook, админы отвечают быстро.
Автоматизация Instagram
По работе попалась интересная задача по автоматизации Instagram, а именно надо было просто провести розыгрыш. Сервисов для организации этой затеи достаточно, есть даже бесплатные. Но были дополнительные (читай премиум) условия, к тому же мне очень захотелось самому посмотреть, что там внутри этой популярной инстаграмы и быть может набраться опыта в построении API.
Первым делом пошел смотреть что там говорят интернеты. Чтение официальных доков по API instagram дало четко понять, что владельцы не хотят давать доступ к неограниченной автоматизации, можно автоматизировать работу со своим аккаунтом в базовом варианте, но это не подходило под мою задачу, а «бизнес» вариант API требовал верификации компании, что естественно мне не подходит. (Может быть уже что-то изменилось …)
Тогда я пошел смотреть что говорят интернеты по поводу работы с тем API что есть на сайте Instagram. Все было радужно и ничего не предвещало проблем. На github были даже проекты на php, предоставляющие API для автоматизации вплоть до постинга. Статьи на Хабре гласили о легкости автоматизации. Многие из источников были нормальной свежести (пару месяцев, а то и недель). Однако …
Авторизация
Начинаем снифать (fiddler + waterfox) запросы на сайте instagram и смотреть что там. Понятное дело принимаем куки и устанавливаем их куда следует. Этот этап пропустим.
Анализ
Далее, надо авторизоваться.
Запрос в консоли Firefox, почему там проблема с Access-Control-Allow-Origin я не знаю
описания входящего пароля (PWDINSTAGRAMBROWSER)
версии шифрования (10)
времени шифрования (unixtime 1591030811)
шифрованной строки с паролем
Немного поигравшись не трудно догадаться что unixtime принимает участие в шифровании, так как шифрованная строка при каждом запросе разная.
Погуглив, можно найти варианты авторизации без шифрования пароля, однако эти методы на момент написания данного материала уже не работали. На просторах github можно найти вариант шифрования пароля на nodejs. Обнадежил этот вариант, но оказался не рабочим.
Проблема
После долгих поисков было решено пройтись отладчиком по коллстеку шифрования пароля. Товарищ по одному из проектов подсказал, что возможно на клиенте instagram используется эта библиотека криптографического шифрования. Сравнивая минифицированный код из отладчика (тот еще изврат) и исходный код библиотеки стало ясно, что скорее всего это так. Но решение задачи это не облегчило.
Разбирая стек я понял, что исходные данные кодировались в нужную форму, а затем отправлялись на шифрование дальше в js. Через несколько часов гуляния по стеку с минифицированным асинхронным js (лютая хрень) я заблудился … и решил не принимать этот вызов (самостоятельного разбора этого блудника), а найти альтернативный путь, потому что неизвестно в какой момент владельцам инсты стрельнет в голову сменить алгоритм шифрования.
Первая дыра в безопасности
Прежде чем окончательно забросить идею авторизации в instagram на php, я решил проверить как там обстоят дела с авторизацией на основании сгенерированных данных на js. Для этого взял эти данные из перехваченного трафика (можно из консоли где xhr запросы, но я взял из fiddler) и попробовал авторизоваться через php на локальном сервере. Наконец-то получил заветный позитивный ответ об успешной авторизации и токен.
Решение проблемы и вторая дыра в безопасности
Тогда я вспомнил мое недавнее знакомство с nodejs и puppeteer и решил попробовать скинуть этап авторизации на указанные технологии. И получилось 🙂
Перехватив один раз заголовки после авторизации, последующую неделю удавалось их спокойно использовать (есесно совместно с куками):
Нести на php хостинг node.js затея так себе, есть вариант запускать node.js на локальной машине по расписанию, и пусть данные после отработки автоматически отсылаются на целевой сервер, но это так, мысли в слух.
Сборка данных
Данные без пагинации
Теперь настало время сборки необходимых данных. Первым делом нужно достать информацию о посте. Она находится в html ответе на запрос вида:
где вместо shortcode нужно написать символьный идентификатор нужного поста. Незамысловатой регуляркой вытаскиваем json со страницы и выдергиваем из него нужные данные.
Просматривать html ответ через браузер не совсем удобно, можно просто скопипастить в привычный редактор и там рассмотреть что надо
Примерно таким же образом достается инфа о странице пользователя
Данные с пагинацией
А теперь самое интересное 🙂
Нужно вытащить все комментарии, лайки, подписчиков. Опять идем и анализируем запросы. Instagram API использует graphql (что-то типа свой rust-full со своими приколами). Запрос выглядит следующим образом:
Например сборка лайков:
Да, usleep обязателен, иначе доступ по этому запросу при частом обращении будет ограничен (даже если попытаться юзать как обычный пользователь через веб версию). Особенно это актуально для больших объёмов данных. Например для сборки
1000 комментариев, такая пауза вполне нормальная, но на сборке
5000 комментариев мой фейковый акк не раз получал бан, из-за чего пришлось увеличить паузу между запросами до 3-5 секунд. И то в некоторых случаях (видимо все зависело от звезд), инстаграм выдавал бан на этот запрос.
В итоге на организацию коленочного API ушло около 20 часов.
Instagram заставил попотеть и испытать различные эмоции от использования API, но поставленная цель была достигнута в полном объёме.
Получаем посты из своего аккаунта Instagram посредством нового API Instagram Basic Display
Создание приложения
Для начала нам необходимо создать учетную запись разработчика на Facebook и создать приложение. Для этого переходим на https://developers.facebook.com/, авторизуемся (если обычного аккаунта Facebook у вас нет, то система в любом случае предложит начать с его создания) и в меню «Мои приложения» выбираем «Создать приложение». После чего указываем название приложения и почту, нажимаем «Создайте ID приложения».
Укажите адрес вашего сайта, на котором вы будете размещать ленту из Instagram. Сохраните изменения.
Платформу можно не указывать, работать будет и без нее. Но в официальной документации данный пункт присутствует, поэтому я включил его в туториал. Скорее всего это необходимо для прохождения приложением проверки, но мы обойдемся и без нее. Так как нам достаточно только создать токен для доступа к данным аккаунта — об этом далее.
Затем перейдите в меню «Товары» и выберите Instagram, нажав на кнопку «Настроить». Страница обновится и появится дополнительное меню слева. Перейдите в меню «Basic Display» и внизу нажмите на кнопку «Create New App».
В открывшемся окне вводим название нашего приложения. После этого откроется страница настроек, где необходимо указать адрес нашего сайта. Во все три поля вводим одно и то же значение — этого будет достаточно для нашей задачи. Обратите внимание, что адрес сайта обязательно должен быть с https. Сохраняем данные и далее нажимаем на кнопку «Add or Remove Instagram Testers».
Внизу страницы нажимаем на «Добавить Instagram Testers». В окошке вбиваем название аккаунта, из которого будем тянуть фотографии и нажимаем «Отправить».
Далее нам необходимо перейти на сайт https://www.instagram.com/, залогиниться в аккаунт, указанный в приложении как тестировщик, и перейти в настройки, выбрав пункт «Apps and Websites».
Переходим во вкладку «Tester invites» и нажимаем «Accept» напротив нашего приложения.
Возвращаемся в кабинет разработчика Facebook и переходим в меню Basic Display и напротив нашего аккаунта нажимаем «Generate Token».
В открывшемся окне нам нужно войти в свою учетную запись Instagram, после чего нам будет предложено скопировать токен для доступа к Instagram API.
Это и есть так называемый long-lived token, который будет действителен в течении 60 дней. И именно его можно периодически обновлять — обновление доступно спустя сутки после создания/обновления предыдущего токена.
Получение ленты Instagram на PHP
Итак, настроив приложение в кабинете разработчика Facebook, можно приступать к интеграции ленты на сайт. Я буду использовать Heroku, так как на нем есть https и он позволяет бесплатно хостить простые приложения, но вы можете использовать любой подходящий вариант. Также обратите внимание на то, что в примерах кода используется библиотека curl — убедитесь, что она у вас установлена.
Предположим, что токен, а также дата его создания, будут храниться в базе данных. В примерах я базу использовать не буду, это не так важно в данном случае, поэтому обойдусь комментариями.
Сперва проверяем дату создания токена. Если токен был создан около 60 дней назад (но не более, иначе обновить не получится), то сперва нам нужно его обновить. Для этого используем endpoint GET /refresh_access_token.
Данные приходят в JSON-формате, а сам токен содержится в свойстве access_token.
Обновив токен, или же если он у нас был не такой уж и старый, мы можем отправить запрос на получение ленты из нашего аккаунта. С помощью Basic Display API можно получить изображения, видео, а также подписи к ним и ссылки на публикации. Для получения данных нам понадобится endpoint GET /me/media
Данные будут содержаться в свойстве data. Список всех возвращаемых свойств:
Но тут возникает проблема, решение которой я не нашел в документации. Если в ленте у нас есть публикации в виде альбомов (media_type будет равен CAROUSEL_ALBUM), то есть несколько изображений/видео в одном посте, то в ответе на запрос придет только первое изображение в карусели. Для получения всех изображений в параметре fields нам нужно указать параметр children. Но и в этом случае мы получим только id изображений:
В документации указано, что для получения изображений из карусели необходимо использовать endpoint GET /
Отправив такой запрос, мы получим все изображения постов, а в свойстве children помимо id будут находится все свойства, перечисленные в параметре запроса children
В итоге, наш окончательный код будет выглядеть так:
Обратите внимание, что я использую дополнительный параметр limit для указания количества получаемых постов. Если его не указать, то вернется количество по умолчанию, а именно 25. Если постов больше, чем запрашиваемое количество, то в ответе придет свойство paging, где будут указаны ссылки для пагинации, то есть для получения следующих и предыдущих постов.
Работающий код можно посмотреть тут.
Исходники тут.