用Node.js制作一个Nico生的评论窗口

var net = require('net');
socket.connect(data.msPort, data.msAddr);
socket.setEncoding('utf-8');
socket.on('connect', function() {
    console.log('connected');
    socket.write('<thread thread="' + data.msThread + '" res_from="' + data.resFrom + '" version="20061206" >' + "\0");
});
socket.on('data', function(data) {
    console.log(data);
});

在使用谷歌搜索时可以找到这段代码片段,但由于其未获取”getplayerstatus”,因此无法正常工作。

手动访问API并修改相应部分即可使其运行。

data.msPort的值应为。

data.msAddr的值应为。

data.msThread的值应为

data.resFrom的值应在-1000~0之间,表示评论起始位置。

以下是中文的一种选项:

例如

var net= require('net');
var socket= net.connect(2811,'omsg101.live.nicovideo.jp');
socket.on('connect', function(){
  console.log('connected');
  socket.setEncoding('utf-8');
  socket.write('<thread thread="1435806943" res_from="-5" version="20061206" />\0');
});
socket.on('data',function(data){
  console.log(data);
});
<thread resultcode="0" thread="1435806943" last_res="2836" ticket="0x1dfc9b00" revision="1" server_time="1431262237"/><chat thread="1435806943" vpos="6450700" date="1431261909" date_usec="57301" mail="184" user_id="Idj1TdXOGrERXdFOUdiTX4sKIB0" anonymity="1" locale="jp">v(゚Д゚)v<♪ カァーニー カァーニー ショヌダー カジカジ バーブー ソムダー パッ! ♬</chat><chat>...</chat>

这太糟糕了。

登录

使用request模块,在https://secure.nicovideo.jp/secure/login提交mail_tel和password。

$ npm install request
$ node login.js

var request= require('request');

request.post({
  url: 'https://secure.nicovideo.jp/secure/login',
  form: {
    mail_tel: 'your@mail.address',
    password: '********',
  },
},function(error,response){
  if(error!=null) throw error;

  var session= null;
  var cookies= response.headers['set-cookie'] || [];
  for(var i=0; i<cookies.length; i++){
    var cookie= cookies[i];
    if(cookie.match(/^user_session=user_session/)){
      session= cookie.slice(0,cookie.indexOf(';')+1);
    }
  }

  console.log(response.headers['set-cookie']);
  console.log(session);
});

如果登录正常的话


[ 'nicosid=1431257919.1222609129; expires=Wed, 07-May-2025 11:38:39 GMT; path=/; domain=.nicovideo.jp',
  'user_session=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT',
  'user_session=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/',
  'user_session=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.nicovideo.jp',
  'user_session=user_session_000000_0000000000000000000000000000000000000000000000000000000000000000; expires=Tue, 09-Jun-2015 11:38:39 GMT; path=/; domain=.nicovideo.jp',
  'repair_history=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.nicovideo.jp' ]
user_session=user_session_000000_0000000000000000000000000000000000000000000000000000000000000000;

将返回类似于的值。最终只使用session。

这之后将重复使用该session。该session在一段时间内是有效的,并且通过将其保存为本地文件,可以避免在每个方法中插入登录过程。

获取玩家(评论服务器)信息

现在让我们立即确认一下getplayerstatus是否可用。

var request= require('request');
request({
  url: 'http://live.nicovideo.jp/api/getplayerstatus/nsen/hotaru',
  headers: {
    Cookie: session,
  },
},function(error,response){
  if(error!=null) throw error;

  console.log(response.body);
});
<?xml version="1.0" encoding="utf-8"?>
<getplayerstatus status="ok" time="1431262800"><stream><id>lv220580424</id><title>Nsen - 蛍の光チャンネル</title><description>Nsenからの去り際に自主的にお立ち寄り下さい。Nsenをご堪能頂いた後、また、ネットサーフィンを終え眠りにつく時などにオススメです。</description>...</stream>
...
<ms><addr>omsg101.live.nicovideo.jp</addr><port>2811</port><thread>1435806943</thread></ms>
...
</getplayerstatus>

我已经能够获取到玩家(评论服务器)的信息。

getplayerstatus 可以使用 nsen、 lv***、 co*** 三种选项。

使用cheerio模块,提取所需值。

$ npm install cheerio
$ node getplayerstatus.js
var request= require('request');
var cheerio= require('cheerio');

request({
  url: 'http://live.nicovideo.jp/api/getplayerstatus/nsen/hotaru',
  headers: {
    Cookie: session,
  },
},function(error,response){
  if(error!=null) throw error;

  var $= cheerio.load(response.body);
  console.log($('getplayerstatus ms port').text());
  console.log($('getplayerstatus ms addr').text());
  console.log($('getplayerstatus ms thread').text());
});
2811
omsg101.live.nicovideo.jp
1435806943

连接到玩家的设备。

通过连接现有的代码,获取评论。

// Dependencies
var request= require('request');
var cheerio= require('cheerio');
var net= require('net');

// Demonstration
process.nextTick(function(){
  // Environment
  var id= 'your@mail.address';
  var pw= '********';
  var live_id= 'nsen/hotaru';

  // Boot
  nicolive.login(id,pw,function(error,session){
    if(error!=null) throw error;

    nicolive.fetchThread(live_id,session,function(error,thread){
      if(error!=null) throw error;

      nicolive.view(thread,function(error,viewer){
        if(error!=null) throw error;

        viewer.on('data',function(data){
          console.log(data);
        });
      });
    });
  });
});

// Methods
nicolive= {
  login: function(id,pw,callback){
    request.post({
      url: 'https://secure.nicovideo.jp/secure/login',
      form: {
        mail_tel: id,
        password: pw,
      },
    },function(error,response){
      if(error!=null) return callback(error);

      var session= null;
      var cookies= response.headers['set-cookie'] || [];
      for(var i=0; i<cookies.length; i++){
        var cookie= cookies[i];
        if(cookie.match(/^user_session=user_session/)){
          session= cookie.slice(0,cookie.indexOf(';')+1);
        }
      }
      if(session==null) return callback(new Error('Invalid user'));

      callback(null,session);
    });
  },
  fetchThread: function(live_id,session,callback){
    request({
      url: 'http://live.nicovideo.jp/api/getplayerstatus/'+live_id,
      headers: {
        Cookie: session,
      },
    },function(error,response){
      if(error!=null) return callback(error);

      var $= cheerio.load(response.body);
      callback(null,{
        port: $('getplayerstatus ms port').text(),
        addr: $('getplayerstatus ms addr').text(),
        thread: $('getplayerstatus ms thread').text(),
      });
    });
  },
  view: function(thread,callback){
    var viewer= net.connect(thread.port,thread.addr);
    viewer.on('connect', function(){
      viewer.setEncoding('utf-8');
      viewer.write('<thread thread="'+thread.thread+'" res_from="-5" version="20061206" />\0');

      callback(null,viewer);
    });
  },
}

module.exports= nicolive;
$ node nicolive.js
<thread resultcode="0" thread="1435806943" last_res="2836" ticket="0x1dfc9b00" revision="1" server_time="1431262237"/><chat thread="1435806943" vpos="6450700" date="1431261909" date_usec="57301" mail="184" user_id="Idj1TdXOGrERXdFOUdiTX4sKIB0" anonymity="1" locale="jp">v(゚Д゚)v<♪ カァーニー カァーニー ショヌダー カジカジ バーブー ソムダー パッ! ♬</chat><chat>...</chat>

产物(用Electron制作的评论浏览器)

d06cf958-ebda-11e4-9d22-5f9420129523.png
    • edgy-comment-viewer/59naga – Latest release | github

 

    • nicolive/59naga Command line comment viewer | github

 

    • nicolive.io/59naga ニコニコ生放送のコメントサーバーの寄生サーバー | github

 

    nicolive.berabou.me/59naga HTML5コメントビューアー | github

请参考

    • request | npm

 

    • cheerio | npm

 

    • niconicoのメッセージ(コメント)サーバーのタグや送り方の説明 – 神の味噌汁青海

 

    • ニコニコAPIリストwiki

 

    node-nicovideo-api/Ragg- | github
广告
将在 10 秒后关闭
bannerAds