py_动漫.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. # -*- coding: utf-8 -*-
  2. # @Author : Doubebly
  3. # @Time : 2024/7/19 22:20
  4. # @Function:
  5. import sys
  6. import requests
  7. import json
  8. import base64
  9. from lxml import etree
  10. import re
  11. sys.path.append('..')
  12. from base.spider import Spider
  13. class Spider(Spider):
  14. def getName(self):
  15. return "DM84"
  16. def init(self, extend):
  17. pass
  18. def destroy(self):
  19. pass
  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': [{'key': 'type',
  32. 'name': '类型',
  33. 'value': [{'n': '全部', 'v': ''},
  34. {'n': '奇幻', 'v': '奇幻'},
  35. {'n': '战斗', 'v': '战斗'},
  36. {'n': '玄幻', 'v': '玄幻'},
  37. {'n': '穿越', 'v': '穿越'},
  38. {'n': '科幻', 'v': '科幻'},
  39. {'n': '武侠', 'v': '武侠'},
  40. {'n': '热血', 'v': '热血'},
  41. {'n': '耽美', 'v': '耽美'},
  42. {'n': '搞笑', 'v': '搞笑'},
  43. {'n': '动态漫画', 'v': '动态漫画'}]},
  44. {'key': 'year',
  45. 'name': '时间',
  46. 'value': [{'n': '全部', 'v': ''},
  47. {'n': '2024', 'v': '2024'},
  48. {'n': '2023', 'v': '2023'},
  49. {'n': '2022', 'v': '2022'},
  50. {'n': '2021', 'v': '2021'},
  51. {'n': '2020', 'v': '2020'},
  52. {'n': '2019', 'v': '2019'},
  53. {'n': '2018', 'v': '2018'},
  54. {'n': '2017', 'v': '2017'},
  55. {'n': '2016', 'v': '2016'},
  56. {'n': '2015', 'v': '2015'}]},
  57. {'key': 'by',
  58. 'name': '排序',
  59. 'value': [{'n': '按时间', 'v': 'time'},
  60. {'n': '按人气', 'v': 'hits'},
  61. {'n': '按评分', 'v': 'score'}]}],
  62. '2': [{'key': 'type',
  63. 'name': '类型',
  64. 'value': [{'n': '全部', 'v': ''},
  65. {'n': '冒险', 'v': '冒险'},
  66. {'n': '奇幻', 'v': '奇幻'},
  67. {'n': '战斗', 'v': '战斗'},
  68. {'n': '后宫', 'v': '后宫'},
  69. {'n': '热血', 'v': '热血'},
  70. {'n': '励志', 'v': '励志'},
  71. {'n': '搞笑', 'v': '搞笑'},
  72. {'n': '校园', 'v': '校园'},
  73. {'n': '机战', 'v': '机战'},
  74. {'n': '悬疑', 'v': '悬疑'},
  75. {'n': '治愈', 'v': '治愈'},
  76. {'n': '百合', 'v': '百合'},
  77. {'n': '恐怖', 'v': '恐怖'},
  78. {'n': '泡面番', 'v': '泡面番'},
  79. {'n': '恋爱', 'v': '恋爱'},
  80. {'n': '推理', 'v': '推理'}]},
  81. {'key': 'year',
  82. 'name': '时间',
  83. 'value': [{'n': '全部', 'v': ''},
  84. {'n': '2024', 'v': '2024'},
  85. {'n': '2023', 'v': '2023'},
  86. {'n': '2022', 'v': '2022'},
  87. {'n': '2021', 'v': '2021'},
  88. {'n': '2020', 'v': '2020'},
  89. {'n': '2019', 'v': '2019'},
  90. {'n': '2018', 'v': '2018'},
  91. {'n': '2017', 'v': '2017'},
  92. {'n': '2016', 'v': '2016'},
  93. {'n': '2015', 'v': '2015'}]},
  94. {'key': 'by',
  95. 'name': '排序',
  96. 'value': [{'n': '按时间', 'v': 'time'},
  97. {'n': '按人气', 'v': 'hits'},
  98. {'n': '按评分', 'v': 'score'}]}],
  99. '3': [{'key': 'type',
  100. 'name': '类型',
  101. 'value': [{'n': '全部', 'v': ''},
  102. {'n': '科幻', 'v': '科幻'},
  103. {'n': '冒险', 'v': '冒险'},
  104. {'n': '战斗', 'v': '战斗'},
  105. {'n': '百合', 'v': '百合'},
  106. {'n': '奇幻', 'v': '奇幻'},
  107. {'n': '热血', 'v': '热血'},
  108. {'n': '搞笑', 'v': '搞笑'}]},
  109. {'key': 'year',
  110. 'name': '时间',
  111. 'value': [{'n': '全部', 'v': ''},
  112. {'n': '2024', 'v': '2024'},
  113. {'n': '2023', 'v': '2023'},
  114. {'n': '2022', 'v': '2022'},
  115. {'n': '2021', 'v': '2021'},
  116. {'n': '2020', 'v': '2020'},
  117. {'n': '2019', 'v': '2019'},
  118. {'n': '2018', 'v': '2018'},
  119. {'n': '2017', 'v': '2017'},
  120. {'n': '2016', 'v': '2016'},
  121. {'n': '2015', 'v': '2015'}]},
  122. {'key': 'by',
  123. 'name': '排序',
  124. 'value': [{'n': '按时间', 'v': 'time'},
  125. {'n': '按人气', 'v': 'hits'},
  126. {'n': '按评分', 'v': 'score'}]}],
  127. '4': [{'key': 'type',
  128. 'name': '类型',
  129. 'value': [{'n': '全部', 'v': ''},
  130. {'n': '搞笑', 'v': '搞笑'},
  131. {'n': '奇幻', 'v': '奇幻'},
  132. {'n': '治愈', 'v': '治愈'},
  133. {'n': '科幻', 'v': '科幻'},
  134. {'n': '喜剧', 'v': '喜剧'},
  135. {'n': '冒险', 'v': '冒险'},
  136. {'n': '动作', 'v': '动作'},
  137. {'n': '爱情', 'v': '爱情'}]},
  138. {'key': 'year',
  139. 'name': '时间',
  140. 'value': [{'n': '全部', 'v': ''},
  141. {'n': '2024', 'v': '2024'},
  142. {'n': '2023', 'v': '2023'},
  143. {'n': '2022', 'v': '2022'},
  144. {'n': '2021', 'v': '2021'},
  145. {'n': '2020', 'v': '2020'},
  146. {'n': '2019', 'v': '2019'},
  147. {'n': '2018', 'v': '2018'},
  148. {'n': '2017', 'v': '2017'},
  149. {'n': '2016', 'v': '2016'},
  150. {'n': '2015', 'v': '2015'}]},
  151. {'key': 'by',
  152. 'name': '排序',
  153. 'value': [{'n': '按时间', 'v': 'time'},
  154. {'n': '按人气', 'v': 'hits'},
  155. {'n': '按评分', 'v': 'score'}]}]
  156. }
  157. }
  158. def homeVideoContent(self):
  159. video_list = []
  160. try:
  161. res = requests.get('https://dm84.org')
  162. root = etree.HTML(res.text)
  163. data_list = root.xpath('//li/div[@class="item"]')
  164. print(len(data_list))
  165. for i in data_list:
  166. video_list.append(
  167. {
  168. 'vod_id': i.xpath('./a[2]/@href')[0].split('/')[-1].split('.')[0],
  169. 'vod_name': i.xpath('./a[2]/@title')[0],
  170. 'vod_pic': i.xpath('./a[1]/@data-bg')[0],
  171. 'vod_remarks': i.xpath('./span/text()')[0]
  172. }
  173. )
  174. except requests.RequestException as e:
  175. return {'list': [], 'msg': e}
  176. return {'list': video_list}
  177. def categoryContent(self, cid, page, filter, ext):
  178. _by = ''
  179. _type = ''
  180. _year = ''
  181. if ext.get('by'):
  182. _by = ext.get('by')
  183. if ext.get('type'):
  184. _type = ext.get('type')
  185. if ext.get('year'):
  186. _type = ext.get('year')
  187. video_list = []
  188. try:
  189. res = requests.get(f'https://dm84.org/show-{cid}--{_by}-{_type}--{_year}-{page}.html')
  190. root = etree.HTML(res.text)
  191. data_list = root.xpath('//li/div[@class="item"]')
  192. print(len(data_list))
  193. for i in data_list:
  194. video_list.append(
  195. {
  196. 'vod_id': i.xpath('./a[2]/@href')[0].split('/')[-1].split('.')[0],
  197. 'vod_name': i.xpath('./a[2]/@title')[0],
  198. 'vod_pic': i.xpath('./a[1]/@data-bg')[0],
  199. 'vod_remarks': i.xpath('./span/text()')[0]
  200. }
  201. )
  202. except requests.RequestException as e:
  203. return {'list': [], 'msg': e}
  204. return {'list': video_list}
  205. def detailContent(self, did):
  206. video_list = []
  207. try:
  208. res = requests.get(f'https://dm84.org/v/{did[0]}.html')
  209. root = etree.HTML(res.text)
  210. vod_play_from = '$$$'.join(root.xpath('//ul[contains(@class, "play_from")]/li/text()'))
  211. play_list = root.xpath('//ul[contains(@class, "play_list")]')
  212. vod_play_url = []
  213. for i in play_list:
  214. name_list = i.xpath('./li/a/text()')
  215. url_list = i.xpath('./li/a/@href')
  216. vod_play_url.append(
  217. '#'.join([_name + '$' + _url for _name, _url in zip(name_list, url_list)])
  218. )
  219. video_list.append(
  220. {
  221. 'type_name': '',
  222. 'vod_id': did[0],
  223. 'vod_name': '',
  224. 'vod_remarks': '',
  225. 'vod_year': '',
  226. 'vod_area': '',
  227. 'vod_actor': '',
  228. 'vod_director': '沐辰_为爱发电',
  229. 'vod_content': '',
  230. 'vod_play_from': vod_play_from,
  231. 'vod_play_url': '$$$'.join(vod_play_url)
  232. }
  233. )
  234. except requests.RequestException as e:
  235. return {'list': [], 'msg': e}
  236. return {"list": video_list}
  237. def searchContent(self, key, quick):
  238. return self.searchContentPage(key, quick, '1')
  239. def searchContentPage(self, keywords, quick, page):
  240. video_list = []
  241. try:
  242. res = requests.get(f'https://dm84.org/s----------.html?wd={keywords}')
  243. root = etree.HTML(res.text)
  244. data_list = root.xpath('//li/div[@class="item"]')
  245. for i in data_list:
  246. video_list.append(
  247. {
  248. 'vod_id': i.xpath('./a[2]/@href')[0].split('/')[-1].split('.')[0],
  249. 'vod_name': i.xpath('./a[2]/@title')[0],
  250. 'vod_pic': i.xpath('./a[1]/@data-bg')[0],
  251. 'vod_remarks': i.xpath('./span/text()')[0]
  252. }
  253. )
  254. except requests.RequestException as e:
  255. return {'list': [], 'msg': e}
  256. return {'list': video_list}
  257. def playerContent(self, flag, pid, vipFlags):
  258. play_url = 'https://gitee.com/dobebly/my_img/raw/c1977fa6134aefb8e5a34dabd731a4d186c84a4d/x.mp4'
  259. try:
  260. res = requests.get(f'https://dm84.org{pid}')
  261. a_url = re.findall('iframe src="(.*?)"', res.text)[0]
  262. res1 = requests.get(a_url)
  263. url = re.findall('var url = "(.*?)"', res1.text)[0]
  264. t = re.findall('var t = "(.*?)"', res1.text)[0]
  265. key = re.findall('var key = "(.*?)"', res1.text)[0]
  266. act = re.findall('var act = "(.*?)"', res1.text)[0]
  267. play = re.findall('var play = "(.*?)"', res1.text)[0]
  268. data = {
  269. 'url': url,
  270. 't': t,
  271. 'key': key,
  272. 'act': act,
  273. 'play': play
  274. }
  275. headers = {
  276. 'authority': 'hhjx.hhplayer.com',
  277. 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
  278. 'origin': 'https://hhjx.hhplayer.com',
  279. 'referer': a_url,
  280. 'user-agent': 'okhttp/3.12.0',
  281. 'x-requested-with': 'XMLHttpRequest',
  282. }
  283. res2 = requests.post('https://hhjx.hhplayer.com/api.php', data=data, headers=headers)
  284. if res2.json()['code'] == 200:
  285. play_url = res2.json()['url']
  286. except requests.RequestException as e:
  287. return {'url': play_url, 'msg': e, 'parse': 0, 'jx': 0, 'header': self.header}
  288. return {"url": play_url, "header": self.header, "parse": 0, "jx": 0}
  289. def localProxy(self, params):
  290. pass
  291. header = {"User-Agent": "okhttp/3.12.0"}
  292. if __name__ == '__main__':
  293. pass