2547 читателей, 196 постов
Администрация
Модераторы
Материалы по замечательному языку программирования Python.
- #!/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[][:-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
- )
Нам открывается файл cron’а с задачами и периодичностью их выполнения (по умолчанию он пуст). Добавим сюда запуск нашего скрипта каждые пять минут. Для этого вставим в файл строчку:
- crontab -e
И перезапускаем cron:
- */5 * * * * /etc/путь_к_нашему_скрипту/twitter_in_vkon.py
либо
- sudo /etc/init.d/cron restart
Тем кому хочется почитать больше про настройку cron’а выполняют команду man cron =).
- sudo service cron restart
комментарии (85)
В твиттере у меня нет ни одного друга с реальной жизни. В отличии от контакта я нашел определенный круг умных людей, с которыми можно общаться. И найти в твиттере одно думцев плевое дело =)
Контакт я воспринимаю, как сеть общения с друзьями в неформальной форме, для всего остального я не вижу зачем он.
Согласно настроениям аудитории, логично было бы спрашивать «пользуетесь ли вы vkontakte.ru» :)
python есть даже под мобильные винды и симбиан.
кстати могу сделать java/groovy версию, если кому надо.
Но все интересно — особенно если один пример на нескольких языках рядом написан.
Если дойдут руки, опубликуйте здесь же, пожалуйста.
Т.е. вариант, что кто-то не пользуется говновконтактом даже не рассматривается?
twivk # ./vktwi.py
File "./vktwi.py", line 31
mask = r"(?:"+mask_link[]+r")(.*)(?:"+mask_link[1]+r")"
^
SyntaxError: invalid syntax
File "./vktwi.py", line 31
mask = r"(?:"+mask_link[]+r")(.*)(?:"+mask_link[1]+r")"
^
SyntaxError: invalid syntax
114c114
< if status_twitter != status_vkontakt:
— > if (status_twitter != status_vkontakt) and (status_twitter[0] != '@'):
Все-таки реплаи не очень красиво там будут смотреться…
т.е. Вы утверждаете, что во вконтакте есть все пользователи хабра?
File «twitter_in_vkon.py», line 67
if timeout:
^
IndentationError: unindent does not match any outer indentation level
Позволяет выделять столбцы текста.
А исхожник все-же надо.
Traceback (most recent call last):
File «TwiVkon.py», line 107, in status_twitter = get_twit_status(tw_login, tw_passwrd)
File «TwiVkon.py», line 51, in get_twit_status
response = t.status_user_timeline(count=1)
File "/Users/icekeeper/Documents/TwiVkon/twyt/twitter.py", line 223, in status_user_timeline
return self.get(data, handler, doauth=True)
File "/Users/icekeeper/Documents/TwiVkon/twyt/twitter.py", line 134, in get
return self.__request(data, handler, doauth=doauth, method='GET')
File "/Users/icekeeper/Documents/TwiVkon/twyt/twitter.py", line 115, in __request
raise TwitterException(«Connect failed: » + str(e.reason))
twyt.twitter.TwitterException: Connect failed: unknown url type: https
P.S. Где нормальный API от ВКонтакте? Парсинг — это зло.
изучением языка занялся недавно) пока только удалось, с помощью этой статьи, получить страницу содержащую список…
urllib2.URLError: прокси нету и можно простым пингом достучаться до vkontakte.ru
Кстати, перезапускать crond после редактирования пользовательского crontab не нужно.
А если бы его понадобилось перезапустить (например, после редактирования /etc/crontab, и то я не уверен), то лучше испольовать reload.
P.S. Пароль доверить можно, я проверял.
python tinv.pyсначала выжавал кучу синтаксических ошибок — исправил выравниванием отступов… теперь ошибок не выдает… но… статус в контакте не меняется :( в чем проблема?И еще, как решается проблема с устареванием кук?
Крон вываливается с ошибкой:
Fatal error: Call to undefined function curl_init() in /virt/homes/ozonar/htdocs/twit/twitter.class.php on line 253
Функция curl_init() нигде не обьявлена. Что не так?
К великому сожалению, сервис прекратил свое земное существование.
Все авторизационные данные были удалены вместе с базой данных.
Просим прощения за такой вот косяк. Если что, пишите письма: evgenij@beloded.net
cookies_string = ""«remixchk=5; remixlang=3; remixclosed_tabs=8; remixsid=31fcc376cf74c284332552ec6c3e3d42d5ac223d9ed12b64579b2x2»""