2003年05月22日

moblogシステム概要


2005-07-17 機能を整理して新版を作成しました。→こちら。

重要! 2005-06-16 更新 2004-04-13以前の版には、セキュリティホールがあります。内容と対策はこちら

このweblogに携帯メールから書き込めるようにしているシステムの概要とセットアップ方法
環境:
Mac OS X 10.2 (10.3以降はSendmailからPostfixに変更されているので、後半のSMTPの設定方法が異なる)

概要:
1.メールサーバでメールを受ける
2.題名、本文、添付ファイルをとりだす
3.weblogに書き込む
という動作をするスクリプトを使用。XMLRPCを使用しているので、メールサーバとMovable Typeが動いているWebサーバは別のマシンでも良い。

更新履歴

  • 2005-06-13: セキュリティ対策(投稿内容のサニタイズ)
  • 2004-04-13: A5501TのExifタグに対応。(GPSタグの度が1/100000、分・秒共に0)
  • 2004-02-13:
    • [Movable Type 2.661 + 日本語化パッチ]に対応。
    • GPS情報の抽出をexiflistからImage::Infoに変更。
    • mencoderによるamcファイルの変換を廃止。(QuickTime6.5によりamc再生環境が整ったため不要と判断)
  • 2003-07-24: Extendedが生成されないバグを修正。
  • 2003-07-20: Altitudeタグがない場合に対応。

この手の動作をするpythonのスクリプトとしてmail2entryというものがすでにあるが、これがOS X10.2に含まれるバージョンのpythonではうまく動かなかったので、perlで書いてしまった。車輪の再発明かも。
Download file
GNU General Public License version 2日本語) に従ったフリーウェアです。

位置付写真を添付したメールでMovable Typeに書き込むための基本的な機能しか実装してません。

  • 想定している測地系は、WGS-84。
  • 地図へのリンクは、@NAVI。
  • カテゴリーは扱いません。
  • ffmpegをインストールしておけば、auムービーメールのサムネールを作って同時にアップロード。
  • ムービーに埋め込んだ位置情報には対応していません

測地系の変換をして日本測地系のMapionを使う、自動的にカテゴリーを設定する、などの拡張をするには、nob sekiさんのSync A World You Want To Explore: GPSは正確だが、地図情報は?が参考になります。

メールから書き込む機能はいらない、画像に地図リンクだけ付け足したい、という場合は、AddMapsプラグインをどうぞ。

スクリプトの設定:

my $url = 'http://www.your-site.com/movabletype/mt-xmlrpc.cgi';
Movable Type のmt.cgiをmt-xmlrpc.cgiに置き換えたもの。

my $blog_id = 2;
書き込みたいweblogのid。Entry編集画面のURLにblog_id=で表示されているもの。

my $username = 'Melody';
my $password = 'Nelson';
書き込むユーザ名とパスワード。メール書き込み用に新しくユーザを追加したほうがいいかも。

my $code = utf8; # utf8, euc, jis, sjis
書き込む漢字コード
(2.661+日本語化パッチではXML-RPCがutf8に統一されているようなので、この設定は削除)

my $MT_DIR = '/Library/WebServer/Documents/mt/';
同じマシンにMovable Type をインストールしているならば、そのディレクトリ。文字列の最後は/で。

my $parse_path = '/Users/Shared/post2blog';
テンポラリファイルを作るディレクトリを用意する。OS Xの場合、Finder上から確認しやすい/Users/Shared/に作るのが良いかも。

モジュールのインストール:

OS XでMovable Typeが動いている環境の標準以外で必要なperlモジュール
http://search.cpan.org/author/ERYQ/IO-stringy-2.108/
http://search.cpan.org/author/GAAS/MIME-Base64-2.20/
http://search.cpan.org/author/MARKOV/MailTools-1.58/
http://search.cpan.org/author/ERYQ/MIME-tools-5.411a/
http://search.cpan.org/author/DANKOGAI/Jcode-0.83/
http://search.cpan.org/~gaas/Image-Info-1.16/

MIME-toolsをインストールする前に、その上の3つをインストール。

それぞれを展開したディレクトリの中で
% perl Makefile.PL
% make
% sudo make install
でインストールできる。

OS Xの標準に含まれていないものとしては、SOAP::Liteも必要だが、Movable Typeが動いている環境ならば、すでにインストールされている。Movable Typeを動かしているマシンとは別のマシンでこのスクリプトを動かす場合は、SOAP::Liteもインストールする。SOAP::Liteは依存するモジュールが多くてややこしいので、CPANモジュールを使ったほうがいいかもしれない
まずはCPANモジュール自身のアップデート。途中でいろいろ聞いてくるが、基本的にはすべてデフォルトでよい。つまりひたすらリターンキー。
% perl -MCPAN -e shell
cpan> install Bundle::CPAN
ただしlibwww-perlのインストール中に
Do you want to install the HEAD alias? [y]
と聞いてくるので、これだけはnと答えないと、大文字小文字を区別しないHFS+ボリュームの場合/usr/bin/headコマンドを潰してしまう。

cpan> reload cpan

CPANモジュールを使っていると、途中でperl5.8.0とかのインストールが始まってしまうことがある。そんなときはダウンロード中にすかさずCtrl+Cで中断。

cpan> install SOAP::Lite

sendmailの設定:
まずはサーバとして動くようにする。
[参考ページ]
http://pisa.csrs.is.uec.ac.jp/TechInfo/Macintosh/SendmailOnJaguar/UptheSendmailOnJaguar.html

[参考ページ]に書いてないこと:
DNSで引けるマシン名がなくてIPアドレスだけの場合
/etc/mail/local-host-names
に、生IPアドレスを[]で囲んだものを記入。仮にアドレスを192.168.0.1とすると
192.168.0.1
[192.168.0.1]
これは、SMTPサーバによってはTo: user@192.168.0.1では送信ができず、To: user@[192.168.0.1]とする必要があるため。.macはこのパターン。ezwebは[]なしで送信可。

次に、サーバに届いたメールをスクリプトに渡すようにする。
スクリプトを/usr/adm/sm.bin内に置く。
% sudo mkdir -p /usr/adm/sm.bin
% sudo cp post2blog /usr/adm/sm.bin
% sudo chmod 555 /usr/adm/sm.bin/post2blog

NetInfoマネージャで[参考ページ]の通りにaliasesを追加。ただし、"members"にはアドレスのかわりにスクリプトへのパイプをフルパスで記入。
| /usr/adm/sm.bin/post2blog

再起動。

これで、
alias名@IPアドレス
にメールを送信すれば書き込まれる。


重要:
2004-04-13以前の版には以下のセキュリティホールがあります。最新のものをダウンロードしなおして使用するか、以下の対策を取ってください。

内容1:
添付ファイル名のサニタイズを行っていないため、投稿先メールアドレスが漏洩すると、最悪の場合、メールを受信するサーバ上で任意のコードの実行が可能です。

この脆弱性情報は坂井まどかさんによるものです。ありがとうございました。

対策1:
オリジナルの添付ファイル名を使用しないようにしてください。

例) $parser->output_under($parse_path); の次行に $parser->filer->ignore_filename(1); を追加。

内容2:
同じく投稿先メールアドレスが漏洩した場合、題名、本文などを利用したXSSが可能になります。
対策2:
投稿内容のサニタイズを行ってください。

例) スクリプト冒頭に BEGIN { my $MT_DIR = '/Library/WebServer/Documents/mt/'; unshift @INC, $MT_DIR . 'extlib'; unshift @INC, $MT_DIR . 'lib'; } use MT::Sanitize; を追加。 my $sub = $head->get('Subject'); の次行に $sub = MT::Sanitize->sanitize($sub); を追加。 $cont = $j->set($cont)->utf8; の前行に $cont = MT::Sanitize->sanitize($cont); を追加。

以上二つの変更を行ったものと旧バージョンとのdiffは以下。

% diff -c post2blog.old post2blog *** post2blog.old Thu Jun 16 17:55:58 2005 --- post2blog Thu Jun 16 17:58:40 2005 *************** *** 10,15 **** --- 10,20 ---- # You can redistribute it and/or modify it under the terms of # the GNU General Public License version 2. # + BEGIN { + my $MT_DIR = '/Library/WebServer/Documents/mt/'; + unshift @INC, $MT_DIR . 'extlib'; + unshift @INC, $MT_DIR . 'lib'; + } use strict; *************** *** 17,35 **** my $blog_id = 2; my $username = 'Melody'; my $password = 'Nelson'; - my $MT_DIR = '/Library/WebServer/Documents/mt/'; my $parse_path = '/Users/Shared/post2blog'; my ($maxx, $maxy) = (320, 320); - unshift @INC, $MT_DIR . 'extlib'; - use MIME::Parser; #use Data::Dumper; use File::Basename; use Jcode; use XMLRPC::Lite; use Image::Info qw(image_info dim); my $j = new Jcode; --- 22,38 ---- my $blog_id = 2; my $username = 'Melody'; my $password = 'Nelson'; my $parse_path = '/Users/Shared/post2blog'; my ($maxx, $maxy) = (320, 320); use MIME::Parser; #use Data::Dumper; use File::Basename; use Jcode; use XMLRPC::Lite; use Image::Info qw(image_info dim); + use MT::Sanitize; my $j = new Jcode; *************** *** 43,51 **** --- 46,56 ---- my $parser = new MIME::Parser; $parser->output_under($parse_path); + $parser->filer->ignore_filename(1); my $entity = $parser->parse_data($str); my $head = $entity->head; my $sub = $head->get('Subject'); + $sub = MT::Sanitize->sanitize($sub); my $message_id = $head->get('Message-ID'); my $cnttype = $entity->mime_type; $sub = $j->set($sub)->mime_decode->utf8; *************** *** 85,90 **** --- 90,96 ---- } close(CONT); } + $cont = MT::Sanitize->sanitize($cont); $cont = $j->set($cont)->utf8; my @conts = split(/?n?n?n/, $cont);
Posted by jiro at 2003年05月22日 04:22 | トラックバック (0)
コメント

はじめまして。さっそく、使わさせていただきました。
私はPythonが全然分からなかったので、Perl版になり
いろいろいじれそうです。

そうそう、GPSのlocation情報については、navi.comとmapionで
場所が違って表示されていたのですが、
これは世界測地系と日本測地系という異なる基準があるからだそうです。

これについては
http://www.syncworld.net/blog/nob/archives/000961.html
をご参照ください。

Posted by: nob seki at 2003年07月16日 13:18

情報ありがとうございます。
国土地理院のページは、お役所の縦割りのせいか、どうにもナビゲーションが悪くて情報を見落としてしまいがちでしたが、教えていただいたURLのおかげでいろいろわかりました。

私は
http://member.nifty.ne.jp/Nowral/index.html
を良く参考にしてます。「測地系」のページに、測地系変換をするperlのコードも載っています。
公開しているバージョンのpost2blogにはまだ反映していないのですが…

Posted by: もとなが at 2003年07月18日 14:43

最後に紹介されているコードは計算量が少なくて、組み込みやすそうですね( http://member.nifty.ne.jp/Nowral/02_DATUM/Molodensky.html

私の場合は、Linux版の座標変換プログラム( http://vldb.gsi.go.jp/sokuchi/software/ )をとりあえずインストールして、Mapionの地図を出すようにしました。

Posted by: nob seki at 2003年07月20日 17:47

元のpost2blogをちょっと拡張させていただきました。

・MovableTypeのカテゴリーに対応
・Mapion、@NAVI.comの両方の地図に対応
・Mapion用に座標軸を日本測地系へ変換
・最新の写真を参照できるlatest.category.jpgファイルを作成

とりあえず元ソースからのdiffを、
http://www.syncworld.net/blog/nob/archives/000961.html
に置いてみました。

Posted by: nob seki at 2003年07月21日 23:50

このスクリプトを元にして、こんなこともできます。
http://ld.minken.net/

Posted by: もとなが at 2003年10月07日 16:18

moblogを始めたので、どうせだったらAUの携帯だし、
GPS情報も活用しようと思いまして、
まずEXIFの情報からリサーチを始めて、
Image::infoを使えばEXIFのdumpも簡単だなと、、、
そして、GPSの測地系についてリサーチを始めたところ
このサイトに行き着きました

もうすでにperlで実現されているようなので
自分で再度作りこむのもなんなんで
使わして頂いてよろしいでしょうか?

ezwebのコンテンツでsutaba-search(簡単アクセス88000)なるものを
運営しているのですがGPS情報って使えば使うほど面白いですよね

Posted by: ambit at 2004年01月13日 20:27

はじめまして。このblogの運営者です。
そう、Image::infoがバージョンアップして今はGPSタグも拾えるようになってるんですよね。適当に書き換えて使ってくださいませ。

Posted by: もとなが at 2004年01月13日 22:18

手を加えて利用させていただいてるのですが、
スクリプトのライセンスはどのような扱いになっているのでしょうか。

Posted by: タロウ at 2004年01月28日 20:51

ご自由にお使いいただいて結構です。改変、再配布も可です。

…ということを明記した方がいいですね。しておきます。

Posted by: もとなが at 2004年01月29日 13:11

ありがとうございます。
GPL2を適用されたのですね。とても嬉しく思います。
改変バージョンについては、
http://33rpm.jp/wiki/index.php?MobLog
こちらで配布しています。

Posted by: タロウ at 2004年02月16日 21:23

こんにちわ。

もしよろしければ、ついでにお聞きしたいのですが、
Urban landscape Search Engineの「近傍検索」
って、どういう仕組みで動いているのでしょうか?

最近傍だけでなく、トップ10とか、
文字列検索と空間検索(2km以内など)のアンドをとるとか、複雑な検索が、技術的に可能なものなのか
知りたいと思っています。

Posted by: いりえ at 2004年02月16日 22:01

ULSEの近傍検索では、素朴に、全投稿を順番にサーチして、投稿ごとにクリックした点からの距離を計算し…という処理を行っています。
他の検索条件と組み合わせることも、技術的には可能だと思います。

投稿数が膨れ上がったら、アルゴリズムを変えるなり、もっと速い言語で書き直すなりしないとダメでしょうけど、いまのところこんな程度で動いてます。

Posted by: もとなが at 2004年02月17日 00:09

なるほど・・ありがとうございました。

あの近傍検索は、無駄な操作をユーザにさせないので、すごいなぁと思っていました。

それでは、また。

Posted by: いりえ at 2004年02月17日 14:27

はじめまして。
公開されているスクリプトを基に、機能を追加して自宅サーバでモブログを運営できるようになりました。
XMLRPCのAPIを扱うのは初めてだったので、大変勉強になりました。どうもありがとうございました。

Posted by: 逆さ独楽 at 2004年04月03日 02:59

See YAHOOSee GOOGLE

Posted by: Bozko1 at 2004年10月20日 19:43

こんにちわ。
モブログの挑戦しているものなのですが、一通り設定し、テスト投稿のため該当のメールアカウント宛にメールを送信した所、$parse_pathで指定したディレクトリにmsg-1155357404-25290-0というディレクトリと中にmsg-25290-1.txtというファイルのセットが延々と作成され続けてしまいます。
post2blog.plを削除する事でループからは逃れられるのですが、モブログができず困っています。

考えられる原因をご教授いただけないでしょうか?

環境はさくらでMTVersion 3.31-ja です。

Posted by: 伊藤 at 2006年08月12日 13:44

スクリプトを削除してループが止まるということは、ループそのものはスクリプトの中ではなくスクリプトを呼び出す側で起きている可能性が高いです。
まっさきに思いつくのは、メールループですね。たとえば、エラーメールが返る先がモブログのアドレスになっているとか。

Posted by: motonaga at 2006年08月12日 14:36

早速のお返事ありがとう御座います。

.mailfilterには
to "| /パス/mt/plugins/post2blog.pl"
exit
と指定しています。

エラーメールがpost2blog.plに行ってしまうため
ループすると言った現象でしょうか?

Posted by: 伊藤 at 2006年08月12日 16:20

まずは、moblogのアドレス自身にエラーが返るような設定で投稿されているなら、設定を変えてください。
つぎに、post2blogはプラグインではありませんので、プラグインディレクトリからは出してください。

Posted by: motonaga at 2006年08月12日 17:44

こんにちわ
その後色々と調べてみたのですが、
moblog自身にエラーが帰る設定が具体的にどのような
設定なのかまったく解りません(汗

moblog自身のメールとは投稿用のメールアドレスかと思うのですが、そちらの.mailfilterの設定になるのでしょうか?

ちなみに、一度めの動作確認時、投稿用アドレスにエントリーをメールで送信しましたが、

use MT::Sanitize;の部分でエラーが発生していると言った内容のメールが送信元に返ってくるため、
どこかのサイトでコメントアウトしても問題がなかった旨の記事があったのでpost2blog.plの36行目、54行目、95行目をコメントアウトし送信したらエラーは返ってきませんがループしてしまいました。
これらが問題でしょうか?

Posted by: 伊藤 at 2006年08月16日 19:34

少し前から利用させていたでき順調に動いてきたのですが、先日ボーダフォンから写真付きのメールで投稿したらエラーが返ってきました。
エラーを引き起こしている場所はpathのメソッドが見つかりません(line70)とあるのでおそらく70行目あたりだと思います。

auからやボーダフォンでも写真がないのでは投稿できます。
何か対処の方法はありますか?

Posted by: イシカワ at 2006年08月31日 16:25

エラーが起きるメールそのものを見てみないとなんとも言えませんが、たぶんMIMEが入れ子になっているとか、そのあたりだと思います。Apple Mailが出すAppleDoubleっぽいメールもダメなんですよね。
if ($entity->is_multipart) {
# multi parts
for (my $pn = 0; $pn < $partnum; $pn++) {
(略)
}
} else
あたりの処理をもう少しいろんなケースを想定したものに書き換える必要があるんですが、手が空いたらやってみます。

Posted by: motonaga at 2006年08月31日 17:21

http://www.google.com/search?q=MIME::Parser+nested
あたりでしらべると参考になります。まだちゃんと調べてないですが。
なにやらMIME-toolsの新しいバージョンなら入れ子のMIMEも良きに計らってくれそうなオプションがあるようにも読めます。

Posted by: motonaga at 2006年08月31日 17:28

やりはじめたら見直したい部分が他にも出てきて、書き直すまでちょっと時間がたってしまいましたが、スクリプトを更新しました。まだしっかりテストできていませんが、とりあえず上げておきます。
http://minken.net/mt/archives/000473.html

Posted by: motonaga at 2006年09月29日 18:57

はじめましてkiichiと申します。

こちらで配布されている「post2blog」の古いやつを使わせてもらっているのですが、添付した画像を任意の位置に表示させたくて少々改造しているのですが、本文を指定している変数はどの辺りで指定してるのでしょうか?
自分なりに置き換える文字を$imgとして125行目あたりに
if ($description =~ /\$img/) {
$description =~ s/\$img/$returl/;
}
のような行を追加してみましたが、上手くいきませんでした。
お忙しいとは思いますが、アドバイスを頂けたら幸いです。

Posted by: kiichi at 2007年01月19日 21:42

連続書き込み失礼します。
125行目じゃなく153行目でしたm(__)m

Posted by: kiichi at 2007年01月19日 21:45

上記の者ですが、自己解決しました(^^♪
ですが、画像を2枚3枚と添付した場合がどうしてもわからず悪戦苦闘しております。

何とか自分で解決できるようがんばりますm(__)m
お騒がせしました。

Posted by: kiichi at 2007年01月23日 19:21
コメントする









名前、アドレスを登録しますか?