Автоматизация аккаунта в твиттер с помощью API

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

Автофолловинг и автоанфолловинг

Сие пришло мне в голову когда я увидел что у аккаунта появляются читатели и я подумал что из вежливости стоило бы их тоже зафоловить и начал делать это вручную, но вскоре я увидел что аккаунт читает больше, чем читают его. На этом прекратилась ручная работа и была написана простая программа которая следила за подписавшимися и отписавшимися.

Если подписался, то подписываемся на него, если отписался, то отписываемся от него. Решение весьма тривиально: запросить читаемых и читателей, сравнить и сделать определенные запросы. Но решение в лоб натыкается на ограничения в запросах к API. Рассуждаем дальше?

  • Читаемые — данная характеристика, если это так можно назвать, зависит только от нас и поэтому во имя оптимизации будем хранить данный список у себя в БД.
  • Читатели — данная характеристика не зависит от нас поэтому придется каждый раз запрашивать у API.

В качестве БД я бы предостерег вас использовать файлы с массивами, поскольку после автоматизации список фолловеров будет исчисляться тысячами, а потом и десятками тысяч, а массив с такой кучей информации будет кушать много памяти. Поэтому советую использовать MySQL, SQLite или любую другую БД. Для любителей хранения информации в файлах советую xml, а так же прочитать как обрабатывать большие xml-файлы.

Для хранения фолловеров я использовал MySQL создав две таблицы:

CREATE TABLE `twitter_friends` (
`friend_id` BIGINT(20) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `twitter_friends` ADD PRIMARY KEY (`friend_id`);

CREATE TABLE `twitter_followers` (
`follower_id` BIGINT(20) UNSIGNED NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `twitter_followers`
ADD PRIMARY KEY (`follower_id`);

Мы создали две таблицы, теперь нам надо напихать в них информации. Для это нам необходимо создать относительно простенький код:

// Иницируем класс и отдаем ему наши ключи
$tmhOAuth = new tmhOAuth(array(
 'consumer_key' => '',
 'consumer_secret' => '',
 'user_token' => '',
 'user_secret' => '',
));


// Делаем запрос к API и получаем код ответа
$code = $tmhOAuth->request( 'GET', $tmhOAuth->url( '1.1/account/verify_credentials' ) );

// Смотрим код ответа, если не равен 200 значит
if ( 200 != $code ) {
 // Какая то ошибка, если надо, то обрабатываем $response
 //$response = json_decode( $tmhOAuth->response['response'], true );
 exit;
}

// Берем ответ и делаем из него массив. В нем собрана информация о нашем профиле. При желании можете с ним поработать и что нибудь из него поизвлекать интересного.
$verify_credentials = json_decode( $tmhOAuth->response['response'], true );


// Подключаемся к нашей БД
$connect = mysql_connect( 'localhost', 'user', 'pass' );
$select = mysql_select_db( 'table' );
if ( $connect && $select ) {
 mysql_query( "SET time_zone='+08:00'" );
 mysql_query( "SET NAMES 'utf8'" );
 mysql_query( "SET character_set_server = 'utf8'" );
 mysql_query( "SET collation_server = 'utf8_general_ci'" );
}

// Проверяем изменилось ли количество друзей
if (mysql_num_rows(mysql_query( "SELECT * FROM `twitter_friends`" ) ) != $verify_credentials['friends_count'] ) {
 // Очищаем таблицу с друзьями
 mysql_query( "TRUNCATE twitter_friends" );
 // Запрашиваем друзей
 $cursor = -1;
 while ( 0 != $cursor ) {
 $code = $tmhOAuth->request( 'GET', $tmhOAuth->url('1.1/friends/ids' ), array( "cursor"=>$cursor, "count"=>1000 ) );
 if ( 200 != $code ) {
 $response = json_decode( $tmhOAuth->response['response'], true );
 exit;
 }
 $response = json_decode( $tmhOAuth->response['response'] );
 mysql_query( "INSERT INTO twitter_friends (`friend_id`) VALUES (" . implode( "), (", $response->ids ) . ")" );
 $cursor = $response->next_cursor_str;
 }
}


// Запрашиваем фолловеров
$cursor = -1;
while ( 0 != $cursor ) {
 //Запрашиваем 1 000 фолловеров
 $code = $tmhOAuth->request( 'GET', $tmhOAuth->url( '1.1/followers/ids'), array( "cursor"=>$cursor, "count"=>1000 ) );
 if ( 200 != $code ) {
 // Ошибка, обрабатываем, если надо $response
 //$response = json_decode($tmhOAuth->response['response'], true);
 exit;
 }
 // В $response->ids находится список идентификаторов наших фолловеров
 $response = json_decode( $tmhOAuth->response['response'] );
 // Пишем их в БД
 mysql_query( "INSERT IGNORE INTO `twitter_followers` (`follower_id`) VALUES (" . implode( "), (", $response->ids ) . ")" );
 // Обновляеа курсор (иентификатор следующей партии фолловеров
 $cursor = $response->next_cursor_str;
}

Данный код первым делом проверяет изменилось ли количество тех, кого мы читаем и в случае изменения очищает таблицу и снова заполняет её свежей информацией. Затем запрашивает наших читателей и записывает их в нашу БД. Теперь нам необходимо отсортировать данные и в конечном итоге получить тех, кого нам надо зафоловить и тех, кого отфоловить. Это выполняется с помощью следующего кода:

$result = mysql_query(
 "SELECT `follower_id`, `friend_id`
 FROM `twitter_followers`
 LEFT JOIN `twitter_friends`
 ON `follower_id`=`friend_id`
 WHERE `friend_id` IS NULL
 UNION
 SELECT `follower_id`, `friend_id`
 FROM `twitter_followers`
 RIGHT JOIN `twitter_friends`
 ON `follower_id`=`friend_id`
 WHERE `follower_id` IS NULL"
);

while ( $item = mysql_fetch_assoc( $result ) ) {
 if ( $item['friend_id'] ) {
 $code = $tmhOAuth->request( 'POST', $tmhOAuth->url( '1.1/friendships/destroy' ), array( "user_id"=>$item['friend_id'] ) );
 if ( 200 != $code ) {
 mysql_query( "DELETE FROM `twitter_friends` WHERE `friend_id`=" . $item['friend_id'] );
 } else {
 $response = json_decode( $tmhOAuth->response['response'], true );
 }
 } else if ( $item['follower_id'] ) {
 $code = $tmhOAuth->request( 'POST', $tmhOAuth->url( '1.1/friendships/create' ), array( "user_id"=>$item['follower_id'], "follow"=>true ) );
 if ( 200 == $code ) {
 mysql_query( "INSERT INTO twitter_friends (`friend_id`) VALUES (" . $item['follower_id'] . ")" );
 } else if ( 403 == $code ) {
 $response = json_decode( $tmhOAuth->response['response'], true );
 // Юзер может читать нас, но нашу заявку на чтение может не подтвердить и мы получим ошибку с кодом 160 (You've already requested to follow...) фактически юзер у нас в друзьях и есть смысл записать его в БД
 if ( 160 == $response['errors'][0]['code'] ) {
 mysql_query( "INSERT INTO twitter_friends (`friend_id`) VALUES (" . $item['follower_id'] . ")" );
 }
 }
 }
}

// Очищаем таблицу с фолловерами
mysql_query( "TRUNCATE twitter_followers" );

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

Личные сообщения

Очень многие пользователи либо сами, либо с помощью сервисов рассылают личные сообщения когда кто либо начинает их читать. Когда счет фолловеров идет на тысячи, то поток этих сообщений превышает возможности человека по их удалению. А так как я люблю порядок во всем, то я решил добавить код, который удалял бы личные сообщения. Код небольшой и весьма простой:

$code = $tmhOAuth->request('GET', $tmhOAuth->url('1.1/direct_messages'), array("count"=>200));

if ($code == 200) {
$messages = json_decode($tmhOAuth->response['response'], true);
foreach($messages as $msg) {
$tmhOAuth->request('POST', $tmhOAuth->url('1.1/direct_messages/destroy'), array("id"=>$msg['id_str']));
}
}

По сути такая же примитивная логика «получаем и удаляем», но вы можете усложнить логику доработав программу и добавив какие либо условия обработки. Кроме всего прочего есть ещё упоминания с которыми так же можно работать, например, ретвитить или отвечать, а может и добавлять в читаемые тех, кто вас упомянул. Я приведу пример запроса, а вы сами уже если понадобится, реализуете логику, которая будет работать с упоминаниями.

$code = $tmhOAuth->request('GET', $tmhOAuth->url('1.1/statuses/mentions_timeline'), array("count"=>200, "since_id"=>$since_id));

  • count — количество упоминаний, которые должен вернуть сервер
  • since_id — идентификатор упоминания с которого должен начаться отсчет. Как вы понимаете, данный параметр необходимо хранить у себя.

Архив со скриптами

Вот собственно и все, дальше вы уже сами. Удачи!

Пожалуйста, оцените статью

Полная фигняУзнал немного новогоНормальная статьяХорошая статьяСупер! (Пока оценок нет)
Загрузка...

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Подпишитесь на рассылку и получайте новые статьи на почту