freeok.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. /*
  2. * @File : freeok.js
  3. * @Author : jade
  4. * @Date : 2024/1/19 10:26
  5. * @Email : jadehh@1ive.com
  6. * @Software : Samples
  7. * @Desc : OK资源网 已失效
  8. */
  9. import {_} from '../lib/cat.js';
  10. import {VodDetail, VodShort} from "../lib/vod.js"
  11. import * as Utils from "../lib/utils.js";
  12. import {Spider} from "./spider.js";
  13. import {player} from "../lib/freeok_setttings.js";
  14. const OCR_API = 'https://api.nn.ci/ocr/b64/text';//ocr在线识别接口
  15. class OkSpider extends Spider {
  16. constructor() {
  17. super();
  18. this.siteUrl = "https://www.freeok.vip"
  19. }
  20. getName() {
  21. return `🆗┃OK资源网┃🆗`
  22. }
  23. getAppName() {
  24. return `OK资源网`
  25. }
  26. getJSName() {
  27. return "freeok"
  28. }
  29. getType() {
  30. return 3
  31. }
  32. async init(cfg) {
  33. this.cookie = await this.load_cache()
  34. await super.init(cfg);
  35. }
  36. async parseVodShortListFromDoc($) {
  37. let vod_list = []
  38. let vodElements = $($("[class=\"module\"]")).find("a").slice(0, 12)
  39. for (const vodElement of vodElements) {
  40. vod_list.push(this.parseVodShortFromElement($, vodElement))
  41. }
  42. return vod_list
  43. }
  44. parseVodShortFromElement($, element) {
  45. let vodShort = new VodShort();
  46. vodShort.vod_name = element.attribs["title"]
  47. vodShort.vod_id = element.attribs["href"]
  48. vodShort.vod_remarks = $($(element).find("[class=\"module-item-note\"]")).text()
  49. vodShort.vod_pic = $(element).find("[class=\"lazy lazyload\"]")[0].attribs["data-original"]
  50. return vodShort
  51. }
  52. async parseVodShortListFromDocByCategory($) {
  53. let vod_list = []
  54. let itemElements = $($("[class=\"module-items module-poster-items-base \"]")).find("a")
  55. for (const itemElement of itemElements) {
  56. vod_list.push(this.parseVodShortFromElement($, itemElement))
  57. }
  58. return vod_list
  59. }
  60. async parseVodShortListFromJson(obj) {
  61. let vod_list = []
  62. for (const result of obj["Data"]["result"]){
  63. let vodShort = new VodShort()
  64. vodShort.vod_id = result["vod_url"].replaceAll(this.siteUrl,"")
  65. vodShort.vod_pic = result["vod_pic"]
  66. vodShort.vod_name = result["vod_name"]
  67. vod_list.push(vodShort)
  68. }
  69. return vod_list
  70. }
  71. async parseVodShortListFromDocByHot($) {
  72. let vod_list = []
  73. let itemElement = $($("[class=\"module-items module-card-items\"]"))[0]
  74. let titleElements = $(itemElement).find("[class=\"module-card-item-title\"]").find("a")
  75. let infoElements = $(itemElement).find("[class=\"module-card-item-info\"]")
  76. let picElements = $(itemElement).find("[class=\"module-item-pic\"]").find("img")
  77. for (let i = 0; i < titleElements.length; i++) {
  78. let vodShort = new VodShort();
  79. vodShort.vod_id = titleElements[i].attribs["href"]
  80. vodShort.vod_name = $(titleElements[i]).text()
  81. vodShort.vod_pic = picElements[i].attribs["data-original"]
  82. vodShort.vod_remarks = $($(infoElements[i])).text().split("\n")[5]
  83. vod_list.push(vodShort)
  84. }
  85. return vod_list
  86. }
  87. async parseVodDetailFromDoc($) {
  88. let vodDetail = new VodDetail();
  89. let moudleElements = $("[class=\"module-info-tag-link\"]").find("a")
  90. let mobilePlay = $("[class=\"module-mobile-play\"]").find("a")[0]
  91. vodDetail.vod_name = mobilePlay.attribs["title"].replaceAll("立刻播放", "")
  92. vodDetail.vod_content = $($("[class=\"module-info-introduction-content\"]")).text().replaceAll("\n", "").replaceAll(" ", "")
  93. let type_list = []
  94. for (const moudleElement of moudleElements.slice(2)) {
  95. type_list.push($(moudleElement).text())
  96. }
  97. vodDetail.type_name = type_list.join("/")
  98. vodDetail.vod_year = $(moudleElements[0]).text()
  99. vodDetail.vod_area = $(moudleElements[1]).text()
  100. let itemElements = $("[class=\"module-info-item\"]")
  101. let itemText = ""
  102. for (const itemElement of itemElements) {
  103. itemText = itemText + $(itemElement).text().replaceAll("\n", "").replaceAll(":", ":") + "\n"
  104. }
  105. vodDetail.vod_pic = $("[class=\"module-item-pic\"]").find("img")[0].attribs["data-original"]
  106. vodDetail.vod_director = Utils.getStrByRegex(/导演:(.*?)\n/, itemText)
  107. vodDetail.vod_actor = Utils.getStrByRegex(/主演:(.*?)\n/, itemText)
  108. vodDetail.vod_year = Utils.getStrByRegex(/上映:(.*?)\n/, itemText)
  109. vodDetail.vod_remarks = Utils.getStrByRegex(/备注:(.*?)\n/, itemText)
  110. if (_.isEmpty(vodDetail.vod_remarks)) {
  111. vodDetail.vod_remarks = Utils.getStrByRegex(/集数:(.*?)\n/, itemText)
  112. }
  113. let playElements = $($("[class=\"module-tab-items-box hisSwiper\"]")).find("span")
  114. let play_from_list = []
  115. let playUrlElements = $("[class=\"module-list sort-list tab-list his-tab-list\"]")
  116. let play_url_list = []
  117. for (let i = 0; i < playElements.length; i++) {
  118. let text = $(playElements[i]).text()
  119. if (text.indexOf("夸克") === -1) {
  120. let playDetailElements = $(playUrlElements[i]).find("a")
  121. let vodItems = []
  122. for (const playDetailElement of playDetailElements) {
  123. let play_name = playDetailElement.attribs["title"].replaceAll("播放", "").replaceAll(vodDetail.vod_name, "")
  124. let play_url = playDetailElement.attribs["href"]
  125. vodItems.push(`${play_name}$${play_url}`)
  126. }
  127. play_url_list.push(vodItems.join("#"))
  128. play_from_list.push($(playElements[i]).text())
  129. }
  130. }
  131. vodDetail.vod_play_from = play_from_list.join("$$$")
  132. vodDetail.vod_play_url = play_url_list.join("$$$")
  133. return vodDetail
  134. }
  135. async setClasses() {
  136. let $ = await this.getHtml(this.siteUrl, this.getHeader())
  137. let navElements = $($("[class=\"navbar-items swiper-wrapper\"]")).find("a")
  138. let type_name = $(navElements.slice(0, 8).slice(-1)[0]).text().replaceAll("\n", "")
  139. let type_id = navElements.slice(0, 8).slice(-1)[0].attribs["href"]
  140. this.classes.push({"type_name": type_name, "type_id": type_id})
  141. for (const navElement of navElements.slice(0, 8)) {
  142. let type_name = $(navElement).text().replaceAll("\n", "")
  143. if (type_name !== "首页" && type_name !== "热榜") {
  144. let type_id = navElement.attribs["href"].split("/").slice(-1)[0].split(".")[0]
  145. this.classes.push({"type_name": type_name, "type_id": type_id})
  146. }
  147. }
  148. }
  149. async getFilter($) {
  150. let titleElements = $("[class=\"module-item-title\"]")
  151. let boxElements = $("[class=\"module-item-box\"]")
  152. let extend_list = []
  153. let type_id_dic = {"类型": 1, "剧情": 4, "地区": 2, "语言": 5, "年份": 12, "排序": 3}
  154. for (let i = 0; i < titleElements.length; i++) {
  155. let extend_dic = {"key": (i + 1).toString(), "name": $(titleElements[i]).text(), "value": []}
  156. let typeElements = $(boxElements[i]).find("a")
  157. for (let j = 0; j < typeElements.length; j++) {
  158. let type_name = $(typeElements[j]).text()
  159. let type_id = decodeURIComponent(typeElements[j].attribs["href"].split("-")[type_id_dic[$(titleElements[i]).text()]]).replaceAll(".html", "")
  160. extend_dic["value"].push({"n": type_name, "v": $(titleElements[i]).text() + "-" + type_id})
  161. }
  162. extend_list.push(extend_dic)
  163. }
  164. return extend_list;
  165. }
  166. async setFilterObj() {
  167. for (const class_dic of this.classes) {
  168. if (class_dic["type_name"] !== "最近更新" && class_dic["type_name"] !== "热榜") {
  169. let cateUrl = this.siteUrl + `/vod-show/${class_dic["type_id"]}--------1---.html`
  170. let $ = await this.getHtml(cateUrl, this.getHeader())
  171. this.filterObj[class_dic["type_id"]] = await this.getFilter($)
  172. }
  173. }
  174. }
  175. async setHomeVod() {
  176. let $ = await this.getHtml(this.siteUrl, this.getHeader())
  177. this.homeVodList = await this.parseVodShortListFromDoc($)
  178. }
  179. getCateUrl(tid, pg, extend) {
  180. let value_list = Object.values(extend)
  181. let type_id_dic = {"类型": 1, "剧情": 3, "地区": 1, "语言": 4, "年份": 11, "排序": 2}
  182. let urlParams = [tid.toString(), "", "","","", "", "", "", "", "", "",""]
  183. urlParams[8] = pg.toString()
  184. for (const value of value_list) {
  185. if (value.split("-")[0] === "类型") {
  186. urlParams[0] = value.split("-")[1].split("show/")[1].toString()
  187. } else {
  188. let type_index = type_id_dic[value.split("-")[0]]
  189. urlParams[type_index] = value.split("-")[1]
  190. }
  191. }
  192. return this.siteUrl + `/vod-show/` + urlParams.join("-") + ".html"
  193. }
  194. async setCategory(tid, pg, filter, extend) {
  195. let cateUrl
  196. if (tid.indexOf(".html") > -1) {
  197. cateUrl = this.siteUrl + tid
  198. let $ = await this.getHtml(cateUrl, this.getHeader());
  199. this.vodList = await this.parseVodShortListFromDocByHot($)
  200. } else {
  201. cateUrl = this.getCateUrl(tid, pg, extend)
  202. let $ = await this.getHtml(cateUrl, this.getHeader());
  203. this.vodList = await this.parseVodShortListFromDocByCategory($)
  204. }
  205. }
  206. async setSearch(wd, quick) {
  207. let url = `http://123.207.150.253/zxapi/public/?service=App.F.Fetch&req_p=${wd}&type=okys`
  208. let content = await this.fetch(url,null,this.getHeader())
  209. this.vodList = await this.parseVodShortListFromJson(JSON.parse(content))
  210. }
  211. async refreshCookie() {
  212. let passUrl = this.siteUrl + "/index.php/verify/index.html?"
  213. let passHtml = await this.fetch(passUrl,null,this.getHeader(),false,true)
  214. let response2 = await this.post(OCR_API,passHtml["content"],this.getHeader())
  215. this.cookie = Utils.getStrByRegex(/(.*?);/,passHtml["cookie"])
  216. let verifyUrl = this.siteUrl + "/index.php/ajax/verify_check?type=search&verify=5286"
  217. let headers = this.getHeader()
  218. headers["cookie"] = this.cookie
  219. let response = await this.post(verifyUrl,null,headers)
  220. await this.write_cache()
  221. }
  222. async load_cache() {
  223. try {
  224. return await local.get("freeok_cookie", "cookie")
  225. } catch (e) {
  226. return ""
  227. }
  228. }
  229. async write_cache() {
  230. await local.set("freeok_cookie", "cookie", JSON.stringify(this.cookie))
  231. }
  232. async setDetail(id) {
  233. let $ = await this.getHtml(this.siteUrl + id, this.getHeader())
  234. this.vodDetail = await this.parseVodDetailFromDoc($)
  235. }
  236. async setPlay(flag, id, flags) {
  237. let $ = await this.getHtml(this.siteUrl + id, this.getHeader())
  238. const js = JSON.parse($('script:contains(player_)').html().replace('var player_aaaa=', ''));
  239. let url = this.siteUrl + "/okplayer/"
  240. let params = {
  241. "url": decodeURIComponent(js.url), "next": decodeURIComponent(js.url_next), "title": js.vod_data.vod_name
  242. }
  243. let playHtml = await this.fetch(url, params, this.getHeader());
  244. let view_port_id = Utils.getStrByRegex(/<meta name="viewport"(.*?)>/, playHtml).split("id=\"")[1].replaceAll("now_", "")
  245. let player_id = Utils.getStrByRegex(/meta charset="UTF-8" id="(.*?)">/, playHtml).replaceAll("now_", "")
  246. let player_url = Utils.getStrByRegex(/"url": "(.*?)",/, playHtml)
  247. this.playUrl = player(player_url, view_port_id, player_id)
  248. }
  249. }
  250. let spider = new OkSpider()
  251. async function init(cfg) {
  252. await spider.init(cfg)
  253. }
  254. async function home(filter) {
  255. return await spider.home(filter)
  256. }
  257. async function homeVod() {
  258. return await spider.homeVod()
  259. }
  260. async function category(tid, pg, filter, extend) {
  261. return await spider.category(tid, pg, filter, extend)
  262. }
  263. async function detail(id) {
  264. return await spider.detail(id)
  265. }
  266. async function play(flag, id, flags) {
  267. return await spider.play(flag, id, flags)
  268. }
  269. async function search(wd, quick) {
  270. return await spider.search(wd, quick)
  271. }
  272. async function proxy(segments, headers) {
  273. return await spider.proxy(segments, headers)
  274. }
  275. export function __jsEvalReturn() {
  276. return {
  277. init: init,
  278. home: home,
  279. homeVod: homeVod,
  280. category: category,
  281. detail: detail,
  282. play: play,
  283. proxy: proxy,
  284. search: search,
  285. };
  286. }
  287. export {spider}