diff --git a/FGBLH/Web鱼壳海豚.json b/FGBLH/Web鱼壳海豚.json
index 69d6f68c..f8e0f21b 100644
--- a/FGBLH/Web鱼壳海豚.json
+++ b/FGBLH/Web鱼壳海豚.json
@@ -803,10 +803,10 @@
"api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/黑料网.py"
},
{
- "key": "采集聚合成人",
- "name": "🐬采集聚合成人.py|🔞[成人]",
+ "key": "真实人妻",
+ "name": "🐬真实人妻.py|🔞[成人]",
"type": 3,
- "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/采集聚合成人.py"
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/真实人妻.py"
},
{
"key": "猫咪TV",
@@ -940,6 +940,12 @@
"type": 3,
"api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/Jable.py"
},
+ {
+ "key": "AdultpornaAV",
+ "name": "🐬AdultpornaAV.py|🔞[成人]",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/AdultpornaAV.py"
+ },
{
"key": "Xvideos",
"name": "🐬Xvideos.py|🔞[成人]",
@@ -1006,9 +1012,15 @@
"type": 3,
"api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/麻豆免费在线播放.py"
},
+ {
+ "key": "采集聚合成人",
+ "name": "🐬采集聚合成人.py|🔞[采集成人]",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/采集聚合成人.py"
+ },
{
"key": "大地采集",
- "name": "🐬大地av|🔞[成人]",
+ "name": "🐬大地av|🔞[采集成人]",
"type": 0,
"api": "https://dadiapi.com/apple_m3u8.php",
"playUrl": "https://play.dadiapi.com/watch?url=",
diff --git a/FGBLH/Web鱼壳海豚py.json b/FGBLH/Web鱼壳海豚py.json
index bc31699c..b48db64e 100644
--- a/FGBLH/Web鱼壳海豚py.json
+++ b/FGBLH/Web鱼壳海豚py.json
@@ -546,10 +546,10 @@
"api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/黑料网.py"
},
{
- "key": "采集聚合成人",
- "name": "🐬采集聚合成人.py|🔞[成人]",
+ "key": "真实人妻",
+ "name": "🐬真实人妻.py|🔞[成人]",
"type": 3,
- "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/采集聚合成人.py"
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/真实人妻.py"
},
{
"key": "猫咪TV",
@@ -683,6 +683,12 @@
"type": 3,
"api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/Jable.py"
},
+ {
+ "key": "AdultpornaAV",
+ "name": "🐬AdultpornaAV.py|🔞[成人]",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/AdultpornaAV.py"
+ },
{
"key": "Xvideos",
"name": "🐬Xvideos.py|🔞[成人]",
@@ -748,7 +754,13 @@
"name": "🐬麻豆免费在线播放.py|🔞[成人]",
"type": 3,
"api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/麻豆免费在线播放.py"
- }
+ },
+ {
+ "key": "采集聚合成人",
+ "name": "🐬采集聚合成人.py|🔞[采集成人]",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/采集聚合成人.py"
+ },
],
"lives": [
{
diff --git a/FGBLH/ok海豚.json b/FGBLH/ok海豚.json
index a077e7ff..ef50ac93 100644
--- a/FGBLH/ok海豚.json
+++ b/FGBLH/ok海豚.json
@@ -735,18 +735,18 @@
"type": 3,
"api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/黑料网.py"
},
- {
- "key": "采集聚合成人",
- "name": "🐬采集聚合成人.py|🔞",
- "type": 3,
- "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/采集聚合成人.py"
- },
{
"key": "mtvm",
"name": "🐬蜜桃视频.py(羊壳观看)|🔞",
"type": 3,
"api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/蜜桃视频.py"
},
+ {
+ "key": "真实人妻",
+ "name": "🐬真实人妻.py|🔞",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/真实人妻.py"
+ },
{
"key": "猫咪TV",
"name": "🐬猫咪TV.py|🔞",
@@ -879,6 +879,12 @@
"type": 3,
"api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/Jable.py"
},
+ {
+ "key": "AdultpornaAV",
+ "name": "🐬AdultpornaAV.py|🔞",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/AdultpornaAV.py"
+ },
{
"key": "Xvideos",
"name": "🐬Xvideos.py|🔞",
@@ -945,6 +951,12 @@
"type": 3,
"api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/麻豆免费在线播放.py"
},
+ {
+ "key": "采集聚合成人",
+ "name": "🐬采集聚合成人|🔞",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/采集聚合成人.py"
+ },
{
"key": "大地采集",
"name": "🐬大地av|🔞",
diff --git a/FGBLH/ok海豚py.json b/FGBLH/ok海豚py.json
index 065c7af1..2c601411 100644
--- a/FGBLH/ok海豚py.json
+++ b/FGBLH/ok海豚py.json
@@ -568,18 +568,18 @@
"type": 3,
"api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/黑料网.py"
},
- {
- "key": "采集聚合成人",
- "name": "🐬采集聚合成人.py|🔞",
- "type": 3,
- "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/采集聚合成人.py"
- },
{
"key": "mtvm",
"name": "🐬蜜桃视频.py(羊壳观看)|🔞",
"type": 3,
"api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/蜜桃视频.py"
},
+ {
+ "key": "真实人妻",
+ "name": "🐬真实人妻.py|🔞",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/真实人妻.py"
+ },
{
"key": "猫咪TV",
"name": "🐬猫咪TV.py|🔞",
@@ -712,6 +712,12 @@
"type": 3,
"api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/Jable.py"
},
+ {
+ "key": "AdultpornaAV",
+ "name": "🐬AdultpornaAV.py|🔞",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/AdultpornaAV.py"
+ },
{
"key": "Xvideos",
"name": "🐬Xvideos.py|🔞",
@@ -777,6 +783,12 @@
"name": "🐬麻豆免费在线播放.py|🔞",
"type": 3,
"api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/麻豆免费在线播放.py"
+ },
+ {
+ "key": "采集聚合成人",
+ "name": "🐬采集聚合成人.py|🔞",
+ "type": 3,
+ "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/py/采集聚合成人.py"
}
],
"parses": [
diff --git a/FGBLH/py/AdultpornaAV.py b/FGBLH/py/AdultpornaAV.py
new file mode 100644
index 00000000..330ecec8
--- /dev/null
+++ b/FGBLH/py/AdultpornaAV.py
@@ -0,0 +1,118 @@
+# -*- coding: utf-8 -*-
+import re,json,requests
+from urllib.parse import quote,urljoin
+try:
+ from base.spider import Spider as BaseSpider
+except Exception:
+ class BaseSpider:
+ def __init__(self):
+ return None
+
+class Spider(BaseSpider):
+ def __init__(self):
+ self.host='https://www.adultporna-av107.com'
+ self.session=requests.Session()
+ self.headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36','Referer':self.host+'/zzzz','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'}
+ self.classes=[('每日最新','/topic/'),('国产视频','/t/163/'),('网曝黑料','/t/232/'),('主播大秀','/t/236/'),('AV解说','/t/233/'),('国产自拍','/t/48/'),('抖阴视频','/t/231/'),('国模私拍','/t/45/'),('空姐模特','/t/67/'),('91制片厂','/t/131/'),('糖心VLOG','/t/128/'),('日本有码','/label/sortjp/'),('国产传媒','/label/sortcnseries/'),('番号专区','/label/sortseries/')]
+
+ def init(self,extend=''):
+ return None
+
+ def getName(self):
+ return 'AdultPorna'
+
+ def isVideoFormat(self,url):
+ return str(url).split('?')[0].lower().endswith(('.m3u8','.mp4','.flv','.avi','.mkv','.mov'))
+
+ def manualVideoCheck(self):
+ return True
+
+ def destroy(self):
+ return None
+
+ def _get(self,url):
+ u=url if str(url).startswith('http') else urljoin(self.host,url)
+ r=self.session.get(u,headers=self.headers,timeout=15,verify=False)
+ r.encoding=r.apparent_encoding or 'utf-8'
+ return r.text
+
+ def _url(self,u):
+ return urljoin(self.host,u.replace('\\/','/')) if u else ''
+
+ def _txt(self,s):
+ return re.sub(r'\s+',' ',re.sub(r'<[^>]+>',' ',s or '')).strip()
+
+ def _pic(self,s):
+ m=re.search(r']+(?:data-original|data-src|data-lazyload|src)=["\']([^"\']+)["\']',s,re.I)
+ return self._url(m.group(1)) if m else ''
+
+ def _parse_list(self,html):
+ arr=[];seen=set()
+ blocks=re.findall(r']+href=["\'](/voddetail/(\d+)/?)["\'][^>]*>.*?',html,re.I|re.S)
+ for href,vid in blocks:
+ if vid in seen: continue
+ i=html.find(href);chunk=html[max(0,i-800):i+2500]
+ tm=re.search(r']+href=["\']'+re.escape(href)+r'["\'][^>]*(?:title=["\']([^"\']+)["\'])?',chunk,re.I|re.S)
+ am=re.search(r'
]+alt=["\']([^"\']+)["\']',chunk,re.I)
+ name=(tm.group(1) if tm and tm.group(1) else '') or (am.group(1) if am else '') or vid
+ sm=re.search(r']*>(.*?)',chunk,re.I|re.S)
+ arr.append({'vod_id':vid,'vod_name':self._txt(name),'vod_pic':self._pic(chunk),'vod_remarks':self._txt(sm.group(1)) if sm else ''})
+ seen.add(vid)
+ return arr
+
+ def homeContent(self,filter=False):
+ html=self._get('/zzzz')
+ return {'class':[{'type_id':i,'type_name':n} for n,i in self.classes],'list':self._parse_list(html),'filters':{}}
+
+ def homeVideoContent(self):
+ return {'list':self._parse_list(self._get('/zzzz'))}
+
+ def categoryContent(self,tid,pg,filter,extend):
+ tid=str(tid);pg=str(pg or '1')
+ path=tid if tid.startswith('/') else '/t/'+tid.strip('/')+'/'
+ if pg!='1': path=path.rstrip('/')+'/page/'+pg+'/'
+ html=self._get(path)
+ data=self._parse_list(html)
+ return {'list':data,'page':int(pg),'pagecount':999 if data else int(pg),'limit':24,'total':999999}
+
+ def detailContent(self,ids):
+ vid=str(ids[0]).strip('/').split('/')[-1]
+ html=self._get('/voddetail/'+vid+'/')
+ name='';pic='';content=''
+ for p in [r']+property=["\']og:title["\'][^>]+content=["\']([^"\']+)["\']',r'
]*>(.*?)
',r'title=["\']([^"\']+)["\']']:
+ m=re.search(p,html,re.I|re.S)
+ if m and self._txt(m.group(1)): name=self._txt(m.group(1));break
+ m=re.search(r']+property=["\']og:image["\'][^>]+content=["\']([^"\']+)["\']',html,re.I)
+ pic=self._url(m.group(1)) if m else self._pic(html)
+ em=re.search(r'(?:剧情|简介|介绍|详情)[^<]*[^>]+>\s*<[^>]+>(.*?)',html,re.I|re.S)
+ content=self._txt(em.group(1)) if em else name
+ plays=[]
+ for href in re.findall(r'href=["\'](/v/'+re.escape(vid)+r'/?[^"\']*)["\']',html,re.I):
+ if href not in plays: plays.append(href)
+ if not plays: plays=['/v/'+vid+'/']
+ vod={'vod_id':vid,'vod_name':name or vid,'vod_pic':pic,'type_name':'','vod_year':'','vod_area':'','vod_remarks':'','vod_actor':'','vod_director':'','vod_content':content,'vod_play_from':'播放','vod_play_url':'#'.join(['第%d集$%s'%(i+1,self._url(u)) for i,u in enumerate(plays)])}
+ return {'list':[vod]}
+
+ def searchContent(self,key,quick,pg='1'):
+ html=self._get('/s/?wd='+quote(str(key)))
+ data=self._parse_list(html)
+ return {'list':data,'page':int(pg or 1),'pagecount':1,'limit':24,'total':len(data)}
+
+ def playerContent(self,flag,id,vipFlags):
+ pid=str(id)
+ url=pid if pid.startswith('http') else self._url('/v/'+pid.strip('/').split('/')[-1]+'/')
+ if self.isVideoFormat(url): return {'parse':0,'playUrl':'','url':url,'header':self.headers}
+ html=self._get(url)
+ m=re.search(r'player_aaaa\s*=\s*(\{.*?\})\s*<',html,re.I|re.S) or re.search(r'player_aaaa\s*=\s*(\{.*?\})',html,re.I|re.S)
+ play=''
+ if m:
+ try:
+ play=json.loads(m.group(1).replace('\\/','/')).get('url','')
+ except json.JSONDecodeError:
+ mm=re.search(r'["\']url["\']\s*:\s*["\']([^"\']+)["\']',m.group(1));play=mm.group(1).replace('\\/','/') if mm else ''
+ if not play:
+ mm=re.search(r'(https?:\\?/\\?/[^"\']+?\.(?:m3u8|mp4)[^"\']*)',html,re.I);play=mm.group(1).replace('\\/','/') if mm else url
+ return {'parse':0 if self.isVideoFormat(play) else 1,'playUrl':'','url':play,'header':self.headers}
+
+ def localProxy(self,param):
+ return [404,'text/plain','']
\ No newline at end of file
diff --git a/FGBLH/py/男同网.py b/FGBLH/py/男同网.py
new file mode 100644
index 00000000..afda16c4
--- /dev/null
+++ b/FGBLH/py/男同网.py
@@ -0,0 +1,228 @@
+# -*- coding: utf-8 -*-
+import re
+import urllib.parse
+import requests
+
+try:
+ from base.spider import Spider as BaseSpider
+except ImportError:
+ class BaseSpider:
+ pass
+
+class Spider(BaseSpider):
+ BASE_URL = "https://91nt.com"
+ FALLBACK_URLS = ["https://91nt.com"]
+ HEADERS = {
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
+ "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
+ "Referer": BASE_URL + "/",
+ }
+
+ def __init__(self):
+ super().__init__()
+ self.name = "91NT"
+ self.session = requests.Session()
+ self.session.headers.update(self.HEADERS)
+ self._class_cache = None
+
+ def init(self, extend="{}"):
+ return None
+
+ def getName(self):
+ return self.name
+
+ def homeContent(self, filter):
+ html = self._get(self.BASE_URL + "/videos")
+ return {"class": self._classes(), "filters": {}, "list": self._parse_list(html), "parse": 0, "jx": 0}
+
+ def homeVideoContent(self):
+ return {"list": self._parse_list(self._get(self.BASE_URL + "/videos"))}
+
+ def categoryContent(self, tid, pg, filter, extend):
+ page = self._to_int(pg, 1)
+ path = str(tid or "/videos").strip()
+ url = self._fix_url(path if path.startswith("http") else self.BASE_URL + (path if path.startswith("/") else "/" + path))
+ url = url if page <= 1 else url + ("&page=" if "?" in url else "?page=") + str(page)
+ data = self._parse_list(self._get(url))
+ return {"page": page, "pagecount": page if len(data) < 12 else page + 1, "limit": 24, "total": 99999, "list": data, "parse": 0, "jx": 0}
+
+ def detailContent(self, ids):
+ result = {"list": [], "parse": 0, "jx": 0}
+ if not ids:
+ return result
+ url = self._fix_url(ids[0] if str(ids[0]).startswith("http") else self.BASE_URL + "/" + str(ids[0]).strip("/"))
+ html = self._get(url)
+ name = self._clean(self._match(html, r']+property=["\']og:title["\'][^>]+content=["\']([^"\']+)') or self._match(html, r'"title"\s*:\s*"([^"]+)') or self._match(html, r']+(?:data-original|data-src|data-lazy-src|data-lazyload|src)=["\']([^"\']+)')
+ content = self._clean(self._match(html, r']+property=["\']og:description["\'][^>]+content=["\']([^"\']+)') or self._match(html, r']+name=["\']description["\'][^>]+content=["\']([^"\']+)') or name)
+ duration = self._match(html, r']+property=["\']video:duration["\'][^>]+content=["\']([^"\']+)')
+ year = self._match(html, r']+property=["\']video:release_date["\'][^>]+content=["\']([^"\']+)')[:10]
+ tags = ",".join([self._clean(x) for x in re.findall(r']+property=["\']video:tag["\'][^>]+content=["\']([^"\']+)', html, re.S | re.I)])
+ play = self._play_url(url, html) or url
+ result["list"].append({"vod_id": url, "vod_name": name, "vod_pic": urllib.parse.urljoin(self.BASE_URL, pic), "type_name": tags, "vod_year": year, "vod_area": "", "vod_remarks": self._dur(duration), "vod_actor": tags, "vod_director": "", "vod_content": content, "vod_play_from": "91NT", "vod_play_url": "正片$" + play})
+ return result
+
+ def searchContent(self, key, quick, pg="1"):
+ page = self._to_int(pg, 1)
+ q = urllib.parse.quote(str(key))
+ url = self.BASE_URL + "/videos/search/" + q
+ url = url if page <= 1 else url + "?page=" + str(page)
+ data = self._parse_list(self._get(url))
+ return {"page": page, "pagecount": page if len(data) < 12 else page + 1, "limit": 24, "total": 99999, "list": data, "parse": 0, "jx": 0}
+
+ def playerContent(self, flag, id, vipFlags):
+ result = {"parse": 0, "playUrl": "", "url": id or "", "jx": 0, "header": {"User-Agent": self.HEADERS["User-Agent"], "Referer": self.BASE_URL + "/"}}
+ if not id:
+ return result
+ if ".m3u8" in id or ".mp4" in id:
+ return result
+ play_page = self._fix_url(id if str(id).startswith("http") else self.BASE_URL + "/" + str(id).strip("/"))
+ html = self._get(play_page)
+ play = self._play_url(play_page, html)
+ if play:
+ result["url"] = play
+ result["header"] = {"User-Agent": self.HEADERS["User-Agent"], "Referer": play_page, "Origin": self.BASE_URL}
+ else:
+ result["url"] = play_page
+ result["parse"] = 1
+ return result
+
+ def localProxy(self, params):
+ return None
+
+ def _classes(self, html=None):
+ if self._class_cache:
+ return self._class_cache
+ self._class_cache = [
+ {"type_id": "/videos", "type_name": "精选影片"},
+ {"type_id": "/videos/category/rhgv", "type_name": "日韩专区"},
+ {"type_id": "/videos/category/omjd", "type_name": "欧美专区"},
+ {"type_id": "/videos/all/xiaolan", "type_name": "原创专区"},
+ {"type_id": "/videos/all/20min", "type_name": "长片专区"},
+ {"type_id": "/videos/all/10min", "type_name": "短片速看"},
+ ]
+ return self._class_cache
+
+ def _parse_list(self, html):
+ data, seen = [], set()
+ for block in re.findall(r'(\{[^{}]*"@type"\s*:\s*"VideoObject"[\s\S]*?\})', html or "", re.S | re.I):
+ name = self._clean(self._j(block, "name"))
+ href = self._j(block, "url") or self._j(block, "embedUrl")
+ pic = self._j(block, "thumbnailUrl")
+ if href and "/videos/" in href and href not in seen:
+ seen.add(href)
+ data.append({"vod_id": self._fix_url(href), "vod_name": name, "vod_pic": urllib.parse.urljoin(self.BASE_URL, pic), "vod_remarks": self._dur(self._j(block, "duration"))})
+ cards = re.findall(r'(]+href=["\'][^"\']*/videos/vd-[^"\']+["\'][\s\S]{0,2500}?)', html or "", re.S | re.I)
+ if not cards:
+ cards = re.findall(r'(