back numbers

6.10.2008

PrologでPOST

SWI-Prologは標準で幾らかのライブラリ(その大半はJan Wielemaker氏による、ありがてぇこってす)が付いてくる、のでtwitterにPOSTくらい訳ないわぃと思ったのだが5分以上かかった。以下、要約。

twitter API(日本語訳)
上の記載に従って、まずはBASIC認証でフレンドのタイムラインを取得。

:- encoding(utf8).
:- use_module(library('http/http_client')).
twitter_account('ユーザ名', 'パスワード').
auth_header(request_header('Authorization' = Value)) :-
twitter_account(User, Pass),
format(atom(Codes), '~w:~w', [User, Pass]),
base64(Codes, Base64Codes),
format(atom(Value), 'Basic ~w', [Base64Codes]).
friends_timeline(Response) :-
auth_header(Head),
http_get('http://twitter.com/statuses/friends_timeline.xml',
Response, [Head]).

変数は単一化した後、適当にパースなどする。続いてアップデート。

update(Msg, Reponse) :-
% www_form_encode(Msg, Encoded), <- URLエンコードしたら駄目?
auth_header(Head),
http_post('http://twitter.com/statuses/update.xml',
form(['status' = Msg]), Response, [Head]).

URLエンコードしたらエンコード文字列のまま投稿された。ちなみにレスポンスはutf-8がURLエンコードされて返ってくる。なんで?

ちなみにSWI-Prolog(と大半のProlog処理系)では、文字は内部データベースのatomとなる。文字コードとして扱いたい場合は atom_codes/2 でatomと文字コードリストを交換する。文字コードをそのまま出力ストリーム(user_outputなど)に流すと対応する文字が表示出来る。

?- atom_codes('あいうえお', Codes).
Codes = [12354, 12356, 12358, 12360, 12362].

?- put(12354).
'あ'

ちなみに 12354 = 0x3042 である。そう、この文字コードはUTF-16である。SWI-Prologの文字の内部表現は、実行環境に依存している。そう、私はこれをWindowsXP上で動かしたのだ。

0 件のコメント:

tags

Profile

Taito, Tokyo, Japan
明けども明けども次の埒
hiro.kosh@gmail.com