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