Kichrum's Blog|

Пятница, 17 июля, 2009

Объединяем В Контакте и Twitter в PHP

Объединяем Твиттер и В Контакте и получаем… В Контер? Нет, Твиттанте… В общем, пусть каждый называет это по-своему, потому что недавно возмутились об отсутствии структуры “а дальше читатель пусть подумает сам” в моём блоге.

А пока ты только думаешь, Смирнов уже сделал… трансляцию статуса Twitter в свой аккаунт В Контакте. Да окрестил сие чудо  “tvkontakte 0.1″, да разрешил издеваться над творением своим… Во имя CTRLa, ALTa и святого DELa, Enter!

Вот я и поиздевался. Проблема его реализации в чём была – в том, что в ней лисапеда не было была проблема со ссылками в статусе. Он-то учёл, что долбать своих друзей постоянно обновляющимся одним и тем же статусом – признак дурного тона, но это всё-равно случается, если в статусах присутствуют ссылки. Что же тогда происходит…

  1. Скрипт читает RSS ленту с Твиттера, публикует последнее сообщение В Контакт.
  2. Умный В Контакте распознаёт ссылки и делает их кликабельными, дописывая свои <a href=”away.php?…
  3. Скрипт через заданный в cron промежуток времени заходит В Контакт и видит – “О Боже! Статус-то уже не такой, как последний на Твиттере, а я его до сих пор не обновил!” и быстренько обновляет.
  4. В результате и скрипту покоя нет долгими утрами, когда я сплю, (нет, это не повод оставлять его без куска хлеба над головой, просто вырвалось), и друзьям покоя тоже нет – они в “Мои новости” будут каждые n минут будут видеть мой статус как новый и им это быстро надоест, в следствии чего закидают монитор камнями. И останусь я без друзей… Так, опять не туда.

В общем, я изначально думал выполнять все действия В Контакта, чтоб составлять статус для сравнения и мне стало лень. Поэтому при обновлении скрипт в моей вариации записывает статус ещё и в отдельный файл, а потом сверяет последний в ленте со строкой в файле.

Минус такого решения очевиден (например, лишний геморрой с атрибутами файла и дополнительный пункт в настройках скрипта). Но плюс, помимо того, что не мучаю друзей, есть ещё один. Так я могу изменить статус В Контакте на свой, и пока я не напишу в Twitter что-то новое, он будет висеть, как так и надо.

В общем, хватит лирического отступления. Вот код vtweet.php.

< ?
 /*
	tvkontakte 0.1i
	vkontakte.ru status updater from twitter
	made by Vladimir Smirnoff
	http://orl.sumy.ua
	mail@smirnoff.sumy.ua
	improved by Kichrum
	http://Kichrum.org.ua
 */
# Конфигурация - ОТРЕДАКТИРУЙ!
define ('TWITTER_USERNAME','MyLogin'); // MyLogin заменить на свой Логин в Twitter
define ('VKONTAKTE_LOGIN','user@mail.ua'); // user@mail.ua заменить на свой E-mail на Vkontakte.ru
define ('VKONTAKTE_PASSWORD','gfhjkm'); // gfhjkm  заменить на свой Пароль на Vkontakte.ru
define ('PREPEND_WORD','Twitter.com/Kichrum '); // Twitter.com/Kichrum  заменить на Слово,  которое будет перед статусом: максимальная длинна: 20 символов с пробелами = 160 во vkontakte - 140 в twitter
# Конфигурация выполнена.
# Дальше можно не читать :)
# Объявляем Дуровский UserAPI
class vkuserapi {
	private $curlh = null;
	public $uid = null;
	private $sid = null;
	public function __construct ($login,$password) {
		$this->curlh = curl_init();
		$request = 'http://login.userapi.com/auth?site=2&login=force&pass='.urlencode($password).'&email='.urlencode($login);
		curl_setopt($this->curlh, CURLOPT_URL,$request);
		curl_setopt($this->curlh, CURLOPT_FAILONERROR, true);
		curl_setopt($this->curlh, CURLOPT_FOLLOWLOCATION, false);
		curl_setopt($this->curlh, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($this->curlh, CURLOPT_POST, false);
		curl_setopt($this->curlh, CURLOPT_HEADER, true);
		$auth_result = curl_exec($this->curlh);
		if (preg_match("/remixmid=(\d+)/", $auth_result, $matches)) $this->uid = $matches[1];
		if (preg_match("/.*;sid=(\w*)/", $auth_result, $matches)) $this->sid = $matches[1];
	}
	public function call ($func,$params) {
		curl_setopt($this->curlh, CURLOPT_HEADER, false);
		$request = 'http://userapi.com/data?act='.$func.'&'.http_build_query ($params).'&sid='.$this->sid;
		curl_setopt($this->curlh, CURLOPT_URL,$request);
		$result = curl_exec($this->curlh);
		return json_decode($result);
	}
	public function __destruct () {
		$request = 'http://login.userapi.com/auth?login=logout&site=2&sid='.$this->sid;
		curl_setopt($this->curlh, CURLOPT_URL,$request);
		curl_exec($this->curlh);
		curl_close ($this->curlh);
	}
}
# Берем статус со своей RSS-ленты на Twitter.com
$rss = simplexml_load_file('http://twitter.com/statuses/user_timeline/'.TWITTER_USERNAME.'.rss');
# Убираем лишнюю информацию
foreach ($rss->channel->item as $status) {
	if (strpos($status->title,'@')) continue; // Фильтр реплаев в Twitter
	$last_status_twitter = str_replace (TWITTER_USERNAME.': ','',$status->title); break;
}
# Читаем последний обновлённый статус из файла vtweet.txt
$f=fopen(dirname(__FILE__).'/vtweet.txt','r');
$last_status_vkontakte = fread($f,512);
fclose($f);
# Если последний статус ещё не опубликован во В Контакте, публикуем и помечаем его как обновлённый
if (($last_status_vkontakte != $last_status_twitter) && ($last_status_twitter != NULL)) {
$vkontakte = new vkuserapi (VKONTAKTE_LOGIN,VKONTAKTE_PASSWORD); // Логинимся
$vkontakte->call ('set_activity',array('ts'=>time(),'text'=>PREPEND_WORD.$last_status_twitter)); // Обновляем статус
unset ($vkontakte); // Выходим из Vkontakte.ru
$f=fopen(dirname(__FILE__).'/vtweet.txt','w');
fwrite($f,$last_status_twitter); // "Помечаем" статус как уже обновлённый
fclose($f);
echo 'Updatetd.';
}
else echo 'No update needed.'; // Если последний уже помечен, выводим внутреннюю ошибку.
# Завершаем работу программы.
?>

Плюс требуется создать файл vtweet.txt, положить его в папку со скриптом и прописать для него chmod 777. И в завершении всего прописать в crontab новою задачу, где указать адрес файла .php и периодичность, с которой требуется обновлять статус. Например, я себе поставил */15 * * * *, что означает запуск скрипта каждые 15 минут.

Скачать всё архивом: tvkontakte 0.1i (не забудь отредактировать нужные поля в vtweet.php).

Нюансы, которые моя вариация перенимает у оригинала: версия установленного PHP должна быть не ниже 5.1, должны быть подключены lib_curl, simple_xml и allow_url_fopen (за этим обращайся к хостинг-провайдеру), Twitter-профиль не должен быть приватным, хостинг-провайдер не должен быть забаненным В Контакте. Последнее случается, если хостинг имеет бесплатные/дешёвые тарифы или на нём хостился какой-нибудь горе-автор какого-нибудь сервиса для ВКонтакта. Например, такое такое горе случилось с masterhost.ru, когда на нём оказался зарегистрированным сайт vtwittere.ru.

Исходная версия скрипта от Владимира Смирнова: Трансляция статуса твиттера в контакт (сам код).

Выбирай и пользуйся :)

UPD: Исправил пару недочётов :)

UPD (18.07): Через форму обратной связи (см. справа) можно присылать мне свои логины к Твиттеру и мыло/пароль к В Контакте – я пропишу у себя на сервере и будет у тебя всегда свежий статус В Контакте. Только поспеши, предложение не вечно!

« “Большой” футбол в Сумах: другая сторона | Мой юбилей »

Поделись статьей с друзьями:

в Твиттере, в Контакте, в Facebook и в Живом Журнале

Ещё в тему:

22 комментария к этой писанине »

  1. Комментарий оставил(а) MrGALL 17 июля 2009 г. (Пятница) в 15:25

    Щоб не прописувати вручну папку до скрипта — краще писати ось так:
    $file=dirname(__FILE__).”/vtweet.txt” );

    А щодо цього ідеї поєднувати Твіттер та Вконтактє — ІМХО це дуже потрібно (як і Вконтактє загалом) :)

  2. Комментарий оставил(а) Kichrum 17 июля 2009 г. (Пятница) в 16:55

    Да, точно, спасибо. Я просто думал, что крон __FILE__ тоже проигнорирует или поставит свой. Ну раз работает, обновил. :)

  3. Комментарий оставил(а) Kichrum 18 июля 2009 г. (Суббота) в 01:17

    Кстати, кто не имеет своего сервера или кому лень что-то делать самому – пишите через форму обратной связи Твиттер-логин, имейл/пароль ко В Контакте – я сделаю автообновление через свой сервак. Только мест ограничено (боюсь бана), так что поспешите. =)

  4. Комментарий оставил(а) Kichrum 18 июля 2009 г. (Суббота) в 23:05

    Так… Объявилась ещё проблема. В Twitter есть ограничение на подключения к RSS-фидам с одного IP (150 раз в час). У меня эта проблема проявилась (нет, не данный скрипт подключался так часто, просто на моём сервере другими пользователями расположены ещё некоторые программы для Твиттера). В следствии этого вместо обычной ленты получаем ошибку, скрипт распознаёт как новый статус – пустое значение, отсюда несходство с последним обновлённым и скрипт срабатывает. В общем, к условию выполнения скрипта предусматриваем значение NULL.

    Находим это:
    # Если последний статус ещё не опубликован во В Контакте, публикуем и помечаем его как обновлённый
    Чуть ниже это:
    if ($last_status_vkontakte != $last_status_twitter) {
    заменяем на вот это:
    if (($last_status_vkontakte != $last_status_twitter) && ($last_status_twitter != NULL)) {

    Мне помогло, архив обновил. :)

  5. Комментарий оставил(а) Николай 24 июля 2009 г. (Пятница) в 22:01

    Заметил что при обновлении статуса вконтакте через юзерапи друзья не получают уведомлений

  6. Комментарий оставил(а) Kichrum 31 июля 2009 г. (Пятница) в 00:00

    Спасибо за новость, Николай. Не исключено и такое, но лично не проверял. А правило хорошего тона – не дёргать часто В Контакт – в любом случае поможет в сохранении IP твоего сервера от бана.

  7. Комментарий оставил(а) WeRteR :) 16 августа 2009 г. (Воскресенье) в 13:57

    Жестячно, але трошки незручно ;)

    Краще зробити форму для введення статусу і вже її опрацьовувати.

  8. Комментарий оставил(а) Kichrum 17 августа 2009 г. (Понедельник) в 21:47

    Тобто замахнутися на сотні дуже зручних Твіттер-клієнтів зі своєю формою, яка має лише один “+” в тому, що може оновлювати статус не тільки на Твіттері, а й В Контакті? Ні, от це вже дійсно було б безґлуздо, я гадаю! Хоча й зробити це дуже легко, я віддаватиму перевагу ТвіттерГаджету в iGoogle перед власною розробкою.

    Чи може я не вірно зрозумів твій комент, Вертере?

  9. Комментарий оставил(а) Тарас 18 августа 2009 г. (Вторник) в 03:38

    Я обледенил ваш вариант и Radmus’a. Можете взглянуть здесь http://www.taras.tk/2009/08/avtomaticheskoe-obnovlenie-statusa-v-kontakte-pri-pomoshhi-twitter-%e2%80%93-twitter-2-v-kontakte/

  10. Комментарий оставил(а) Kichrum 21 августа 2009 г. (Пятница) в 21:20

    Спасибо, Тарас. У меня было такое же желание, но решил, что меньше кода = меньше проблем. Чего-то о скорости не подумал…

  11. Комментарий оставил(а) Kenjik 4 сентября 2009 г. (Пятница) в 12:18

    А можно ли как-то тоже самое, но в Новости группы запихивать? Именно в Новости, а не на Стену.

  12. Комментарий оставил(а) Kichrum 4 сентября 2009 г. (Пятница) в 12:49

    К сожалению, нет. UserAPI сейчас ещё не умеет работать с группами.

  13. Комментарий оставил(а) Iriska 19 сентября 2009 г. (Суббота) в 14:32

    А таким образом проставленные статусы видны в ленте друзей?

  14. Комментарий оставил(а) Kichrum 19 сентября 2009 г. (Суббота) в 17:31

    Если верить Николаю, то нет. Лично я не проверял, но по-моему, тоже нет. Да и кто в ту ленту друзей подписывается на статусы? Это ж сколько мусора будет, если друзей хотя бы 100 =)

  15. Комментарий оставил(а) Kichrum 10 октября 2009 г. (Суббота) в 21:54

    Я только-что перешел на версию Тараса. Одобрянус! :) С API я могу позволить себе большее (выставил запуск скрипта ежеминутно, хотя хостер не позволяет. Так что если блог уйдет в оффлайн…… ;))

    Была проблема с 267-й строкой твиттер-классов. Исправляется тупо закомментированием:

    //        curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);

  16. Комментарий оставил(а) DPolyakov 13 марта 2010 г. (Суббота) в 16:27

    Спасибо за скриптик. Перешел на него со скрипта radmus.net, тот почему то поломался )))
    Ваш работает – спасибо. Дам ссылочку в твиттере ))

  17. Комментарий оставил(а) Kichrum 13 марта 2010 г. (Суббота) в 18:02

    DPolyakov, спасибо. Ретвитну :)

  18. Комментарий оставил(а) Юлий 17 мая 2010 г. (Понедельник) в 14:33

    Хороший скрипт. Сейчас как раз изучаю возможности этой платформы. Так что думаю что пригодится.

  19. Комментарий оставил(а) Аббат_Кальне 22 мая 2010 г. (Суббота) в 15:19

    спасибо, с меня наверно постовой )))

  20. Комментарий оставил(а) Сергей 4 июня 2010 г. (Пятница) в 17:35

    Прикольный скриптец! Попробую его в действии.

  21. Комментарий оставил(а) Kichrum 7 июня 2010 г. (Понедельник) в 01:11

    ВКонтакте стал поддерживать связь в обратную сторону (экспорт статусов с ВКонтакте в Твиттер): ВКонтакте – Мои настройки – Мобильные сервисы – Экспорт статуса.
    Конфликтов со скриптом не обнаружено! Прекрасно работает связь в обе стороны: можно обновлять статус ВКонтакте и он скопируется в Твиттер, и наоборот: написав новый твит, он станет статусом ВКонтакте.

  22. Комментарий оставил(а) Astri 10 июля 2010 г. (Суббота) в 00:45

    спарились таки ))

Подпишись на RSS и получай оперативно новые статьи, комменты к этой записи или сразу все комментарии блога!

Выскажись!

© Пашко Сергей, 2008—2010. Все права защищены

В совершенстве знаю все надписи на освежителях воздуха в туалете.
Kichrum's BlogKichrum