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

久保田 吉彦 kubota @ sie.dendai.ac.jp
2009年 10月 10日 (土) 16:29:06 JST


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

RubyであっさりできてSmalltalkでつまづいていて、なんだかく 
やしい気持ちでいました。
投稿した後もいろいろためしましたが、Character value: 0 に 
は気がつきませんでした。
ようやく解決しました、どうもありがとうござういました。

On 2009/10/10, at 15:19, Masashi Umezawa wrote:

> こんにちは
> 梅澤です。
>
> こんな感じではないでしょうか。
>
> 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 メーリングリストの案内