すがブロ

sugamasaoのhatenablogだよ

CGIでハマる

もごもごAPIをいじっていて

コマンドラインの入力から HTTP REQUEST でメッセージを書き込めるのはできた。
で、早速 WEB からできるように変更していたんだけど、そのままのロジックでは動かないことが判明。
CGIのクエリは受け取れているんだけど、そのクエリの文字列を変換しようとしているところで、なぜか落ちる。
URLエンコードされているであろうクエリの文字列をURLデコードをして、生の文字列にして使おうとしていたのだけど、その方法がマズいのか。コマンドラインからではうまくいっていたので、入力の文字コードがおかしいのか。
とか、色々原因を調べた。特に、URLデコードした文字列が UTF-8 で認識されていないのか? とか延々調べたんだけど、原因は全然違った。
しかもショーモナイものだった_| ̄|○

原因は

cgi.params["xxxxx"] でクエリからの値を取得していたんだけど、この取得した値って、文字列じゃなくて、配列だったんだよね_| ̄|○
確かにエラーログにも Array の文字はあったんだけど、どうにも文字コードのほうに意識が行ってしまい遠回りをしてしまった。
実に3時間くらいハマっていた気がする(´Д`)

ひとまず

ある程度の形ができたので、あとはメインの変換ロジックを組み込めば目的は達成する。
……と思いきや、大きな問題が潜んでいたのだった。

大きな問題

もごもごAPI でメッセージの投稿をするには、ログインで使うパスワードではなくて

  • 任意で設定する「API利用パスワード」

が必要。
普通のログイン用のパスワードなら良かったんだけど、そうじゃないってことは一般ユーザ向けのサービスとしては成り立たないような気がしてきた。
つか、仮に投稿に必要な「メールアドレス*1」と「API利用パスワード」の入力をユーザに求めたとして、それって正当な「API利用パスワード」の使い方なんだろうか。
イメージ的にはWEBサービス作成者が使用するためのパスワードな気がするんだよね。まぁ、もうちょっと調べてみよう。

API利用パスワード

もごもごのページをまじまじと見たら載っていた
もごもごAPI

API認証について
APIには認証が必要になります
・認証はBasic認証で行ないます
・ユーザ名にはご登録いただいているメールアドレスをご入力ください。
APIパスワードの設定はログイン後にセッティングメニューにて設定が可能です。
・本APIを利用したアプリケーションを提供する際は、利用ユーザーに対しAPIパスワードを新たに登録して頂くよう告知してください。
APIパスワードは、【必ず】もごもごの本パスワードとは異なるパスワードを設定してください。

というわけで、API利用パスワードを使わせれば良いらしい。

*1:これはログイン時にもIDとして使う