py_jinpai.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. # -*- coding: utf-8 -*-
  2. # @Author : Doubebly
  3. # @Time : 2025/1/20 01:47
  4. import sys
  5. import hashlib
  6. import time
  7. import requests
  8. import re
  9. import json
  10. sys.path.append('..')
  11. from base.spider import Spider
  12. class Spider(Spider):
  13. def getName(self):
  14. return "JinPai"
  15. def init(self, extend):
  16. self.home_url = 'https://www.cfkj86.com'
  17. self.ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
  18. def getDependence(self):
  19. return []
  20. def isVideoFormat(self, url):
  21. pass
  22. def manualVideoCheck(self):
  23. pass
  24. def homeContent(self, filter):
  25. return {
  26. 'class': [{'type_id': '1', 'type_name': '电影'},
  27. {'type_id': '2', 'type_name': '电视剧'},
  28. {'type_id': '3', 'type_name': '综艺'},
  29. {'type_id': '4', 'type_name': '动漫'}],
  30. 'filters': {
  31. '1': [
  32. {'key': 'type',
  33. 'name': '类型',
  34. 'value': [{'n': '全部', 'v': ''},
  35. {'n': '喜剧', 'v': '/type/22'},
  36. {'n': '动作', 'v': '/type/23'},
  37. {'n': '科幻', 'v': '/type/30'},
  38. {'n': '爱情', 'v': '/type/26'},
  39. {'n': '悬疑', 'v': '/type/27'},
  40. {'n': '奇幻', 'v': '/type/87'},
  41. {'n': '剧情', 'v': '/type/37'},
  42. {'n': '恐怖', 'v': '/type/36'},
  43. {'n': '犯罪', 'v': '/type/35'},
  44. {'n': '动画', 'v': '/type/33'},
  45. {'n': '惊悚', 'v': '/type/34'},
  46. {'n': '战争', 'v': '/type/25'},
  47. {'n': '冒险', 'v': '/type/31'},
  48. {'n': '灾难', 'v': '/type/81'},
  49. {'n': '伦理', 'v': '/type/83'},
  50. {'n': '其他', 'v': '/type/43'}]},
  51. {'key': 'area',
  52. 'name': '地区',
  53. 'value': [{'n': '全部', 'v': ''},
  54. {'n': '中国大陆', 'v': '/area/中国大陆'},
  55. {'n': '中国香港', 'v': '/area/中国香港'},
  56. {'n': '中国台湾', 'v': '/area/中国台湾'},
  57. {'n': '美国', 'v': '/area/美国'},
  58. {'n': '日本', 'v': '/area/日本'},
  59. {'n': '韩国', 'v': '/area/韩国'},
  60. {'n': '印度', 'v': '/area/印度'},
  61. {'n': '泰国', 'v': '/area/泰国'},
  62. {'n': '其他', 'v': '/area/其他'}]},
  63. {'key': 'year',
  64. 'name': '年份',
  65. 'value': [{'n': '全部', 'v': ''},
  66. {'n': '2024', 'v': '/year/2024'},
  67. {'n': '2023', 'v': '/year/2023'},
  68. {'n': '2022', 'v': '/year/2022'},
  69. {'n': '2021', 'v': '/year/2021'},
  70. {'n': '2020', 'v': '/year/2020'},
  71. {'n': '2019', 'v': '/year/2019'},
  72. {'n': '2018', 'v': '/year/2018'},
  73. {'n': '2017', 'v': '/year/2017'},
  74. {'n': '2016', 'v': '/year/2016'},
  75. {'n': '2015', 'v': '/year/2015'},
  76. {'n': '2014', 'v': '/year/2014'},
  77. {'n': '2013', 'v': '/year/2013'},
  78. {'n': '2012', 'v': '/year/2012'},
  79. {'n': '2011', 'v': '/year/2011'},
  80. {'n': '2010', 'v': '/year/2010'},
  81. {'n': '2009~2000', 'v': '/year/2009~2000'}]},
  82. {'key': 'lang',
  83. 'name': '语言',
  84. 'value': [{'n': '全部', 'v': ''},
  85. {'n': '国语', 'v': '/lang/国语'},
  86. {'n': '英语', 'v': '/lang/英语'},
  87. {'n': '粤语', 'v': '/lang/粤语'},
  88. {'n': '韩语', 'v': '/lang/韩语'},
  89. {'n': '日语', 'v': '/lang/日语'},
  90. {'n': '其他', 'v': '/lang/其他'}]},
  91. {'key': 'by',
  92. 'name': '排序',
  93. 'value': [{'n': '上映时间', 'v': '/sortType/1/sortOrder/0'},
  94. {'n': '人气高低', 'v': '/sortType/3/sortOrder/0'},
  95. {'n': '评分高低', 'v': '/sortType/4/sortOrder/0'}]}
  96. ],
  97. '2': [
  98. {'key': 'type',
  99. 'name': '类型',
  100. 'value': [{'n': '全部', 'v': ''},
  101. {'n': '国产剧', 'v': '/type/14'},
  102. {'n': '欧美剧', 'v': '/type/15'},
  103. {'n': '港台剧', 'v': '/type/16'},
  104. {'n': '日韩剧', 'v': '/type/62'},
  105. {'n': '其他剧', 'v': '/type/68'}]},
  106. {'key': 'class',
  107. 'name': '剧情',
  108. 'value': [{'n': '全部', 'v': ''},
  109. {'n': '古装', 'v': '/class/古装'},
  110. {'n': '战争', 'v': '/class/战争'},
  111. {'n': '喜剧', 'v': '/class/喜剧'},
  112. {'n': '家庭', 'v': '/class/家庭'},
  113. {'n': '犯罪', 'v': '/class/犯罪'},
  114. {'n': '动作', 'v': '/class/动作'},
  115. {'n': '奇幻', 'v': '/class/奇幻'},
  116. {'n': '剧情', 'v': '/class/剧情'},
  117. {'n': '历史', 'v': '/class/历史'},
  118. {'n': '短片', 'v': '/class/短片'}]},
  119. {'key': 'area',
  120. 'name': '地区',
  121. 'value': [{'n': '全部', 'v': ''},
  122. {'n': '中国大陆', 'v': '/area/中国大陆'},
  123. {'n': '中国香港', 'v': '/area/中国香港'},
  124. {'n': '中国台湾', 'v': '/area/中国台湾'},
  125. {'n': '日本', 'v': '/area/日本'},
  126. {'n': '韩国', 'v': '/area/韩国'},
  127. {'n': '美国', 'v': '/area/美国'},
  128. {'n': '泰国', 'v': '/area/泰国'},
  129. {'n': '其他', 'v': '/area/其他'}]},
  130. {'key': 'year',
  131. 'name': '时间',
  132. 'value': [{'n': '全部', 'v': ''},
  133. {'n': '2024', 'v': '/year/2024'},
  134. {'n': '2023', 'v': '/year/2023'},
  135. {'n': '2022', 'v': '/year/2022'},
  136. {'n': '2021', 'v': '/year/2021'},
  137. {'n': '2020', 'v': '/year/2020'},
  138. {'n': '2019', 'v': '/year/2019'},
  139. {'n': '2018', 'v': '/year/2018'},
  140. {'n': '2017', 'v': '/year/2017'},
  141. {'n': '2016', 'v': '/year/2016'},
  142. {'n': '2015', 'v': '/year/2015'},
  143. {'n': '2014', 'v': '/year/2014'},
  144. {'n': '2013', 'v': '/year/2013'},
  145. {'n': '2012', 'v': '/year/2012'},
  146. {'n': '2011', 'v': '/year/2011'},
  147. {'n': '2010', 'v': '/year/2010'}]},
  148. {'key': 'lang',
  149. 'name': '语言',
  150. 'value': [{'n': '全部', 'v': ''},
  151. {'n': '普通话', 'v': '/lang/普通话'},
  152. {'n': '英语', 'v': '/lang/英语'},
  153. {'n': '粤语', 'v': '/lang/粤语'},
  154. {'n': '韩语', 'v': '/lang/韩语'},
  155. {'n': '日语', 'v': '/lang/日语'},
  156. {'n': '泰语', 'v': '/lang/泰语'},
  157. {'n': '其他', 'v': '/lang/其他'}, ]},
  158. {'key': 'by',
  159. 'name': '排序',
  160. 'value': [{'n': '最近更新', 'v': '/sortType/1/sortOrder/0'},
  161. {'n': '添加时间', 'v': '/sortType/2/sortOrder/0'},
  162. {'n': '人气高低', 'v': '/sortType/3/sortOrder/0'},
  163. {'n': '评分高低', 'v': '/sortType/4/sortOrder/0'}]}
  164. ],
  165. '3': [
  166. {'key': 'type',
  167. 'name': '类型',
  168. 'value': [{'n': '全部', 'v': ''},
  169. {'n': '国产综艺', 'v': '/type/69'},
  170. {'n': '港台综艺', 'v': '/type/70'},
  171. {'n': '日韩综艺', 'v': '/type/72'},
  172. {'n': '欧美综艺', 'v': '/type/73'}]},
  173. {'key': 'class',
  174. 'name': '剧情',
  175. 'value': [{'n': '全部', 'v': ''},
  176. {'n': '真人秀', 'v': '/class/真人秀'},
  177. {'n': '音乐', 'v': '/class/音乐'},
  178. {'n': '脱口秀', 'v': '/class/脱口秀'}]},
  179. {'key': 'area',
  180. 'name': '地区',
  181. 'value': [{'n': '全部', 'v': ''},
  182. {'n': '中国大陆', 'v': '/area/中国大陆'},
  183. {'n': '中国香港', 'v': '/area/中国香港'},
  184. {'n': '中国台湾', 'v': '/area/中国台湾'},
  185. {'n': '日本', 'v': '/area/日本'},
  186. {'n': '韩国', 'v': '/area/韩国'},
  187. {'n': '美国', 'v': '/area/美国'},
  188. {'n': '其他', 'v': '/area/其他'}]},
  189. {'key': 'year',
  190. 'name': '时间',
  191. 'value': [{'n': '全部', 'v': ''},
  192. {'n': '2024', 'v': '/year/2024'},
  193. {'n': '2023', 'v': '/year/2023'},
  194. {'n': '2022', 'v': '/year/2022'},
  195. {'n': '2021', 'v': '/year/2021'},
  196. {'n': '2020', 'v': '/year/2020'}]},
  197. {'key': 'lang',
  198. 'name': '语言',
  199. 'value': [{'n': '全部', 'v': ''},
  200. {'n': '国语', 'v': '/lang/国语'},
  201. {'n': '英语', 'v': '/lang/英语'},
  202. {'n': '粤语', 'v': '/lang/粤语'},
  203. {'n': '韩语', 'v': '/lang/韩语'},
  204. {'n': '日语', 'v': '/lang/日语'},
  205. {'n': '其他', 'v': '/lang/其他'}, ]},
  206. {'key': 'by',
  207. 'name': '排序',
  208. 'value': [{'n': '最近更新', 'v': '/sortType/1/sortOrder/0'},
  209. {'n': '添加时间', 'v': '/sortType/2/sortOrder/0'},
  210. {'n': '人气高低', 'v': '/sortType/3/sortOrder/0'},
  211. {'n': '评分高低', 'v': '/sortType/4/sortOrder/0'}]}
  212. ],
  213. '4': [
  214. {'key': 'type',
  215. 'name': '类型',
  216. 'value': [{'n': '全部', 'v': ''},
  217. {'n': '国产动漫', 'v': '/type/75'},
  218. {'n': '日韩动漫', 'v': '/type/76'},
  219. {'n': '欧美动漫', 'v': '/type/77'}]},
  220. {'key': 'class',
  221. 'name': '剧情',
  222. 'value': [{'n': '全部', 'v': ''},
  223. {'n': '喜剧', 'v': '/class/喜剧'},
  224. {'n': '科幻', 'v': '/class/科幻'},
  225. {'n': '热血', 'v': '/class/热血'},
  226. {'n': '冒险', 'v': '/class/冒险'},
  227. {'n': '动作', 'v': '/class/动作'},
  228. {'n': '运动', 'v': '/class/运动'},
  229. {'n': '战争', 'v': '/class/战争'},
  230. {'n': '儿童', 'v': '/class/儿童'}]},
  231. {'key': 'area',
  232. 'name': '地区',
  233. 'value': [{'n': '全部', 'v': ''},
  234. {'n': '中国大陆', 'v': '/area/中国大陆'},
  235. {'n': '日本', 'v': '/area/日本'},
  236. {'n': '美国', 'v': '/area/美国'},
  237. {'n': '其他', 'v': '/area/其他'}]},
  238. {'key': 'year',
  239. 'name': '时间',
  240. 'value': [{'n': '全部', 'v': ''},
  241. {'n': '2024', 'v': '/year/2024'},
  242. {'n': '2023', 'v': '/year/2023'},
  243. {'n': '2022', 'v': '/year/2022'},
  244. {'n': '2021', 'v': '/year/2021'},
  245. {'n': '2020', 'v': '/year/2020'},
  246. {'n': '2019', 'v': '/year/2019'},
  247. {'n': '2018', 'v': '/year/2018'},
  248. {'n': '2017', 'v': '/year/2017'},
  249. {'n': '2016', 'v': '/year/2016'},
  250. {'n': '2015', 'v': '/year/2015'},
  251. {'n': '2014', 'v': '/year/2014'},
  252. {'n': '2013', 'v': '/year/2013'},
  253. {'n': '2012', 'v': '/year/2012'},
  254. {'n': '2011', 'v': '/year/2011'},
  255. {'n': '2010', 'v': '/year/2010'}]},
  256. {'key': 'lang',
  257. 'name': '语言',
  258. 'value': [{'n': '全部', 'v': ''},
  259. {'n': '国语', 'v': '/lang/国语'},
  260. {'n': '英语', 'v': '/lang/英语'},
  261. {'n': '日语', 'v': '/lang/日语'},
  262. {'n': '其他', 'v': '/lang/其他'}]},
  263. {'key': 'by',
  264. 'name': '排序',
  265. 'value': [{'n': '最近更新', 'v': '/sortType/1/sortOrder/0'},
  266. {'n': '添加时间', 'v': '/sortType/2/sortOrder/0'},
  267. {'n': '人气高低', 'v': '/sortType/3/sortOrder/0'},
  268. {'n': '评分高低', 'v': '/sortType/4/sortOrder/0'}]}
  269. ]
  270. }
  271. }
  272. def homeVideoContent(self):
  273. video_list = []
  274. t = str(int(time.time() * 1000))
  275. # t = '1723292093234'
  276. data = f'key=cb808529bae6b6be45ecfab29a4889bc&t={t}'
  277. data_md5 = hashlib.md5(data.encode()).hexdigest()
  278. data_sha1 = hashlib.sha1(data_md5.encode()).hexdigest()
  279. h = {
  280. "User-Agent": self.ua,
  281. 'referer': self.home_url, 't': t, 'sign': data_sha1}
  282. try:
  283. res = requests.get(f'{self.home_url}/api/mw-movie/anonymous/home/hotSearch', headers=h)
  284. data_list = res.json()['data']
  285. for i in data_list:
  286. video_list.append(
  287. {
  288. 'vod_id': i['vodId'],
  289. 'vod_name': i['vodName'],
  290. 'vod_pic': i['vodPic'],
  291. 'vod_remarks': i['vodVersion'] if i['typeId1'] == 1 else i['vodRemarks']
  292. }
  293. )
  294. except requests.RequestException as e:
  295. return {
  296. 'list': [],
  297. 'parse': 0,
  298. 'jx': 0
  299. }
  300. return {
  301. 'list': video_list,
  302. 'parse': 0,
  303. 'jx': 0
  304. }
  305. def categoryContent(self, cid, page, filter, ext):
  306. t = cid
  307. _type = ext.get('type') if ext.get('type') else ''
  308. __class = ext.get('class') if ext.get('class') else ''
  309. _area = ext.get('area') if ext.get('area') else ''
  310. _year = ext.get('year') if ext.get('year') else ''
  311. _lang = ext.get('lang') if ext.get('lang') else ''
  312. _by = ext.get('by') if ext.get('by') else ''
  313. video_list = []
  314. h = {
  315. "User-Agent": self.ua,
  316. 'referer': self.home_url,
  317. }
  318. try:
  319. res = requests.get(
  320. f'{self.home_url}/vod/show/id/{t}{_type}{__class}{_area}{_year}{_lang}{_by}/page/{page}',
  321. headers=h)
  322. aa = re.findall(r'\\"list\\":(.*?)}}}]', res.text)
  323. if not aa:
  324. return {'list': [], 'parse': 0, 'jx': 0}
  325. bb = aa[0].replace('\\"', '"')
  326. data_list = json.loads(bb)
  327. for i in data_list:
  328. video_list.append(
  329. {
  330. 'vod_id': i['vodId'],
  331. 'vod_name': i['vodName'],
  332. 'vod_pic': i['vodPic'],
  333. 'vod_remarks': i['vodVersion'] if i['typeId1'] == 1 else i['vodRemarks']
  334. }
  335. )
  336. except requests.RequestException as e:
  337. return {'list': [], 'msg': e}
  338. return {'list': video_list, 'parse': 0, 'jx': 0}
  339. def detailContent(self, did):
  340. ids = did[0]
  341. video_list = []
  342. t = str(int(time.time() * 1000))
  343. # t = '1723292093234'
  344. data = f'id={ids}&key=cb808529bae6b6be45ecfab29a4889bc&t={t}'
  345. data_md5 = hashlib.md5(data.encode()).hexdigest()
  346. data_sha1 = hashlib.sha1(data_md5.encode()).hexdigest()
  347. h = {
  348. "User-Agent": self.ua,
  349. 'referer': self.home_url,
  350. 't': t, 'sign': data_sha1
  351. }
  352. try:
  353. res = requests.get(f'{self.home_url}/api/mw-movie/anonymous/video/detail?id={ids}', headers=h)
  354. data = res.json()['data']
  355. play_list = data['episodeList']
  356. vod_play_url = []
  357. for i in play_list:
  358. name = i['name']
  359. url = ids + '/' + str(i['nid'])
  360. vod_play_url.append(name + '$' + url)
  361. video_list.append(
  362. {
  363. 'type_name': data['typeName'],
  364. 'vod_id': ids,
  365. 'vod_name': data['vodName'],
  366. 'vod_remarks': data['vodRemarks'],
  367. 'vod_year': data['vodYear'],
  368. 'vod_area': data['vodArea'],
  369. 'vod_actor': data['vodActor'],
  370. 'vod_director': data['vodDirector'],
  371. 'vod_content': data['vodContent'],
  372. 'vod_play_from': '官方线路',
  373. 'vod_play_url': '#'.join(vod_play_url)
  374. }
  375. )
  376. except requests.RequestException as e:
  377. return {'list': [], 'msg': e}
  378. return {"list": video_list, 'parse': 0, 'jx': 0}
  379. def searchContent(self, key, quick, page='1'):
  380. wd = key
  381. video_list = []
  382. t = str(int(time.time() * 1000))
  383. data = f'keyword={wd}&pageNum={page}&pageSize=12&key=cb808529bae6b6be45ecfab29a4889bc&t={t}'
  384. data_md5 = hashlib.md5(data.encode()).hexdigest()
  385. data_sha1 = hashlib.sha1(data_md5.encode()).hexdigest()
  386. h = {
  387. "User-Agent": self.ua,
  388. 'referer': self.home_url,
  389. 't': t, 'sign': data_sha1
  390. }
  391. try:
  392. response = requests.get(
  393. f'{self.home_url}/api/mw-movie/anonymous/video/searchByWord?keyword={wd}&pageNum={page}&pageSize=12',
  394. headers=h,
  395. )
  396. data_list = response.json()['data']['result']['list']
  397. for i in data_list:
  398. video_list.append(
  399. {
  400. 'vod_id': i['vodId'],
  401. 'vod_name': i['vodName'],
  402. 'vod_pic': i['vodPic'],
  403. 'vod_remarks': i['vodVersion'] if i['typeId1'] == 1 else i['vodRemarks']
  404. }
  405. )
  406. except requests.RequestException as e:
  407. return {'list': [], 'msg': e}
  408. return {'list': video_list, 'parse': 0, 'jx': 0}
  409. def playerContent(self, flag, pid, vipFlags):
  410. # https://www.cfkj86.com/api/mw-movie/anonymous/v1/video/episode/url?id=83882&nid=175817
  411. url = pid
  412. play_url = 'https://gitee.com/dobebly/my_img/raw/c1977fa6134aefb8e5a34dabd731a4d186c84a4d/x.mp4'
  413. data = url.split('/')
  414. _id = data[0]
  415. _nid = data[1]
  416. t = str(int(time.time() * 1000))
  417. # t = '1723292093234'
  418. data = f'id={_id}&nid={_nid}&key=cb808529bae6b6be45ecfab29a4889bc&t={t}'
  419. data_md5 = hashlib.md5(data.encode()).hexdigest()
  420. data_sha1 = hashlib.sha1(data_md5.encode()).hexdigest()
  421. h = {
  422. "User-Agent": self.ua,
  423. 'referer': self.home_url,
  424. 't': t, 'sign': data_sha1
  425. }
  426. h2 = {
  427. "User-Agent": self.ua,
  428. }
  429. try:
  430. res = requests.get(
  431. f'{self.home_url}/api/mw-movie/anonymous/v1/video/episode/url?id={_id}&nid={_nid}',
  432. headers=h)
  433. play_url = res.json()['data']['playUrl']
  434. except requests.RequestException as e:
  435. print(e)
  436. return {"url": play_url, "header": h2, "parse": 0, "jx": 0}
  437. return {"url": play_url, "header": h2, "parse": 0, "jx": 0}
  438. def localProxy(self, params):
  439. pass
  440. def destroy(self):
  441. return '正在Destroy'