はてなブックマークで人気のcookpadレシピをTumblr投稿する

ときどきはてなブックマーク人気エントリーcookpadのレシピが入ってきます。
見ると食べてみたくなるんで、嫁さんに見せて作ってもらったりするんですが、いちいちリンクを送ったりするのが面倒になってきました。

嫁さんがはてなブックマークをチェックしてくれればいいんですが、はてブは見ませんし、RSSリーダーも使ってません。

なのでTumblrに人気になってるレシピを投稿して、そのサイトをときどきチェックしてもらうことにしました。

こちらのサイトに投稿してます。

http://kyonogohan.tumblr.com/



投稿させる処理はpythonで書いて、google app engine上で6時間ごとにcronで動かしてます。

# -*- coding: utf-8 -*-
import re
import logging
import urllib2
from datetime import datetime
import feedparser
from BeautifulSoup import BeautifulSoup
from kay.utils.decorators import cron_only
from werkzeug import Response
from google.appengine.ext.deferred import deferred
from google.appengine.api import memcache

from config import OAUTH_CONSUMER_KEY, SECRET_KEY, \
                   OAUTH_TOKEN, OAUTH_TOKEN_SECRET, \
                   RSS_URL, LAST_PUBLISHED_DATETIME_MEMCACHE_KEY, \
                   COOKPAD_PATTERN, HATENA_BOOKMARK_LINK, BLOG_URL

@cron_only
def index(request):
    deferred.defer(task)
    return Response(None)


def task():
    atom = feedparser.parse(RSS_URL)

    last_published_string = memcache.get(LAST_PUBLISHED_DATETIME_MEMCACHE_KEY)

    pattern = re.compile(COOKPAD_PATTERN)

    entries = []

    for e in atom.entries:
        title = e.title.encode('utf-8')
        link = e.link.encode('utf-8')
        date_string = e.date
        date = parse_date_string(date_string)

        matcher = pattern.match(e.link)
        if not matcher:
            continue

        if last_published_string:
            last_published = parse_date_string(last_published_string)

            if date <= last_published:
                continue

        id = matcher.groups(0)
        image_source = get_image_source_from_cookpad(id)

        entries.append({'title': title,
                        'source': image_source,
                        'link': link,
                        'date': date_string})

        logging.debug(title)
        logging.debug(link)
        logging.debug(image_source)
        logging.debug(date)

    if entries:
        entries.reverse()
        memcache.set(LAST_PUBLISHED_DATETIME_MEMCACHE_KEY,
                     entries[-1:][0]["date"])

        for e in entries:
            post_tumblr(create_caption(e['title'], e['link']),
                        e['source'],
                        e['link'])


def create_caption(title, link):
    caption = u'<a href="%s">%s</a>'.encode('utf-8') % (link, title)
    caption = caption + HATENA_BOOKMARK_LINK % (link, link, title)
    return caption


def get_image_source_from_cookpad(id):
    res = urllib2.urlopen('http://cookpad.com/recipe/%s' % id)
    soup = BeautifulSoup(res)
    img = soup.find('div', attrs={'id': 'main-photo'}).find('img')

    return img["src"]


def post_tumblr(title, source, url):
    from tumblpy import Tumblpy

    t = Tumblpy(app_key=OAUTH_CONSUMER_KEY,
                app_secret=SECRET_KEY,
                oauth_token=OAUTH_TOKEN,
                oauth_token_secret=OAUTH_TOKEN_SECRET)

    t.post('post',
           blog_url=BLOG_URL,
           params={'type': 'photo',
                   'caption': title,
                   'source': source,
                   'link': url})


def parse_date_string(s):
    return datetime.strptime(s, "%Y-%m-%dT%H:%M:%S+09:00")