Постинг в Twitter с помощью PHP (Twitter API, OAuth)

в категориях:
Версия для печатиВерсия для печати

После того как 30 июня 2010 года в Twitter запретили механизм базовой аутентификации, все действия по работе с Twitter API (требующие аутентификации) нужно выполнять с помощью нового механизма OAuth. На первый взгляд новый API ужасно сложный... но на самом деле всё гораздо проще, чем кажется.

В этой статье я покажу, как с помощью PHP, используя Twitter API, можно изменить статус в Twitter (послать сообщение).

Предварительная настройка для использования Twitter API

Раньше при использовании механизма базовой аутентификации все, что было нужно для работы с Twitter — это логин и пароль. Новый механизм OAuth более сложен, но в то же время значительнее безопаснее — даже если ваши данные перехватят при обращении к Twitter API, ваш логин и пароль от Twitter останутся в тайне.

Для использования Twitter API необходимо зарегистрировать свое приложение:

  • Зайдите на dev.twitter.com под своим логином и паролем, затем нажмите на ссылку "Register an app".
  • Заполните форму — скорее всего введенные данные никто не проверяет со стороны Twitter, но лучше все заполнить по уму. Главное нужно выбрать в пункте "Default Access type" опцию "Read and Write". Нажмите кнопку "Register Application".
  • Теперь вам нужно 4 ключа для работы вашего приложения. Перейдите по ссылке "View Your Applications", а потом нажмите на название вновь созданного приложения. Прокрутите страницу вниз и скопируйте "Consumer Key" и "Consumer Secret".
  • Дальше нужно нажать в правом меню ссылку "My access token" и скопировать: "Access Token (oauth_token)" и "Access Token Secret (oauth_token_secret)".

Нервничаете? Расслабьтесь, мы почти закончили — последнее, что нужно сделать: скачать библиотеку Abraham Twitter OAuth. В архиве библиотеки несколько файлов, но нам нужны только два: twitteroauth/twitteroauth.php и twitteroauth/OAuth.php.

Интеграция Twitter и PHP OAuth

Теперь напишем исходный код для опубликования сообщения в Twitter. Для этого достаточно нескольких строчек: нужно просто подключить библиотеку TwitterOAuth и использовать ключи для доступа к Twitter.

<?php
require_once 'TwitterOAuth.php';

define("CONSUMER_KEY", "<Вставить Consumer Key>");
define("CONSUMER_SECRET", "<Вставить Consumer Secret>");
define("OAUTH_TOKEN", "<Вставить Access Token (oauth_token)>");
define("OAUTH_SECRET", "<Вставить Access Token Secret (oauth_token_secret)>");

$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, OAUTH_TOKEN, OAUTH_SECRET);
$content = $connection->get('account/verify_credentials');

$connection->post('statuses/update', array('status' => 'Сообщение в Twitter автоматом из PHP :) .'));

?>

Вот и все.

ВложениеРазмер
Пример и нужные файлы библиотеки Abraham Twitter OAuth9.72 КБ
Ваша оценка: Нет Средняя: 8.5 (31 голос)

Комментарии

Спасибо большое за простую и понятную статью! Реально помогла!!

Интересует второй вопрос :) количество постов приложения на один аккаунт.

или ограничение постов накладывается вообще на аккаунт?

Вот, что знаю из технических ограничений:

Количество апдейтов (сообщений) – не боле 1000 в сутки.
Количество прямых сообщений другим пользователям – не более 1000 в сутки.
Ограничение на операции с акаунтом (ограничение API Twitter) – не более 100 в час.

Текущие технические ограничения для аккаунтов Twitter:

  • Прямых сообщений: 250 в день.
  • Запросов API: 150 в час.
  • Обновлений: 1 000 в день. Причем этот лимит разбит на получасовые интервалы (т.е. в каждые полчаса можно делать не более 20 обновлений). Ретвиты засчитываются за обновления.
  • Изменения на E-mail аккаунта: 4 в час.
  • Following (ежедневный): Технический лимит фолловинга — 1 000 в день.
  • Following (по каждому аккаунту): Технический лимит фолловинга других пользователей — 2 000.

Источник: http://support.twitter.com/entries/15364-about-twitter-limits-update-api-dm-and-following

Fatal error: Call to undefined function curl_init() in Z:\home\0.0.0.0\www\Twi\twitteroauth\twitteroauth.php on line 199

Скорее всего на вашем хостинге не установлена библиотека curl.

Не совсем понял, а как постить сообщения из текстового файла с помощью этого скрипта?

Да как угодно . Ну если хотите, то можно так:

<?

$text = file_get_contents("text-file.txt");
$connection->post('statuses/update', array('status' => $text));

// или так
$text_array = file("text-file.txt"); // будет создан массив, каждый элемент которого будет строкой файла
foreach($text_array as $text)
{
  $connection->post('statuses/update', array('status' => $text));
}

?>

Это уже на усмотрение программиста.

 

 КААААПЕЦ, я пол дня искал облазил все буржуйские сайты

единственный нормальный пост в сети, спасибо :)

 Спасибо за статью!

 подскажите как сделать таймаут в 2 - 3 мин. публикации постов с текстовго файла 

 

<?php
require_once 'TwitterOAuth.php';

define("CONSUMER_KEY", "<mJBlxUEllYSYlLen1OQ>");
define("CONSUMER_SECRET", "<Вставить Consumer Secret>");
define("OAUTH_TOKEN", "<Вставить Access Token (oauth_token)>");
define("OAUTH_SECRET", "<Вставить Access Token Secret (oauth_token_secret)>");

$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, OAUTH_TOKEN, OAUTH_SECRET);
$content = $connection->get('account/verify_credentials');

$text = file_get_contents("text-file.txt");
$connection->post('statuses/update', array('status' => $text));
?>

Можно просто использовать sleep(), но тогда время выполнения скрипта может превысить разрешенный лимит.

Самым идеальным вариантом является использование cron.

Или же можно вызывать функцию публикации нового поста из файла при загрузке страницы пользователями сайта, при этом проверяя время последней публикации (можно изменять время последнего изменения файла с постами и сверяться с ним), выбирая нужный пост для публикации и не выполнять опубликование, если все посты опубликованы.

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

 

Почему то отправил только тестовое сообщение.

После из файла вообще не отправляет ? 

Какие то есть ограничения ?

Все, что я знаю про ограничения — написано выше в комментарии от 01/02/2011 - 17:07

А в библиотеке с этим ничего не нужно менять ?

А то в твиттере предыдущее сообщение висит уже час, а остальных нет.

Хотя и cron настроен и скрипт выполняется.

Нет, я все делал как описано выше в статье, все работало и отправлялось. Возможно, при отправке одного из сообщений Twitter завис.

Спасибо, хорошая библиотека.

Возникла сдледующая проблема: автопоcтинг идет нормально, но через некоторое время (примерно через месяц) авторизация пропадает, скрипт возвращает 401 'status' => string '401 Unauthorized', после заведения новой регистрации и замены ключей начинает снова работать нормально. Однако и это прератилось, теперь после обновления сайта dev.tvitter.com аворизоваться не удается. Не получается также удалить старые приложения.

Не знаете в чем может быть проблема?

Только что попробовал опубликовать - все нормально работает. Получал ключи полгода назад.

Причина оказалась в следующем: в настройках приложения на dev.twitter (вкладка settings) указан Application type - Read and Write, но во вкладке Details Access level - Read-only по этому не идет автопостинг. Не знаете как изменить Access level на Read & Write ?

столкнулся с той же проблемой - самое смешное что настройка поменялась после нажатия кнопки "Recreate my access token" на странице редактирования приложения, не знаю почему изменилось - скорее всего какой-то глюк у самого твиттера...

Спасибо, отличная статья !

Сначало я прочитал наблы Котерова.  Притопывание,  прихлопывания, самолюбование и...в целом мало, что практически ценного (хотя для общего развития полезно)

Тут предельно ясно и конктретно, большое спасибо!

Хочу отметить: есть проблема с кодировкой.  Твиттер понимает только UTF8.

Картинки можно публиковать только ссылками на них, а ссылки прямым текстом в сообщении - то есть с http://

Возникла проблема, решение которой в комментах не нашел... Отправил тестовое сообщение! Запостилось моментально.. Следом отправил второе, не запостилось! Следом отправил третье, не запостилось! И так сообщений 10.. Но после 1-го ничего так и небыло.. В чем проблема?

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

Большое спасибо за маленькую, но ёмкую статью!

Была проблема с ошибкой "Fatal error: Call to undefined function hash_hmac", решил заменой страндартной функции hash_hmac() на функцию custom_hmac(), взятую с http://www.php.net/manual/en/function.hash-hmac.php

 А эти ограничения действуют для аккаунта или для написанного приложения (API) ? 

 

Эти ограничения касаются и API в том числе.

Здраствуйте, все работает, если постить английские тексты, но если в тексте втречается кирилица, сообщение не отправляется, в чем может быть проблема? 

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

 такая же ситуация.

нужно вставить функцию конвертации в юникод

возможно не правильно настроено приложение в твиттере, сам мучался так

Fatal error: Call to undefined function twitteroauth() in /home/www/vhjgfhj/test.php on line 9 что делать?

Fatal error: Class 'twitteroauth' not found in /home/www/fhgjfg/test.php on line 10 что делать?

Может, кому пригодиться. Удаление записи из твиттера:

$connection->post('statuses/destroy/id')

где id - id записи.

Кто-нибудь знает, как в теле твита использовать ссылку?

сделал все как в статье, запустил скрипт - результата 0, ошибок 0. Подскажите пожалуйста в чем проблема ?  

а им можно во множество разных аков своих постить без авторизации?

 Вот эту ссылку поставьте, по указанной хер найдешь где app зарегать

https://dev.twitter.com/apps/

 А как эти библиотеки подключить? Просто скопировать код и создать файл php с ним в корне сайта? 

 

У меня этот скрипт не заработал, заработал совет с webmaster-source com /2013/01/09/post-to-twitter-from-a-php-script-2013-edition/ но, скорее всего и с этим бы разобрался, но тот оказался быстрее и проще + раньше попался. Так вот, мой вам совет, чего не указал автор статьи: 1. twitter принимает только KOI8, то есть конвертируйте свои сообщения $message=iconv("cp1251","utf-8", $message); 2. повторы он отсекает и не постает, так что проверяйте перед постом был уже пост или нет.

KOI8 отличается от UTF8.

Чувствуешь разницу? KOI8 != UTF8 

Абсолютно тоже самое написано, но понял лучше: http://catine.ru/coding/posting-tvitov-avtomaticheski-php-twitter-api/

Твиттер больше не поддерживает апи 1.0

Необходимо исправить скрипт OAuth.php:

public $host = "https://api.twitter.com/1";

на :
public $host = "https://api.twitter.com/1.1/";

---

function authenticateURL() { return 'https://twitter.com/oauth/authenticate'; }
function authorizeURL() { return 'https://twitter.com/oauth/authorize'; }

на :
function authenticateURL() { return 'https://api.twitter.com/oauth/authenticate'; }
function authorizeURL() { return 'https://api.twitter.com/oauth/authorize'; }

Спасибо, получилось

не могу найти как получить ключи и коды от твитера. подскажите.

Скрипт не срабатывает, друзья .. 

Подключил все по инструкци...

Вот мой скрипт - не страшно, что ключи выклаываю, все равно все тестовое )

 

<?php
require_once 'twitteroauth.php';

define("CONSUMER_KEY", "gQKXP1lcRnzPwjXvpdgdUU0FR");
define("CONSUMER_SECRET", "cNpYFmEWkLjEnlL6nbjcYVpKwoAdkJkDukjwhVLyBaFEmeUFhD");
define("OAUTH_TOKEN", "958395860299206656-TxhVU0heGu4iCMGB2gjNOR7ftiw7QeI");
define("OAUTH_SECRET", "JmGH3deO9MWqNluiFvIGZmK6gBlK0fwNtU6sVk3WY0VKg");

$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, OAUTH_TOKEN, OAUTH_SECRET);

$content = $connection->get('account/verify_credentials');

$connection->post('statuses/update', array( 'status' => 'MESSAGE TEST !!!' ));
?>