ほんじゃらねっと

ダイエット中プログラマのブログ

Google Readerでスターをつけた記事をはてブに自動投稿する

iPhoneのReederアプリでGoogle Readerの記事を読むようになってから
スター機能を多用するようになったので、スターをつけた記事をはてブ
連携させる簡単なWebアプリを作成した。


やり方としては、

  1. Google Readerでスター記事ページを公開する
  2. スター記事ページのRSSを読み込んではてブの投稿メアドに送信するアプリを作成する

というだけ。

Google Readerでスター記事ページを公開する

  1. Google Readerの設定画面で「フォルダとタグ」タブを開き、「スター付きアイテム」を公開設定する。
  2. 「公開ページを見る」というリンクが表示されるので、それをクリックして公開ページを表示
  3. 公開ページに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("")


今のところ動いてる。