[SML 7674] ニコ生APIのコメントサーバとのやりとりができません

久保田 吉彦 kubota @ sie.dendai.ac.jp
2009年 10月 8日 (木) 12:39:26 JST


こんにちは電大の久保田です。

ニコ生アラートのようなものを以下の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 メーリングリストの案内