« | »

2005年12月11日

mail2entryのハック

moblogを実装するmail2entryなるpythonのスクリプトがあるが、これは単純に画像だけを送るのを目的として作られている。
このままではカテゴリの指定、追記、改行の変換指定が出来ないのでハックしてみた。


mail2entry自体のインストールはweb上に情報がいくらでも転がっているので割愛。
動作自体は送られてきたメールのイメージと本文を分割してイメージを保存し、blogのXML-RPCのAPIを叩いてイメージのリンクを埋め込んだ本文とタイトルとのデーターを送信するというもの。
送信されるデーターにはタイトルと内容しかないので、これを拡張すべく ttp://www.na.rim.or.jp/~tsupo/program/blogTool/mt_xmlRpc.htmlで見つけたAPIの仕様を読む読む。
追記と改行の指定を追加したエントリーのデーターを送信後、エントリーIDを指定してカテゴリを設定する必要があるようだ。
結果、成功したので、土偶オリジナルの改造部分だけを記す。
目標
●携帯やPHSでメールを送信した際に一定の長さ以上の文が自動改行されるので、blogの方では改行の変換をせずに、mail2entryのスクリプト内で連続した二つの改行が投稿時に一つの改行に変換されるようにした。
●指定した文字列(<EXTEND>)以降の分を追記として投稿する。
●カテゴリーを指定する。
改造部分の動作概要は以下の通り。
●pythonでメールの本文をエントリーの「本文」と「追記」を分ける"区切り文字列"で分割。(なければすべてがエントリーの「本文」)
●「本文」「追記」とも二つの連続した改行(\n\n")を"<BR&gtに変換
●XML-RPCにPOSTするデーター「weblogContent」に「追記」(あれば)、「改行の扱いをどうするか」を追加。
●正常にエントリーが投稿されればそのエントリーにカテゴリーIDをセット
前口上は以上で以下の通りmail2entryの同封スクリプトを書き換えれば動作するかと。
postcategory.py (新規作成)

#! /usr/bin/env python2.2
"""Post a Category"""
# username, password, blogid, publish
from settings import *
#import types
import xmlrpclib
def post(postid):
    """Post a category to a blog.  Return true on success."""
    if categoryid != '' :
        #categories = [{'categoryId':categoryid, 'isPrimary':1}]
        categories = [{'categoryId':categoryid, 'isPrimary':1}]
        server = xmlrpclib.ServerProxy(uri)
        # on success, result should be true.
        result = server.mt.setPostCategories(postid, username, password, categories)
        if result :
            result = server.mt.publishPost(postid, username, password)
    else :
        result = 1
    return result

postentry.py

#! /usr/bin/env python2.2
"""Post a new MT entry"""
# username, password, blogid, publish
from settings import *
import types
import xmlrpclib
import string
def post(content):
    """Post an entry to a blog.  Return postid on success."""
    content.check()
    naiyou = content.getEntry()
    cutichi = string.find(naiyou , kugiri)
    if cutichi == -1:
             naiyou = string.replace( naiyou , "\n\n" ,"<BR>\n")
             weblogContent = {
             'title' : content.getTitle(),
             'description' : naiyou,
             'mt_convert_breaks' : convert_breaks
             }
    else:
             honbun = naiyou[:cutichi]
             tsuiki = naiyou[cutichi + len(kugiri):]
             honbun = string.replace( honbun, "\n\n" ,"<BR>\n")
             tsuiki = string.replace( tsuiki, "\n\n" ,"<BR>\n")
             weblogContent = {
             'title' : content.getTitle(),
             'description' : honbun,
             'mt_text_more' : tsuiki,
             'mt_convert_breaks' : convert_breaks
             }
    server = xmlrpclib.ServerProxy(uri)
 # on success, result should be an integer representing a postid
    result = server.metaWeblog.newPost(blogid, username, password,
                                       weblogContent, publish)
    return result

mail2entry.py

#! /usr/bin/env python2.2
"""Post a new MT entry from a mail message"""
import sys
assert(sys.hexversion >= 0x02020000) # Require Python 2.2 or higher.
import os
import time
import stat
import traceback
def main():
    """"""
    try:
        import parsemsg
        import postentry
        import saveimage
        import postcategory
        content = parsemsg.parse(sys.stdin)
        images = content.getImages()
        if images :
            imageurls = saveimage.save ( images )
            imagecontent = map ( lambda imageurl : imgtemplate % \
                                 { 'imageurl' : imageurl }, imageurls )
        else :
            imagecontent = u''
        entry = template % { 'caption' : content.getDescription(),
                             'imagecontent' : "\n".join(imagecontent) }
        content.setEntry(entry)
        result = postentry.post(content)
        if result :
            postid = result
            result = postcategory.post(postid)
    except:
        lfo = open(logfilepath, "a")
        lfo.write(time.strftime("%Y-%m-%d %H:%M\n\n"))
        traceback.print_exception(sys.exc_info()[0], sys.exc_info()[1], \
                                  sys.exc_info()[2], 100, lfo)
        lfo.write("--------------------------------------------------------\n")
        lfo.close()
        result = None
    return result
def usage():
    """"""
    print "mail2entry.py profile-directory"
if __name__ == "__main__":
    # finding and loading things from settings.py
    if len(sys.argv) > 0:
        settings_path = sys.argv[1]
        settings_abspath = os.path.abspath(settings_path)
        if os.access(settings_abspath, os.F_OK):
            sys.path.insert(-1, settings_abspath)
            from settings import *
        else:
            print "Path error"
            sys.exit(1)
    else:
        usage()
        sys.exit(1)
    main()

setting.py に以下を追加。

#投稿するカテゴリーID
categoryid = 1
#「エントリーの内容」と「追記」を区切る文字列
kugiri = "<EXTEND> "
#記事本文の改行の扱いをどうするか 0なら変換なし、1なら変換。
convert_breaks =0

しかしソケット(ソラリスやしデータグラム?)プログラムを作るのにも簡単になったねぇ。

Trackback URL

Comment & Trackback

No comments.

Comment feed

Comment





XHTML: You can use these tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>