Comments (1)
Trang này khoai lắm. Kiểu cắt ảnh vầy nhiều web cũng sài rồi, mã hóa đủ kiểu nhưng để hiển thị ra client thì phải để key giải mã ra ngoài:
s.voocdn.com_js_comic_viewer.txt
function ComicViewer(_arg) {
this.servers_data = [];
this.total_images = 0;
this.servers_el = _arg.servers_el;
this.servers_wrapper_el = _arg.servers_wrapper_el;
this.viewer_el = _arg.viewer_el;
this.max_loading = _arg.max_loading || 5;
this.enable_more_btn = _arg.enable_more_btn;
this.more_btn_el = _arg.more_btn_el;
this.comic_id = _arg.comic_id;
this.chapter_id = _arg.chapter_id;
this.sig = _arg.sig;
this.crypto = CryptoJS;
this.version = _arg.version;
this.webp_support = false;
}
ComicViewer.prototype.initServers = function() {
function run(time, dt) {
var imgchk = $('<div class="btn btn-primary" />').text("Server " + time);
imgchk.click(function() {
var type = self.servers_el.data("current");
if (type != time) {
self.servers_el.data("current", time);
self.viewer_el.empty();
var type = dt[self.webp_support ? "webp" : "jpeg"];
self.loadImages(type);
}
}).appendTo(self.servers_el);
if (time == 1) {
imgchk.click();
}
}
var self = this;
self.getChapterData(function(r) {
self.total_images = r.total;
var canvas = 1;
var j;
for (j in r.data) {
run(canvas, r.data[j]);
canvas++;
}
if (canvas == 2) {
self.servers_wrapper_el.hide();
}
});
};
ComicViewer.prototype.getChapterData = function(callback) {
var self = this;
if (self.loaded || self.loading) {
return;
}
self.loading = true;
$.ajax({
url : "/content/rest",
data : {
t : "chapter",
cid : this.comic_id,
chid : this.chapter_id,
sig : this.sig,
v : this.version
},
success : function(data) {
if (data.error == 0) {
callback(data);
} else {
self.viewer_el.find("h3").html(data.error_msg);
}
},
error : function(deleted_model) {
self.viewer_el.find("h3").html("C\u00f3 l\u1ed7i x\u1ea3y ra. Vui l\u00f2ng th\u1eed l\u1ea1i,");
},
complete : function() {
self.loading = false;
}
});
};
ComicViewer.prototype.loadImages = function(data) {
function init() {
return ["iPad Simulator", "iPhone Simulator", "iPod Simulator", "iPad", "iPhone", "iPod"].includes(navigator.platform) || navigator.userAgent.includes("Mac") && "ontouchend" in document;
}
function check(d, p, f, data) {
var _stringBuilder = self.viewer_el.find("[data-idx=" + d[p][1] + "] [data-idx=" + d[p][2] + "]");
var a = load(d[p][0]);
if (!a) {
f(data);
return;
}
if (!data) {
data = new Image;
}
data.onload = function() {
_stringBuilder.empty();
if (h) {
var random = function(width, radius) {
width = Math.ceil(width);
return radius = Math.floor(radius), Math.floor(Math.random() * (radius - width + 1)) + width;
};
if (averageImageArea > MinimumAverageImageArea) {
_stringBuilder.append(data.cloneNode(true));
f(data);
return;
}
var e = $("<div class='c-holder' />");
var width = data.width;
var i = data.height;
averageImageArea = averageImageArea + width * i * 4;
e[0].style.maxWidth = width;
var resolution = random(1, 2);
var scale = random(1, 3);
var w = width / resolution;
var v = i / scale;
var s = 0;
for (; s < scale; s++) {
var x = 0;
for (; x < resolution; x++) {
var img = document.createElement("canvas");
var context = img.getContext("2d");
img.width = w;
img.height = v;
img.style.width = 100 / resolution + "%";
var pw = w;
var knobSize = v;
var placex = dx = x * w;
var textureY = dy = s * v;
context.drawImage(data, placex, textureY, pw, knobSize, 0, 0, pw, knobSize);
e.append(img);
}
}
_stringBuilder.append(e);
if (i > 150) {
var adjustWindow = function() {
var height = self.viewer_el.width();
if (height >= width) {
e[0].style.width = "auto";
return;
}
var start = height / width * i;
e[0].style.width = start / i * width;
if (e.find("canvas").length > 0) {
e.find("canvas").css({
width : height / resolution + "px",
height : start / scale + "px"
});
}
};
$(window).resize(adjustWindow);
adjustWindow();
}
}
f(data);
};
data.onerror = function() {
f(data);
};
data.src = a;
if (!h) {
_stringBuilder.append(data.cloneNode(true));
}
}
function log(b, i) {
function done(cb) {
i = i + 1;
if (i < b.length) {
try {
check(b, i, done, cb);
} catch (e) {
done(cb);
}
}
}
var i = -1;
var whichFriend = 0;
for (; whichFriend < i; whichFriend++) {
done();
}
}
var self = this;
var r = false;
var value = "f1014e69f2b1ae4";
var iv = "840f44747cb4f236";
var encrypt = function(key, data, iv) {
try {
iv = self.crypto.enc.Utf8.parse(iv);
if (data.length < 32) {
data = data.padEnd(32, "\x00");
}
var dec = self.crypto.AES.decrypt(key, self.crypto.enc.Utf8.parse(data), {
iv : iv
});
return dec.toString(self.crypto.enc.Utf8);
} catch (e) {
}
return "";
};
var m = [];
var key;
for (key in data) {
var $burn_msg = $("<div data-idx=" + key + "></div>").appendTo(self.viewer_el);
if (self.enable_more_btn) {
if (self.total_images > 3 && m.length > self.total_images / 3) {
$burn_msg.hide();
if (!r) {
r = true;
var moreMessagesIndicator = self.more_btn_el.detach().appendTo(self.viewer_el).show();
moreMessagesIndicator.click(function() {
self.viewer_el.find("> div").show();
moreMessagesIndicator.hide();
});
}
}
}
var name;
for (name in data[key]) {
$burn_msg.append("<div data-idx=" + name + ">Loading...</div>");
m.push([data[key][name], key, name]);
}
}
const iframe = document.createElement("iframe");
document.body.appendChild(iframe);
var textedCanvas = iframe.contentDocument.createElement("canvas");
var h = !!(textedCanvas.getContext && textedCanvas.getContext("2d"));
document.body.removeChild(iframe);
var load = function(lessId) {
return "";
};
switch(this.version) {
case "2":
var f = function(indexes) {
var outChance = [];
var i = 0;
for (; i < indexes.length; i++) {
outChance.push((parseInt(indexes[i], 16) * 5 % 16).toString(16));
}
return outChance.join("");
};
load = function(window) {
var text = window[0];
var thisClass = window[1];
var value = f(thisClass.substr(9, 15));
var data = f(thisClass.substr(-20, 16));
return encrypt(text, value, data);
};
break;
default:
load = function(data) {
return encrypt(data, value, iv);
};
break;
}
var MinimumAverageImageArea = 157286400;
var averageImageArea = 0;
var newPath = [];
key = 0;
for (; key < m.length / 5; key++) {
var path = m.splice(Math.floor(Math.random() * m.length), 1);
newPath.push(path[0]);
}
log(m, self.max_loading - 1);
log(newPath, 1);
};
ComicViewer.prototype.run = function() {
function getCanvasImageData(event, callback) {
var options = {
lossy : "UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",
lossless : "UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA==",
alpha : "UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAARBxAR/Q9ERP8DAABWUDggGAAAABQBAJ0BKgEAAQAAAP4AAA3AAP7mtQAAAA==",
animation : "UklGRlIAAABXRUJQVlA4WAoAAAASAAAAAAAAAAAAQU5JTQYAAAD/////AABBTk1GJgAAAAAAAAAAAAAAAAAAAGQAAABWUDhMDQAAAC8AAAAQBxAREYiI/gcA"
};
var offscreenImage = new Image;
offscreenImage.onload = function() {
var warFilename = offscreenImage.width > 0 && offscreenImage.height > 0;
callback(event, warFilename);
};
offscreenImage.onerror = function() {
callback(event, false);
};
offscreenImage.src = "data:image/webp;base64," + options[event];
}
var serMan = this;
getCanvasImageData("lossy", function(canCreateDiscussions, Client) {
serMan.webp_support = Client;
serMan.initServers();
});
};
Giờ giải mã ra để lấy key thì lần sau deploy họ lại đổi key mới, đổi kiểu mã hóa mới khó giải hơn. Nói chung là tốn công cả 2 bên, nếu họ đổi key thì phải gen lại mớ ảnh cũ, nhọc server. Muốn chặn được mình giải mã thì code cũng phải nặng hơn nhiều, tốn nhiều bandwidth, chậm web.
Đơn giản nhất là puppeteer, playwright,... để mô phỏng quá trình tải web bình thường và screenshot từng khung hình, hoặc full page. Hoặc, chờ web khác như nettruyen cào về, ta cào lại, ez.
Nói lại thì trang này còn nhiều truyện chỉ đọc trên app, video, nhưng lại không có bộ nào hay, độc quyền, không bõ công làm tool.
from userscript.
Related Issues (20)
- Cập nhật hentaivn.la đi bác 😊
- Facebook blocking script no longer finding ads in feed
- Tải truyenvip.yy Lỗi không vượt qua được kiểm tra của Google
- Download không thành công truyện từ nguồn truyenvnpro HOT 5
- [Request] Can I customize the awesome info box position? HOT 2
- [Request] Can I completely disable the image 'auto-move'? HOT 4
- Danh sách truyện hỗ trợ thường hay thay đổi tên miền HOT 5
- [truyenyy]: Bugs khi get token để verify captcha
- (Truyenyy) lỗi flie tải về HOT 9
- Làm thêm cho download epub cho trang truyenchu.vn bạn ơi
- có thể cập nhật link mỗi khi các trang đổi tên miền được k ạ HOT 1
- Thiếu nhiều web truyện mới cũng như các web chia sẻ epub
- Cập nhật thêm truyenmoi-org và các web mới được không bạn ơi HOT 3
- Lỗi! Bạn không vượt qua kiểm tra của GG HOT 2
- Image Viewer: can I get tiled & scrollable checkerboard background? HOT 2
- Trang truyenCV giờ đổi trang mới rồi, xin bạn hãy cập nhật srcipt ạ! Trân trọng
- Lỗi down ảnh ở 10download.com HOT 1
- bác có thể làm thêm web truyendocviet downloader được không :<<
- bác có thể làm thêm web truyendocviet downloader được không :<<
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from userscript.