[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 メーリングリストの案内