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