2
0

py_gsych.py 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. #coding=utf-8
  2. #!/usr/bin/python
  3. import sys
  4. sys.path.append('..')
  5. from base.spider import Spider
  6. import json
  7. import time
  8. import base64
  9. import requests
  10. class Spider(Spider): # 元类 默认的元类 type
  11. def getName(self):
  12. return "歌星mv"
  13. def init(self,extend=""):
  14. print("============{0}============".format(extend))
  15. pass
  16. def isVideoFormat(self,url):
  17. pass
  18. def manualVideoCheck(self):
  19. pass
  20. def homeContent(self,filter):
  21. result = {}
  22. cateManual = {
  23. "周杰伦": "周杰伦",
  24. "陈奕迅": "陈奕迅",
  25. "Beyond": "Beyond",
  26. "刘德华": "刘德华",
  27. "郭富城": "郭富城",
  28. "张学友": "张学友",
  29. "黎明": "黎明",
  30. "李宗盛": "李宗盛",
  31. "邓丽君": "邓丽君",
  32. "朴树": "朴树",
  33. "林子祥": "林子祥",
  34. "任贤齐": "任贤齐",
  35. "张信哲": "张信哲",
  36. "孙楠": "孙楠",
  37. "张宇": "张宇",
  38. "周华健": "周华健",
  39. "蔡依林": "蔡依林",
  40. "薛之谦": "薛之谦",
  41. "洛天依": "洛天依",
  42. "初音未来": "初音未来",
  43. "许嵩": "许嵩",
  44. "戴佩妮": "戴佩妮",
  45. "邓紫棋": "邓紫棋",
  46. "张韶涵": "张韶涵",
  47. "蔡健雅": "蔡健雅",
  48. "莫文蔚": "莫文蔚",
  49. "刘若英": "刘若英",
  50. "周深": "周深",
  51. "毛不易": "毛不易",
  52. "汪苏泷": "汪苏泷",
  53. "李宇春": "李宇春",
  54. "徐佳莹": "徐佳莹",
  55. "杨宗纬": "杨宗纬",
  56. "胡彦斌": "胡彦斌",
  57. "杨千嬅": "杨千嬅",
  58. "张靓颖": "张靓颖",
  59. "李荣浩": "李荣浩",
  60. "杨丞琳": "杨丞琳",
  61. "林志炫": "林志炫",
  62. "陶喆": "陶喆",
  63. "胡夏": "胡夏",
  64. "李玉刚": "李玉刚",
  65. "弦子": "弦子",
  66. "陈小春": "陈小春",
  67. "萧亚轩": "萧亚轩",
  68. "鹿晗": "鹿晗",
  69. "纵贯线": "纵贯线",
  70. "许巍": "许巍",
  71. "林俊杰": "林俊杰",
  72. "赵雷": "赵雷",
  73. "谭咏麟": "谭咏麟",
  74. "凤凰传奇": "凤凰传奇",
  75. "二手玫瑰": "二手玫瑰",
  76. "容祖儿": "容祖儿",
  77. "周传雄": "周传雄",
  78. "SHE": "SHE",
  79. "苏打绿": "苏打绿",
  80. "五月天": "五月天",
  81. "张国荣": "张国荣",
  82. "梅艳芳": "梅艳芳",
  83. "孙燕姿": "孙燕姿",
  84. "李健": "李健",
  85. "华晨宇": "华晨宇",
  86. "袁娅维": "袁娅维",
  87. "大张伟": "大张伟",
  88. "TFBOYS": "TFBOYS",
  89. "王俊凯": "王俊凯",
  90. "易烊千玺": "易烊千玺",
  91. "王源": "王源",
  92. "田馥甄": "田馥甄",
  93. "小虎队": "小虎队",
  94. "张杰": "张杰",
  95. "王菲": "王菲",
  96. "伍佰": "伍佰",
  97. "刀郎": "刀郎",
  98. "草蜢": "草蜢",
  99. "潘玮柏": "潘玮柏",
  100. "梁静茹": "梁静茹",
  101. "林宥嘉": "林宥嘉",
  102. "蔡徐坤": "蔡徐坤",
  103. "周慧敏": "周慧敏",
  104. "李圣杰": "李圣杰",
  105. "张惠妹": "张惠妹",
  106. "萧敬腾": "萧敬腾",
  107. "周笔畅": "周笔畅",
  108. "焦迈奇": "焦迈奇",
  109. "尤长靖": "尤长靖",
  110. "郑中基": "郑中基",
  111. "谭维维": "谭维维",
  112. "陈慧娴": "陈慧娴",
  113. "张艺兴": "张艺兴",
  114. "王嘉尔": "王嘉尔",
  115. "刘宪华": "刘宪华",
  116. "张敬轩": "张敬轩",
  117. "李克勤": "李克勤",
  118. "阿杜": "阿杜",
  119. "郭静": "郭静",
  120. "崔健": "崔健",
  121. "庾澄庆": "庾澄庆",
  122. "汪峰": "汪峰",
  123. "那英": "那英",
  124. "杨坤": "杨坤",
  125. "叶倩文": "叶倩文",
  126. "王心凌": "王心凌",
  127. "张震岳": "张震岳",
  128. "韩红": "韩红",
  129. "齐秦": "齐秦",
  130. "张雨生": "张雨生",
  131. "黄品源": "黄品源",
  132. "林忆莲": "林忆莲",
  133. "丁当": "丁当",
  134. "郑智化": "郑智化",
  135. "李玟": "李玟",
  136. "谢霆锋": "谢霆锋",
  137. "黄小琥": "黄小琥",
  138. "徐小凤": "徐小凤",
  139. "任嘉伦": "任嘉伦",
  140. "卓依婷": "卓依婷",
  141. "逃跑计划": "逃跑计划",
  142. "青鸟飞鱼": "青鸟飞鱼",
  143. "飞儿乐队": "飞儿乐队",
  144. "花儿乐队": "花儿乐队",
  145. "南拳妈妈": "南拳妈妈",
  146. "水木年华": "水木年华",
  147. "动力火车": "动力火车",
  148. "筷子兄弟": "筷子兄弟",
  149. "鹿先森乐队": "鹿先森乐队",
  150. "信乐队": "信乐队",
  151. "旅行团乐队": "旅行团乐队",
  152. "By2": "By2",
  153. "郁可唯": "郁可唯",
  154. "宋亚森": "宋亚森",
  155. "费玉清": "费玉清",
  156. "费翔": "费翔",
  157. "金志文": "金志文",
  158. "黄家强": "黄家强",
  159. "方大同": "方大同",
  160. "吴克群": "吴克群",
  161. "罗大佑": "罗大佑",
  162. "光良": "光良",
  163. "田震": "田震",
  164. "凤飞飞": "凤飞飞",
  165. "谭晶": "谭晶",
  166. "王杰": "王杰",
  167. "羽泉": "羽泉",
  168. "金池": "金池",
  169. "屠洪刚": "屠洪刚",
  170. "戴荃": "戴荃",
  171. "郭采洁": "郭采洁",
  172. "罗志祥": "罗志祥",
  173. "王力宏": "王力宏",
  174. "林肯公园": "林肯公园",
  175. "迈克尔杰克逊": "迈克尔杰克逊",
  176. "泰勒·斯威夫特": "泰勒·斯威夫特",
  177. "阿黛尔": "阿黛尔",
  178. "BIGBANG": "BIGBANG",
  179. "LadyGaga": "LadyGaga",
  180. "贾斯丁比伯": "贾斯丁比伯",
  181. "中岛美雪": "中岛美雪",
  182. "仓木麻衣": "仓木麻衣",
  183. "后街男孩": "后街男孩",
  184. "布兰妮": "布兰妮",
  185. "夜愿乐队": "夜愿乐队"
  186. }
  187. classes = []
  188. for k in cateManual:
  189. classes.append({
  190. 'type_name':k,
  191. 'type_id':cateManual[k]
  192. })
  193. result['class'] = classes
  194. if(filter):
  195. result['filters'] = self.config['filter']
  196. return result
  197. def homeVideoContent(self):
  198. result = {
  199. 'list':[]
  200. }
  201. return result
  202. cookies = ''
  203. def getCookie(self):
  204. cookies_str = self.fetch("https://agit.ai/138001380000/MHQTV/raw/branch/master/bbcookie.txt").text
  205. cookies_dic = dict([co.strip().split('=') for co in cookies_str.split(';')])
  206. rsp = requests.session()
  207. cookies_jar = requests.utils.cookiejar_from_dict(cookies_dic)
  208. rsp.cookies = cookies_jar
  209. content = self.fetch("http://api.bilibili.com/x/web-interface/nav", cookies=rsp.cookies)
  210. res = json.loads(content.text)
  211. if res["code"] == 0:
  212. self.cookies = rsp.cookies
  213. else:
  214. rsp = self.fetch("https://www.bilibili.com/")
  215. self.cookies = rsp.cookies
  216. return rsp.cookies
  217. def categoryContent(self,tid,pg,filter,extend):
  218. result = {}
  219. url = 'https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword={0}&duration=4&page={1}'.format(tid,pg)
  220. if len(self.cookies) <= 0:
  221. self.getCookie()
  222. rsp = self.fetch(url,cookies=self.cookies)
  223. content = rsp.text
  224. jo = json.loads(content)
  225. if jo['code'] != 0:
  226. rspRetry = self.fetch(url,cookies=self.getCookie())
  227. content = rspRetry.text
  228. jo = json.loads(content)
  229. videos = []
  230. vodList = jo['data']['result']
  231. for vod in vodList:
  232. aid = str(vod['aid']).strip()
  233. title = vod['title'].strip().replace("<em class=\"keyword\">","").replace("</em>","")
  234. img = 'https:' + vod['pic'].strip()
  235. remark = str(vod['duration']).strip()
  236. videos.append({
  237. "vod_id":aid,
  238. "vod_name":title,
  239. "vod_pic":img,
  240. "vod_remarks":remark
  241. })
  242. result['list'] = videos
  243. result['page'] = pg
  244. result['pagecount'] = 9999
  245. result['limit'] = 90
  246. result['total'] = 999999
  247. return result
  248. def cleanSpace(self,str):
  249. return str.replace('\n','').replace('\t','').replace('\r','').replace(' ','')
  250. def detailContent(self,array):
  251. aid = array[0]
  252. url = "https://api.bilibili.com/x/web-interface/view?aid={0}".format(aid)
  253. rsp = self.fetch(url,headers=self.header)
  254. jRoot = json.loads(rsp.text)
  255. jo = jRoot['data']
  256. title = jo['title'].replace("<em class=\"keyword\">","").replace("</em>","")
  257. pic = jo['pic']
  258. desc = jo['desc']
  259. typeName = jo['tname']
  260. vod = {
  261. "vod_id":aid,
  262. "vod_name":title,
  263. "vod_pic":pic,
  264. "type_name":typeName,
  265. "vod_year":"",
  266. "vod_area":"",
  267. "vod_remarks":"",
  268. "vod_actor":"",
  269. "vod_director":"",
  270. "vod_content":desc
  271. }
  272. ja = jo['pages']
  273. playUrl = ''
  274. for tmpJo in ja:
  275. cid = tmpJo['cid']
  276. part = tmpJo['part']
  277. playUrl = playUrl + '{0}${1}_{2}#'.format(part,aid,cid)
  278. vod['vod_play_from'] = 'B站'
  279. vod['vod_play_url'] = playUrl
  280. result = {
  281. 'list':[
  282. vod
  283. ]
  284. }
  285. return result
  286. def searchContent(self,key,quick):
  287. result = {
  288. 'list':[]
  289. }
  290. return result
  291. def playerContent(self,flag,id,vipFlags):
  292. # https://www.555dianying.cc/vodplay/static/js/playerconfig.js
  293. result = {}
  294. ids = id.split("_")
  295. url = 'https://api.bilibili.com:443/x/player/playurl?avid={0}&cid=%20%20{1}&qn=112'.format(ids[0],ids[1])
  296. rsp = self.fetch(url, cookies=self.cookies)
  297. jRoot = json.loads(rsp.text)
  298. jo = jRoot['data']
  299. ja = jo['durl']
  300. maxSize = -1
  301. position = -1
  302. for i in range(len(ja)):
  303. tmpJo = ja[i]
  304. if maxSize < int(tmpJo['size']):
  305. maxSize = int(tmpJo['size'])
  306. position = i
  307. url = ''
  308. if len(ja) > 0:
  309. if position == -1:
  310. position = 0
  311. url = ja[position]['url']
  312. result["parse"] = 0
  313. result["playUrl"] = ''
  314. result["url"] = url
  315. result["header"] = {
  316. "Referer":"https://www.bilibili.com",
  317. "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
  318. }
  319. result["contentType"] = 'video/x-flv'
  320. return result
  321. config = {
  322. "player": {},
  323. "filter": {}
  324. }
  325. header = {}
  326. def localProxy(self,param):
  327. return [200, "video/MP2T", action, ""]