Преамбула.
Итак, есть у меня 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 - не читай мой вывод ;)
Комментариев нет:
Отправить комментарий