28 октября 2013

Twitter REST API

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

Для начала нужно иметь аккаунт в самом Twitter.
Затем нужно создать что-то типа учетки для приложения в Twitter (по ссылке https://dev.twitter.com/ - Ваша учетка - My applications - Create a new application).
Для приложения можно задать кое-какие даные и настройки, но это не важно и не все они обязательны. Мне достаточно было использовать только функцию поиска и поэтому хватало прав только для чтения.
Итак, после регистрации приложения у нас появляются всякие связанные с ним даные, но нам нужны только Consumer key и Consumer secret (по крайней мере в моем случае).

Что делать с этим далее подробно описано на страничке https://dev.twitter.com/docs/auth/application-only-auth

Если кратко, то чтоба апи нам ответило нужно предоставить ему наши специальным образом подготовленные ключ и секрет (key и secret) в POST запросе. Если этот запрос будет правильным, то  сервер вернет нам токен, коорый мы будем крепить к нашим последующим GET запросам для работы с апи.

Подготовка  ключа и секрета заключается в их склеивании со вставкой между ними двоеточия и перевод полученной строки в Base64 encode.

Шаг первый - подготовка данных для получения токена

Если у нас есть
Consumer key:         xvz1evFS4wEEPTGEFPHBog
Consumer secret:     L8qq9PZyRg6ieKGEKhZolGC0vJWLw8iEJ88DRdyOg
То соединяем их через двоеточие  и получаем
xvz1evFS4wEEPTGEFPHBog:L8qq9PZyRg6ieKGEKhZolGC0vJWLw8iEJ88DRdyOg
Кодируем это дело в  Base64 (например онлайн кодером\декодером http://www.base64decode.org/) и получаем
eHZ6MWV2RlM0d0VFUFRHRUZQSEJvZzpMOHFxOVBaeVJnNmllS0dFS2hab2xHQzB2SldMdzhpRUo4OERSZHlPZw==

Нужно сказать, что для экспериментов я пользовался замечательной бесплатной утилитой (а вернее приложением для google chrome) - Rest Console

В ней можно правильно сформировать нужный запрос, даже особо ничего не зная про рест апи и связанные с ним вещи.

Шаг второй - получение токена

Открываем Rest Console и заполняем следующие поля такими данными:
Request URI:
https://api.twitter.com/oauth2/token 
Content-Type:
application/x-www-form-urlencoded;charset=UTF-8
Encoding:
Accept-Encoding: gzip
RAW Body:
grant_type=client_credentials
Authorization Header:
Basic иТутВставляемПолученныйВПрошломШагеПерекодированныйКлючИСекрет
получится что-то вроде
Basic pQVS5hVJpoVaROVcN...YJeFZVURSNZBYoNBW2s=
Нажимаем POST и видим в Responce
  1. {
  2. "token_type": "bearer",
  3. "access_token": "ANTAA9tBBcBIT3i2Bo0Qu...Q3Rqn8OWRMp^Zs7JvnpS7G8x"
  4. }
Ура! Мы получили наш токен!

P.S. позже выяснилось, что все это можно упростить - задать
Request URI как https://api.twitter.com/oauth2/token?grant_type=client_credentials и дополнительно заполнить только Authorization.

Шаг третий - поиск

Теперь, когда токен получен можем отправлять GET запрос уже непосредственно для поиска по твитам.
Описание возможных параметров есть тут: https://dev.twitter.com/docs/api/1.1/get/search/tweets
Мы будем использовать самый простой - просто укажем ключевое слово.

Заполняем поля (не забываем снять чекбоксы с уже ненужных полей)
Request URI:
https://api.twitter.com/1.1/search/tweets.json?q=restkit
restkit здесь - это искомое слово. Можно вставить какое Вам угодно.
Encoding:
Accept-Encoding: gzip
Authorization Header:
Bearer иТутВставляемПолученныйВПрошломЗапросеТокен
получится что-то вроде
Bearer AAAAAAAAAA...QShJoaOc..JF%VRNB%oB%2s

Жмем GET и видим в Responce body наш долгожданный JSON с результатами поиска!

  1. {
  2. "statuses": [{
  3. "metadata": {
  4. "result_type": "recent",
  5. "iso_language_code": "en"
  6. },
  7. ...
Что делать с этим дальше - надеюсь найду время описать :)