ブログペットの自動投稿
ココロを設置したまではいいけど、置いてあるだけじゃちょっと寂しい。
ので、ブログペットの自動投稿について調べているうちに、割と深いところまで来てしまったのでメモ代わりに色々書いておいてみる。
間違ってたら誰か指摘してくれないかなぁ。
・ブログペットが自動投稿する仕組み
ブログペットはブログサービスの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インターフェース
この記事のトラックバックURL:
何かしら