суббота, 2 июня 2012 г.

Программировать - это легко!

Преамбула.


Итак, есть у меня htc wildfire телефон, на который я прошил cyanogen прошивку. И, с некоторой периодичностью я посещаю страницу download.cyanogenmod.com чтобы проверить наличие новых билдов. Это немного напрягает, да и вообще - лень двигатель прогресса :)

Решил я написать робота, который бы вместо меня ходил на эту страницу и проверял наличие новых сообщений. И вот что из этого вышло...


Решение проблемы.


Для начала я пошел сюда App Engine и установил всё что необходимо для разработки приложений на python.

Прошел по шагам создания Hello World приложения и от этого уже начал плясать. Сначала добавил загрузку данных по линку

from google.appengine.api import urlfetch 
result = urlfetch.fetch('http://download.cyanogenmod.com/?device=buzz')
Потом добавил парсинг html и выборку всех линков на странице

from BeautifulSoup import BeautifulSoup, SoupStrainer

for link in BeautifulSoup(result.content, parseOnlyThese=SoupStrainer('a'):
self.response.out.write(link.has_key('href')):

после этого мне необходимо было отфильтровать не нужные мне линки, получилось следующее

import re 
for link in BeautifulSoup(result.content, parseOnlyThese=SoupStrainer('a', href=re.compile('(?i).*buzz.*zip))):

дальше добавил сохранение полученных линков в бд, с указанием что этот линк еще не был отправлен мне по почте



from google.appengine.ext import db 
class buzzurls(db.Model):
url = db.StringProperty()
sended = db.BooleanProperty()

if link.has_key('href'):
buzzurl = buzzurls(url = 'http://download.cyanogenmod.com'+link['href'], sended = False)
buzzurl.put()
 но при таком подходе появлялись дубликаты, поэтому перед сохранением линка я добавил проверку на наличие такого линка в базе данных

buzzurl = buzzurls.all().filter('url = ', 'http://download.cyanogenmod.com'+link['href']).fetch(1)
if len(buzzurl) is 0:

 ну и теперь всё что осталось в коде, это отправить те линки о которых я еще не видел уведомления.



buzzlist = buzzurls.all().filter('sended = ', False)
for buzz in buzzlist:
mail.send_mail(sender="username@gmail.com", to="username@gmail.com", subject="Buzz updated", body=buzz.url)

и после отправки поставить отметку в базе данных о том, что линк был отправлен

buzz.sended = True
buzz.put()

 Итоговый проект для Google App Engine лежит http://code.google.com/p/helloworldironwit/downloads/detail?name=upload.zip

Выводы :)


Программировать легко! Просто поймите что вы хотите получить и ищите примеры кода которые вам подойдут. Всё уже написано до нас, осталось найти и скопипастить :)

P.S.

Oracle - не читай мой вывод ;)

Комментариев нет:

Отправить комментарий