上传文件至 m/lib
This commit is contained in:
parent
321f468da2
commit
38785cd343
2 changed files with 288 additions and 0 deletions
174
m/lib/小丑撸.json
Normal file
174
m/lib/小丑撸.json
Normal file
|
|
@ -0,0 +1,174 @@
|
|||
{
|
||||
//发布页https://jokerlus.top/fabu/
|
||||
//https://fdiy37iy.zero-jokerlu.buzz
|
||||
//https://震巽.jokerlu.homes
|
||||
"规则名": "小丑撸av-XYQHiker",
|
||||
"规则作者": "飞鱼",
|
||||
"请求头参数": "PC_UA",
|
||||
"网页编码格式": "UTF-8",
|
||||
"图片是否需要代理": "0",
|
||||
"是否开启获取首页数据": "1",
|
||||
"首页推荐链接": "https://12noiq413c.jokerlu-wind.buzz/index.php/vodtype/",
|
||||
"首页列表数组规则": ".recommended",
|
||||
"首页片单列表数组规则": ".col-md-2",
|
||||
"首页片单是否Jsoup写法": "1",
|
||||
"首页片单标题": ".title&&Text",
|
||||
"首页片单链接": "a&&href",
|
||||
"首页片单图片": "img&&data-src",
|
||||
"首页片单副标题": "'📅'+.time&&Text",
|
||||
"首页片单链接加前缀": "https://12noiq413c.jokerlu-wind.buzz",
|
||||
"首页片单链接加后缀": "",
|
||||
"分类起始页码": "1",
|
||||
//"分类链接": "https://hscangku.com/vodtype/{cateId}-{catePg}/",
|
||||
"分类链接": "https://12noiq413c.jokerlu-wind.buzz/index.php/vodtype/{cateId}-{catePg}.html",
|
||||
"分类名称": "全部视频&HongKongDoll&国产传媒&国产视频&日本视频&泰国视频&欧美视频&动画视频&中文字幕&VR&韩国视频",
|
||||
"分类名称替换词": "0&133&115&1&2&84&5&49&9&3&4",
|
||||
"分类截取模式": "1",
|
||||
"分类列表数组规则": ".recommended&&.col-md-2",
|
||||
"分类片单是否Jsoup写法": "1",
|
||||
"分类片单标题": ".title&&Text",
|
||||
"分类片单链接": "a&&href",
|
||||
"分类片单图片": ".resent-grid-img&&img&&data-src",
|
||||
"分类片单副标题": "'📅'+.time&&p&&Text+'🔥'+.views&&Text",
|
||||
"分类片单链接加前缀": "https://12noiq413c.jokerlu-wind.buzz",
|
||||
"分类片单链接加后缀": "",
|
||||
"搜索请求头参数": "User-Agent$PC_UA",
|
||||
"搜索链接": "https://12noiq413c.jokerlu-wind.buzz/index.php/ajax/suggest?mid=1&wd={wd}",
|
||||
"POST请求数据": "",
|
||||
"搜索截取模式": "0",
|
||||
"搜索列表数组规则": "list",
|
||||
"搜索片单是否Jsoup写法": "1",
|
||||
"搜索片单图片": "pic",
|
||||
"搜索片单标题": "name",
|
||||
"搜索片单链接": "id",
|
||||
"搜索片单副标题": "",
|
||||
"搜索片单链接加前缀": "https://12noiq413c.jokerlu-wind.buzz/index.php/vodplay/",
|
||||
"搜索片单链接加后缀": "-1-1.html",
|
||||
"链接是否直接播放": "1",
|
||||
"直接播放链接加前缀": "",
|
||||
"直接播放链接加后缀": "",
|
||||
"直接播放直链视频请求头": "",
|
||||
|
||||
"筛选数据":{
|
||||
"115":[
|
||||
{"key":"cateId","name":"分类","value":[
|
||||
{"v":"115","n":"全部"},
|
||||
{"v":"121","n":"麻豆视频"},
|
||||
{"v":"122","n":"91制片厂"},
|
||||
{"v":"123","n":"天美传媒"},
|
||||
{"v":"124","n":"蜜桃传媒"},
|
||||
{"v":"125","n":"皇家华人"},
|
||||
{"v":"126","n":"星空传媒"},
|
||||
{"v":"127","n":"精东影业"},
|
||||
{"v":"128","n":"乐播传媒"},
|
||||
{"v":"129","n":"91茄子"},
|
||||
{"v":"130","n":"性视界传媒"},
|
||||
{"v":"131","n":"兔子先生"},
|
||||
{"v":"132","n":"杏吧原创"},
|
||||
{"v":"133","n":"玩偶姐姐"},
|
||||
{"v":"134","n":"起点传媒"},
|
||||
{"v":"135","n":"SA国际传媒"},
|
||||
{"v":"136","n":"草莓猛料"},
|
||||
{"v":"137","n":"PsychoPorn"},
|
||||
{"v":"138","n":"糖心Vlog"},
|
||||
{"v":"139","n":"葫芦影业"},
|
||||
{"v":"140","n":"果冻传媒"}
|
||||
]
|
||||
}]
|
||||
,
|
||||
"1":[
|
||||
{"key":"cateId","name":"分类","value":[
|
||||
{"v":"1","n":"全部"},
|
||||
{"v":"10","n":"国产精品"},
|
||||
{"v":"11","n":"精品三级"},
|
||||
{"v":"12","n":"主播大秀"},
|
||||
{"v":"13","n":"抖阴视频"},
|
||||
{"v":"14","n":"国模私拍"},
|
||||
{"v":"15","n":"颜射瞬间"},
|
||||
{"v":"16","n":"女神学生"},
|
||||
{"v":"17","n":"美熟少妇"},
|
||||
{"v":"18","n":"娇妻素人"},
|
||||
{"v":"19","n":"空姐模特"},
|
||||
{"v":"20","n":"国产乱伦"},
|
||||
{"v":"26","n":"专题"},
|
||||
{"v":"21","n":"自慰群交"},
|
||||
{"v":"22","n":"野合车震"},
|
||||
{"v":"23","n":"职场同事"},
|
||||
{"v":"24","n":"国产名人"},
|
||||
{"v":"25","n":"网曝门事件"},
|
||||
{"v":"57","n":"偷拍自拍"},
|
||||
{"v":"99","n":"深夜保健室"},
|
||||
{"v":"119","n":"北京天使"}
|
||||
]
|
||||
}],
|
||||
"2":[
|
||||
{"key":"cateId","name":"分类","value":[
|
||||
{"v":"2","n":"全部"},
|
||||
{"v":"27","n":"骑兵有码"},
|
||||
{"v":"28","n":"步兵无码"},
|
||||
{"v":"50","n":"制服师生"},
|
||||
{"v":"51","n":"强奸乱伦"},
|
||||
{"v":"53","n":"人妻熟女"},
|
||||
{"v":"55","n":"三级剧情"},
|
||||
{"v":"56","n":"丝袜美腿"},
|
||||
{"v":"58","n":"亚洲情色"}
|
||||
]
|
||||
}],
|
||||
"84":[
|
||||
{"key":"cateId","name":"分类","value":[
|
||||
{"v":"84","n":"GoGoBar"},
|
||||
{"v":"85","n":"TukTukPatro"},
|
||||
{"v":"86","n":"泰国主播"},
|
||||
{"v":"88","n":"人妖偽娘"},
|
||||
{"v":"118","n":"TiTTiPorn"},
|
||||
{"v":"120","n":"ThaiSkter10"}
|
||||
]
|
||||
}],
|
||||
"5":[
|
||||
{"key":"cateId","name":"分类","value":[
|
||||
{"v":"5","n":"全部"},
|
||||
{"v":"29","n":"欧美性爱"},
|
||||
{"v":"93","n":"性爱音乐视频-PMV"},
|
||||
{"v":"30","n":"人兽"},
|
||||
{"v":"31","n":"人妖"},
|
||||
{"v":"95","n":"MomsTeachSex"},
|
||||
{"v":"32","n":"男同"},
|
||||
{"v":"33","n":"女同"},
|
||||
{"v":"83","n":"Fake Taxi"},
|
||||
{"v":"87","n":"Barzzers"},
|
||||
{"v":"117","n":"Wow Girls"},
|
||||
{"v":"116","n":"FamilyStrokes"}
|
||||
]
|
||||
}],
|
||||
"9":[
|
||||
{"key":"cateId","name":"分类","value":[
|
||||
{"v":"9","n":"全部"},
|
||||
{"v":"34","n":"无码中文"},
|
||||
{"v":"35","n":"强奸中文"},
|
||||
{"v":"36","n":"巨乳中文"},
|
||||
{"v":"37","n":"乱伦中文"},
|
||||
{"v":"38","n":"制服中文"},
|
||||
{"v":"39","n":"人妻中文"},
|
||||
{"v":"40","n":"调教中文"},
|
||||
{"v":"41","n":"出轨中文"},
|
||||
{"v":"59","n":"中文字幕"}
|
||||
]
|
||||
}],
|
||||
"4":[
|
||||
{"key":"cateId","name":"分类","value":[
|
||||
{"v":"4","n":"全部"},
|
||||
{"v":"42","n":"韩国精品"},
|
||||
{"v":"43","n":"韩国制服主播"},
|
||||
{"v":"44","n":"韩国萝莉主播"},
|
||||
{"v":"47","n":"韩国唯美三级"},
|
||||
{"v":"48","n":"韩国明星学生"}
|
||||
|
||||
]
|
||||
}]
|
||||
},
|
||||
|
||||
"分析MacPlayer": "0",
|
||||
"是否开启手动嗅探": "1",
|
||||
"手动嗅探视频链接关键词": ".m3u8",
|
||||
"手动嗅探视频链接过滤词": "baidu.com"
|
||||
}
|
||||
114
m/lib/糖心次元.py
Normal file
114
m/lib/糖心次元.py
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# @Author : Grok-4 Adapted & Optimized
|
||||
# @Time : 2025/10/22
|
||||
# @Note : 糖心次元极简爬虫(已修复转义 \/ 问题 & 韩国AV标题前缀)
|
||||
|
||||
import sys, urllib.parse, re, json
|
||||
from lxml import etree
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
|
||||
class Spider(Spider):
|
||||
def getName(self):
|
||||
return "糖心次元"
|
||||
|
||||
def init(self, extend):
|
||||
pass
|
||||
|
||||
def homeContent(self, filter):
|
||||
cate = {"传媒系列":"1","AV系列":"2","麻豆传媒":"5","糖心传媒":"6","精东影业":"7","蜜桃传媒":"8","果冻传媒":"9","星空无限":"10","天美传媒":"11","抠抠传媒":"12","星杏吧传媒":"13","性视界传媒":"14","SA国际传媒":"15","其他传媒":"16","国产-自拍-偷拍":"17","探花-主播-网红":"18","日本-中文字幕":"19","日本-无码流出":"20","日本-高清有码":"21","日本-东京热":"22","动漫-番中字":"23","变态-暗网-同恋":"24","欧美高清无码":"25","韩国av":"27"}
|
||||
return {'class': [{'type_name': k, 'type_id': v} for k, v in cate.items()]}
|
||||
|
||||
def homeVideoContent(self):
|
||||
return {}
|
||||
|
||||
# --------------- 通用解析 --------------- #
|
||||
def _parse(self, rsp):
|
||||
root = etree.HTML(rsp)
|
||||
videos = root.xpath('//li[contains(@class,"mb15") and .//a[contains(@href,"/vod/play/")]]')
|
||||
lst = []
|
||||
for v in videos:
|
||||
name = (v.xpath('.//h2/a/@title|.//h3/a/@title|.//p[contains(@class,"txt-ov")]/text()') or [''])[0].strip()
|
||||
# >>> 去韩国AV前缀:kbj-23010421标题 -> 标题
|
||||
name = re.sub(r'^[a-zA-Z]{2,}\-\d+\s*', '', name).strip()
|
||||
img = (v.xpath('.//img/@src') or [''])[0]
|
||||
if img and not img.startswith('http'):
|
||||
img = ('https:' + img) if img.startswith('//') else 'https://img1.souavzy.org' + img
|
||||
link = (v.xpath('.//a[contains(@href,"/vod/play/")]/@href') or [''])[0]
|
||||
if link and not link.startswith('http'):
|
||||
link = 'https://www.txsp.my' + link
|
||||
lst.append({'vod_name': name or '未知标题', 'vod_pic': img, 'vod_remarks': (v.xpath('.//span[contains(@class,"ico-left")]/text()') or [''])[0].strip(), 'vod_id': link})
|
||||
return lst
|
||||
|
||||
def categoryContent(self, tid, pg, filter, extend):
|
||||
url = f'https://www.txsp.my/index.php/vod/type/id/{tid}.html' if pg == '1' else f'https://www.txsp.my/index.php/vod/type/id/{tid}/page/{pg}.html'
|
||||
try:
|
||||
rsp = self.fetch(url).text
|
||||
lst = self._parse(rsp)
|
||||
pages = max([int(n) for n in re.findall(r'/page/(\d+)', rsp)] or [1])
|
||||
return {'list': lst, 'page': int(pg), 'pagecount': pages, 'limit': len(lst), 'total': 999999}
|
||||
except Exception as e:
|
||||
return {'list': [], 'page': int(pg), 'pagecount': 1, 'limit': 0, 'total': 0}
|
||||
|
||||
def detailContent(self, array):
|
||||
tid = array[0]
|
||||
url = tid if tid.startswith('http') else 'https://www.txsp.my' + tid
|
||||
try:
|
||||
rsp = self.fetch(url).text
|
||||
root = etree.HTML(rsp)
|
||||
title = (root.xpath('//h1/text()') or ['未知标题'])[0].strip()
|
||||
pic = (root.xpath('//meta[@property="og:image"]/@content|//img[contains(@src,"upload/vod")]/@src') or [''])[0]
|
||||
if pic and not pic.startswith('http'):
|
||||
pic = ('https:' + pic) if pic.startswith('//') else 'https://img1.souavzy.org' + pic
|
||||
play_url = self._extract(rsp)
|
||||
return {'list': [{'vod_id': tid, 'vod_name': title, 'vod_pic': pic, 'vod_content': title, 'vod_play_from': '糖心次元', 'vod_play_url': '播放$' + play_url if play_url else '播放$暂无播放地址'}]}
|
||||
except Exception as e:
|
||||
return {'list': []}
|
||||
|
||||
def _extract(self, html):
|
||||
html = html.replace(r'\/', '/') # 关键修复
|
||||
for pat in [r'var player_aaaa\s*=\s*({[^}]+})', r'player_aaaa\s*=\s*({[^}]+})', r'var player_data\s*=\s*({[^}]+})']:
|
||||
m = re.search(pat, html)
|
||||
if m:
|
||||
try:
|
||||
url = json.loads(m.group(1))['url']
|
||||
if url: return url
|
||||
except:
|
||||
continue
|
||||
src = re.search(r'<iframe[^>]+src="([^"]+souavzy[^"]+)"', html, re.I)
|
||||
if src:
|
||||
m3 = re.search(r'url=([^&]+)', src.group(1))
|
||||
if m3: return urllib.parse.unquote(m3.group(1))
|
||||
for url in re.findall(r'"(https?://[^"]+\.m3u8[^"]*)"', html):
|
||||
if 'souavzy' in url or 'qrtuv' in url: return url
|
||||
return ''
|
||||
|
||||
def searchContent(self, key, quick, pg="1"):
|
||||
url = f'https://www.txsp.my/index.php/vod/search/page/{pg}/wd/{urllib.parse.quote(key)}.html'
|
||||
try:
|
||||
return {'list': self._parse(self.fetch(url).text), 'page': int(pg), 'pagecount': 999, 'limit': 999, 'total': 999999}
|
||||
except:
|
||||
return {'list': [], 'page': int(pg), 'pagecount': 1, 'limit': 0, 'total': 0}
|
||||
|
||||
def playerContent(self, flag, id, vipFlags):
|
||||
if flag != "糖心次元":
|
||||
return {}
|
||||
if id.startswith('http') and ('.m3u8' in id or 'souavzy' in id):
|
||||
return {"parse": 0, "playUrl": '', "url": id, "header": {"User-Agent": "Mozilla/5.0", "Referer": "https://www.txsp.my/", "Origin": "https://www.txsp.my"}}
|
||||
try:
|
||||
url = id if id.startswith('http') else 'https://www.txsp.my' + id
|
||||
play_url = self._extract(self.fetch(url).text)
|
||||
if play_url:
|
||||
return {"parse": 0, "playUrl": '', "url": play_url, "header": {"User-Agent": "Mozilla/5.0", "Referer": "https://www.txsp.my/", "Origin": "https://www.txsp.my"}}
|
||||
except:
|
||||
pass
|
||||
return {"parse": 1, "playUrl": '', "url": id, "header": {"User-Agent": "Mozilla/5.0", "Referer": "https://www.txsp.my/", "Origin": "https://www.txsp.my"}}
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
pass
|
||||
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
|
||||
def localProxy(self, param):
|
||||
pass
|
||||
Loading…
Reference in a new issue