iPhoneのReederアプリでGoogle Readerの記事を読むようになってから
スター機能を多用するようになったので、スターをつけた記事をはてブと
連携させる簡単なWebアプリを作成した。
やり方としては、
- Google Readerでスター記事ページを公開する
- スター記事ページのRSSを読み込んではてブの投稿メアドに送信するアプリを作成する
というだけ。
Google Readerでスター記事ページを公開する
- Google Readerの設定画面で「フォルダとタグ」タブを開き、「スター付きアイテム」を公開設定する。
- 「公開ページを見る」というリンクが表示されるので、それをクリックして公開ページを表示
- 公開ページにAtomフィードへのリンクが表示されているので、それをクリックしてURLを確認
スター記事をはてブにメール投稿するアプリを作成する
BlogtrottrなどのRSS内容をメール送信してくれるサービスはあるのだけど、
はてブの仕様に合わせていい感じでメール内容を調整できるサービスがなかったので
Google AppEngineで自作した。
はてブにメール投稿する時のメールアドレスや内容の作成方法についてはこちらのヘルプページに記載されている。
http://b.hatena.ne.jp/help/basic
メール投稿アプリの仕様としては、
cronで定期的にスター記事ページのRSSを読み込んで未投稿の記事のURLをはてブにメール送信する
感じ。
モデルとビュー処理は下記のような感じ。
Kay Frameworkを使ってるけど、使わなくても同じような処理になると思う。
models.py
# -*- coding: utf-8 -*- # rss2hatebu.models from google.appengine.ext import db class StarredEntry(db.Model): pass
views.py
# -*- coding: utf-8 -*- """ rss2hatebu.views """ import logging from BeautifulSoup import BeautifulSoup from google.appengine.api import urlfetch, mail from werkzeug import Response from kay.utils import render_to_response import settings from rss2hatebu.models import * def retrieve_stars_and_mail_bookmarks(request): rpc = urlfetch.create_rpc() urlfetch.make_fetch_call(rpc, settings.RSS2HATEBU_RSS_URL) try: result = rpc.get_result() if result.status_code == 200: text = result.content soup = BeautifulSoup(text) entries = soup.findAll("entry") for entry in entries: entry_id = entry.find("id").string title = entry.find("title").string link = entry.find("link")['href'] category_list = [] categories = entry.findAll("category") for category in categories: category_list.append(category['term']) # 記事IDをキーとして保存して未保存のもののみ処理 existing_entry = StarredEntry.get_by_key_name(entry_id) if existing_entry is None: mail_body = "%s %s" % ("".join(["[%s]" % category for category in category_list]), link) logging.info(mail_body) # hatebuにメール送信 message = mail.EmailMessage(sender=settings.RSS2HATEBU_SENDER_MAIL, subject=title) message.to = settings.RSS2HATEBU_HATEBU_MAILADDRESS message.body = mail_body message.send() # StarredEntryを保存 new_entry = StarredEntry(key_name=entry_id) new_entry.save() except urlfetch.DownloadError: logging.error("RSS Request timed out or failed.") return Response("")
今のところ動いてる。