Twitter REST API, app only auth

На данный момент Twitter предоставляет разработчикам API двух видов: классический (пока еще) REST и Streaming API. Не смотря на то, что платформа всяческими ограничениями переталкивает разработчиков на сторону зла Streaming API, речь в этой статье пойдет именно о REST.

Версии API у соцсервисов постоянно обновляются, все что написано ниже справедливо для TWITTER REST API v 1.1

Чтобы выполнять запросы к апишечке, нам необходим будет https, twitter application и, куда без него, OAuth Request Token.

Для начала регистрируем приложение, выбираем необходимый будущему приложению уровень доступа (чтение / чтение+публикация твитов / чтение+публикация+директ мессаджи). Далее все как всегда, получаем API Key, API Secret и гоу в ИДЕшечку, писать что-нибудь (конечно на пхп, а вы на чем хотели?)

Ах да, в твиттере есть обычная(с авторизацией пользователя) и app-only аутентификация (хотя, какая тут обычная, каждый выбирает сам). App only auth не позволяет делать разве что публикацию твиттов и DM (не от имени приложения же твиты слать, не так ли?), все остальное он умеет, если конечно показать  ему ваш токен.

Пример элементарнейшего приложения, которое генерирует токен с помощью app-only auth и получает новые статусы (твиты) из списка (list) пользователя, можно посмотреть ниже. Все, что реализует приложение, справедливо и для всех остальных методов  API. Похоже, это совсем несложно.

class TwitterWrapper{

private $consumerKey = 'YOUR API KEY';
private $consumerSecret ='YOUR API SECRET';
private $userID = (int) YOUR USER ID;
private $listID = (int) LIST ID;

private function getToken(){

// Step 1 - получение ключа подписи из consumerKey & consumerSecret
$token = sprintf("%s:%s", $this->consumerKey, $this->consumerSecret);
$base64Token = base64_encode($token);

// Step 2 - формируем запрос для получения токена
$url = "https://api.twitter.com/oauth2/token";
$headers = array(
"POST /oauth2/token HTTP/1.1",
"Host: api.twitter.com",
"User-Agent: Twitter Application-only OAuth App v.1",
"Authorization: Basic ".$base64Token,
"Content-Type: application/x-www-form-urlencoded;charset=UTF-8"
);

//формируем curl - запрос

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // возвращать ответ будем, а вдруг пригодится - для извлечения токена, например
curl_setopt($ch, CURLOPT_POSTFIELDS, "grant_type=client_credentials");

curl_setopt($ch, CURLOPT_HEADER, 1);
curl_getinfo($ch, CURLINFO_HTTP_CODE);

$retrievedHtml = curl_exec ($ch);
curl_close($ch);

$output = explode("\n", $retrievedHtml);
$token = '';
foreach($output as $line)
{
if($line != false)
{
$token = $line;
}
}
$token = json_decode($token);
return $token->{'access_token'};

}

function getListStatuses(){

$url = "https://api.twitter.com/1.1/lists/statuses.json"; // base url
$q = sprintf("?list_id=%s&user_id=%s&include_entities=%s&include_rts=true", $this->listID, $this->userID, "false");

$headers = array(
"GET /1.1/lists/statuses.json".$q." HTTP/1.1",
"Host: api.twitter.com",
"User-Agent: Twitter Application-only OAuth App v.1",
"Authorization: Bearer ".$this->getToken()
);
$ch = curl_init(); // setup a curl
curl_setopt($ch, CURLOPT_URL,$url.$q); // set url to send to
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // set custom headers
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // return output
$retrievedHtml = curl_exec ($ch); // execute the curl
curl_close($ch); // close the curl
return $retrievedHtml;
}

}

$twitterApp = new TwitterWrapper();
$statuses = json_decode($twitterApp -> getListStatuses());

И на десерт про 15 minutes windows и лимиты на количество запросов: версия 1.1 лимитирует количество запросов, лимиты распространяются на 15-минутные интервалы и зависят от способа аутентификации (у app-only auth количество запросов по некоторым пунктам меньше). Подробнее