Иди ты нафиг, twitterfeed!


В который раз убеждаюсь – полагаться нужно только на себя и свои силы (возможности, ресурсы и далее по списку). Не жизнь, а череда законов Мерфи. Но, обо всем по порядку.

Раскручивая все тот же ресурс (что и в прошлой статье), задался целью наследить в твитере. На ресурсе часто появляются новые записи в блогах и для лучшей индексации и повышения количества внешних ссылок кросс-постинг в твитер не помешает. На сайте уже имелся rss-генератор и я уже собирался было клепать свой парсер-rss-и-авто-твитт, как натнулся на twitterfeed.com (даже ссылкой оформлять не буду). Там мне было обещано принимать на вход rss’ку и репостить ссылки с описаниями в твитер. Регистрируюсь, добавляю свою rss, рассекречиваю логин с паролем от twitter’а и устанавливаю самую высокую частоту обновления rss’ки – 30 минут. Через полчаса первые пять укороченных ссылок (http://bit.ly) с описаниями затвитились. Спустя 2,5 часа затвитились еще две ссылки, хотя должно было быть намного больше. Это меня совсем не устраивало. Мне нужна стабильность – если в течении получаса в rss’ке появилась ссылка, значит она стабильно появляется и в твитере.

О том что python-боты легко находят общий язык с популярным сервисом микроблоггинга я узнал еще полгода назад из журнала «Хакер», а вот сокращалку ссылок нужно было приручить. Сначала мой выбор пал на Кликер – готовый API (да еще и первый пример на питоне) позволил накатать скрипт за 3 минуты. Но при проверке оказалось, что все укороченные ссылки ведут на одну страницу (хотя когда укорачивал не скриптом, а руками – все работало; мистика!). Тогда я решил использовать http://b23.ru. Правда там пользоваться API разрешают только зарегистрированным и не более 30 укорачиваний за час, но эти ограничения меня не отпугнули :) .

Для того что бы не твитить один и тот же пост несколько раз пришлось хранить id’ки твитнутых постов в текстовом файле. В ссылке id передается GET-параметром rid.

А вот и исходник скрипта:

# -*- coding: utf-8
import pycurl
import StringIO
import urllib
import urllib2
import re
import string

# сокращалка ссылок
user = '11111' # логин
key = 'pass' # ключ из настроек
host = 'http://b23.ru/api/shorten/'

# сокращалка ссылок
def shorter(url):
	passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
	passman.add_password(None, 'http://b23.ru', user, key)
	opener = urllib2.build_opener(urllib2.HTTPBasicAuthHandler(passman))
	urllib2.install_opener(opener)
	result = urllib2.urlopen(host+url)
	return result.read()

# из items выделяем ссылку, номер, заголовок
def get_fields(item):
	title = re.findall(r'<title>(.+?)</title>', item)[0]
	# если rss'ка в виндовой кодировке - обращаем в utf-8
	title = title.decode('cp1251').encode('utf-8')
	link = re.findall(r'<link>(.+?)</link>', item)[0]
	link = string.replace(link, "&amp;", "&")
	rid = re.findall(r'rid=([^&]*)', link)[0]
	rid = int(rid)
	desc = re.findall(r'<description>(.*?)</description>', item, re.DOTALL)[0]
	# если rss'ка в виндовой кодировке - обращаем в utf-8
	desc = desc.decode('cp1251').encode('utf-8')
	return title, link, rid, desc

# твитим
def tweet(txt):
	txt = txt[:139]
	data = StringIO.StringIO()
	curl = pycurl.Curl()
	curl.setopt(pycurl.URL,'http://twitter.com/statuses/update.xml')
	curl.setopt(pycurl.WRITEFUNCTION, data.write)
	curl.setopt(pycurl.USERPWD,'логин:пароль')
	curl.setopt(pycurl.POSTFIELDS,'status='+txt)
	curl.setopt(pycurl.POST,1)
	curl.perform()
	curl.close()

# ==========================================собственно сама прога

# формируем массив твитанутых id-шников
try:
	fposted = 'posted_tweets.txt'
	f = open(fposted, "r")
	posted = f.readlines()
	f.close()
	for i in xrange(len(posted)):
		posted[i] = int(posted[i])
except:
	posted = []

# получаем rss
rss = urllib.urlopen('адрес rss`ки').read()
# делим на items
items = re.findall(r'<item>(.+?)</item>', rss, re.DOTALL)
# пробегаемся по всем элементам rss'ки
for item in items:
	# из items выделяем ссылку, номер, заголовок
	title, link, rid, desc = get_fields(item)
	print str(rid)+"\n"
	# проверяем rid на твитнутость
	if rid not in posted:
		# сокращаем ссылку
		short = shorter(link)
		# и твитим короткую ссылку, заголовок и описание
		tweet(short+' '+title+' '+desc)
		# запоминаем что затвитили
		f = open(fposted, "a+")
		f.write(str(rid)+"\n")
		f.close()

Ставим скрипт в cron на каждые полчаса и смотрим как все делается за нас :)

Жду вопросов, идей и предложений.

, , , ,



  1. #1 by Noob on 23 Август 2010 - 18:16

    Привет. Твои статьи по питону меня заинтересовали заняться этим языком. Не мог бы ты посоветовать какую-нибудь литературу на рус. по этому языку. И какой интерпретатор рекомендуешь
    спасибо заранее

    • #2 by toly on 23 Август 2010 - 18:38

      Привет.
      Из литературы пользовался в основном книгой Р.А. Сузи «Язык программирования Python», статьями из журнала «Хакер», а так же статьями с Хабра. Если с английским дружишь, то можно почитать «A primer on scientific programming with python».
      Интерпретатор (я так понял вопрос про версию) 2.5 или 2.6 – особой разницы между ними нет.

(никто не узнает)