py_cctv_2024.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  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 re
  10. from urllib import request, parse
  11. import urllib
  12. import urllib.request
  13. import time
  14. class Spider(Spider): # 元类 默认的元类 type
  15. def getName(self):
  16. return "中央电视台"#可搜索
  17. def init(self,extend=""):
  18. print("============{0}============".format(extend))
  19. pass
  20. def isVideoFormat(self,url):
  21. pass
  22. def manualVideoCheck(self):
  23. pass
  24. def homeContent(self,filter):
  25. result = {}
  26. cateManual = {
  27. "电视剧": "电视剧",
  28. "动画片": "动画片",
  29. "纪录片": "纪录片",
  30. "特别节目": "特别节目",
  31. "节目大全":"节目大全"
  32. }
  33. classes = []
  34. for k in cateManual:
  35. classes.append({
  36. 'type_name':k,
  37. 'type_id':cateManual[k]
  38. })
  39. result['class'] = classes
  40. if(filter):
  41. result['filters'] = self.config['filter']
  42. return result
  43. def homeVideoContent(self):
  44. result = {
  45. 'list':[]
  46. }
  47. return result
  48. def categoryContent(self,tid,pg,filter,extend):
  49. result = {}
  50. month = ""#月
  51. year = ""#年
  52. area=''#地区
  53. channel=''#频道
  54. datafl=''#类型
  55. letter=''#字母
  56. pagecount=24
  57. if tid=='动画片':
  58. id=urllib.parse.quote(tid)
  59. if 'datadq-area' in extend.keys():
  60. area=urllib.parse.quote(extend['datadq-area'])
  61. if 'dataszm-letter' in extend.keys():
  62. letter=extend['dataszm-letter']
  63. if 'datafl-sc' in extend.keys():
  64. datafl=urllib.parse.quote(extend['datafl-sc'])
  65. url='https://api.cntv.cn/list/getVideoAlbumList?channelid=CHAL1460955899450127&area={0}&sc={4}&fc={1}&letter={2}&p={3}&n=24&serviceId=tvcctv&topv=1&t=json'.format(area,id,letter,pg,datafl)
  66. elif tid=='纪录片':
  67. id=urllib.parse.quote(tid)
  68. if 'datapd-channel' in extend.keys():
  69. channel=urllib.parse.quote(extend['datapd-channel'])
  70. if 'datafl-sc' in extend.keys():
  71. datafl=urllib.parse.quote(extend['datafl-sc'])
  72. if 'datanf-year' in extend.keys():
  73. year=extend['datanf-year']
  74. if 'dataszm-letter' in extend.keys():
  75. letter=extend['dataszm-letter']
  76. url='https://api.cntv.cn/list/getVideoAlbumList?channelid=CHAL1460955924871139&fc={0}&channel={1}&sc={2}&year={3}&letter={4}&p={5}&n=24&serviceId=tvcctv&topv=1&t=json'.format(id,channel,datafl,year,letter,pg)
  77. elif tid=='电视剧':
  78. id=urllib.parse.quote(tid)
  79. if 'datafl-sc' in extend.keys():
  80. datafl=urllib.parse.quote(extend['datafl-sc'])
  81. if 'datanf-year' in extend.keys():
  82. year=extend['datanf-year']
  83. if 'dataszm-letter' in extend.keys():
  84. letter=extend['dataszm-letter']
  85. url='https://api.cntv.cn/list/getVideoAlbumList?channelid=CHAL1460955853485115&area={0}&sc={1}&fc={2}&year={3}&letter={4}&p={5}&n=24&serviceId=tvcctv&topv=1&t=json'.format(area,datafl,id,year,letter,pg)
  86. elif tid=='特别节目':
  87. id=urllib.parse.quote(tid)
  88. if 'datapd-channel' in extend.keys():
  89. channel=urllib.parse.quote(extend['datapd-channel'])
  90. if 'datafl-sc' in extend.keys():
  91. datafl=urllib.parse.quote(extend['datafl-sc'])
  92. if 'dataszm-letter' in extend.keys():
  93. letter=extend['dataszm-letter']
  94. url='https://api.cntv.cn/list/getVideoAlbumList?channelid=CHAL1460955953877151&channel={0}&sc={1}&fc={2}&bigday=&letter={3}&p={4}&n=24&serviceId=tvcctv&topv=1&t=json'.format(channel,datafl,id,letter,pg)
  95. elif tid=='节目大全':
  96. cid=''#频道
  97. if 'cid' in extend.keys():
  98. cid=extend['cid']
  99. fc=''#分类
  100. if 'fc' in extend.keys():
  101. fc=extend['fc']
  102. fl=''#字母
  103. if 'fl' in extend.keys():
  104. fl=extend['fl']
  105. url = 'https://api.cntv.cn/lanmu/columnSearch?&fl={0}&fc={1}&cid={2}&p={3}&n=20&serviceId=tvcctv&t=json&cb=ko'.format(fl,fc,cid,pg)
  106. pagecount=20
  107. else:
  108. url = 'https://tv.cctv.com/epg/index.shtml'
  109. videos=[]
  110. htmlText =self.webReadFile(urlStr=url,header=self.header)
  111. if tid=='节目大全':
  112. index=htmlText.rfind(');')
  113. if index>-1:
  114. htmlText=htmlText[3:index]
  115. videos =self.get_list1(html=htmlText,tid=tid)
  116. else:
  117. videos =self.get_list(html=htmlText,tid=tid)
  118. #print(videos)
  119. result['list'] = videos
  120. result['page'] = pg
  121. result['pagecount'] = 9999 if len(videos)>=pagecount else pg
  122. result['limit'] = 90
  123. result['total'] = 999999
  124. return result
  125. def detailContent(self,array):
  126. result={}
  127. aid = array[0].split('###')
  128. tid = aid[0]
  129. logo = aid[3]
  130. lastVideo = aid[2]
  131. title = aid[1]
  132. id= aid[4]
  133. vod_year= aid[5]
  134. actors= aid[6]
  135. brief= aid[7]
  136. fromId='CCTV'
  137. if tid=="节目大全":
  138. lastUrl = 'https://api.cntv.cn/video/videoinfoByGuid?guid={0}&serviceId=tvcctv'.format(id)
  139. htmlTxt = self.webReadFile(urlStr=lastUrl,header=self.header)
  140. topicId=json.loads(htmlTxt)['ctid']
  141. Url = "https://api.cntv.cn/NewVideo/getVideoListByColumn?id={0}&d=&p=1&n=100&sort=desc&mode=0&serviceId=tvcctv&t=json".format(topicId)
  142. htmlTxt = self.webReadFile(urlStr=Url,header=self.header)
  143. else:
  144. Url='https://api.cntv.cn/NewVideo/getVideoListByAlbumIdNew?id={0}&serviceId=tvcctv&p=1&n=100&mode=0&pub=1'.format(id)
  145. jRoot = ''
  146. videoList = []
  147. try:
  148. if tid=="搜索":
  149. fromId='中央台'
  150. videoList=[title+"$"+lastVideo]
  151. else:
  152. htmlTxt=self.webReadFile(urlStr=Url,header=self.header)
  153. jRoot = json.loads(htmlTxt)
  154. data=jRoot['data']
  155. jsonList=data['list']
  156. videoList=self.get_EpisodesList(jsonList=jsonList)
  157. if len(videoList)<1:
  158. htmlTxt=self.webReadFile(urlStr=lastVideo,header=self.header)
  159. if tid=="电视剧" or tid=="纪录片":
  160. patternTxt=r"'title':\s*'(?P<title>.+?)',\n{0,1}\s*'brief':\s*'(.+?)',\n{0,1}\s*'img':\s*'(.+?)',\n{0,1}\s*'url':\s*'(?P<url>.+?)'"
  161. elif tid=="特别节目":
  162. patternTxt=r'class="tp1"><a\s*href="(?P<url>https://.+?)"\s*target="_blank"\s*title="(?P<title>.+?)"></a></div>'
  163. elif tid=="动画片":
  164. patternTxt=r"'title':\s*'(?P<title>.+?)',\n{0,1}\s*'img':\s*'(.+?)',\n{0,1}\s*'brief':\s*'(.+?)',\n{0,1}\s*'url':\s*'(?P<url>.+?)'"
  165. elif tid=="节目大全":
  166. patternTxt=r'href="(?P<url>.+?)" target="_blank" alt="(?P<title>.+?)" title=".+?">'
  167. videoList=self.get_EpisodesList_re(htmlTxt=htmlTxt,patternTxt=patternTxt)
  168. fromId='央视'
  169. except:
  170. pass
  171. if len(videoList) == 0:
  172. return {}
  173. vod = {
  174. "vod_id":array[0],
  175. "vod_name":title,
  176. "vod_pic":logo,
  177. "type_name":tid,
  178. "vod_year":vod_year,
  179. "vod_area":"",
  180. "vod_remarks":'',
  181. "vod_actor":actors,
  182. "vod_director":'',
  183. "vod_content":brief
  184. }
  185. vod['vod_play_from'] = fromId
  186. vod['vod_play_url'] = "#".join(videoList)
  187. result = {
  188. 'list':[
  189. vod
  190. ]
  191. }
  192. return result
  193. def get_lineList(self,Txt,mark,after):
  194. circuit=[]
  195. origin=Txt.find(mark)
  196. while origin>8:
  197. end=Txt.find(after,origin)
  198. circuit.append(Txt[origin:end])
  199. origin=Txt.find(mark,end)
  200. return circuit
  201. def get_RegexGetTextLine(self,Text,RegexText,Index):
  202. returnTxt=[]
  203. pattern = re.compile(RegexText, re.M|re.S)
  204. ListRe=pattern.findall(Text)
  205. if len(ListRe)<1:
  206. return returnTxt
  207. for value in ListRe:
  208. returnTxt.append(value)
  209. return returnTxt
  210. def searchContent(self,key,quick):
  211. key=urllib.parse.quote(key)
  212. Url='https://search.cctv.com/ifsearch.php?page=1&qtext={0}&sort=relevance&pageSize=20&type=video&vtime=-1&datepid=1&channel=&pageflag=0&qtext_str={0}'.format(key)
  213. htmlTxt=self.webReadFile(urlStr=Url,header=self.header)
  214. videos=self.get_list_search(html=htmlTxt,tid='搜索')
  215. result = {
  216. 'list':videos
  217. }
  218. return result
  219. def playerContent(self,flag,id,vipFlags):
  220. result = {}
  221. url=''
  222. parse=0
  223. headers = {
  224. 'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'
  225. }
  226. if flag=='CCTV':
  227. url=self.get_m3u8(urlTxt=id)
  228. else:
  229. try:
  230. html=self.webReadFile(urlStr=id,header=self.header)
  231. guid=self.get_RegexGetText(Text=html,RegexText=r'var\sguid\s*=\s*"(.+?)";',Index=1)
  232. url=self.get_m3u8(urlTxt=guid)
  233. except :
  234. url=id
  235. parse=1
  236. if url.find('https:')<0:
  237. url=id
  238. parse=1
  239. result["parse"] = parse#1=嗅探,0=播放
  240. result["playUrl"] = ''
  241. result["url"] = url
  242. result["header"] =headers
  243. return result
  244. config = {
  245. "player": {},
  246. "filter": {
  247. "电视剧":[
  248. {"key":"datafl-sc","name":"类型","value":[{"n":"全部","v":""},{"n":"谍战","v":"谍战"},{"n":"悬疑","v":"悬疑"},{"n":"刑侦","v":"刑侦"},{"n":"历史","v":"历史"},{"n":"古装","v":"古装"},{"n":"武侠","v":"武侠"},{"n":"军旅","v":"军旅"},{"n":"战争","v":"战争"},{"n":"喜剧","v":"喜剧"},{"n":"青春","v":"青春"},{"n":"言情","v":"言情"},{"n":"偶像","v":"偶像"},{"n":"家庭","v":"家庭"},{"n":"年代","v":"年代"},{"n":"革命","v":"革命"},{"n":"农村","v":"农村"},{"n":"都市","v":"都市"},{"n":"其他","v":"其他"}]},
  249. {"key":"datadq-area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"中国大陆"},{"n":"中国香港","v":"香港"},{"n":"美国","v":"美国"},{"n":"欧洲","v":"欧洲"},{"n":"泰国","v":"泰国"}]},
  250. {"key":"datanf-year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"},{"n":"1999","v":"1999"},{"n":"1998","v":"1998"},{"n":"1997","v":"1997"}]},
  251. {"key":"dataszm-letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"C","v":"C"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]}
  252. ],
  253. "动画片":[
  254. {"key":"datafl-sc","name":"类型","value":[{"n":"全部","v":""},{"n":"亲子","v":"亲子"},{"n":"搞笑","v":"搞笑"},{"n":"冒险","v":"冒险"},{"n":"动作","v":"动作"},{"n":"宠物","v":"宠物"},{"n":"体育","v":"体育"},{"n":"益智","v":"益智"},{"n":"历史","v":"历史"},{"n":"教育","v":"教育"},{"n":"校园","v":"校园"},{"n":"言情","v":"言情"},{"n":"武侠","v":"武侠"},{"n":"经典","v":"经典"},{"n":"未来","v":"未来"},{"n":"古代","v":"古代"},{"n":"神话","v":"神话"},{"n":"真人","v":"真人"},{"n":"励志","v":"励志"},{"n":"热血","v":"热血"},{"n":"奇幻","v":"奇幻"},{"n":"童话","v":"童话"},{"n":"剧情","v":"剧情"},{"n":"夺宝","v":"夺宝"},{"n":"其他","v":"其他"}]},
  255. {"key":"datadq-area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"中国大陆"},{"n":"美国","v":"美国"},{"n":"欧洲","v":"欧洲"}]},
  256. {"key":"dataszm-letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"C","v":"C"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]}
  257. ],
  258. "纪录片":[
  259. {"key":"datapd-channel","name":"频道","value":[{"n":"全部","v":""},{"n":"CCTV1 综合","v":"CCTV1 综合"},{"n":"CCTV2 财经","v":"CCTV2 财经"},{"n":"CCTV3 综艺","v":"CCTV3 综艺"},{"n":"CCTV4 中文国际","v":"CCTV4 中文国际"},{"n":"CCTV5 体育","v":"CCTV5 体育"},{"n":"CCTV6 电影","v":"CCTV6 电影"},{"n":"CCTV7 国防军事","v":"CCTV7 国防军事"},{"n":"CCTV8 电视剧","v":"CCTV8 电视剧"},{"n":"CCTV9 纪录","v":"CCTV9 纪录"},{"n":"CCTV10 科教","v":"CCTV10 科教"},{"n":"CCTV11 戏曲","v":"CCTV11 戏曲"},{"n":"CCTV12 社会与法","v":"CCTV12 社会与法"},{"n":"CCTV13 新闻","v":"CCTV13 新闻"},{"n":"CCTV14 少儿","v":"CCTV14 少儿"},{"n":"CCTV15 音乐","v":"CCTV15 音乐"},{"n":"CCTV17 农业农村","v":"CCTV17 农业农村"}]},
  260. {"key":"datafl-sc","name":"类型","value":[{"n":"全部","v":""},{"n":"人文历史","v":"人文历史"},{"n":"人物","v":"人物"},{"n":"军事","v":"军事"},{"n":"探索","v":"探索"},{"n":"社会","v":"社会"},{"n":"时政","v":"时政"},{"n":"经济","v":"经济"},{"n":"科技","v":"科技"}]},
  261. {"key":"datanf-year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"}]},
  262. {"key":"dataszm-letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"C","v":"C"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]}
  263. ],
  264. "特别节目":[
  265. {"key":"datapd-channel","name":"频道","value":[{"n":"全部","v":""},{"n":"CCTV1 综合","v":"CCTV1 综合"},{"n":"CCTV2 财经","v":"CCTV2 财经"},{"n":"CCTV3 综艺","v":"CCTV3 综艺"},{"n":"CCTV4 中文国际","v":"CCTV4 中文国际"},{"n":"CCTV5 体育","v":"CCTV5 体育"},{"n":"CCTV6 电影","v":"CCTV6 电影"},{"n":"CCTV7 国防军事","v":"CCTV7 国防军事"},{"n":"CCTV8 电视剧","v":"CCTV8 电视剧"},{"n":"CCTV9 纪录","v":"CCTV9 纪录"},{"n":"CCTV10 科教","v":"CCTV10 科教"},{"n":"CCTV11 戏曲","v":"CCTV11 戏曲"},{"n":"CCTV12 社会与法","v":"CCTV12 社会与法"},{"n":"CCTV13 新闻","v":"CCTV13 新闻"},{"n":"CCTV14 少儿","v":"CCTV14 少儿"},{"n":"CCTV15 音乐","v":"CCTV15 音乐"},{"n":"CCTV17 农业农村","v":"CCTV17 农业农村"}]},
  266. {"key":"datafl-sc","name":"类型","value":[{"n":"全部","v":""},{"n":"全部","v":"全部"},{"n":"新闻","v":"新闻"},{"n":"经济","v":"经济"},{"n":"综艺","v":"综艺"},{"n":"体育","v":"体育"},{"n":"军事","v":"军事"},{"n":"影视","v":"影视"},{"n":"科教","v":"科教"},{"n":"戏曲","v":"戏曲"},{"n":"青少","v":"青少"},{"n":"音乐","v":"音乐"},{"n":"社会","v":"社会"},{"n":"公益","v":"公益"},{"n":"其他","v":"其他"}]},
  267. {"key":"dataszm-letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"C","v":"C"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]}
  268. ],
  269. "节目大全":[{"key":"cid","name":"频道","value":[{"n":"全部","v":""},{"n":"CCTV-1综合","v":"EPGC1386744804340101"},{"n":"CCTV-2财经","v":"EPGC1386744804340102"},{"n":"CCTV-3综艺","v":"EPGC1386744804340103"},{"n":"CCTV-4中文国际","v":"EPGC1386744804340104"},{"n":"CCTV-5体育","v":"EPGC1386744804340107"},{"n":"CCTV-6电影","v":"EPGC1386744804340108"},{"n":"CCTV-7国防军事","v":"EPGC1386744804340109"},{"n":"CCTV-8电视剧","v":"EPGC1386744804340110"},{"n":"CCTV-9纪录","v":"EPGC1386744804340112"},{"n":"CCTV-10科教","v":"EPGC1386744804340113"},{"n":"CCTV-11戏曲","v":"EPGC1386744804340114"},{"n":"CCTV-12社会与法","v":"EPGC1386744804340115"},{"n":"CCTV-13新闻","v":"EPGC1386744804340116"},{"n":"CCTV-14少儿","v":"EPGC1386744804340117"},{"n":"CCTV-15音乐","v":"EPGC1386744804340118"},{"n":"CCTV-16奥林匹克","v":"EPGC1634630207058998"},{"n":"CCTV-17农业农村","v":"EPGC1563932742616872"},{"n":"CCTV-5+体育赛事","v":"EPGC1468294755566101"}]},{"key":"fc","name":"分类","value":[{"n":"全部","v":""},{"n":"新闻","v":"新闻"},{"n":"体育","v":"体育"},{"n":"综艺","v":"综艺"},{"n":"健康","v":"健康"},{"n":"生活","v":"生活"},{"n":"科教","v":"科教"},{"n":"经济","v":"经济"},{"n":"农业","v":"农业"},{"n":"法治","v":"法治"},{"n":"军事","v":"军事"},{"n":"少儿","v":"少儿"},{"n":"动画","v":"动画"},{"n":"纪实","v":"纪实"},{"n":"戏曲","v":"戏曲"},{"n":"音乐","v":"音乐"},{"n":"影视","v":"影视"}]},{"key":"fl","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]},{"key":"month","name":"月份","value":[{"n":"全部","v":""},{"n":"12","v":"12"},{"n":"11","v":"11"},{"n":"10","v":"10"},{"n":"09","v":"09"},{"n":"08","v":"08"},{"n":"07","v":"07"},{"n":"06","v":"06"},{"n":"05","v":"05"},{"n":"04","v":"04"},{"n":"03","v":"03"},{"n":"02","v":"02"},{"n":"01","v":"01"}]}]
  270. }
  271. }
  272. header = {
  273. "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36",
  274. "Host": "tv.cctv.com",
  275. "Referer": "https://tv.cctv.com/"
  276. }
  277. def localProxy(self,param):
  278. return [200, "video/MP2T", action, ""]
  279. #-----------------------------------------------自定义函数-----------------------------------------------
  280. #访问网页
  281. def webReadFile(self,urlStr,header):
  282. html=''
  283. req=urllib.request.Request(url=urlStr)#,headers=header
  284. with urllib.request.urlopen(req) as response:
  285. html = response.read().decode('utf-8')
  286. return html
  287. #判断网络地址是否存在
  288. def TestWebPage(self,urlStr,header):
  289. html=''
  290. req=urllib.request.Request(url=urlStr,method='HEAD')#,headers=header
  291. with urllib.request.urlopen(req) as response:
  292. html = response.getcode ()
  293. return html
  294. #正则取文本
  295. def get_RegexGetText(self,Text,RegexText,Index):
  296. returnTxt=""
  297. Regex=re.search(RegexText, Text, re.M|re.S)
  298. if Regex is None:
  299. returnTxt=""
  300. else:
  301. returnTxt=Regex.group(Index)
  302. return returnTxt
  303. #取集数
  304. def get_EpisodesList(self,jsonList):
  305. videos=[]
  306. for vod in jsonList:
  307. url = vod['guid']
  308. title =vod['title']
  309. if len(url) == 0:
  310. continue
  311. videos.append(title+"$"+url)
  312. return videos
  313. #取集数
  314. def get_EpisodesList_re(self,htmlTxt,patternTxt):
  315. ListRe=re.finditer(patternTxt, htmlTxt, re.M|re.S)
  316. videos=[]
  317. for vod in ListRe:
  318. url = vod.group('url')
  319. title =vod.group('title')
  320. if len(url) == 0:
  321. continue
  322. videos.append(title+"$"+url)
  323. return videos
  324. #取剧集区
  325. def get_lineList(self,Txt,mark,after):
  326. circuit=[]
  327. origin=Txt.find(mark)
  328. while origin>8:
  329. end=Txt.find(after,origin)
  330. circuit.append(Txt[origin:end])
  331. origin=Txt.find(mark,end)
  332. return circuit
  333. #正则取文本,返回数组
  334. def get_RegexGetTextLine(self,Text,RegexText,Index):
  335. returnTxt=[]
  336. pattern = re.compile(RegexText, re.M|re.S)
  337. ListRe=pattern.findall(Text)
  338. if len(ListRe)<1:
  339. return returnTxt
  340. for value in ListRe:
  341. returnTxt.append(value)
  342. return returnTxt
  343. #删除html标签
  344. def removeHtml(self,txt):
  345. soup = re.compile(r'<[^>]+>',re.S)
  346. txt =soup.sub('', txt)
  347. return txt.replace("&nbsp;"," ")
  348. #取m3u8
  349. def get_m3u8(self,urlTxt):
  350. url = "https://vdn.apps.cntv.cn/api/getHttpVideoInfo.do?pid={0}".format(urlTxt)
  351. html=self.webReadFile(urlStr=url,header=self.header)
  352. jo =json.loads(html)
  353. link = jo['hls_url'].strip()
  354. html = self.webReadFile(urlStr=link,header=self.header)
  355. content = html.strip()
  356. arr = content.split('\n')
  357. urlPrefix = self.get_RegexGetText(Text=link,RegexText='(http[s]?://[a-zA-z0-9.]+)/',Index=1)
  358. subUrl = arr[-1].split('/')
  359. subUrl[3] = '1200'
  360. subUrl[-1] = '1200.m3u8'
  361. hdUrl = urlPrefix + '/'.join(subUrl)
  362. url = urlPrefix + arr[-1]
  363. hdRsp = self.TestWebPage(urlStr=hdUrl,header=self.header)
  364. if hdRsp == 200:
  365. url = hdUrl
  366. else:
  367. url=''
  368. return url
  369. #搜索
  370. def get_list_search(self,html,tid):
  371. jRoot = json.loads(html)
  372. jsonList=jRoot['list']
  373. videos=[]
  374. for vod in jsonList:
  375. url = vod['urllink']
  376. title =self.removeHtml(txt=vod['title'])
  377. img=vod['imglink']
  378. id=vod['id']
  379. brief=vod['channel']
  380. year=vod['uploadtime']
  381. if len(url) == 0:
  382. continue
  383. guid="{0}###{1}###{2}###{3}###{4}###{5}###{6}###{7}".format(tid,title,url,img,id,year,'',brief)
  384. videos.append({
  385. "vod_id":guid,
  386. "vod_name":title,
  387. "vod_pic":img,
  388. "vod_remarks":year
  389. })
  390. return videos
  391. return videos
  392. def get_list1(self,html,tid):
  393. jRoot = json.loads(html)
  394. videos = []
  395. data=jRoot['response']
  396. if data is None:
  397. return []
  398. jsonList=data['docs']
  399. for vod in jsonList:
  400. id = vod['lastVIDE']['videoSharedCode']
  401. title =vod['column_name']
  402. url=vod['column_website']
  403. img=vod['column_logo']
  404. year=vod['column_playdate']
  405. brief=vod['column_brief']
  406. actors=''
  407. if len(url) == 0:
  408. continue
  409. guid="{0}###{1}###{2}###{3}###{4}###{5}###{6}###{7}".format(tid,title,url,img,id,year,actors,brief)
  410. #print(vod_id)
  411. videos.append({
  412. "vod_id":guid,
  413. "vod_name":title,
  414. "vod_pic":img,
  415. "vod_remarks":''
  416. })
  417. #print(videos)
  418. return videos
  419. #分类取结果
  420. def get_list(self,html,tid):
  421. jRoot = json.loads(html)
  422. videos = []
  423. data=jRoot['data']
  424. if data is None:
  425. return []
  426. jsonList=data['list']
  427. for vod in jsonList:
  428. url = vod['url']
  429. title =vod['title']
  430. img=vod['image']
  431. id=vod['id']
  432. try:
  433. brief=vod['brief']
  434. except:
  435. brief=''
  436. try:
  437. year=vod['year']
  438. except:
  439. year=''
  440. try:
  441. actors=vod['actors']
  442. except:
  443. actors=''
  444. if len(url) == 0:
  445. continue
  446. guid="{0}###{1}###{2}###{3}###{4}###{5}###{6}###{7}".format(tid,title,url,img,id,year,actors,brief)
  447. #print(vod_id)
  448. videos.append({
  449. "vod_id":guid,
  450. "vod_name":title,
  451. "vod_pic":img,
  452. "vod_remarks":''
  453. })
  454. return videos