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

久保田 吉彦 kubota @ sie.dendai.ac.jp
2009年 10月 9日 (金) 17:49:18 JST


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

まだ問題解決できず悩んでいます。
コメントサーバへのアクセスを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 メーリングリストの案内