[SML 7678] Re: ニコ生APIのコメントサーバとのやりとりができません
久保田 吉彦
kubota @ sie.dendai.ac.jp
2009年 10月 9日 (金) 18:08:41 JST
2重送信してしまいました、すいません
On 2009/10/09, at 17:49, 久保田 吉彦 wrote:
> こんにちは、電大の久保田です。
>
> まだ問題解決できず悩んでいます。
> コメントサーバへのアクセスをWebにあったプログラムを参考
> に作ってみました。動きますが、Rubyです。ちゃんとサーバか
> らの応答を取得します。
> ーーーーーーーーーーーーーーーーー
> require 'socket'
>
> socket = TCPSocket.open("twr.live.nicovideo.jp","2538")
> query = "<thread thread=\"1000000013\" version=\"20061206\"
> res_from=\"-1\"/>\0"
>
> puts query
> socket.print query
>
> socket.each("\0") do |line|
> puts line
> end
> ーーーーーーーーーーーーーーーーー
> これと同じことをSmalltalkでやりたいわけです。
>
> 次のようにプログラムを書いてみましたがreplyを受けとると
> ころで応答が返ってきません。
> 原因が分からないので、どなたかプログラムのどこが悪いのかご指摘
> 願えないでしょうか。
> ーーーーーーーーーーーーーーーーー
> |socket stream query reply|
> socket :=SocketAccessor newTCPclientToHost:'twr.live.nicovideo.jp'
> port: 2538.
> stream := socket readAppendStream.
> query := '<thread thread="1000000013" version="20061206"
> res_from="-1"/>\0'
>
> Transcript cr; show:query.
> stream nextPutAll: query ;cr ;commit.
>
> [true] whileTrue: [
> reply := stream upToAll:'\0'.
> Transcript cr; show: reply.]
> ーーーーーーーーーーーーーーーーー
>
> 以上、よろしくお願い致します。
>
> 久保田吉彦
> 東京電機大学 情報環境学部 情報環境学科
>
>
> On 2009/10/08, at 12:39, 久保田 吉彦 wrote:
>
>> こんにちは電大の久保田です。
>>
>> ニコ生アラートのようなものを以下のURLで公開されている
>> APIを使ってちょこちょこ書いています。
>>
>> http://dic.nicovideo.jp/a/%E3%83%8B%E3%82%B3%E7%94%9F%E3%82%A2%E3%
>> 83%A9%E3%83%BC%E3%83%88(%E6%9C%AC%E5%AE%B6)%E3%81%AE%E4%BB%95%E6%
>> A7%98
>>
>> 以下のプログラム(きたないですが)でAPIの使い
>> かたをちょっと勉強をしているのですが、上記URLのログイン
>> API、認証APIその2は使えたのですがコメントサーバー
>> の項目がうまくいきません。
>> 自分ではコメントサーバにXMLを送信してその返事を待つこと
>> を10回くりかえしているつもりですが、コメントにあるよう
>> に reply := stream through: Character cr. を実行すると
>> プログラムが停止してしまいます(step3がTranscript
>> に表示されず、ループもそこでおわる)。
>> デバッガ開いて追ってみましたがなぜだかわかりませでした?
>> Socketプログラムはくわしくないのでおかしなことをしているので
>> しょうか?
>>
>> また、実行するとException"Unhandled exception:CA Not inTrust
>> Registry!"と出てきます。いまはProceedボタンを押してプロ
>> グラムを実行していますが、このExceptionを出さない方法は
>> ないのでしょうか?
>>
>> 作成している環境はVisualWorks7.6NC+Jun784それに
>> WobSupportパーセルを使っています。
>>
>>
>> | host port socket connection elements stream reply threadId
>> key elementCollection pdoc parser httpRequest httpResponse client
>> message |
>>
>> "ログインAPIその1"
>> client := Net.HttpClient new.
>> httpRequest := Net.HttpRequest post:
>> 'https://secure.nicovideo.jp/secure/login?
>> site=nicolive_antenna'.
>> httpRequest
>> userAgent: 'テスト1';
>> addFormKey: 'mail' value: 'メールアドレス';
>> addFormKey: 'password' value: 'パスワード'.
>> httpResponse := client executeRequest: httpRequest.
>> parser := XML.XMLParser new.
>> parser validate: false.
>> pdoc := parser parse: httpResponse decodedContents readStream.
>> elementCollection := pdoc root elementNamed: 'ticket'.
>> key := elementCollection elements first text.
>> Transcript
>> cr;
>> show: 'key:' , key.
>>
>> "認証APIその2"
>> client := Net.HttpClient new.
>> httpRequest := Net.HttpRequest post:
>> 'http://live.nicovideo.jp/api/getalertstatus'.
>> httpRequest
>> userAgent: 'テスト2';
>> addFormKey: 'ticket' value: key.
>> httpResponse := client executeRequest: httpRequest.
>> parser := XML.XMLParser new.
>> parser validate: false.
>> pdoc := parser parse: httpResponse decodedContents readStream.
>> elements := pdoc root children last.
>> host := (elements elementsNamed: 'addr') first elements first
>> text.
>> port := (elements elementsNamed: 'port') first elements first
>> text.
>> threadId := (elements elementsNamed: 'thread') first elements
>> first text.
>> Transcript
>> cr;
>> show: host , ':' , port , ':' , threadId.
>>
>> "コメントサーバー"
>> socket := SocketAccessor
>> newTCPclientToHost: host
>> port: port asNumber.
>> connection := ExternalConnection new.
>> connection
>> input: socket;
>> output: socket.
>> stream := connection readAppendStream.
>> stream lineEndTransparent.
>> message := '<thread thread=' , threadId ,
>> ' version="20061206" res_from="-1"/>'.
>> Transcript
>> cr;
>> show: message.
>> 10
>> timesRepeat:
>> [Transcript
>> cr;
>> show: 'step1'.
>> stream
>> nextPutAll: message; "<= XMLの送信"
>> cr;
>> commit.
>> Transcript
>> cr;
>> show: 'step2'.
>> reply := stream through: Character cr. "<=ここ
>> でプログラムが止まる"
>> Transcript
>> cr;
>> show: 'step3'].
>> stream close.
>> ^reply
SML メーリングリストの案内