本帖最后由 ModeCai 于 2026-5-19 10:39 编辑
抓包逆向初级学习者,分享一点自己的学习痕迹,代码已支持下载图书图片,可以自行生成PDF,里面需要的详细参数需自行使用抓包软件抓取,不适合零基础
[JavaScript] 纯文本查看 复制代码 import fs from "fs";
import path from "path";
import axios from "axios";
// 下载图片
async function downloadImage(url, outputPath) {
try {
const response = await axios({
method: 'GET',
url: url,
responseType: 'stream'
});
return new Promise((resolve, reject) => {
const writer = fs.createWriteStream(outputPath);
response.data.pipe(writer);
writer.on('finish', () => {
resolve();
});
writer.on('error', reject);
response.data.on('error', reject);
});
} catch (error) {
console.error(`下载失败: ${url} - ${error.message} `);
throw error;
}
}
// 'EOF'
async function fetchBookPages(apiUrl) {
try {
const response = await axios.get(apiUrl);
if (response.data.code !== 2000) {
throw new Error(`API echo: ${response.data.msg} `);
}
return response.data.data;
} catch (error) {
console.error(`'EOF': ${error.message} `);
throw error;
}
}
// pic_water 'EOF'
async function parsePicWater(pages, outputDir = './watermark_images') {
'EOF'
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir, { recursive: true });
}
const baseUrl = 'https://ddjcdn.diandujun.com/';
const results = [];
for (let i = 0; i < pages.length; i++) {
const page = pages[i];
const picWater = page.pic_water;
// pic_water'EOF'
if (!picWater) {
console.log(` ${page.page} (ID: ${page.id}): pic_water `);
results.push({
id: page.id,
page: page.page,
pic_water: null,
status: 'skipped',
reason: 'pic_water'
});
continue;
}
// 'EOF' URL
const fullUrl = picWater.startsWith('http')
? picWater
: `${baseUrl}${picWater} `;
const fileName = `page_${page.page}_${page.id}.jpg`;
const filePath = path.join(outputDir, fileName);
try {
console.log(`${page.page} (ID: ${page.id})...`);
console.log(` pic_water: ${picWater} `);
console.log(` 'EOF'UUUURL: ${fullUrl} `);
await downloadImage(fullUrl, filePath);
results.push({
id: page.id,
page: page.page,
pic_water: picWater,
fullUrl: fullUrl,
outputPath: filePath,
status: 'success'
});
} catch (error) {
console.error(` ${page.page} : ${error.message} `);
results.push({
id: page.id,
page: page.page,
pic_water: picWater,
fullUrl: fullUrl,
status: 'failed',
error: error.message
});
}
}
return results;
}
//
async function main() {
// API 自行替换内容可以自己去抓包 某点读君小程序、App或者网页版都可以
const apiUrl = 'https://api.diandujun.com/api//dianduapi/bookAllPages?cv=版本号(自行替换)&from=uni&app_name=ddj&env=mp&uid=用户id(自行替换)&key=加密签名的key(自行替换)&bid=图书id(自行替换)&kind=2';
try {
// 'EOF'
const pages = await fetchBookPages(apiUrl);
// pic_water
const results = await parsePicWater(pages);
// 'EOF'
const successful = results.filter(r => r.status === 'success').length;
const failed = results.filter(r => r.status === 'failed').length;
const skipped = results.filter(r => r.status === 'skipped').length;
// SON
const resultFile = './pic_water_results.json';
fs.writeFileSync(resultFile, JSON.stringify(results, null, 2));
console.log(`\ ${resultFile} `);
} catch (error) {
console.error('./:', error.message);
process.exit(1);
}
}
//
main(); |