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

Masashi Umezawa umejava @ mars.dti.ne.jp
2009年 10月 10日 (土) 15:19:40 JST


こんにちは
梅澤です。

こんな感じではないでしょうか。

accessor := SocketAccessor newTCPclientToHost:'twr.live.nicovideo.jp' port: 2538.
query := '<thread thread="1000000013" version="20061206" res_from="-1"/>'.
connection := accessor asExternalConnection.
connection writeStream nextPutAll: query; nextPut:(Character value: 0); commit.

rstr := connection readStream.
[[rstr atEnd] whileFalse: [
Transcript cr; show: (rstr upTo: (Character value: 0))]] fork.

[] forkで括っているのは、"do it"後に操作しやすくするためです。
なくてもかまいません。

ポイントは0で終わる文字列の作り方にあると思います。
またこの手のやつは一時変数ではなくワークスペース変数にしておいたほうが、
デバッグがしやすくて良いですよ。

ではでは。


久保田 吉彦 <kubota @ sie.dendai.ac.jp> 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



---
[:masashi | ^umezawa]


SML メーリングリストの案内