Posted by & filed under diary, programming, twitter.


結構前から,Twitter の1日分のつぶやきを,毎晩自動的に WordPress へ投稿するようにしてたけど,

  • 画像のサムネイルを表示してくれない
  • リスト表示は正直見栄えが悪い
  • 時々マルチポストされてしまっている

などの理由により,別のものを探すか,自分で作りたいと思っていた.

最近,Python の勉強を始めたので,練習がてら,作ってみた.

作ったと言っても,自分で作ったのはTwilogからソースを取ってきて,成形してポストするところだけ.

サムネイルの取得とか,あとリンクを張ったりだとかの処理は面倒なので,全部Twilogからそのまま持ってくる事にw

#!/usr/bin/env python
# fileencoding=utf-8
"""
wp-twilog

指定された日付のtweetをtwilogから取得し,投稿する
"""

'''
HTMLの実体参照文字をUnicode文字へ変換する
'''
def ref2uni(s):
    from htmlentitydefs import name2codepoint as entitydic
    try:
        s = s.decode('utf-8')
    except UnicodeEncodeError:
        pass
    s = s.replace('<', unichr(entitydic['lt']))
    s = s.replace('>', unichr(entitydic['gt']))
    s = s.replace('"', unichr(entitydic['quot']))
    s = s.replace('&', unichr(entitydic['amp']))
    return s.encode('utf-8')

'''
twilog.org からデータを取得し,返す
'''
def getTweet(user, date, type = '', IncRep = False):
    import urllib
    import re

    # まず一覧を更新
    refleshurl = 'http://twilog.org/update.cgi?id=%s&order=&filter=&kind=reg'
    tmp = urllib.urlopen(refleshurl % user)
    tmp.readlines()
    tmp.close()

    baseurl = 'http://twilog.org/source.cgi?id=%s&date=%s&order=asc&word=&cate=&filter=%s&type=%s'
    reg = re.compile('^<')
    return [ref2uni(s) for s in urllib.urlopen(baseurl % (user, date, '' if IncRep else 'norep', type)) if reg.match(s)]

'''
WordPress へ記事を投稿する
'''
def postNewEntry(title, desc, time):
    import xmlrpclib
    
    cate = ['twitter']
    tags = ['twilog']
    poweredby = '<p style="text-align: right;"><span style="vertical-align: top;">Powered by </span><a href="http://twilog.org/" target=_blank><img class="lazy " src="http://tokcs.com/wordpress/wp-content/plugins/jquery-image-lazy-loading/images/grey.gif" data-original="http://www.tokcs.com/wordpress/wp-content/uploads/2010/02/banner-t.gif" alt="twilog" /><noscript><img src="http://www.tokcs.com/wordpress/wp-content/uploads/2010/02/banner-t.gif" alt="twilog" /></noscript></a></p>'
    desc.append(poweredby)

    wp = xmlrpclib.ServerProxy('http://tokcs.com/wordpress/xmlrpc.php')
    param = {
    'title'       : title,
    'description' : ''.join(desc[:5]),
    'mt_text_more': ''.join(desc[5:]),
    'dateCreated' : xmlrpclib.DateTime(time),
    'categories'  : cate,
#    'mt_keywords' : tags,
    'wp_slug'     : 'tweets'
    }
    return wp.metaWeblog.newPost('0', 'twitter', 'twitter_bot', param, 1)

'''
前日のつぶやきを投稿する
'''
def wpTwilog():
    from datetime import datetime, timedelta
    postdate = datetime.now() - timedelta(0, datetime.now().second, 0, 0, datetime.now().minute, datetime.now().hour)
    yesterday = postdate - timedelta(1)
    desc = getTweet('freiheit_tokkyu', yesterday.strftime('%y%m%d'), 'p')
    if len(desc) != 0:
        ret = postNewEntry(yesterday.strftime('%Y年%m月%d日のつぶやき'), desc, (postdate - timedelta(0,0,0,0,0,9)))

if __name__ == '__main__':
    wpTwilog()

#    user = raw_input('user> ')
#    date = raw_input('date> ')
#    type = raw_input('type> ')
#    if user == '':
#        wpTwilog()
#    else:
#        tweets = getTweet(user, date, type)
#        print 'raw data'
#        print tweets

あとはこれを cron で自動的に実行してやるだけ.

今のところ問題なく動いている.

今は,同じような事をプラグインで実現しようと,PHPにて組み直し中.
ただし,次は Twilog は使わずに,きちんと Twitter API を使って取得してくる.

Twilog は Geotag に対応してないからなー.今度作るものは,逆ジオコーディングを使って,地点名と Google Maps へのリンクを貼るようにしたい.

現在,Python と同じく,最近勉強を始めた Mercurial で管理しつつ,ちまちまと進行中.