Node.js 去掉种子(torrent)文件里的邪恶信息


Posted in Javascript onMarch 27, 2015

2012 年,一部名为 ABS-130 的日本影片引起了网络的震动,网络上纷纷出现了 “当初求种像条狗,如今*完嫌人丑”的现象,成为了 2012 年互联网的一件大事件。

2014年,净网行动如火如荼地进行,各大互联网公司都作出了表率,一时之间XX云、X雷都把万恶的种子拒之门外。净网行动万岁!!(还我苍老师!!)

各大网盘、下载应用都从种子当中提取关键信息,将种子拒之门外。这些关键信息究竟藏在哪里?让我们一探究竟。

种子文件结构

以下内容来自维基百科

.torrent种子文件本质上是文本文件,包含Tracker信息和文件信息两部分。Tracker信息主要是BT下载中需要用到的Tracker服务器的地址和针对Tracker服务器的设置,文件信息是根据对目标文件的计算生成的,计算结果根据BitTorrent协议内的Bencode规则进行编码。它的主要原理是需要把提供下载的文件虚拟分成大小相等的块,块大小必须为2k的整数次方(由于是虚拟分块,硬盘上并不产生各个块文件),并把每个块的索引信息和Hash验证码写入种子文件中;所以,种子文件就是被下载文件的“索引”。

Node.js 去掉种子(torrent)文件里的邪恶信息

上图是一个典型种子的结构,那些被识别出来的邪恶关键字就藏在 name 和 file 当中。name 包含了该种子的名字,如:abcd-123 性感XXXX。而 file 当中的 path 则包含了要下载的所有文件的信息,如:草X社区最新地址.txt等等。

Node.js 和 parse-torrent 库

为了寻找出种子当中的邪恶信息我们请出了 Node.js 和 parse-torrent库 作为助手。

实验准备:

种子一枚安装 Node.js 电脑一台

首先我们利用 npm 安装 parse-torrent 库,它帮助我们快速找到种子内的信息。

npm install parse-torrent
var fs = require("fs");
var parseTorrent = require('parse-torrent');

var info = parseTorrent(fs.readFileSync('my.torrent'));
console.log(info);

这个库会将种子的信息解析出来,以对象的形式返回给我们。

查看结果:

name:

Node.js 去掉种子(torrent)文件里的邪恶信息

files:

Node.js 去掉种子(torrent)文件里的邪恶信息

可以看到用 parse-torrent 库解析出来的 name 和 files 的信息都是以 Buffer 形式存储。

清洗种子

如何将种子里的邪恶信息清洗掉,把万恶的种子扼杀在摇篮之中,最重要的就算要清除调 name 和 files 里面 path 的信息。

function cleanInfo (info) {
 // 将种子名用 md5 加密
 info.name = md5(info.name);
 info['name.utf-8'] = md5(info['name.utf-8']);
 var files = info.files;
 for (var i = 0; i < files.length; i++) {
  var file = files[i];
  for (var key in file) {
   if (key == "path" || key == "path.utf-8") {
    for (var j = 0; j < file[key].length; j++) {
     var text = file[key][j].toString();
     var dotIndex = text.lastIndexOf(".");
     // 将种子名用 md5 加密
     file[key][j] = md5(text.slice(0,dotIndex)) + text.slice(dotIndex,text.length);
    }
   }
  }
 }
 return info;
}
// 将清洗干净后的 info 对象重新生成一个 torrent 文件
var buf = parseTorrent.toTorrentFile({
 info: cleanInfos[i]
});
fs.writeFile(dir + "/" + cleanInfos[i].name + ".torrent", buf);

经过这样之后,我们的邪恶种子文件就变成这样了:

Node.js 去掉种子(torrent)文件里的邪恶信息

实战阶段

首先准备一个种子,进行XX云的离线下载。

Node.js 去掉种子(torrent)文件里的邪恶信息

一开始它是被拒绝的。

Node.js 去掉种子(torrent)文件里的邪恶信息

然后运行脚本进行清洗。

node cleanTorrent IPTD-XXX.torrent

下载成功了!

Node.js 去掉种子(torrent)文件里的邪恶信息

脚本源码放在这里了,要去看一下我的下载内容了!!!

Node.js 去掉种子(torrent)文件里的邪恶信息

Node.js 去掉种子(torrent)文件里的邪恶信息

(**都脱了你给我看这个!!!)

最后

本文纯属技术讨论,感谢你的阅读,有不足之处请为我指出。

请您花一点时间将文章分享给您的朋友或者留下评论。我们将会由衷感谢您的支持!

Javascript 相关文章推荐
Javascript中的String对象详谈
Mar 03 Javascript
css如何让浮动元素水平居中
Aug 07 Javascript
jQuery表单对象属性过滤选择器实例详解
Sep 13 Javascript
javascript实现的左右无缝滚动效果
Sep 19 Javascript
jQuery实现带延时功能的水平多级菜单效果【附demo源码下载】
Sep 21 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
Jun 03 Javascript
js数组实现权重概率分配
Sep 12 Javascript
详解Vue 事件修饰符capture 的使用
Dec 29 Javascript
vue弹窗消息组件的使用方法
Sep 24 Javascript
jQuery实现的淡入淡出图片轮播效果示例
Aug 29 jQuery
Vue实现可移动水平时间轴
Jun 29 Javascript
详解vue 组件的实现原理
Nov 12 Javascript
jQuery使用attr()方法同时设置多个属性值用法实例
Mar 26 #Javascript
jQuery使用prepend()方法在元素前添加内容用法实例
Mar 26 #Javascript
jQuery使用append在html元素后同时添加多项内容的方法
Mar 26 #Javascript
jQuery使用before()和after()在元素前后添加内容的方法
Mar 26 #Javascript
jQuery使用after()方法在元素后面添加多项内容的方法
Mar 26 #Javascript
jQuery使用empty()方法删除元素及其所有子元素的方法
Mar 26 #Javascript
jquery使用remove()方法删除指定class子元素
Mar 26 #Javascript
You might like
php操作(删除,提取,增加)zip文件方法详解
2015/03/12 PHP
apache php mysql开发环境安装教程
2016/07/28 PHP
Yii2框架实现数据库常用操作总结
2017/02/08 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
php反射学习之不用new方法实例化类操作示例
2019/06/14 PHP
PHP7.3.10编译安装教程
2019/10/08 PHP
jquery监控数据是否变化(修正版)
2011/04/12 Javascript
javascript (用setTimeout而非setInterval)
2011/12/28 Javascript
用js写了一个类似php的print_r输出换行功能
2013/02/18 Javascript
jquery cookie实现的简单换肤功能适合小网站
2013/08/25 Javascript
Chrome扩展页面动态绑定JS事件提示错误
2014/02/11 Javascript
jquery插件开发之实现google+圈子选择功能
2014/03/10 Javascript
javascript数字时钟示例分享
2014/04/23 Javascript
js 动态修改css文件用到了cssRule
2014/08/20 Javascript
原生javascript实现拖动元素示例代码
2014/09/01 Javascript
详解JavaScript数组的操作大全
2015/10/19 Javascript
JavaScript实现的CRC32函数示例
2016/11/23 Javascript
详解Node.js实现301、302重定向服务
2017/04/07 Javascript
JavaScript实现图片本地预览功能【不用上传至服务器】
2017/09/20 Javascript
微信小程序视图template模板引用的实例详解
2017/09/20 Javascript
总结js函数相关知识点
2018/02/27 Javascript
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
2019/05/10 Javascript
微信小程序点击按钮动态切换input的disabled禁用/启用状态功能
2020/03/07 Javascript
Vue的全局过滤器和私有过滤器的实现
2020/04/20 Javascript
如何使用 vue-cli 创建模板项目
2020/11/19 Vue.js
[01:34]2014DOTA2展望TI 剑指西雅图VG战队专访
2014/06/30 DOTA
Mac中Python 3环境下安装scrapy的方法教程
2017/10/26 Python
Python编程之黑板上排列组合,你舍得解开吗
2017/10/30 Python
浅谈Python Opencv中gamma变换的使用详解
2018/04/02 Python
django利用request id便于定位及给日志加上request_id
2018/08/26 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
2020/01/06 Python
利用Tensorflow的队列多线程读取数据方式
2020/02/05 Python
开启Django博客的RSS功能的实现方法
2020/02/17 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
2020/02/29 Python
selenium WebDriverWait类等待机制的实现
2020/03/18 Python
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS