itv.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. import time
  2. import os
  3. import concurrent.futures
  4. from selenium import webdriver
  5. from selenium.webdriver.chrome.options import Options
  6. import requests
  7. import re
  8. urls = [
  9. "https://fofa.info/result?qbase64=ImlwdHYvbGl2ZS96aF9jbi5qcyIgJiYgY291bnRyeT0iQ04iICYmIHJlZ2lvbj0iSGViZWki", # Hebei (河北)
  10. "https://fofa.info/result?qbase64=ImlwdHYvbGl2ZS96aF9jbi5qcyIgJiYgY291bnRyeT0iQ04iICYmIHJlZ2lvbj0iYmVpamluZyI%3D", # Beijing (北京)
  11. "https://fofa.info/result?qbase64=ImlwdHYvbGl2ZS96aF9jbi5qcyIgJiYgY291bnRyeT0iQ04iICYmIHJlZ2lvbj0iZ3Vhbmdkb25nIg%3D%3D", # Guangdong (广东)
  12. "https://fofa.info/result?qbase64=ImlwdHYvbGl2ZS96aF9jbi5qcyIgJiYgY291bnRyeT0iQ04iICYmIHJlZ2lvbj0ic2hhbmdoYWki", # Shanghai (上海)
  13. "https://fofa.info/result?qbase64=ImlwdHYvbGl2ZS96aF9jbi5qcyIgJiYgY291bnRyeT0iQ04iICYmIHJlZ2lvbj0idGlhbmppbiI%3D", # Tianjin (天津)
  14. "https://fofa.info/result?qbase64=ImlwdHYvbGl2ZS96aF9jbi5qcyIgJiYgY291bnRyeT0iQ04iICYmIHJlZ2lvbj0iY2hvbmdxaW5nIg%3D%3D", # Chongqing (重庆)
  15. "https://fofa.info/result?qbase64=ImlwdHYvbGl2ZS96aF9jbi5qcyIgJiYgY291bnRyeT0iQ04iICYmIHJlZ2lvbj0ic2hhbnhpIg%3D%3D", # Shanxi (山西)
  16. "https://fofa.info/result?qbase64=ImlwdHYvbGl2ZS96aF9jbi5qcyIgJiYgY291bnRyeT0iQ04iICYmIHJlZ2lvbj0iU2hhYW54aSI%3D", # Shaanxi (陕西)
  17. "https://fofa.info/result?qbase64=ImlwdHYvbGl2ZS96aF9jbi5qcyIgJiYgY291bnRyeT0iQ04iICYmIHJlZ2lvbj0ibGlhb25pbmci", # Liaoning (辽宁)
  18. "https://fofa.info/result?qbase64=ImlwdHYvbGl2ZS96aF9jbi5qcyIgJiYgY291bnRyeT0iQ04iICYmIHJlZ2lvbj0iamlhbmdzdSI%3D", # Jiangsu (江苏)
  19. "https://fofa.info/result?qbase64=ImlwdHYvbGl2ZS96aF9jbi5qcyIgJiYgY291bnRyeT0iQ04iICYmIHJlZ2lvbj0iemhlamlhbmci", # Zhejiang (浙江)
  20. "https://fofa.info/result?qbase64=ImlwdHYvbGl2ZS96aF9jbi5qcyIgJiYgY291bnRyeT0iQ04iICYmIHJlZ2lvbj0i5a6J5b69Ig%3D%3D", # Anhui (安徽)
  21. "https://fofa.info/result?qbase64=ImlwdHYvbGl2ZS96aF9jbi5qcyIgJiYgY291bnRyeT0iQ04iICYmIHJlZ2lvbj0iRnVqaWFuIg%3D%3D", # 福建
  22. "https://fofa.info/result?qbase64=ImlwdHYvbGl2ZS96aF9jbi5qcyIgJiYgY291bnRyeT0iQ04iICYmIHJlZ2lvbj0i5rGf6KW%2FIg%3D%3D", # 江西
  23. "https://fofa.info/result?qbase64=ImlwdHYvbGl2ZS96aF9jbi5qcyIgJiYgY291bnRyeT0iQ04iICYmIHJlZ2lvbj0i5bGx5LicIg%3D%3D", # 山东
  24. "https://fofa.info/result?qbase64=ImlwdHYvbGl2ZS96aF9jbi5qcyIgJiYgY291bnRyeT0iQ04iICYmIHJlZ2lvbj0i5rKz5Y2XIg%3D%3D", # 河南
  25. "https://fofa.info/result?qbase64=ImlwdHYvbGl2ZS96aF9jbi5qcyIgJiYgY291bnRyeT0iQ04iICYmIHJlZ2lvbj0i5rmW5YyXIg%3D%3D", # 湖北
  26. "https://fofa.info/result?qbase64=ImlwdHYvbGl2ZS96aF9jbi5qcyIgJiYgY291bnRyeT0iQ04iICYmIHJlZ2lvbj0i5rmW5Y2XIg%3D%3D", # 湖南
  27. "https://www.zoomeye.org/searchResult?q=%2Fiptv%2Flive%2Fzh_cn.js%20%2Bcountry%3A%22CN%22%20%2Bsubdivisions%3A%22hebei%22", #河北
  28. "https://www.zoomeye.org/searchResult?q=%2Fiptv%2Flive%2Fzh_cn.js%20%2Bcountry%3A%22CN%22%20%2Bsubdivisions%3A%22beijing%22", #北京
  29. "https://www.zoomeye.org/searchResult?q=%2Fiptv%2Flive%2Fzh_cn.js%20%2Bcountry%3A%22CN%22%20%2Bsubdivisions%3A%22guangdong%22", #广东
  30. "https://www.zoomeye.org/searchResult?q=%2Fiptv%2Flive%2Fzh_cn.js%20%2Bcountry%3A%22CN%22%20%2Bsubdivisions%3A%22shanghai%22", #上海
  31. "https://www.zoomeye.org/searchResult?q=%2Fiptv%2Flive%2Fzh_cn.js%20%2Bcountry%3A%22CN%22%20%2Bsubdivisions%3A%22tianjin%22", #天津
  32. "https://www.zoomeye.org/searchResult?q=%2Fiptv%2Flive%2Fzh_cn.js%20%2Bcountry%3A%22CN%22%20%2Bsubdivisions%3A%22chongqing%22", #重庆
  33. "https://www.zoomeye.org/searchResult?q=%2Fiptv%2Flive%2Fzh_cn.js%20%2Bcountry%3A%22CN%22%20%2Bsubdivisions%3A%22shanxi%22", #山西
  34. "https://www.zoomeye.org/searchResult?q=%2Fiptv%2Flive%2Fzh_cn.js%20%2Bcountry%3A%22CN%22%20%2Bsubdivisions%3A%22shaanxi%22", #陕西
  35. "https://www.zoomeye.org/searchResult?q=%2Fiptv%2Flive%2Fzh_cn.js%20%2Bcountry%3A%22CN%22%20%2Bsubdivisions%3A%22liaoning%22", #辽宁
  36. "https://www.zoomeye.org/searchResult?q=%2Fiptv%2Flive%2Fzh_cn.js%20%2Bcountry%3A%22CN%22%20%2Bsubdivisions%3A%22jiangsu%22", #江苏
  37. "https://www.zoomeye.org/searchResult?q=%2Fiptv%2Flive%2Fzh_cn.js%20%2Bcountry%3A%22CN%22%20%2Bsubdivisions%3A%22zhejiang%22", #浙江
  38. "https://www.zoomeye.org/searchResult?q=%2Fiptv%2Flive%2Fzh_cn.js%20%2Bcountry%3A%22CN%22%20%2Bsubdivisions%3A%22anhui%22", #安徽
  39. "https://www.zoomeye.org/searchResult?q=%2Fiptv%2Flive%2Fzh_cn.js%20%2Bcountry%3A%22CN%22%20%2Bsubdivisions%3A%22fujian%22", #福建
  40. "https://www.zoomeye.org/searchResult?q=%2Fiptv%2Flive%2Fzh_cn.js%20%2Bcountry%3A%22CN%22%20%2Bsubdivisions%3A%22jiangxi%22", #江西
  41. "https://www.zoomeye.org/searchResult?q=%2Fiptv%2Flive%2Fzh_cn.js%20%2Bcountry%3A%22CN%22%20%2Bsubdivisions%3A%22shandong%22", #山东
  42. "https://www.zoomeye.org/searchResult?q=%2Fiptv%2Flive%2Fzh_cn.js%20%2Bcountry%3A%22CN%22%20%2Bsubdivisions%3A%22henan%22", #河南
  43. "https://www.zoomeye.org/searchResult?q=%2Fiptv%2Flive%2Fzh_cn.js%20%2Bcountry%3A%22CN%22%20%2Bsubdivisions%3A%22hubei%22", #湖北
  44. "https://www.zoomeye.org/searchResult?q=%2Fiptv%2Flive%2Fzh_cn.js%20%2Bcountry%3A%22CN%22%20%2Bsubdivisions%3A%22hunan%22" #湖南
  45. ]
  46. def modify_urls(url):
  47. modified_urls = []
  48. ip_start_index = url.find("//") + 2
  49. ip_end_index = url.find(":", ip_start_index)
  50. base_url = url[:ip_start_index] # http:// or https://
  51. ip_address = url[ip_start_index:ip_end_index]
  52. port = url[ip_end_index:]
  53. ip_end = "/iptv/live/1000.json?key=txiptv"
  54. for i in range(1, 256):
  55. modified_ip = f"{ip_address[:-1]}{i}"
  56. modified_url = f"{base_url}{modified_ip}{port}{ip_end}"
  57. modified_urls.append(modified_url)
  58. return modified_urls
  59. def is_url_accessible(url):
  60. try:
  61. response = requests.get(url, timeout=0.5)
  62. if response.status_code == 200:
  63. return url
  64. except requests.exceptions.RequestException:
  65. pass
  66. return None
  67. results = []
  68. for url in urls:
  69. try:
  70. # 创建一个Chrome WebDriver实例
  71. chrome_options = Options()
  72. chrome_options.add_argument('--headless')
  73. chrome_options.add_argument('--no-sandbox')
  74. chrome_options.add_argument('--disable-dev-shm-usage')
  75. driver = webdriver.Chrome(options=chrome_options)
  76. # 使用WebDriver访问网页
  77. driver.get(url) # 将网址替换为你要访问的网页地址
  78. time.sleep(10)
  79. # 获取网页内容
  80. page_content = driver.page_source
  81. # 关闭WebDriver
  82. driver.quit()
  83. # 查找所有符合指定格式的网址
  84. pattern = r"http://\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d+" # 设置匹配的格式,如http://8.8.8.8:8888
  85. urls_all = re.findall(pattern, page_content)
  86. # urls = list(set(urls_all)) # 去重得到唯一的URL列表
  87. urls = set(urls_all) # 去重得到唯一的URL列表
  88. x_urls = []
  89. for url in urls: # 对urls进行处理,ip第四位修改为1,并去重
  90. url = url.strip()
  91. ip_start_index = url.find("//") + 2
  92. ip_end_index = url.find(":", ip_start_index)
  93. ip_dot_start = url.find(".") + 1
  94. ip_dot_second = url.find(".", ip_dot_start) + 1
  95. ip_dot_three = url.find(".", ip_dot_second) + 1
  96. base_url = url[:ip_start_index] # http:// or https://
  97. ip_address = url[ip_start_index:ip_dot_three]
  98. port = url[ip_end_index:]
  99. ip_end = "1"
  100. modified_ip = f"{ip_address}{ip_end}"
  101. x_url = f"{base_url}{modified_ip}{port}"
  102. x_urls.append(x_url)
  103. urls = set(x_urls) # 去重得到唯一的URL列表
  104. valid_urls = []
  105. # 多线程获取可用url
  106. with concurrent.futures.ThreadPoolExecutor(max_workers=100) as executor:
  107. futures = []
  108. for url in urls:
  109. url = url.strip()
  110. modified_urls = modify_urls(url)
  111. for modified_url in modified_urls:
  112. futures.append(executor.submit(is_url_accessible, modified_url))
  113. for future in concurrent.futures.as_completed(futures):
  114. result = future.result()
  115. if result:
  116. valid_urls.append(result)
  117. for url in valid_urls:
  118. print(url)
  119. # 遍历网址列表,获取JSON文件并解析
  120. for url in valid_urls:
  121. try:
  122. # 发送GET请求获取JSON文件,设置超时时间为0.5秒
  123. ip_start_index = url.find("//") + 2
  124. ip_dot_start = url.find(".") + 1
  125. ip_index_second = url.find("/", ip_dot_start)
  126. base_url = url[:ip_start_index] # http:// or https://
  127. ip_address = url[ip_start_index:ip_index_second]
  128. url_x = f"{base_url}{ip_address}"
  129. json_url = f"{url}"
  130. response = requests.get(json_url, timeout=0.5)
  131. json_data = response.json()
  132. try:
  133. # 解析JSON文件,获取name和url字段
  134. for item in json_data['data']:
  135. if isinstance(item, dict):
  136. name = item.get('name')
  137. urlx = item.get('url')
  138. if ',' in urlx:
  139. urlx=f"aaaaaaaa"
  140. #if 'http' in urlx or 'udp' in urlx or 'rtp' in urlx:
  141. if 'http' in urlx:
  142. urld = f"{urlx}"
  143. else:
  144. urld = f"{url_x}{urlx}"
  145. if name and urld:
  146. # 删除特定文字
  147. name = name.replace("cctv", "CCTV")
  148. name = name.replace("中央", "CCTV")
  149. name = name.replace("央视", "CCTV")
  150. name = name.replace("高清", "")
  151. name = name.replace("超高", "")
  152. name = name.replace("HD", "")
  153. name = name.replace("标清", "")
  154. name = name.replace("频道", "")
  155. name = name.replace("-", "")
  156. name = name.replace(" ", "")
  157. name = name.replace("PLUS", "+")
  158. name = name.replace("+", "+")
  159. name = name.replace("(", "")
  160. name = name.replace(")", "")
  161. name = re.sub(r"CCTV(\d+)台", r"CCTV\1", name)
  162. name = name.replace("CCTV1综合", "CCTV1")
  163. name = name.replace("CCTV2财经", "CCTV2")
  164. name = name.replace("CCTV3综艺", "CCTV3")
  165. name = name.replace("CCTV4国际", "CCTV4")
  166. name = name.replace("CCTV4中文国际", "CCTV4")
  167. name = name.replace("CCTV4欧洲", "CCTV4")
  168. name = name.replace("CCTV5体育", "CCTV5")
  169. name = name.replace("CCTV6电影", "CCTV6")
  170. name = name.replace("CCTV7军事", "CCTV7")
  171. name = name.replace("CCTV7军农", "CCTV7")
  172. name = name.replace("CCTV7农业", "CCTV7")
  173. name = name.replace("CCTV7国防军事", "CCTV7")
  174. name = name.replace("CCTV8电视剧", "CCTV8")
  175. name = name.replace("CCTV9记录", "CCTV9")
  176. name = name.replace("CCTV9纪录", "CCTV9")
  177. name = name.replace("CCTV10科教", "CCTV10")
  178. name = name.replace("CCTV11戏曲", "CCTV11")
  179. name = name.replace("CCTV12社会与法", "CCTV12")
  180. name = name.replace("CCTV13新闻", "CCTV13")
  181. name = name.replace("CCTV新闻", "CCTV13")
  182. name = name.replace("CCTV14少儿", "CCTV14")
  183. name = name.replace("CCTV15音乐", "CCTV15")
  184. name = name.replace("CCTV16奥林匹克", "CCTV16")
  185. name = name.replace("CCTV17农业农村", "CCTV17")
  186. name = name.replace("CCTV17农业", "CCTV17")
  187. name = name.replace("CCTV5+体育赛视", "CCTV5+")
  188. name = name.replace("CCTV5+体育赛事", "CCTV5+")
  189. name = name.replace("CCTV5+体育", "CCTV5+")
  190. if 'udp' not in urld or 'rtp' not in urld:
  191. results.append(f"{name},{urld}")
  192. except:
  193. continue
  194. except:
  195. continue
  196. except:
  197. continue
  198. results = set(results) # 去重得到唯一的URL列表
  199. results = sorted(results)
  200. with open("itv.txt", 'w', encoding='utf-8') as file:
  201. for result in results:
  202. file.write(result + "\n")
  203. print(result)