読者です 読者をやめる 読者になる 読者になる

ほんじゃら堂

めんどくさい仕事をラクにする作業自動化レシピ集

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

googleappengine IT系・技術系

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("")


今のところ動いてる。