用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制作的评论浏览器)
-
- 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