123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- // 网站搜索异常
- import { load, _ } from './lib/cat.js';
- let key = '爱上你听书网';
- let HOST = 'https://wap.230ts.net';
- let siteKey = '';
- let siteType = 0;
- const MOBILE_UA = 'Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36';
- async function request(reqUrl, agentSp) {
- let res = await req(reqUrl, {
- method: 'get',
- headers: {
- 'User-Agent': agentSp || MOBILE_UA,
- 'Referer': HOST
- },
- });
- return res.content;
- }
- // cfg = {skey: siteKey, ext: extend}
- async function init(cfg) {
- siteKey = cfg.skey;
- siteType = cfg.stype;
- }
- async function home(filter) {
- const html = await request(HOST + '/sort/');
- const $ = load(html);
- let filterObj = {};
- const class_parse = $('dl.pd-class:first > dd > a[href*=sort]');
- let classes = [];
- classes = _.map(class_parse, (cls) => {
- let typeId = cls.attribs['href'];
- typeId = typeId.replace(/.*?\/sort\/(.*).html/g, '$1');
- return {
- type_id: typeId,
- type_name: cls.children[0].data,
- };
- });
- const sortName = ['玄幻有声', '灵异有声', '综艺娱乐', '长篇评书', '都市有声', '军事有声', '职场有声', '其他有声'];
- classes = _.sortBy(classes, (c) => {
- const index = sortName.indexOf(c.type_name);
- return index === -1 ? sortName.length : index;
- });
- return JSON.stringify({
- class: classes,
- filters: filterObj,
- });
- }
- async function homeVod() {
- const link = HOST + '/top/lastupdate/1.html';
- const html = await request(link);
- const $ = load(html);
- const items = $('ul.list-ul > li');
- let videos = _.map(items, (item) => {
- const it = $(item).find('a:first')[0];
- const img = $(item).find('img:first')[0];
- const remarks = $($(item).find('p.module-slide-author')[0]).text().trim();
- return {
- vod_id: it.attribs.href.replace(/.*?\/tingshu\/(.*)/g, '$1'),
- vod_name: it.attribs.title.replace('有声小说',''),
- vod_pic: HOST + img.attribs['data-original'],
- vod_remarks: remarks || '',
- };
- });
- return JSON.stringify({
- list: videos,
- });
- }
- async function category(tid, pg, filter, extend) {
- if (pg <= 0) pg = 1;
- const link = HOST + '/sort/' + tid +'/' + (`${pg}`) + '.html';
- const html = await request(link);
- const $ = load(html);
- const items = $('ul.book-ol > li');
- let videos = _.map(items, (item) => {
- const it = $(item).find('a:first')[0];
- const img = $(item).find('img:first')[0];
- const remarks = $($(item).find('div.book-meta')[0]).text().trim();
- return {
- vod_id: it.attribs.href.replace(/.*?\/tingshu\/(.*)/g, '$1'),
- vod_name: it.attribs.title.replace('有声小说',''),
- vod_pic: HOST + img.attribs['data-original'],
- vod_remarks: remarks.replace('佚名(著)','').replace('佚名(播)','').replace('未知(著)','').replace('未知(播)','') || '',
- };
- });
- const hasMore = $('div.paging > a:contains(下一页)').length > 0;
- const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
- return JSON.stringify({
- page: parseInt(pg),
- pagecount: pgCount,
- limit: 24,
- total: 24 * pgCount,
- list: videos,
- });
- }
- async function detail(id) {
- const html = await request(HOST + '/tingshu/' + id);
- const $ = load(html);
- const detail = $('div.book-cell:first > div');
- let vod = {
- vod_id: id,
- vod_name: $('h1:first').text().trim().replace('有声小说',''),
- vod_pic: HOST + $('div.myui-content__thumb img:first').attr('data-original'),
- vod_content: $('div.ellipsis').text().trim(),
- };
- for (const info of detail) {
- const i = $(info).text().trim();
- if (i.startsWith('类型:')) {
- vod.vod_type = _.map($(info).find('a'), (a) => {
- return a.children[0].data;
- }).join('/');
- } else if (i.startsWith('作者:')) {
- vod.vod_director = _.map($(info).find('a'), (a) => {
- return a.children[0].data;
- }).join('/');
- } else if (i.startsWith('演播:')) {
- vod.vod_actor = _.map($(info).find('a'), (a) => {
- return a.children[0].data;
- }).join('/');
- } else if (i.startsWith('连载中')) {
- vod.vod_remarks = i.substring(3);
- }
- }
- const playlist = _.map($('#playlist > ul > li > a'), (it) => {
- return it.children[0].data + '$' + it.attribs.href.replace(/\/mp3\/(.*).html/g, '$1');
- });
- vod.vod_play_from = '道长在线';
- vod.vod_play_url = playlist.join('#');
- return JSON.stringify({
- list: [vod],
- });
- }
- async function play(flag, id, flags) {
- const link = HOST + '/mp3/' + id + '.html';
- const html = await request(link);
- const $ = load(html);
- const iframe = $('body iframe[src*=player]');
- const iframeHtml = (
- await req(HOST + iframe[0].attribs.src, {
- headers: {
- 'Referer': link,
- 'User-Agent': MOBILE_UA,
- },
- })
- ).content;
- const playUrl = iframeHtml.match(/mp3:'(.*?)'/)[1];
- if (playUrl.indexOf('m4a') >= 0 || playUrl.indexOf('mp3') >= 0 ) {
- return JSON.stringify({
- parse: 0,
- url: playUrl,
- });
- } else {
- try {
- const iframeHtml = (
- await req(HOST + iframe[0].attribs.src, {
- headers: {
- 'Referer': link,
- 'User-Agent': MOBILE_UA,
- },
- })
- ).content;
- const playUrl = playUrl + '.m4a' + iframeHtml.match(/(\?.*?)'/)[1];
- if (playUrl.indexOf('http') >= 0) {
- return JSON.stringify({
- parse: 0,
- url: playUrl,
- });
- } else {
- const iframeHtml = (
- await req(HOST + iframe[0].attribs.src, {
- headers: {
- 'Referer': link,
- 'User-Agent': MOBILE_UA,
- },
- })
- ).content;
- const playUrl2 = iframeHtml.match(/url[\s\S]*?(http.*?)'/)[1];
- if (playUrl2.indexOf('\?') >= 0) {
- return JSON.stringify({
- parse: 0,
- url: playUrl2,
- });
- } else {
- const playUrl3 = playUrl2 + playUrl
- return JSON.stringify({
- parse: 0,
- url: playUrl3,
- });
- }
- }
- } catch (e) {}
- if (playUrl.indexOf('http') >= 0) {
- const playUrl = playUrl + '.m4a';
- return JSON.stringify({
- parse: 0,
- url: playUrl,
- });
- } else {
- const iframeHtml = (
- await req(HOST + iframe[0].attribs.src, {
- headers: {
- 'Referer': link,
- 'User-Agent': MOBILE_UA,
- },
- })
- ).content;
- const playUrl4 = iframeHtml.match(/url[\s\S]*?(http.*?)'/)[1];
- return JSON.stringify({
- parse: 0,
- url: playUrl4 + '.m4a',
- });
- }
- }
- }
- async function search(wd, quick) {
- const link = HOST + '/search.html?searchtype=name&searchword=' + wd +'&page=1';
- const html = await request(link);
- const $ = load(html);
- const items = $('ul.book-ol > li');
- let videos = _.map(items, (item) => {
- const it = $(item).find('a:first')[0];
- const img = $(item).find('img:first')[0];
- const remarks = $($(item).find('div.book-meta')[0]).text().trim();
- return {
- vod_id: it.attribs.href.replace(/.*?\/tingshu\/(.*)/g, '$1'),
- vod_name: it.attribs.title.replace('有声小说',''),
- vod_pic: img.attribs['data-original'],
- vod_remarks: remarks.replace('佚名(著)','').replace('佚名(播)','').replace('未知(著)','').replace('未知(播)','') || '',
- };
- });
- return JSON.stringify({
- list: videos,
- });
- }
- export function __jsEvalReturn() {
- return {
- init: init,
- home: home,
- homeVod: homeVod,
- category: category,
- detail: detail,
- play: play,
- search: search,
- };
- }
|