《如何制作自己的b站追番表》一文,上次博主介绍了使用b站api制作自己的追番表,但对json数据获取和更新没有过多介绍,这里给大家介绍一下使用nodejs获取b站追番数据,便捷更新数据的方法。

I.使用须知

1.电脑需安装node.js

II.操作教程

新建文件bili.js和文件夹json,添加以下代码:

文件目录
const http = require('http');
const url = require('url');
const myhost = "api.bilibili.com";
//设置cookies
const mycookie = "你的cookies";
const ps = 10;			//每个json含有的番剧数量
const vmid = 6535656;		//uid
const type = 1;
const num = 28;			//总文件数(total/ps+1)
class Url {
    /**
     * 传入对象返回url参数
     * @param {Object} data {a:1}
     * @returns {string}
     */
    getParam(data){
        let url = '';
        for(var k in data){
            let value = data[k] !==undefined ? data[k] : '';
            url += `&${k}=${encodeURIComponent(value)}`
        }
        return url ? url.substring(1) : ''
    }
 
    /**
     * 将url和参数拼接成完整地址
     * @param {string} url url地址
     * @param {Json} data json对象
     * @returns {string}
     */
    getUrl(url, data){
        //看原始url地址中开头是否带?,然后拼接处理好的参数
        return url += (url.indexOf('?') < 0 ? '?' : '') + this.getParam(data)
    }
}
function nodePostGetRequest(HOST, PORT, method, bodydata, callBackFunction, path, cookie,i) {
  //把将要发送的body转换为json格式 
 var body = bodydata;
 var bodyString = JSON.stringify(body);
  //http 头部
 var headers = {
'Content-Type': 'application/json',
'Content-Length': bodyString.length,
'Cookie': cookie
 };

//用与发送的参数类型
var options = {
host: HOST,  //ip
port: PORT,   //port
path: path,   //get方式使用的地址
method: method, //get方式或post方式
headers: headers
  };
  var req = http.request(options, function(res) {
res.setEncoding('utf-8');

var responseString = '';

res.on('data', function(data) {
  responseString += data;
});

res.on('end', function() {
  //这里接收的参数是字符串形式,需要格式化成json格式使用
  // var resultObject = JSON.parse(responseString);
  // console.log('-----resBody-----', resultObject);
  writeJson(responseString,i);
});

req.on('error', function(e) {
  // TODO: handle error.
  console.log('-----error-------', e);
});
 });
 req.write(bodyString);
req.end();
}
//写入文件
function writeJson(responseString,i){
	var fs = require("fs");
	//       要写入的文件   要写入的内容       a追加|w写入(默认)|r(读取)  回调函数
		var filesrc = "./json/" + i + ".json";
	fs.writeFile(filesrc,responseString,{flag:"w"},function (err) {
	    if(err){
	        return console.log(err);
	    }else {
	        console.log("写入"+filesrc+"成功");
	    }
	})
	  // console.log(json);  //打印json
}

function getbangumi(num){
	for (var i = 1; i <= num; i++) {
	  let URL = new Url();
	  let mypath = URL.getUrl("/x/space/bangumi/follow/list",{type:type,pn:i,ps:ps,vmid:vmid});
	  (function(i) {
	  nodePostGetRequest(myhost, 80, 'GET', null, writeJson, mypath, mycookie,i);
	  })(i);
	}
}
getbangumi(num);

mycookie需登录自己的b站账号查看添加(b站模拟登录博主暂时不会,大佬别喷)

ps为每个json文件包含的番剧数量,可以根据自己网站展示不同灵活设置。(便于展示和设置分页,博主采用的是每页展示10个番剧)

num为总的json文件数量,根据ps值的不同json文件数量也不同,可以自行测试。

num = 总追番数 / 每页番剧数 + 1

vmid为自己的b站账号uid, 登陆自己的b站账号,点击个人空间获取自己的uid 。

B站账号uid