daemonfreaks.com

PyBlosxom用vim plugin - pyblosxom.vim

posted by jun-g at Mon, 23 Apr 2007 21:59 JST

~/.vimrc がごちゃごちゃしてきたので、以前書いたPyBlosxom用のvimスクリプトを整理してvim pluginにしてみた。

ダウンロード

こちらからどうぞ

インストール

アーカイブを展開すると、pyblosxom.pyとpyblosxom.vimが出てくるので、それらを~/.vim/pluginに入れてインストール完了。

他に必要なもの

  • config.py … PyBlosxomの設定ファイル。
  • py-mixi … mixi日記に投稿する際に必要。(無くてもOK)

~/.vimrcの設定

~/.vimrcに以下の設定が必要。

  • g:pbconfigfile … config.pyファイルのパス
  • g:pbftpserver … FTPサーバ名
  • g:pbftpuser … FTPユーザー
  • g:pbftppassword … FTPパスワード
  • g:pbworkdir … ローカルの作業ディレクトリ
  • g:pbremotedir … アップロード先のディレクトリ
  • g:pbpingservers … 更新PINGを送信するPingサーバ
  • g:pbmixiid … mixiにログインするメールアドレス
  • g:pbmixipassword … mixiのパスワード

~/.vimrcには以下のように書けば良い。

:let g:pbconfigfile = "/home/jun-g/pyblosxom/config.py"
:let g:pbftpserver = "daemonfreaks.com"
:let g:pbftpuser = "user"
:let g:pbftppassword = "password"
:let g:pbworkdir = "/tmp"
:let g:pbremotedir = "/pyblosxom/entries"
:let g:pbmixiid = "mixi@loginid.com"
:let g:pbmixipassword = "mixipassword"
:let g:pbpingservers = "['http://pingoo.jp/ping/', 'http://api.my.yahoo.co.jp/RPC2', 'http://blogsearch.google.co.jp/ping/RPC2']"

使い方

  • 新規エントリ作成 -> 新しいエントリ(バッファ)にテンプレートを表示

    :PBCreateEntry
  • エントリのアップロード -> 現在編集中のエントリ(バッファ)を保存してアップロード

    :PBUploadEntry
  • トラックバック送信 -> 現在編集中のエントリから指定したURLへトラックバックを送信

    :PBTrackback [trackback url]
  • 更新PING送信

    :PBSendUpdatePing
  • 日記の抜粋をmixi日記に投稿 -> 現在編集中のエントリの抜粋を投稿

    :PBPost2Mixi

備考・ToDoなど

  • トラックバックで送信する本文は、エントリの先頭行に「...」を加えた文字列。
  • mixi日記に投稿する日記の抜粋は、エントリの先頭行に「...」を加えた文字列とエントリのURL。
  • Windows版vimには未対応。
  • カテゴリ(サブディレクトリ)には対応していない。なぜなら自分が使っていないから。次のバージョンで対応予定。
  • 更新PING送信機能は、以前どなたかのBlogで見かけたコードをほぼそのまま使用している。
  • mixi日記投稿機能は、以前実装したものを外部の関数として書き直したもの。

ご意見、ご要望、バグレポート、パッチなどなど、お待ちしています。

Pythonでミクシィ日記に投稿

posted by jun-g at Sun, 12 Nov 2006 18:19 JST

ミクシィ日記はチラシの裏扱いしているので「友人まで公開」にしている。でもそうしてると数少ないマイミク達はどうしようもないチラ裏日記ばかり読んでしまってこのブログを全然読んでくれない為、僕について「このゲス野郎め!」みたいな印象しか受けなくなってしまうという問題が考えられる。これは大問題!!

という事で、前の「vimでpyblosxomのエントリを書いてアップロードするvimスクリプトをpythonで書いた」を拡張して、「uploadEntry()」を実行したらエントリをアップロードしつつミクシィ日記にもタイトルとURLを投稿するようにしてみる事にした。

まずは同じような事考えてる人いないかな〜という事でググってみると、そのものズバリ「mizzy.org - ブログを書いたら mixi 日記に自動投稿」というエントリを発見。しかしPerlだった。うーん。ということで検索キーワードに「python」を加えて探してみたら、lirisさん作の「MIXI Pythonライブラリ」と、それをsetomitsさんがメンテナンスした「mixi python ライブラリ」を発見。素晴らしいっす。しかし、ライブラリには日記投稿系のメソッドが実装されていなかった…。めげずにもうちょっと調べてみると、Perlの「WWW::Mixi」には投稿系のメソッドも実装されているということで、これを参考にしながら、日記投稿メソッドを自分で実装することにした。

まずは「mixi python ライブラリ」からpymixiをダウンロードして展開。BeautiluSoupUniversal Encoding Detectorも必要、との事なのでインストール。僕はFreeBSDを使っているので、ports treeから、

# cd /usr/ports/www/py-beautifulsoup/
# make install clean
# cd /usr/ports/textproc/py-chardet/
# make install clean

でインストール完了。とりあえず動くか試してみる。

$ python mixidiary2txt.py -u MAILADDRESS -p PASSWORD

まったく問題なく動いた。という事で、元となっているクラスモジュール「mixi.py」に日記投稿用メソッドを追加する作業に。とりあえずWWW:Mixiのリファレンスを読むと、最低限必要なパラメータは

idミクシィID。
diary_titleタイトル。
diary_body本文。
submit画面遷移用パラメータ。
編集画面->確認画面遷移時の値は「main」。
確認画面->投稿時の値は「confirm」。

という事がわかった。後、クロスサイトリクエストフォージェリ対策(と思われる)ランダムトークン「post_key」が確認画面で発行されるので、確認画面から「post_key」を取得する必要がある事もわかった。

つー事で、「mixi.py」のクラス「MIXI」に以下を追加。

    def _post_diary(self, mixiid, title, body, submit="main", postkey=""):
        params = urllib.urlencode({"id": mixiid,
                                   "diary_title": title,
                                   "diary_body": body,
                                   "submit": submit,
                                   "post_key": postkey})
        try:
            f = self.opener.open("%s/add_diary.pl" % MIXI_BASE_URL, params)
            data = f.read()
            f.close()
            return BeautifulSoup.BeautifulSoup(data)
        except:
            return None

    def post_diary(self, title, body):
        soup = self._post_diary(self.mixiid, title, body)
        if soup == None:
            return False
        postkey = soup.find("input", {"name": "post_key"})["value"]
        soup = self._post_diary(self.mixiid, title, body, "confirm", postkey)
        if soup == None:
            return False
        return True

Pythonから使うには、

from mixi import MIXI
m = MIXI()
m.login(MAILADDRESS, PASSWORD)
m.post_diary("日記タイトル", "日記本文")

でOK。

これにて問題解決!!