Шрифт
Объединяем twitter.com и vkontakte.ru
Play

Объединяем twitter.com и vkontakte.ru

Пользуетесь ли вы twitter’ом? Если ответом является «Да», то милости просим под кат, где будет рассказано про способ автоматического репостинга сообщений из twitter’а в статус сообщения на сайте vkontakte.ru используя python. Что такое twitter? Вот так отвечают на этот вопрос сами разработчики: Twitter — это сервис для друзей, родственников и коллег по работе для общения и поддержания связи при помощи обмена быстрыми, частыми ответами на один простой вопрос: Что ты делаешь?

Но в русскоязычном twitter’е в данный момент всего лишь 17 тыс. пользователей (по данным Бобука). И, к сожалению, не все мои друзья, родственники и коллеги зарегистрированы на twitter.com и не спешат там регистрироваться, даже после красочных рассказов как тут всё радужно и прекрасно. Но все мои друзья подсели на сайт вконтакт.ру. Тут они проводят много своего свободного и не очень времени онлайн (причём некоторые сидят тут и с портативных устройств, что лично для меня как-то странновато).

Поэтому логичным явилась идея объединить эти два сервиса каким либо способом. Хочу сказать, что данная мысль совсем не нова и есть даже специализированный сервис, пропиарим его немного: ВТвиттер. Но лично я, не люблю отдавать свои пароли непонятно кому (я же не квип пользователь, без обид;).

Собственно вот так мы и подобрались к цели этой статьи. Мы будем связывать статус сообщения вконтакт'а и twitter’а по средствам скрипта на питоне, который будет считывать последние сообщение из твиттера, проверять статус вконтакта и, в случае расхождения, обновлять статус сообщение в контакте. Скрипт отдаём на съедение планировщику вашей ОС и радуемся. Я расскажу как это сделать на линуксовой машине при помощи cron. На винде изменится только работа с планировщиком.

  • библиотека для работы c API Twitter'a;
  • библиотека для работы с json-ом.
  • remixpass — хэш пароля;
  • remixmid — id юзера контакта (можно достать не из кук);
  • remixemail — ваша электронная почта для логина (тоже просто известна).

Теперь у нас всё готово для написания кода. Дальше я покажу весь код сразу. Он очень хорошо прокомментирован и проблем с его пониманием, в принципе, не должно возникнуть, а если возникнут — комментарии внизу странички.

  1. #!/usr/bin/env python
  2. # -*- coding: utf8 -*-
  3. import urllib2 , urllib
  4. import re
  5. from twyt import twitter
  6. import simplejson as json
  7. #Прописываем информацию для авторизации
  8. #Для вконтака:
  9. email = 'lalala@mail.ru'
  10. id = '23'
  11. hash = '191aeb36d7876f9337ca61707b56d5882'
  12. activityhash = '982daef72dfd20321bbf31cia01347c6d'
  13. #Для твиттера:
  14. tw_login = 'Twitter_login'
  15. tw_passwrd = 'Twitter_pass'
  16. #формируем строку кук для вконтакта
  17. cookies_string = 'remixemail=' + email + ';remixmid=' + id + ';remixpass=' + hash
  18. def get_vkontakt_status ( text ) :
  19. """Функция выдерает статус сообщение со страницы вконтакта"""
  20. #Маска по которой происходит поиск регулярного выражения. Первый элемент начало, второй конец для поиска
  21. mask_link = ( r ';return false;">' , r '</a><br />' )
  22. #Формируем маску регулярного выражения
  23. mask = r "(?:" +mask_link [ 0 ] +r ")(.*)(?:" +mask_link [ 1 ] +r ")"
  24. #Компилируем регулярное выражение, re.I — игнорируем регистр
  25. parsed= re . compile ( mask, re . I )
  26. #и производим поиск
  27. finish = parsed. findall ( text )
  28. #Возвращаем первый найденный элемент (а он будет один),
  29. #при этом режем последний символ (в статусе вконтака там всегда точка, а она нам не нужна)
  30. #и декодируем из cp1251
  31. return finish [ 0 ] [ 0 :- 1 ] . decode ( 'cp1251' )
  32. def get_twit_status ( login, passwrd ) :
  33. """Получаем последнее сообщение твиттера"""
  34. #Создаём объект класса
  35. t = twitter. Twitter ( )
  36. #авторизуемся
  37. t. set_auth ( login, passwrd )
  38. #Получаем последнее сообщение (count=1)
  39. response = t. status_user_timeline ( count= 1 )
  40. #Ответ возвращает в виде json-строки
  41. #Обрабатываем полученное сообщение
  42. #Переводим json объект в объект питона
  43. json_objs = json. loads ( response )
  44. #Перебираем все пришедшие сообщения (хоть и прийти должно одно)
  45. for json_obj in json_objs:
  46. #забираем только текст сообщения
  47. twit = json_obj [ 'text' ]
  48. return twit
  49. def get_page ( url, post= None , cookies= None , timeout= None , referer= None ) :
  50. """Получаем странички, отсылаем запросы"""
  51. #Устанавливаем тайм аут
  52. if timeout:
  53. urllib2 . socket . setdefaulttimeout ( timeout )
  54. #POST данные посылаются в виде: post =
  55. if post ! = None :
  56. #кодируем русские и спец символы пос запроса
  57. post = urllib . urlencode ( post )
  58. #Создаём опенер для загрузки страницы
  59. opener = urllib2 . build_opener ( )
  60. #Формируем запрос
  61. #задаём адрес и строку для поста
  62. request = urllib2 . Request ( url, post )
  63. # задаёмся рефером
  64. if referer ! = None :
  65. request. add_header ( 'Referer' , referer )
  66. # устанавливаем клиент
  67. request. add_header ( 'User-Agent' , 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.10) Gecko/2009042523 Ubuntu/9.04 (jaunty) Firefox/3.0.10' )
  68. # устанавливаем куки
  69. if cookies ! = None :
  70. request. add_header ( 'Cookie' , cookies ) # куки
  71. #Запрос пошёл
  72. handle = opener. open ( request )
  73. # Читаем данные
  74. data = handle. read ( )
  75. #Закрываем хэндл
  76. handle. close ( )
  77. return data
  78. #Собственно понеслась программа
  79. if __name__ == "__main__" :
  80. #Получаем твиттер статус
  81. status_twitter = get_twit_status ( tw_login, tw_passwrd )
  82. #Получаем вконтакте статус
  83. content = get_page ( 'http://vkontakte.ru/' , cookies=cookies_string )
  84. status_vkontakt = get_vkontakt_status ( content )
  85. #Обновляем статус в случае расхождения
  86. if status_twitter ! = status_vkontakt:
  87. #формируем пост запросс для обновления
  88. #посылаем текст нового статуса в поле setactivity, указав принудительно кодировку utf8,
  89. #и activityhash для подтвержднения действия с одновление
  90. post_array =
  91. # И посылаем запрос для обновления статуса
  92. # ВНИМАНЕ в данном случае отсылка реффрера является обязательно. В противном случае ничего не обновится.
  93. content = get_page ( url= 'http://vkontakte.ru/profile.php' , post=post_array,
  94. cookies=cookies_string, referer= 'http://vkontakte.ru/id' + id
  95. )

Сохраняем это всё в файл, к примеру, twitter_in_vkon.py. Убеждаемся, что папки с библиотеками присутствуют в той же папке, даём права для запуска chmod +x ./twitter_in_vkon.py и запускаем скрипт ./twitter_in_vkon.py. Всё должно работать: последнее сообщение из твиттера перекочует в контакт;).

Теперь я расскажу как прикрутить всё это к локальному/удалённому планировщику типа cron. Прикручивал на непонятно почему всех в последнее время раздражающей Ubuntu. У других может быть по другому. Выполняем:

  1. crontab -e
  1. */ 5 ****/ etc / путь_к_нашему_скрипту / twitter_in_vkon.py
  1. sudo/ etc / init.d / cron restart
  1. sudo service cron restart

Тем кому хочется почитать больше про настройку cron’а выполняют команду man cron =). Вот и всё. В итоге, у нас получился автоматический репостинг наших твиттов в статус сообщения контакта. Даёшь микроблогинг в массы! =)

UPD arti_kz предложил логичный патч, исключающий постинг реплаев. Меняем 114 строку на: if (status_twitter != status_vkontakt) and (status_twitter[0] != '@'):

📎📎📎📎📎📎📎📎📎📎