Hatena::ブログ(Diary)

「まずまずのダム日和」 このページをアンテナに追加 RSSフィード

2008-12-27

ニコ生のコメントサーバからコメントのデータを取得する方法を調べてた 00:53 ニコ生のコメントサーバからコメントのデータを取得する方法を調べてたを含むブックマーク ニコ生のコメントサーバからコメントのデータを取得する方法を調べてたのブックマークコメント

rubyでSocket使って通信する方法の勉強も兼ねて調べたメモ。っていうか、それ勉強してた。

require 'socket'

msgsvr = ARGV[0]    #メッセージサーバのホスト名
port = ARGV[1]      #メッセージサーバのポート番号
thread = ARGV[2]    #スレッド番号

s = TCPSocket.open(msgsvr,port)
req = "<thread thread=\"#{thread}\" res_from=\"-200\" version=\"20061206\" \>\0"

s.print req

s.each("\0") do |line|
    print line + "\n"
end

ホスト名とかはニコニコ動画ログインしてるブラウザから

http://live.nicovideo.jp/api/getplayerstatus?v=生放送の番号(lv9999…)

アクセスして取得できる(これ取得する処理もmechanizeとか使えば書けると思うけど今開いてるブラウザのニコ生がログアウトしちゃうんだろうなぁ)。区切り文字がnull文字というのがなんか嵌りました。

参考にしたのはニコニコ生放送のコメントを取得しようとした…けど失敗 - imakamiのメモとか、Nico Requestのソースコードとか。あと、Web+DBPress Vol.47のネットワークプログラミングの特集も読んだ。

どうなったら停止させたらいいのかとかよくわからないけど、最初の一歩ということで。

追記

すいません、s.puts reqだと改行コードはいっちゃいますね。s.print reqに修正しました。ごめんなさい。

ExceptionErrorExceptionError 2008/12/28 12:56 エンタメ向けの設定で修正する手間をかけさせてしまってすみません。
次回の更新で「ゆっくり」限定かつコメントを順番にしゃべらせていく実用モード(?)を実装したいと思います。

dambiyoridambiyori 2008/12/28 21:42 >ExceptionErrorさん
コメントありがとうございます。Nico Request今度実際に動画中継で利用させていただきます。
>エンタメ向けの設定で修正する手間をかけさせてしまってすみません。
こちらこそ、プログラム勝手にいじくる記事乗せちゃってすいません。「実用モード」作られたら利用される方結構居そうな気がします。
楽しみにしていますね。

oiraoira 2009/01/11 23:24 108行目にいどうしても、
テキストが見当たらないのですが...

dambiyoridambiyori 2009/01/14 22:44 >oiraさん
お返事おそくなってすいません。
Nico Requestのバージョンがこれを書いたときから上がったようなので、おそらくソースコードが変わったのだと思います。
僕もまだ内容確認してないのでわからないのですが、SofTalk.exeで検索するとそれっぽい場所が出てくるのではないかと思います。

oiraoira 2009/01/30 01:54 SofTalk ver1.51 NicoRequest ver2.1.0
を使ってるのですが、どうもうまくいきません。
読み上げ速度、声色どこで設定したらいいか...

RR 2009/02/13 03:09 Vistaで動かしてみましたが、
タスクにSoftalkのプロセスが次から次へと作られ、非常に動作が重くなります。
私の設定が悪いのでしょうか?

dambiyoridambiyori 2009/02/17 21:44 コメントお答え出来なくてごめんなさい。
softalk呼び出し箇所については、機能が存在しているならば
プログラム中のどこかにsoftalkの文字が有ると思いますので
それを検索して頂ければと思います。
Vistaに関しては、SoftalkのFAQを見るとどうも終了しない場合が
有るようなので、それじゃ無いかと思います。

asunyanasunyan 2012/02/15 10:40 ニコ生のアプリを開発中の者です。コメントサーバーに接続したくて調べていたところ、このブログにたどり着きました。
dambiyoriさんの方法で無事接続でき、ターミナル上でコメントログを表示させることができました。(windowsのコマンドプロンプトではどこかのエンコードの問題で文字化けしてしまいましたが)
たいへん参考になりました。ありがとうございます。

取得したコメントをブラウザ上で表示させたいのですが、方法がわかりません。
Ruby on Railsを勉強中なのですが、ビューの中のerbに組み込んでもダメでした。

私のrubyの文法の知識が足りないためだと思ったので、質問させていただくことにしました。よろしくお願いします。
「s.print req」とありますが、これは「(変数).(メソッド) (変数)」という捉え方なのでしょうか。
この行がどういう処理をするコードなのかがわからないので、ご教授いただければ幸いです。

ちなみに私は黒部ダムが好きです。失礼しました。

dambiyoridambiyori 2012/02/16 00:21 >asunyan さん
コメントありがとうございます。
>たいへん参考になりました。ありがとうございます。
いえいえ、こちらこそ。お役に立ちましたら幸いです。

>取得したコメントをブラウザ上で表示させたいのですが、方法がわかりません。
>Ruby on Railsを勉強中なのですが、ビューの中のerbに組み込んでもダメでした。
このサンプルからWebアプリまで持っていくにはいろいろ手を加えないといけないと思います。
まず、実行されたとのことでお分かりかと思いますが、このサンプルプログラムは動き出すとクライアントで強制終了するかサーバとの接続が切れない限り止まりません。ところがWebアプリはhtmlをクライアントに返してあげないといけませんから、単純に組み込んだだけではサーバの処理がいつになっても終わらなくてタイムアウトしてしまうと思います。
いままでのコメントを取得するだけの場合でも何かしらループを抜ける条件を付加する必要があるでしょうし、リアルタイムで取得させる場合は非同期にコメントを取得してそれをAjaxなどの技術を使用してクライアントに返す必要があると思います。

>「s.print req」とありますが、これは「(変数).(メソッド) (変数)」という捉え方なのでしょうか。
>この行がどういう処理をするコードなのかがわからないので、ご教授いただければ幸いです。
これは、クライアントがコメントサーバに対してコメント取得のリクエストをしているところです。具体的にはその上の行のreqに代入している文字列をサーバに投げてます。こうすると、コメントサーバから随時クライアントにコメントが送られてきて、残りの行のループでひたすら送られてきたものを出力しています。
ご質問の内容から察するにrailsじゃないrubyを使われたことがあまりないのではと思います。railsのつかないrubyの入門書をいちどお手にとってはいかがでしょうか。遠回りに感じるかもしれませんが、Railsの独特の表記がrubyの言語でどういう意味だったのかとか理解できて、役立つ(というか、絶対必要)と思いますよ。
ちなみに、僕は「たのしいRuby(ソフトバンク)」で勉強しました。この他にも結構いろんな本が出ているようなので是非書店でごらんになって見てください。
きちんと解答できなくてすいません。実は僕もそんなに詳しくなくてまさにRails勉強中している最中ですw

>ちなみに私は黒部ダムが好きです。失礼しました。
おー、黒部ダム!僕も黒部ダムが一番好きです。それでは。