var express = require('express'), router = express.Router(), utils = require("../utils"), config = require("../config"); var isA = true; // 别人的后端c router.all('*', (req, res, next) => { isA = Boolean(req.query.isAndroid) || false res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "*"); res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS"); res.header("X-Powered-By", 'bmy') res.header("Content-Type", "application/json;charset=utf-8"); next(); }); // http://127.0.0.1:3000/api/json/test router.get('/test', async (req, res, next) => { // res.status(500) // 200 res.json({ status: 500, msg: '请求成功', result: [ { id: 1, name: 'test1' }, { id: 2, name: 'test2' }, { id: 3, name: 'test3' }, ] }) }); // http://127.0.0.1:3000/api/json/token router.get('/token', async (req, res, next) => { // 500 res.json({ status: 200, msg: '请求成功', result: { title: 'token获取' } }) }); /** * 【已修改,正常】1:获取首页推荐写真集列表 【页面完成】 * 接口地址:http://127.0.0.1:3000/api/json/index */ router.get('/index', async (req, res, next) => { var list = await utils.AgentPost(config.AgentUrl); res.json({ status: 200, msg: '请求成功', result: list.data }) }); // ================ 查看写真详情 接口 ====================== /** * 【已修改,正常】2:进入写真集详情 * 接口地址:http://127.0.0.1:3000/api/json/info * 参数: * id 从首页带过来的 id参数 * quantity 写真的数量 * 示例:http://127.0.0.1:3000/api/json/info?id=7850&quantity=91 * */ router.get('/info', async (req, res, next) => { let quantity = req.query.quantity; let id = req.query.id; let result = [] for (let i = 1; i<= quantity; i++) { result.push(returnUrl(`https://tjg.gzhuibei.com/a/1/${id}/${i}.jpg`)) } res.json({ status: 200, msg: '请求成功', result: result }) }) // ================写真机构 接口 ====================== /** * 【已修改,正常】3:获取各大国内外写真机构列表 【页面完成】 * 接口地址:http://127.0.0.1:3000/api/json/mechanism */ router.get('/mechanism', async (req, res, next) => { let $ = await utils.get(config.BaseUrl); var result = [] $(".layui-tab-content .layui-tab-item").eq(2).find(".tags>a").each(function (index) { result.push({ id: parseInt($(this).attr("href").split("?id=")[1]), title: $(this).text(), page: 1 }) }) res.json({ status: 200, msg: '请求成功', result: result }) }) /** * 【已修改,正常】4:获取该机构下写真套图列表 【页面完成】 * 接口地址:http://127.0.0.1:3000/api/json/mechanismList * 参数: * page 页数 注意page默认从 0 开始 * id 接口3的id * 示例:http://127.0.0.1:3000/api/json/mechanismList?id=82&page=1 */ router.get('/mechanismList', async (req, res, next) => { var id = req.query.id; var page = req.query.page; let $ = await utils.get(config.jigouList(id, page)); var result = { current_page: Number(page), // 当前页数 // 该分类有多少页 total_page: 1, // 当页的数据 data: [] }; result.total_page = totalPage($) $(".hezi ul li").each(function (i, el) { result.data.push({ id: parseInt($(this).find("a").attr("href").split("?id=")[1]), total: parseInt($(this).find(".shuliang").text()), source: '', user: clearText($(this).find("p").eq(2).text()), tags: [], title: $(this).find(".biaoti a").text(), preview: returnUrl($(this).find("a img").attr("src")), }); $(this).find("p").eq(1).find("a").each(function (index, ele) { result.data[i].tags.push({ title: $(this).text(), id: parseInt($(this).attr("href").split("?id=")[1]) }) }) }); res.json({ status: 200, msg: '请求成功', result: result }) }) // ================ 推荐分类 接口 ====================== /** * 【已修改,正常】5:获取写真分类列表 【页面完成】 * 接口地址:http://127.0.0.1:3000/api/json/class */ router.get('/class', async (req, res, next) => { console.log(config.BaseUrl); let $ = await utils.get(config.BaseUrl); var result = { // 默认菜单 principal: [], // 可选菜单 additional: [ { id: 40, title: '萝莉控', page: 1 }, { id: 104, title: '白丝诱惑', page: 1 }, { id: 189, title: '双马尾', page: 1 }, { id: 20, title: '护士制服', page: 1 }, { id: 207, title: '丝足诱惑', page: 1 }, { id: 27, title: '性感女仆装', page: 1 }, { id: 50, title: '湿身诱惑', page: 1 }, { id: 62, title: '御姐控', page: 1 }, { id: 68, title: '古典气质', page: 1 }, { id: 69, title: '旗袍美女', page: 1 }, { id: 70, title: '人体艺术', page: 1 }, { id: 43, title: '福利图片', page: 1 }, { id: 75, title: '性感浴室', page: 1 }, { id: 78, title: '性感网袜', page: 1 }, { id: 81, title: '阳光少女', page: 1 }, { id: 82, title: '居家私房', page: 1 }, { id: 89, title: '巨乳波霸', page: 1 }, { id: 110, title: '性感豹纹', page: 1 }, { id: 100, title: '日本女明星', page: 1 }, { id: 112, title: '空姐制服', page: 1 }, { id: 114, title: 'SM镣铐', page: 1 }, { id: 121, title: '粉嫩少女', page: 1 }, { id: 122, title: '教师制服', page: 1 }, { id: 123, title: '美女警察', page: 1 }, { id: 145, title: '床上美女', page: 1 }, { id: 147, title: 'OL制服', page: 1 }, { id: 130, title: '姐妹花', page: 1 }, { id: 131, title: '性感健身', page: 1 }, { id: 125, title: '美厨娘', page: 1 }, { id: 128, title: '情趣皮衣', page: 1 }, { id: 134, title: '透视诱惑', page: 1 }, { id: 146, title: '美女秘书', page: 1 }, { id: 157, title: '西装美女', page: 1 }, { id: 184, title: '黑长直', page: 1 }, { id: 190, title: '老照片美女', page: 1 }, { id: 191, title: '肉感美女', page: 1 }, { id: 192, title: '学生装美女', page: 1 }, { id: 194, title: '写真杂志', page: 1 }, { id: 195, title: '欧美巨乳', page: 1 }, { id: 196, title: '金发美女', page: 1 }, { id: 197, title: '欧美熟妇', page: 1 }, { id: 199, title: '欧美制服', page: 1 }, { id: 201, title: '黑人美女', page: 1 }, { id: 202, title: '巨乳肥臀', page: 1 }, { id: 203, title: '长靴美女', page: 1 }, { id: 204, title: '丝袜美臀', page: 1 }, { id: 206, title: '美臀少妇', page: 1 }, { id: 228, title: '美女制服诱惑', page: 1 }, { id: 211, title: '不知火舞COS', page: 1 }, { id: 212, title: '性感女郎', page: 1 }, { id: 213, title: '丝袜女郎', page: 1 }, { id: 214, title: '轻熟女写真集', page: 1 }, { id: 215, title: '比基尼少女', page: 1 }, { id: 216, title: '日本比基尼', page: 1 }, { id: 217, title: '中国比基尼', page: 1 }, { id: 219, title: '风骚诱惑', page: 1 }, { id: 220, title: '风骚少妇', page: 1 }, { id: 221, title: '丰满少妇', page: 1 }, { id: 222, title: '丝袜少妇', page: 1 }, { id: 224, title: '黑丝美腿', page: 1 }, { id: 225, title: '黑丝制服', page: 1 }, { id: 226, title: '街拍黑丝', page: 1 }, { id: 227, title: '日本巨乳AV女优', page: 1 }, { id: 229, title: '蕾丝诱惑', page: 1 }, { id: 231, title: '半裸尤物', page: 1 }, { id: 232, title: '勾魂尤物', page: 1 }, { id: 233, title: '丝袜肥臀', page: 1 }, { id: 235, title: '街拍美腿', page: 1 }, { id: 236, title: '巨乳萝莉', page: 1 }, { id: 237, title: '丝袜制服', page: 1 }, { id: 238, title: '街拍短裙', page: 1 }, { id: 239, title: '丝袜短裙', page: 1 }, { id: 240, title: '丝袜人体艺术', page: 1 }, { id: 242, title: '性感丰满', page: 1 }, { id: 243, title: '街拍丝袜', page: 1 }, { id: 244, title: '超短迷你裙', page: 1 }, { id: 245, title: '开背毛衣', page: 1 }, { id: 247, title: '性感香车', page: 1 }, { id: 248, title: '吊带美女', page: 1 }, { id: 249, title: '极品美丝', page: 1 }, { id: 250, title: '眼镜娘', page: 1 }, { id: 251, title: '极品女友', page: 1 }, { id: 53, title: '大胸嫩模', page: 1 }, { id: 73, title: '情趣内衣', page: 1 }, { id: 254, title: '白领丽人', page: 1 }, { id: 255, title: '美女故事', page: 1 }, { id: 256, title: '极品抹胸', page: 1 }, { id: 257, title: '情趣制服', page: 1 }, { id: 258, title: '肉丝高跟', page: 1 }, { id: 259, title: '黑丝袜诱惑', page: 1 }, { id: 113, title: '婚纱美女', page: 1 }, { id: 108, title: '丽柜美束系列', page: 1 }, ] }; $(".layui-tab-content .layui-tab-item").eq(1).find(".tags>a").each(function (index) { // if (index < 10) { result.additional.unshift({ id: parseInt($(this).attr("href").split("?id=")[1]), title: $(this).text(), page: 1 }) // } }) result.principal.unshift({ id: 18, title: '热裤', page: 1 }) result.principal.unshift({ id: 127, title: '紧身裤', page: 1 }) result.principal.unshift({ id: 64, title: '丁字裤', page: 1 }) result.principal.unshift({ id: 10, title: '办公室', page: 1 }) result.principal.unshift({ id: 253, title: '黑丝萝莉', page: 1 }) result.principal.unshift({ id: 46, title: '翘臀', page: 1 }) result.principal.unshift({ id: 124, title: 'JK制服', page: 1 }) result.principal.unshift({ id: 12, title: '长筒袜', page: 1 }) result.principal.unshift({ id: 67, title: '捆绑绳艺', page: 1 }) result.principal.unshift({ id: 65, title: '街拍', page: 1 }) result.principal.unshift({ id: 252, title: '白丝萝莉', page: 1 }) result.principal.unshift({ id: 36, title: 'COSPLAY', page: 1 }) result.principal.unshift({ id: 48, title: '猫女郎', page: 1 }) // 【必看】模特列表:https://www.tujigu.com/s/85/ // 网红美女、网红模特写真 https://www.tujigu.com/s/116/ // 日本AV女优写真 https://www.tujigu.com/s/159/ // B罩杯美女 https://www.tujigu.com/s/170/ 171 172 173 174 175 176 177 178 179 res.json({ status: 200, msg: '请求成功', result: result }) }) /** * 【已修改,正常】6:进入分类的详情列表,获取该分类下有多少套图,用在接口5上 * 接口地址:http://127.0.0.1:3000/api/json/classList * 参数: * page 页数 注意page默认从 1 开始 * id 代入的接口4 id 或者 接口1 的tags id * 示例:http://127.0.0.1:3000/api/json/classList?id=124&page=1 */ router.get('/classList', async (req, res, next) => { var id = req.query.id; var page = req.query.page; let $ = await utils.get(config.ClassList(id, page)); var result = { current_page: Number(page), // 当前页数 // 该分类有多少页 total_page: 1, // 当页的数据 data: [] }; result.total_page = totalPage($) $(".hezi ul li").each(function (i, el) { result.data.push({ id: parseInt($(this).find("a").attr("href").split("?id=")[1]), total: parseInt($(this).find(".shuliang").text()), source: clearText(`来源机构:${$(this).find("p").eq(0).find("a").text()}`), user: clearText($(this).find("p").eq(2).text()), tags: [], title: $(this).find(".biaoti a").text(), preview: returnUrl($(this).find("a img").attr("src")), }); $(this).find("p").eq(1).find("a").each(function (index, ele) { result.data[i].tags.push({ title: $(this).text(), id: parseInt($(this).attr("href").split("?id=")[1]) }) }) }); res.json({ status: 200, msg: '请求成功', result: result }) }) // ================ 模特相关 接口 ====================== /** * 【已修改,正常】7:获取所有模特 * 接口地址:http://127.0.0.1:3000/api/json/allModel * 示例:http://127.0.0.1:3000/api/json/allModel */ router.get('/allModel', async (req, res, next) => { let $ = await utils.get(`${config.AgentUrl}&c=Renwu&a=index`); res.json({ status: 200, msg: '请求成功', result: $.data }) }); /** * 【已修改,正常】8:进入模特的个人套图页,可用于 接口1 的 model * 接口地址:http://127.0.0.1:3000/api/json/modelList * 参数: * page 页数 注意page默认从 1 开始 * id 从首页带过来的 id参数 * 示例:http://127.0.0.1:3000/api/json/modelList?id=3265&page=1 */ router.get('/modelList', async (req, res, next) => { var id = req.query.id; var page = req.query.page; let promise1 = await utils.get(`${config.AgentUrl}&c=Renwu&a=detail&id=${id}`); let promise2 = await utils.get(`${config.AgentUrl}&c=Renwu&a=tulist&id=${id}&p=${page}`); console.log("pr1: ", `${config.AgentUrl}&c=Renwu&a=detail&id=${id}`) console.log("pr2: ", `${config.AgentUrl}&c=Renwu&a=tulist&id=${id}&p=${page}`) var result = { current_page: Number(page), total_page: 1, model_info: { portrait: 0, name: 0, explain: 0 }, data: [] } Promise.all([promise1, promise2]).then((values) => { result.total_page = Number(values[1].data.total) result.data = values[1].data.list result.model_info.portrait = values[0].data.img_src result.model_info.name = values[0].data.title result.model_info.explain = values[0].data.des res.json({ status: 200, msg: '请求成功', result: result }) }); }) // ================ 搜索 接口 ====================== /** *【已修改,正常】9:根据关键词搜索写真接口 * 接口地址:http://127.0.0.1:3000/api/json/search * 参数: * keyword 搜索关键词 * 示例:http://127.0.0.1:3000/api/json/search?keyword=jk&page=1 */ router.get('/search', async (req, res, next) => { var keyword = req.query.keyword; var page = req.query.page; let $ = await utils.get(`${config.AgentUrl}&c=Search&a=Tuji&key=${encodeURIComponent(keyword)}&p=${page}`) res.json({ status: 200, msg: '请求成功', result: $.data }) }) /** * 10: 破解有防盗链的图片地址 * 接口地址:http://127.0.0.1:3000/api/json/url * 参数: * url 图片地址 * 示例:http://127.0.0.1:3000/api/json/url?url=https://lns.hywly.com/a/1/24510/0.jpg */ router.get('/url', async (req, res, next) => { const http = require('https'); const URL = require('url'); var url = URL.parse(req.query.url); var option = { hostname: url.hostname, path: url.path, rejectUnauthorized: false, headers: { "Referer": config.BaseUrl } }; http.get(option, function (response) { var chunks = []; response.on('data', function (chunk) { chunks.push(chunk); }).on('end', function () { // 保存图片ArrayBuffer 数据 var buffer = Buffer.concat(chunks); // 设置前端请求头 res.set(response.headers) // 两次二进制转换 res.end(buffer.toString("binary"), 'binary') }); }); }); function totalPage($) { var total_page = 0; $("#pages a").each(function () { if ($(this).text().includes("末页")) { total_page = Number($(this).attr("href").split("&page=")[1]) } }); return total_page; } function returnUrl(url) { isA = false; return isA ? url : config.CrackUrl + url } function clearText(text) { return text.replace(/\ +/g, "").replace(/[\r\n]/g, "");; } module.exports = router;