ブログペットの自動投稿
ココロを設置したまではいいけど、置いてあるだけじゃちょっと寂しい。
ので、ブログペットの自動投稿について調べているうちに、割と深いところまで来てしまったのでメモ代わりに色々書いておいてみる。
間違ってたら誰か指摘してくれないかなぁ。
・ブログペットが自動投稿する仕組み
ブログペットはブログサービスのAtomAPI、もしくはXML-RPCにユーザID、Password、記事データを渡す事により、該当のブログに自動的に記事を投稿する。
・WSSE認証
AtomAPI標準での認証はWSSE認証で行われている事が多い。
WSSE認証とは、X_WSSEヘッダを用いて認証用文字列を送信する認証手段で、以下のようなヘッダが送られる。
サーバ側にはPasswordの情報が存在する為、Nonce、Createdと実際のPasswordを用いて同じ手順を実行し、PasswordDigestを比較して認証を行う。
また、PasswordDigestを作る際に、エンコードする前のNonceを用いる事もある。
・起こった問題
最初にブログペットの設定で投稿用APIのURLを設定する必要があるのだが、設定の際に一度GETで情報を取得しに行ってるらしく、認証の為のX_WSSEヘッダを投げてくる。ヘッダの内容は以下。
このCreated、Nonce、実際のPasswordを用いて上で述べたアルゴリズムに従ってPasswordDigetsを生成しても、送られてきたPasswordDigestと異なっているので認証出来ない。
それとも全然違う暗号化してる?
・解決案
1.WSSE認証の詳細を問い合わせてみる
2.認証しないでレスポンスを直接返す
問い合わせたら教えてくれるような内容なんだろうか…orz
ブログ開発者なら教えてもらえそうだけど。
・実際の投稿
ブログペットのページで「ブログエディタ」から実際に記事を投げる事が出来る。
が、何処に投げてるのか不明なので当然投稿失敗。
投稿用APIを設定した時点で、
もしくは一度認証を通らせて、投稿用のURLを取得後にそのURLに向かって投げる設定なのかもしれない。
最初は投稿用APIに直接XMLを投げてるのかと思ったが、アクセス記録を見ても触っている形跡がないのでこれは確実。
<!--なんでもっとシンプルにしてくれないかなぁ…-->
・参考文献
はてなフォトライフAtomAPI
こせきの技術日記
観測気球::ここうさぎ3.09版
こうさぎHACK
Movable Type 3.2 マニュアル
RFC: MetaWeblog API
Atom API Documentation for Blogger
MIME::Base64 - base64文字列のエンコードとデコード
Digest::SHA1 - SHA-1アルゴリズムへのPerlインターフェース
ので、ブログペットの自動投稿について調べているうちに、割と深いところまで来てしまったのでメモ代わりに色々書いておいてみる。
間違ってたら誰か指摘してくれないかなぁ。
・ブログペットが自動投稿する仕組み
ブログペットはブログサービスのAtomAPI、もしくはXML-RPCにユーザID、Password、記事データを渡す事により、該当のブログに自動的に記事を投稿する。
・WSSE認証
AtomAPI標準での認証はWSSE認証で行われている事が多い。
WSSE認証とは、X_WSSEヘッダを用いて認証用文字列を送信する認証手段で、以下のようなヘッダが送られる。
*ID=ppp,Pass=qqqの場合
UsernameToken Username="ppp", PasswordDigest="zmq/giOPXamY+801x/V9hlNV/n0=", Created="2007-12-23T05:24:55Z",
Nonce="N2UwYWU0M2QxZDI2NmJkOTk3ZTMxYT
c4NmY1ODE2YWFmOTkyZjI1NQ=="
ここで、
Username:ID
Nonce:ランダムなバイト列をbase64エンコードしたもの
Created:Nonceが作られた日時をISO-8601表記で記述したもの
PasswordDigest:Nonce,Created,実際のPasswordを連結させてNIST SHA-1メッセージ・ダイジェスト・アルゴリズムで暗号化して出力されたバイト列をbase64エンコードしたもの
具体的には
PasswordDigest = base64( sha1( nonce . created . password ) )
UsernameToken Username="ppp", PasswordDigest="zmq/giOPXamY+801x/V9hlNV/n0=", Created="2007-12-23T05:24:55Z",
Nonce="N2UwYWU0M2QxZDI2NmJkOTk3ZTMxYT
c4NmY1ODE2YWFmOTkyZjI1NQ=="
ここで、
Username:ID
Nonce:ランダムなバイト列をbase64エンコードしたもの
Created:Nonceが作られた日時をISO-8601表記で記述したもの
PasswordDigest:Nonce,Created,実際のPasswordを連結させてNIST SHA-1メッセージ・ダイジェスト・アルゴリズムで暗号化して出力されたバイト列をbase64エンコードしたもの
具体的には
PasswordDigest = base64( sha1( nonce . created . password ) )
サーバ側にはPasswordの情報が存在する為、Nonce、Createdと実際のPasswordを用いて同じ手順を実行し、PasswordDigestを比較して認証を行う。
また、PasswordDigestを作る際に、エンコードする前のNonceを用いる事もある。
PasswordDigest
= base64( sha1( base64_decode( nonce ) . created . password ) )
= base64( sha1( base64_decode( nonce ) . created . password ) )
・起こった問題
最初にブログペットの設定で投稿用APIのURLを設定する必要があるのだが、設定の際に一度GETで情報を取得しに行ってるらしく、認証の為のX_WSSEヘッダを投げてくる。ヘッダの内容は以下。
*ID=ppp,Pass=qqqの場合
UsernameToken Username="ppp", PasswordDigest="1PIF/8v6ji8o7Ppeo7dlxnf0vSU=", Created="2007-12-23T05:24:55Z",
Nonce="N2UwYWU0M2QxZDI2NmJkOTk3ZTMxYT
c4NmY1ODE2YWFmOTkyZjI1NQ=="
UsernameToken Username="ppp", PasswordDigest="1PIF/8v6ji8o7Ppeo7dlxnf0vSU=", Created="2007-12-23T05:24:55Z",
Nonce="N2UwYWU0M2QxZDI2NmJkOTk3ZTMxYT
c4NmY1ODE2YWFmOTkyZjI1NQ=="
このCreated、Nonce、実際のPasswordを用いて上で述べたアルゴリズムに従ってPasswordDigetsを生成しても、送られてきたPasswordDigestと異なっているので認証出来ない。
それとも全然違う暗号化してる?
・解決案
1.WSSE認証の詳細を問い合わせてみる
2.認証しないでレスポンスを直接返す
問い合わせたら教えてくれるような内容なんだろうか…orz
ブログ開発者なら教えてもらえそうだけど。
・実際の投稿
ブログペットのページで「ブログエディタ」から実際に記事を投げる事が出来る。
が、何処に投げてるのか不明なので当然投稿失敗。
投稿用APIを設定した時点で、
この設定では投稿用APIにアクセスできませんでした。
(MetaWeblogとAtomAPIのみ対応しています)
とか言われてるので、多分設定が不十分で投げる場所が未設定になっていると思われる。(MetaWeblogとAtomAPIのみ対応しています)
もしくは一度認証を通らせて、投稿用のURLを取得後にそのURLに向かって投げる設定なのかもしれない。
最初は投稿用APIに直接XMLを投げてるのかと思ったが、アクセス記録を見ても触っている形跡がないのでこれは確実。
<!--なんでもっとシンプルにしてくれないかなぁ…-->
・参考文献
はてなフォトライフAtomAPI
こせきの技術日記
観測気球::ここうさぎ3.09版
こうさぎHACK
Movable Type 3.2 マニュアル
RFC: MetaWeblog API
Atom API Documentation for Blogger
MIME::Base64 - base64文字列のエンコードとデコード
Digest::SHA1 - SHA-1アルゴリズムへのPerlインターフェース
time stamp:2007/12/23 16:51:23
トラックバック(0)|コメント(5)
トラックバック(0)|コメント(5)
この記事のトラックバックURL:
コメント
はじめまして。
BlogPetはAPIの設定時に接続チェックを行っていて、具体的にはIDやパスワードが正しいかどうか調べるために、記事取得のAPIをたたいています。
ちなみに
XML-RPC
ATOM
アメブロ専用認証のATOMと順番に、3つの方法を試してます。
ココで書かれているログは最後の方法で接続したログだと思います。
で、どの方法でも認証できない場合、投稿エラーになると言う感じの実装です。
色々理由はあるのですが、一番の理由は数十万というブログに投稿設定がされていて、いちいち全部に投稿していたら負荷が凄すぎる為、チェック通過したものだけ投稿するような感じになってます。
written by Lanタソ [2008/02/06 11:45:54]
どうもはじめまして
BlogPetについて色々調べた時にLanタソのページにも辿り着いたりしてましたが、まさかコメントが貰えるとは思ってませんでした(・ω・;)
何か最近BlogPetで検索して来る人が多いようなのでもう少し記事書かないと…とか思ってたのですが時間がなかなか取れなかったので…
一ヶ月近く放置してますがもうすぐ暇になるらしいのでBlogPetの方も再開しようかと思ってます。
と言う訳でアドバイスありがとうございました。投稿出来るように頑張ります。
written by G [2008/02/10 13:38:59]
はじめまして、犬山ぽち丸と申します。
自分でAtomPPのサーバ=クライアントでテストした時と違って、ブログペットが実際に送ってくるものだと403が返って認証に失敗してしまいますね。
やっぱり普通とは違うやり方の暗号化なのでしょうか?
一年以上前の記事にコメントしていましたけども、わたしもなんとブログペットに投稿して欲しくて悪戦苦闘中です[犬]ω;)
違うようです
はじめまして。コメントが遅れてすいません。
あれからあんまり調べてないのでブログペットの現在の状況がわかりません。
以下のURLでWSSE認証用のヘッダを生成できるのですが、送られてきてるヘッダ情報とパスワード入力しても、異なるPasswordDigetsが生成されます。
ttp://www.teria.com/~koseki/tools/wssegen/
なので多分一般的なWSSE認証とは異なる方法で認証をしてるような気がします。
これは、上でLanタソさんが仰っているのですが、多分アメブロ専用のATOM認証方法のヘッダが来てるのではないのでしょうか。
なのでアクセスを全部取ってみようとしたのですが、何故か来たアクセスは2回で、どちらのX_WSSEヘッダ情報も通常のWSSE認証とは異なるものでした。
自分はこの辺が得意でないので詰まってしまい、更に今どのような通信方式でブログペットが投稿してるのかわからないのでお力にはなれません…
なので是非これを解決してやり方を教えてくだs(ry
ひっそりと応援してます。
written by G [2009/02/15 02:03:27]
ブログペットの WSSE認証は、
PasswordDigest = base64(sha1(Nonce . Created . パスワード))
で来ているのですけども、
Perlモジュール XML::Atom::Server の sub authenticate
では、
PasswordDigest = base64(sha1(base64_decode(Nonce) . Created . パスワード))
を使っていました。
このsub authenticate内の WSSE認証部分を
my $expected = encode_base64(sha1($auth->{Nonce} .
$auth->{Created} .$password), '');
といった感じでオーバーライドしたら認証「は」通りました。
Atomの認証の仕様も不安定らしいので XML::Atom::Server ベースクラスとしてオーバーライドするのが前提のモジュールみたいですね。
あとは機能の実装がちゃんと出来ればなんとかなりそうな予感がします。
コメントを書く
何かしら