Пользуетесь ли вы twitter’ом? Если ответом является «Да», то милости просим под кат, где будет рассказано про способ автоматического репостинга сообщений из twitter’а в статус сообщения на сайте vkontakte.ru используя python.
Что такое twitter? Вот так отвечают на этот вопрос сами разработчики:
Twitter — это сервис для друзей, родственников и коллег по работе для общения и поддержания связи при помощи обмена быстрыми, частыми ответами на один простой вопрос: Что ты делаешь?
Но в русскоязычном twitter’е в данный момент всего лишь 17 тыс. пользователей (по данным Бобука). И, к сожалению, не все мои друзья, родственники и коллеги зарегистрированы на twitter.com и не спешат там регистрироваться, даже после красочных рассказов как тут всё радужно и прекрасно. Но все мои друзья подсели на сайт вконтакт.ру. Тут они проводят много своего свободного и не очень времени онлайн (причём некоторые сидят тут и с портативных устройств, что лично для меня как-то странновато).
Поэтому логичным явилась идея объединить эти два сервиса каким либо способом. Хочу сказать, что данная мысль совсем не нова и есть даже специализированный сервис, пропиарим его немного: ВТвиттер. Но лично я, не люблю отдавать свои пароли непонятно кому (я же не квип пользователь, без обид;).
Собственно вот так мы и подобрались к цели этой статьи. Мы будем связывать статус сообщения вконтакт'а и twitter’а по средствам скрипта на питоне, который будет считывать последние сообщение из твиттера, проверять статус вконтакта и, в случае расхождения, обновлять статус сообщение в контакте. Скрипт отдаём на съедение планировщику вашей ОС и радуемся. Я расскажу как это сделать на линуксовой машине при помощи cron. На винде изменится только работа с планировщиком.
И так для начала подготовим окружение для работы. Нам потребуются две библиотеки для питона:
Теперь переходим к подготовке конфиденциальной информацию, которая нам потребуется. Для начала нам необходим логин и пароль twitter’а. Это просто.
Теперь сайт вконтакта. Т.к. мы пишем скриптик под себя, а не сервис, мы не станем производить sing-in каждый раз на контаке для того чтобы получить куки. Вместо этого мы будем использовать готовые куки, которые раздобудем в браузере. Из кук нам будут нужны:
Теперь у нас всё готово для написания кода. Дальше я покажу весь код сразу. Он очень хорошо прокомментирован и проблем с его пониманием, в принципе, не должно возникнуть, а если возникнут — комментарии внизу странички.
Сохраняем это всё в файл, к примеру, twitter_in_vkon.py. Убеждаемся, что папки с библиотеками присутствуют в той же папке, даём права для запуска chmod +x ./twitter_in_vkon.py и запускаем скрипт ./twitter_in_vkon.py. Всё должно работать: последнее сообщение из твиттера перекочует в контакт;).
Теперь я расскажу как прикрутить всё это к локальному/удалённому планировщику типа cron. Прикручивал на непонятно почему всех в последнее время раздражающей Ubuntu. У других может быть по другому.
Выполняем:
Вот и всё. В итоге, у нас получился автоматический репостинг наших твиттов в статус сообщения контакта. Даёшь микроблогинг в массы! =)
UPD
arti_kz предложил логичный патч, исключающий постинг реплаев.
Меняем 114 строку на:
if (status_twitter != status_vkontakt) and (status_twitter[0] != '@'):
Что такое twitter? Вот так отвечают на этот вопрос сами разработчики:
Twitter — это сервис для друзей, родственников и коллег по работе для общения и поддержания связи при помощи обмена быстрыми, частыми ответами на один простой вопрос: Что ты делаешь?
Но в русскоязычном twitter’е в данный момент всего лишь 17 тыс. пользователей (по данным Бобука). И, к сожалению, не все мои друзья, родственники и коллеги зарегистрированы на twitter.com и не спешат там регистрироваться, даже после красочных рассказов как тут всё радужно и прекрасно. Но все мои друзья подсели на сайт вконтакт.ру. Тут они проводят много своего свободного и не очень времени онлайн (причём некоторые сидят тут и с портативных устройств, что лично для меня как-то странновато).
Поэтому логичным явилась идея объединить эти два сервиса каким либо способом. Хочу сказать, что данная мысль совсем не нова и есть даже специализированный сервис, пропиарим его немного: ВТвиттер. Но лично я, не люблю отдавать свои пароли непонятно кому (я же не квип пользователь, без обид;).
Собственно вот так мы и подобрались к цели этой статьи. Мы будем связывать статус сообщения вконтакт'а и twitter’а по средствам скрипта на питоне, который будет считывать последние сообщение из твиттера, проверять статус вконтакта и, в случае расхождения, обновлять статус сообщение в контакте. Скрипт отдаём на съедение планировщику вашей ОС и радуемся. Я расскажу как это сделать на линуксовой машине при помощи cron. На винде изменится только работа с планировщиком.
И так для начала подготовим окружение для работы. Нам потребуются две библиотеки для питона:
- библиотека для работы c API Twitter'a;
- библиотека для работы с json-ом.
Теперь переходим к подготовке конфиденциальной информацию, которая нам потребуется. Для начала нам необходим логин и пароль twitter’а. Это просто.
Теперь сайт вконтакта. Т.к. мы пишем скриптик под себя, а не сервис, мы не станем производить sing-in каждый раз на контаке для того чтобы получить куки. Вместо этого мы будем использовать готовые куки, которые раздобудем в браузере. Из кук нам будут нужны:
- remixpass — хэш пароля;
- remixmid — id юзера контакта (можно достать не из кук);
- remixemail — ваша электронная почта для логина (тоже просто известна).
Теперь у нас всё готово для написания кода. Дальше я покажу весь код сразу. Он очень хорошо прокомментирован и проблем с его пониманием, в принципе, не должно возникнуть, а если возникнут — комментарии внизу странички.
- #!/usr/bin/env python
- # -*- coding: utf8 -*-
- import urllib2, urllib
- import re
- from twyt import twitter
- import simplejson as json
- #Прописываем информацию для авторизации
- #Для вконтака:
- email = 'lalala@mail.ru'
- id = '23'
- hash = '191aeb36d7876f9337ca61707b56d5882'
- activityhash = '982daef72dfd20321bbf31cia01347c6d'
- #Для твиттера:
- tw_login = 'Twitter_login'
- tw_passwrd = 'Twitter_pass'
- #формируем строку кук для вконтакта
- cookies_string = 'remixemail='+email+';remixmid='+id+';remixpass='+hash
- def get_vkontakt_status(text):
- """Функция выдерает статус сообщение со страницы вконтакта"""
- #Маска по которой происходит поиск регулярного выражения. Первый элемент начало, второй конец для поиска
- mask_link = ( r';return false;">', r'</a><br />')
- #Формируем маску регулярного выражения
- mask = r"(?:"+mask_link[ 0 ]+r")(.*)(?:"+mask_link[1]+r")"
- #Компилируем регулярное выражение, re.I — игнорируем регистр
- parsed= re.compile(mask, re.I)
- #и производим поиск
- finish = parsed.findall(text)
- #Возвращаем первый найденный элемент (а он будет один),
- #при этом режем последний символ (в статусе вконтака там всегда точка, а она нам не нужна)
- #и декодируем из cp1251
- return finish[0][0:-1].decode('cp1251')
- def get_twit_status(login, passwrd):
- """Получаем последнее сообщение твиттера"""
- #Создаём объект класса
- t = twitter.Twitter()
- #авторизуемся
- t.set_auth(login, passwrd)
- #Получаем последнее сообщение (count=1)
- response = t.status_user_timeline(count=1)
- #Ответ возвращает в виде json-строки
- #Обрабатываем полученное сообщение
- #Переводим json объект в объект питона
- json_objs = json.loads(response)
- #Перебираем все пришедшие сообщения (хоть и прийти должно одно)
- for json_obj in json_objs:
- #забираем только текст сообщения
- twit = json_obj['text']
- return twit
- def get_page(url, post=None, cookies=None, timeout=None, referer=None):
- """Получаем странички, отсылаем запросы"""
- #Устанавливаем тайм аут
- if timeout:
- urllib2.socket.setdefaulttimeout(timeout)
- #POST данные посылаются в виде: post = {'key1' : 'value1', 'key2' : 'value2'}
- if post != None:
- #кодируем русские и спец символы пос запроса
- post = urllib.urlencode(post)
- #Создаём опенер для загрузки страницы
- opener = urllib2.build_opener()
- #Формируем запрос
- #задаём адрес и строку для поста
- request = urllib2.Request(url, post)
- # задаёмся рефером
- if referer != None:
- request.add_header('Referer', referer)
- # устанавливаем клиент
- 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')
- # устанавливаем куки
- if cookies != None:
- request.add_header('Cookie', cookies) # куки
- #Запрос пошёл
- handle = opener.open(request)
- # Читаем данные
- data = handle.read()
- #Закрываем хэндл
- handle.close()
- return data
- #Собственно понеслась программа
- if __name__ == "__main__":
- #Получаем твиттер статус
- status_twitter = get_twit_status(tw_login, tw_passwrd)
- #Получаем вконтакте статус
- content = get_page('http://vkontakte.ru/', cookies=cookies_string)
- status_vkontakt = get_vkontakt_status(content)
- #Обновляем статус в случае расхождения
- if status_twitter != status_vkontakt:
- #формируем пост запросс для обновления
- #посылаем текст нового статуса в поле setactivity, указав принудительно кодировку utf8,
- #и activityhash для подтвержднения действия с одновление
- post_array = {'setactivity': status_twitter.encode("utf8"), 'activityhash':activityhash}
- # И посылаем запрос для обновления статуса
- # ВНИМАНЕ в данном случае отсылка реффрера является обязательно. В противном случае ничего не обновится.
- content = get_page(url='http://vkontakte.ru/profile.php', post=post_array,
- cookies=cookies_string, referer='http://vkontakte.ru/id'+id
- )
Сохраняем это всё в файл, к примеру, twitter_in_vkon.py. Убеждаемся, что папки с библиотеками присутствуют в той же папке, даём права для запуска chmod +x ./twitter_in_vkon.py и запускаем скрипт ./twitter_in_vkon.py. Всё должно работать: последнее сообщение из твиттера перекочует в контакт;).
Теперь я расскажу как прикрутить всё это к локальному/удалённому планировщику типа cron. Прикручивал на непонятно почему всех в последнее время раздражающей Ubuntu. У других может быть по другому.
Выполняем:
Нам открывается файл cron’а с задачами и периодичностью их выполнения (по умолчанию он пуст). Добавим сюда запуск нашего скрипта каждые пять минут. Для этого вставим в файл строчку:
- crontab -e
И перезапускаем cron:
- */5 * * * * /etc/путь_к_нашему_скрипту/twitter_in_vkon.py
либо
- sudo /etc/init.d/cron restart
Тем кому хочется почитать больше про настройку cron’а выполняют команду man cron =).
- sudo service cron restart
Вот и всё. В итоге, у нас получился автоматический репостинг наших твиттов в статус сообщения контакта. Даёшь микроблогинг в массы! =)
UPD
arti_kz предложил логичный патч, исключающий постинг реплаев.
Меняем 114 строку на:
if (status_twitter != status_vkontakt) and (status_twitter[0] != '@'):