ikanbot.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. /*
  2. * @File : ikanbot.js
  3. * @Author : jade
  4. * @Date : 2024/1/15 10:32
  5. * @Email : jadehh@1ive.com
  6. * @Software : Samples
  7. * @Desc :
  8. */
  9. import {Spider} from "./spider.js";
  10. import {load, _} from "../lib/cat.js";
  11. import {VodDetail, VodShort} from "../lib/vod.js";
  12. import * as Utils from "../lib/utils.js";
  13. function _0xf746(_0xbb40c4, _0x1cb776) {
  14. const _0x45e084 = _0x45e0();
  15. return _0xf746 = function (_0xf74696, _0x4d32af) {
  16. _0xf74696 = _0xf74696 - 0x1a8;
  17. let _0xcbfa28 = _0x45e084[_0xf74696];
  18. return _0xcbfa28;
  19. }, _0xf746(_0xbb40c4, _0x1cb776);
  20. }
  21. function _0x45e0() {
  22. const _0x58b10c = ['1580630GngmmA', '117uvwflw', 'join', 'current_id', '565448Apkhig', '23092JwmytW', '707152yowhOv', 'getElementById', '855936CGaczt', 'length', '2966831GCGpvn', '611266nfcTEf', 'value', 'substring'];
  23. _0x45e0 = function () {
  24. return _0x58b10c;
  25. };
  26. return _0x45e0();
  27. }
  28. (function (_0x27923d, _0x43d7fc) {
  29. const _0x439396 = _0xf746, _0x30f164 = _0x27923d();
  30. while (!![]) {
  31. try {
  32. const _0xa560eb = -parseInt(_0x439396(0x1b4)) / 0x1 + parseInt(_0x439396(0x1ad)) / 0x2 + -parseInt(_0x439396(0x1b1)) / 0x3 * (-parseInt(_0x439396(0x1b5)) / 0x4) + -parseInt(_0x439396(0x1b0)) / 0x5 + parseInt(_0x439396(0x1aa)) / 0x6 + parseInt(_0x439396(0x1ac)) / 0x7 + parseInt(_0x439396(0x1a8)) / 0x8;
  33. if (_0xa560eb === _0x43d7fc) break; else _0x30f164['push'](_0x30f164['shift']());
  34. } catch (_0x3ae316) {
  35. _0x30f164['push'](_0x30f164['shift']());
  36. }
  37. }
  38. }(_0x45e0, 0x4a3d9));
  39. function get_tks(play_id, e_token) {
  40. const _0xf07220 = _0xf746;
  41. let _0x35162d = play_id, _0xf25678 = e_token;
  42. if (!_0x35162d || !_0xf25678) return;
  43. let _0x3882a3 = _0x35162d['length'], _0x52a097 = _0x35162d[_0xf07220(0x1af)](_0x3882a3 - 0x4, _0x3882a3),
  44. _0x2d9d1b = [];
  45. for (let _0x570711 = 0x0; _0x570711 < _0x52a097[_0xf07220(0x1ab)]; _0x570711++) {
  46. let _0x23e537 = parseInt(_0x52a097[_0x570711]), _0x48b93d = _0x23e537 % 0x3 + 0x1;
  47. _0x2d9d1b[_0x570711] = _0xf25678[_0xf07220(0x1af)](_0x48b93d, _0x48b93d + 0x8), _0xf25678 = _0xf25678[_0xf07220(0x1af)](_0x48b93d + 0x8, _0xf25678[_0xf07220(0x1ab)]);
  48. }
  49. return _0x2d9d1b[_0xf07220(0x1b2)]('');
  50. }
  51. class IKanBotSpider extends Spider {
  52. constructor() {
  53. super();
  54. this.siteUrl = "https://v.aikanbot.com"
  55. }
  56. getName() {
  57. return "🤖┃爱看机器人┃🤖"
  58. }
  59. getAppName() {
  60. return "爱看机器人"
  61. }
  62. getJSName() {
  63. return "ikanbot"
  64. }
  65. getType() {
  66. return 3
  67. }
  68. async spiderInit(inReq = null) {
  69. if (inReq !== null) {
  70. this.jsBase = await js2Proxy(inReq, "img", this.getHeader());
  71. } else {
  72. this.jsBase = await js2Proxy(true, this.siteType, this.siteKey, 'img/', this.getHeader());
  73. }
  74. }
  75. async init(cfg) {
  76. await super.init(cfg);
  77. await this.spiderInit(null)
  78. }
  79. async parseVodShortListFromDoc($) {
  80. let vod_list = [];
  81. let VodShortElements = $($("[class=\"row list-wp\"]")).find("a")
  82. for (const vodShortElement of VodShortElements) {
  83. let vodShort = new VodShort()
  84. let reElement = $(vodShortElement).find("img")[0]
  85. vodShort.vod_id = vodShortElement.attribs["href"]
  86. vodShort.vod_pic = this.jsBase + Utils.base64Encode(reElement.attribs["data-src"])
  87. vodShort.vod_name = reElement.attribs["alt"]
  88. vod_list.push(vodShort)
  89. }
  90. return vod_list
  91. }
  92. getChildren(detail, index) {
  93. try {
  94. return detail[index].children[0].data;
  95. } catch (e) {
  96. return ""
  97. }
  98. }
  99. async parseVodDetailFromDoc($) {
  100. const detail = $('div.detail > .meta');
  101. let vodDetail = new VodDetail();
  102. vodDetail.vod_pic = this.jsBase + Utils.base64Encode($('div.item-root > img')[0].attribs['data-src'])
  103. vodDetail.vod_name = this.getChildren(detail, 0)
  104. vodDetail.vod_year = this.getChildren(detail, 1)
  105. vodDetail.vod_area = this.getChildren(detail, 3);
  106. vodDetail.vod_actor = this.getChildren(detail, 4);
  107. let id = Utils.getStrByRegex(/<input type="hidden" id="current_id" value="(.*?)"/, $.html())
  108. let token = Utils.getStrByRegex(/<input type="hidden" id="e_token" value="(.*?)"/, $.html())
  109. let mtype = Utils.getStrByRegex(/<input type="hidden" id="mtype" value="(.*?)"/, $.html())
  110. let params = {
  111. "videoId": id, "mtype": mtype, "token": get_tks(id, token),
  112. }
  113. let content = await this.fetch(this.siteUrl + '/api/getResN', params, this.getHeader())
  114. const list = JSON.parse(content)["data"]["list"];
  115. let playlist = {};
  116. let index = 0
  117. let form_list = []
  118. for (const l of list) {
  119. const flagData = JSON.parse(l["resData"]);
  120. for (const f of flagData) {
  121. index = index + 1
  122. const from = f.flag;
  123. const urls = f.url;
  124. if (!from || !urls) continue;
  125. if (playlist[from]) continue;
  126. form_list.push(`线路${index}`)
  127. playlist[from] = urls;
  128. }
  129. }
  130. vodDetail.vod_play_from = form_list.join('$$$');
  131. vodDetail.vod_play_url = _.values(playlist).join('$$$');
  132. return vodDetail
  133. }
  134. async parseVodShortListFromDocBySearch($) {
  135. let vod_list = []
  136. const items = $('div.media > div.media-left > a');
  137. for (const item of items) {
  138. let vodShort = new VodShort();
  139. const img = $(item).find('img:first')[0];
  140. vodShort.vod_id = item.attribs.href
  141. vodShort.vod_name = img.attribs.alt
  142. vodShort.vod_pic = this.jsBase + Utils.base64Encode(img.attribs['data-src'])
  143. vod_list.push(vodShort)
  144. }
  145. return vod_list
  146. }
  147. async setClasses() {
  148. let html = await this.fetch(this.siteUrl + "/category", null, this.getHeader())
  149. if (!_.isEmpty(html)) {
  150. let $ = load(html)
  151. let classElements = $($($("[class=\"row visible-xs-block visible-sm-block\"]")).find("li")).find("a")
  152. for (const classElement of classElements) {
  153. this.classes.push({"type_name": $(classElement).text(), "type_id": classElement.attribs["href"]})
  154. }
  155. }
  156. }
  157. async setFilterObj() {
  158. for (const class_dic of this.classes.slice(1, 9)) {
  159. let type_id = class_dic["type_id"]
  160. if (type_id.indexOf("category") === -1 || type_id.indexOf(",") > -1) {
  161. let type_url = type_id.split(",").slice(-1)[0]
  162. let html = await this.fetch(this.siteUrl + type_url, null, this.getHeader())
  163. if (!_.isEmpty(html)) {
  164. let $ = load(html)
  165. let containerElement = $("[class=\"row visible-xs-block visible-sm-block\"]")
  166. let filterElements = containerElement.find("[class=\"nav nav-pills\"]").find("a")
  167. let value_list = []
  168. if (type_id.indexOf(",") > -1) {
  169. value_list.push({"n": "全部", "v": type_id.split(",")[0]})
  170. }
  171. let extend_dic = {
  172. "key": type_id, "name": $(containerElement.find("h5")).text(), "value": value_list
  173. }
  174. for (const filterElement of filterElements) {
  175. value_list.push({"n": $(filterElement).text(), "v": filterElement.attribs["href"]})
  176. }
  177. if (value_list.length > 0) {
  178. this.filterObj[type_id] = [extend_dic]
  179. }
  180. }
  181. }
  182. }
  183. }
  184. async setHomeVod() {
  185. let html = await this.fetch(this.siteUrl, null, this.getHeader())
  186. if (!_.isEmpty(html)) {
  187. let $ = load(html)
  188. this.homeVodList = await this.parseVodShortListFromDoc($)
  189. }
  190. }
  191. async setCategory(tid, pg, filter, extend) {
  192. let categoryUrl = (this.siteUrl + (extend[tid] || tid.split(",")[0]))
  193. let update_page = false
  194. if (categoryUrl.indexOf("html") > -1) {
  195. categoryUrl = categoryUrl.replace('.html', pg > 1 ? `-p-${pg}.html` : '.html');
  196. } else {
  197. categoryUrl = categoryUrl + `?p=${pg}`
  198. update_page = true
  199. }
  200. await this.jadeLog.debug(`分类URL:${categoryUrl}`)
  201. let html = await this.fetch(categoryUrl, null, this.getHeader())
  202. if (!_.isEmpty(html)) {
  203. let $ = load(html)
  204. this.vodList = await this.parseVodShortListFromDoc($)
  205. let pageDoc = $('div.page-more > a:contains(下一页)')
  206. if (update_page) {
  207. this.page = parseInt(pageDoc[0].attribs["href"].split("p=")[1])
  208. }
  209. const hasMore = pageDoc.length > 0;
  210. this.limit = 24
  211. this.count = hasMore ? parseInt(pg) + 1 : parseInt(pg);
  212. this.total = this.limit * this.count
  213. }
  214. }
  215. async setDetail(id) {
  216. let html = await this.fetch(this.siteUrl + id, null, this.getHeader())
  217. if (!_.isEmpty(html)) {
  218. let $ = load(html);
  219. this.vodDetail = await this.parseVodDetailFromDoc($)
  220. }
  221. }
  222. async setSearch(wd, quick) {
  223. const html = await this.fetch(this.siteUrl + '/search?q=' + wd, null, this.getHeader());
  224. if (!_.isEmpty(html)) {
  225. let $ = load(html)
  226. this.vodList = await this.parseVodShortListFromDocBySearch($)
  227. }
  228. }
  229. async setPlay(flag, id, flags) {
  230. this.playUrl = id
  231. }
  232. }
  233. let spider = new IKanBotSpider()
  234. async function init(cfg) {
  235. await spider.init(cfg)
  236. }
  237. async function home(filter) {
  238. return await spider.home(filter)
  239. }
  240. async function homeVod() {
  241. return await spider.homeVod()
  242. }
  243. async function category(tid, pg, filter, extend) {
  244. return await spider.category(tid, pg, filter, extend)
  245. }
  246. async function detail(id) {
  247. return await spider.detail(id)
  248. }
  249. async function play(flag, id, flags) {
  250. return await spider.play(flag, id, flags)
  251. }
  252. async function search(wd, quick) {
  253. return await spider.search(wd, quick)
  254. }
  255. async function proxy(segments, headers) {
  256. return await spider.proxy(segments, headers)
  257. }
  258. export function __jsEvalReturn() {
  259. return {
  260. init: init,
  261. home: home,
  262. homeVod: homeVod,
  263. category: category,
  264. detail: detail,
  265. play: play,
  266. proxy: proxy,
  267. search: search,
  268. };
  269. }
  270. export {spider}