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