import requests from bs4 import BeautifulSoup import re from base.spider import Spider import sys import json import base64 import urllib.parse from Crypto.Cipher import ARC4 from Crypto.Util.Padding import unpad import binascii sys.path.append('..') xurl = "https://www.fullhd.xxx/zh/" headerx = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36' } pm = '' class Spider(Spider): global xurl global headerx def getName(self): return "首页" def init(self, extend): pass def isVideoFormat(self, url): pass def manualVideoCheck(self): pass def extract_middle_text(self, text, start_str, end_str, pl, start_index1: str = '', end_index2: str = ''): if pl == 3: plx = [] while True: start_index = text.find(start_str) if start_index == -1: break end_index = text.find(end_str, start_index + len(start_str)) if end_index == -1: break middle_text = text[start_index + len(start_str):end_index] plx.append(middle_text) text = text.replace(start_str + middle_text + end_str, '') if len(plx) > 0: purl = '' for i in range(len(plx)): matches = re.findall(start_index1, plx[i]) output = "" for match in matches: match3 = re.search(r'(?:^|[^0-9])(\d+)(?:[^0-9]|$)', match[1]) if match3: number = match3.group(1) else: number = 0 if 'http' not in match[0]: output += f"#{'📽️' + match[1]}${number}{xurl}{match[0]}" else: output += f"#{'📽️' + match[1]}${number}{match[0]}" output = output[1:] purl = purl + output + "$$$" purl = purl[:-3] return purl else: return "" else: start_index = text.find(start_str) if start_index == -1: return "" end_index = text.find(end_str, start_index + len(start_str)) if end_index == -1: return "" if pl == 0: middle_text = text[start_index + len(start_str):end_index] return middle_text.replace("\\", "") if pl == 1: middle_text = text[start_index + len(start_str):end_index] matches = re.findall(start_index1, middle_text) if matches: jg = ' '.join(matches) return jg if pl == 2: middle_text = text[start_index + len(start_str):end_index] matches = re.findall(start_index1, middle_text) if matches: new_list = [f'✨{item}' for item in matches] jg = '$$$'.join(new_list) return jg def homeContent(self, filter): result = {} result = {"class": [ {"type_id": "latest-updates", "type_name": "最新视频🌠"}, {"type_id": "top-rated", "type_name": "最佳视频🌠"}, {"type_id": "most-popular", "type_name": "热门影片🌠"}, {"type_id": "networks/brazzers-com", "type_name": "Brazzers🌠"}, {"type_id": "networks/tushy-com", "type_name": "Tushy🌠"}, {"type_id": "networks/naughtyamerica-com", "type_name": "Naughtyamerica🌠"}, {"type_id": "sites/sexmex", "type_name": "Sexmex🌠"}, {"type_id": "sites/passion-hd", "type_name": "Passion-HD🌠"}, {"type_id": "categories/animation", "type_name": "Animation🌠"}, {"type_id": "categories/18-years-old", "type_name": "Teen🌠"}, {"type_id": "categories/pawg", "type_name": "Pawg🌠"}, {"type_id": "categories/thong", "type_name": "Thong🌠"}, {"type_id": "categories/stockings", "type_name": "Stockings🌠"}, {"type_id": "categories/jav-uncensored", "type_name": "JAV🌠"}, {"type_id": "categories/pantyhose", "type_name": "Pantyhose🌠"} ], } return result def homeVideoContent(self): videos = [] try: detail = requests.get(url=xurl, headers=headerx) detail.encoding = "utf-8" res = detail.text doc = BeautifulSoup(res, "lxml") # Get videos from different sections sections = { "latest-updates": "最新视频", "top-rated": "最佳视频", "most-popular": "热门影片" } for section_id, section_name in sections.items(): section = doc.find('div', id=f"list_videos_videos_watched_right_now_items") if not section: continue vods = section.find_all('div', class_="item") for vod in vods: names = vod.find_all('a') name = names[0]['title'] if names and 'title' in names[0].attrs else section_name ids = vod.find_all('a') id = ids[0]['href'] if ids else "" pics = vod.find('img', class_="lazyload") pic = pics['data-src'] if pics and 'data-src' in pics.attrs else "" if pic and 'http' not in pic: pic = xurl + pic remarks = vod.find('span', class_="duration") remark = remarks.text.strip() if remarks else "" video = { "vod_id": id, "vod_name": name, "vod_pic": pic, "vod_remarks": remark } videos.append(video) result = {'list': videos} return result except Exception as e: print(f"Error in homeVideoContent: {str(e)}") return {'list': []} def categoryContent(self, cid, pg, filter, ext): result = {} videos = [] try: if pg and int(pg) > 1: url = f'{xurl}/{cid}/{pg}/' else: url = f'{xurl}/{cid}/' detail = requests.get(url=url, headers=headerx) detail.encoding = "utf-8" res = detail.text doc = BeautifulSoup(res, "lxml") section = doc.find('div', class_="list-videos") if section: vods = section.find_all('div', class_="item") for vod in vods: names = vod.find_all('a') name = names[0]['title'] if names and 'title' in names[0].attrs else "" ids = vod.find_all('a') id = ids[0]['href'] if ids else "" pics = vod.find('img', class_="lazyload") pic = pics['data-src'] if pics and 'data-src' in pics.attrs else "" if pic and 'http' not in pic: pic = xurl + pic remarks = vod.find('span', class_="duration") remark = remarks.text.strip() if remarks else "" video = { "vod_id": id, "vod_name": name, "vod_pic": pic, "vod_remarks": remark } videos.append(video) except Exception as e: print(f"Error in categoryContent: {str(e)}") result = { 'list': videos, 'page': pg, 'pagecount': 9999, 'limit': 90, 'total': 999999 } return result def detailContent(self, ids): global pm did = ids[0] result = {} videos = [] playurl = '' if 'http' not in did: did = xurl + did res1 = requests.get(url=did, headers=headerx) res1.encoding = "utf-8" res = res1.text content = '👉' + self.extract_middle_text(res,'

','

', 0) yanuan = self.extract_middle_text(res, 'Pornstars:','',1, 'href=".*?">(.*?)') bofang = did videos.append({ "vod_id": did, "vod_actor": yanuan, "vod_director": '', "vod_content": content, "vod_play_from": '💗FullHD💗', "vod_play_url": bofang }) result['list'] = videos return result def playerContent(self, flag, id, vipFlags): parts = id.split("http") xiutan = 0 if xiutan == 0: if len(parts) > 1: before_https, after_https = parts[0], 'http' + parts[1] res = requests.get(url=after_https, headers=headerx) res = res.text url2 = self.extract_middle_text(res, '', 0).replace('\\', '') soup = BeautifulSoup(url2, 'html.parser') first_source = soup.find('source') src_value = first_source.get('src') response = requests.head(src_value, allow_redirects=False) if response.status_code == 302: redirect_url = response.headers['Location'] response = requests.head(redirect_url, allow_redirects=False) if response.status_code == 302: redirect_url = response.headers['Location'] result = {} result["parse"] = xiutan result["playUrl"] = '' result["url"] = redirect_url result["header"] = headerx return result def searchContentPage(self, key, quick, page): result = {} videos = [] if not page: page = '1' if page == '1': url = f'{xurl}/search/{key}/' else: url = f'{xurl}/search/{key}/{str(page)}/' try: detail = requests.get(url=url, headers=headerx) detail.encoding = "utf-8" res = detail.text doc = BeautifulSoup(res, "lxml") section = doc.find('div', class_="list-videos") if section: vods = section.find_all('div', class_="item") for vod in vods: names = vod.find_all('a') name = names[0]['title'] if names and 'title' in names[0].attrs else "" ids = vod.find_all('a') id = ids[0]['href'] if ids else "" pics = vod.find('img', class_="lazyload") pic = pics['data-src'] if pics and 'data-src' in pics.attrs else "" if pic and 'http' not in pic: pic = xurl + pic remarks = vod.find('span', class_="duration") remark = remarks.text.strip() if remarks else "" video = { "vod_id": id, "vod_name": name, "vod_pic": pic, "vod_remarks": remark } videos.append(video) except Exception as e: print(f"Error in searchContentPage: {str(e)}") result = { 'list': videos, 'page': page, 'pagecount': 9999, 'limit': 90, 'total': 999999 } return result def searchContent(self, key, quick): return self.searchContentPage(key, quick, '1') def localProxy(self, params): if params['type'] == "m3u8": return self.proxyM3u8(params) elif params['type'] == "media": return self.proxyMedia(params) elif params['type'] == "ts": return self.proxyTs(params) return None