http://minken.net/mt/archives/000473.html
http://minken.net/mt/archives/000064.html
そういえば、携帯からエントリー入れるようにしてないなぁ、とか思いつつ、ひっそりと動かしているmt4i(http://www.hazama.nu/pukiwiki/index.php?MT4i)をいじってみたりしてみたけど、どうもちょっと違う。どうせ携帯であまり文字打たないし、カメラで撮った画像と短いコメントをアップできる方が使いようがありそう。
で、googleで検索して見つけたのがこのpost2blog。メールで特定のアドレスに画像添付つきのメール送ればmovabletype(http://www.sixapart.jp/movabletype/)にエントリが登録される、というもの。メールアドレス作るのは自前サーバーで簡単なんで、早速。
まず、うちはqmail(http://www.qmail.org/)を動かしているので、まずは受け取り用のアドレス、たとえばhoge@domain.comにするとして、
/var/qmail/alias/.qmail-hoge
というファイルを用意して、post2blogを置いた場所(仮に /usr/local/bin/post2blogとでもしておくかな)を以下のように記述する。
|/usr/local/bin/post2blog
で、あとはpost2blogの中のパラメータを上記URLを見ながら設定していくんだけど、はまったのがテンポラリファイルが作成されるディレクトリのアクセス権、そしてアカウントとパスワード。
qmailがqmaildユーザーとnofilesグループの権限で動いているので、テンポラリファイルのディレクトリのグループをnofilesに変更して、アクセス権をグループ書き込み可能な状態にしないといけなかった。当たり前ではあるけど…。仮に、テンポラリファイルのディレクトリを /usr/local/tmp/post2blog とした場合、
chgrp nofiles /usr/local/tmp/post2blog
chmod 775 /usr/local/tmp/post2blog
としてあげないといけないわけだ。なんて単純ミス…。
そしてもうひとつの方の問題。携帯からの投稿用に新たにmovabletypeのユーザーを作り、そのユーザーに「エントリーの投稿」と「ファイルのアップロード」の権限を与えて使おうと思ったんだけど、どうしても投稿されない。おかしいと思い、コメントアウトされていた
use Data::Dumper;
を復活させて、さらに以下のようにスクリプトを変更して、何が起こっているのかファイルに吐き出せるようにしてみた。
*** 37,47 ****
my $j = new Jcode;
! #open(OUT, ">$parse_path/mtmail");
my $str='';
while(
$str = $str.$_;
! #print OUT $_;
}
#close(OUT);
--- 37,47 ----
my $j = new Jcode;
! open(OUT, ">$parse_path/mtmail");
my $str='';
while(
$str = $str.$_;
! print OUT $_;
}
#close(OUT);
***************
*** 120,127 ****
},
1
);
! #print Dumper $ret->result;
! #print Dumper $ret->fault;
my $returl = $ret->result->{url};
if ($returl =~ /\.(jpe?g|gif|png)$/i) {
use Image::Size;
--- 120,127 ----
},
1
);
! print OUT "newMediaObject: ", Dumper($ret->result), "\n";
! print OUT "newMediaObject: ", Dumper($ret->fault), "\n";
my $returl = $ret->result->{url};
if ($returl =~ /\.(jpe?g|gif|png)$/i) {
use Image::Size;
***************
*** 147,152 ****
--- 147,156 ----
0,
);
+ print OUT "newPost: ", Dumper($ret->result), "\n";
+ print OUT "newPost: ", Dumper($ret->fault), "\n";
+ print OUT "newPost(all): ", Dumper($ret), "\n";
+
my $post_id = $ret->result();
if ($category_id) {
***************
*** 176,186 ****
1
);
! #print Dumper $ret->result;
! #print Dumper $ret->fault;
#$parser->filer->purge;
sub arrange_parts {
my ($texts, $attachs, $pn, $cnttype, $cntpath, $cntname) = @_;
if ($cnttype =~ /^text\/plain$/i) {
--- 180,192 ----
1
);
! print OUT "editPost: ", Dumper($ret->result), "\n";
! print OUT "editPost: ", Dumper($ret->fault), "\n";
#$parser->filer->purge;
+ close(OUT);
+
sub arrange_parts {
my ($texts, $attachs, $pn, $cnttype, $cntpath, $cntname) = @_;
if ($cnttype =~ /^text\/plain$/i) {
そうしたところ、いきなりしょっぱなのXMLRPCに接続してnewPost関数を呼んでいるところで
Invalid login
と出てくることがわかった。んん、アカウントあるし、パスワードも大丈夫だしなぜ?WEB上では投稿もできるの確認したし…。で、試しにいつも管理・書き込み用に使っているアカウントに書き直してみたところ、問題なく投稿される。へんだなぁ、と思いXMLRPCServer.pmをみてみたところ、どうやら
return unless $author->api_password;
というところでだめになっているっぽい。api_passwordって普通のパスワードともしかして別物?と思って、管理アカウントの設定を見てみると、一番下に「APIパスワード」という項目があって、しっかりと「XML-RPCやAtom APIで利用するパスワードです。」と書かれている…。
これを用意すればいいんだな、というのはわかったけど、追加作成したユーザーの設定画面にはこの項目が表示されず、権限設定しか出てこない。そこで、権限設定で「システムの管理者」にチェックをつけ、いったん管理アカウントから抜けて再度追加したアカウントで管理画面に入りなおし、ユーザー設定画面を開いてみたところ、見事に登場:)。
早速、
mkpasswd -l 14
とちょっと長めのパスワードを生成して登録し、再度、post2blogのメールアカウントに投稿してみたところ、無事エントリーが作成できた:)。試しに、再度管理アカウントで管理画面に入りなおしたあとに追加ユーザーの権限を最初の最小限の状態に戻しても問題なく投稿できる:)。これでばっちり。