上传文件至「xbpq」

This commit is contained in:
2026-08-14 11:28:22 +02:00
parent 84e5c55c6b
commit 878c0b23ca
3 changed files with 299 additions and 0 deletions
+30
View File
@@ -0,0 +1,30 @@
{
"作者": "h",
"站名": "一起草自动挡",
"请求头": "User-Agent@Mozilla/5.0 (Linux;; Android 16;; 2510DRK44C Build/BP2A.250605.031.A3) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/143.0.7499.192 Mobile Safari/537.36",
"发布页": "https://91fby.cc/91a/",
"域名-c": "{{发布页}}[工具:源码#<a href=\"截取\"]",
"主页url": "{{域名-c}}[替换:/vod>>/]",
"数组": "<div class=\"video-item\">&&<div class=\"video-preview w-full h-full left-0 top-0\">[不包含:_type=\"data-src\">]||黑料--<ul class=\"grid grid-cols-1 gap-2.5 md:gap-4\">&&<div class=\"flex justify-center w-full overflow-hidden mt-3 md:mt-5\">分割(后:</article>)||📌女优--<li class=\"group\">&&<div class=\"truncate\">||📌热门词条--<li class=\"flex mr-2.5 md:mr-5 last:mr-0 mb-2.5 md:mb-5\">&&</li>",
"标题": "alt=\"&&\"||黑料--<h2 class=\"text-xl mb-1 md:mb-2.5 post-item-title\">&&</h2>||📌女优--alt=\"&&\"||📌热门词条--href=\"*\">&&</a>",
"副标题": "<div class=\"text-sm opacity-50 py-0.5 px-1.5 bg-black rounded-large text-white\">&&</div>||黑料--<span>&&</span>",
"图片": "data-src=\"&&\"||黑料--style=\"background-image:*url(\"&&\")||📌女优--data-src=\"&&\"",
"链接": "href=\"&&\"||黑料--<a href=\"&&\"||📌女优--href=\"&&\"+?page={catePg}||📌热门词条--https://haijiaod.life/search/keyword/page/{catePg}/+href=\"/search/keyword/&&\"",
"简介": "",
"嗅探词": ".m3u8",
"跳转播放链接": "const source*=*'&&'",
"直接播放": "1",
"搜索模式": "1",
"二级目录": "📌女优,📌热门词条|folder-0-0-H",
"二级ID": "",
"特殊分类链接": "国产,日本,欧美,三级,动漫,另类${{主页url}}video/filtering/{cateId}-{catePg}/by{by}.html#黑料${{主页url}}{cateId}/page/{catePg}.html#📌女优${{主页url}}actorshow/{area}--{顺序}----{catePg}--/id/40.html#📌热门词条${{主页url}}label/hotsearch.html#自定义词条${{主页url}}search/keyword/page/{catePg}/wd/{cateId}.html",
"搜索url": "{{主页url}}search/keyword/page/{pg}/wd/{wd}.html",
"分类url": "{cateId}?page={catePg}",
"分类": "国产$11#日本$12#欧美$13#三级$14#动漫$15#另类$34#黑料$art/index/by/time#📌女优$40#📌热门词条#自定义词条$春药",
"类型": "全部$11#国产自拍$16#国产偷拍$17#国产探花$18#真实乱伦$19#成人主播$20#黑料吃瓜$21#福利姬$22#国产传媒$23#性侵侵犯$24#抖音短视频$39||全部$12#中文字幕$25#岛国自拍$26#无码AV$27#AV解说$28||全部$13#欧美成人$29#黑人系列$43||全部$14#国产三级$30#日韩三级$31||全部$15#成人动漫$32#3D动漫$33||全部$34#猎奇重口味$35#男同女同$36#人妖变性$37#明星淫梦$38||全部黑料$art/index/by/time#网友爆料$artshow-41#反差婊$artshow-42#明星网红$artshow-44||空||空||春药&人妻&精油&男同",
"排序": "最近更新$/#当前最热$/hits_day#本周最热$/hits_week#本月最热$/hits_month",
"地区": "大陆地区$%E5%A4%A7%E9%99%86#台湾地区$%E5%8F%B0%E6%B9%BE#香港地区$%E9%A6%99%E6%B8%AF#美国地区$%E7%BE%8E%E5%9B%BD#日本地区$%E6%97%A5%E6%9C%AC#越南地区$%E8%B6%8A%E5%8D%97",
"顺序": "最新更新$time#当下最热$hits_day#周最热$hits_week#月最热$hits_month"
}
+12
View File
@@ -0,0 +1,12 @@
{
"主页url": "https://odayask.jokerlu-now.buzz/",
"直接播放": "1",
"搜索模式": "1",
"数组": "<div class=\"col-md-2 resent-grid recommended-grid sports-recommended-grid\">&&views</p>",
"标题": "class=\"title\">&&</a>",
"链接": "https://odayask.jokerlu-now.buzz/vodplay/+<a href=\"/voddetail/&&/\"+-1-1/",
"图片": "data-src=\"&&\"",
"搜索url": "https://odayask.jokerlu-now.buzz/vodsearch/{wd}----------{pg}---/",
"分类url": "https://odayask.jokerlu-now.buzz/vodtype/{cateId}-{catePg}/",
"分类": "麻豆视频$424#91制片厂$425#天美传媒$426#蜜桃传媒$427#皇家华人$428#星空传媒$429#精东影业$430#大象传媒$431#91茄子$432#性视界传媒$433#兔子先生$434#杏吧原创$435#玩偶姐姐$436#香蕉传媒$437#SA国际传媒$438#EDmosaic$439#PsychoPorn$440#糖心Vlog$441#葫芦影业$442#果冻传媒$443#国产视频$2#国产主播$3#91大神$4#热门事件$5#传媒自拍$6#日本有码$7#日本无码$8#日韩主播$9#动漫肉番$10#女同性恋$11#中文字幕$12#强奸乱伦$13#熟女人妻$14#制服诱惑$15#AV解说$16#女星换脸$17#欧美精品$444#日韩无码$19#强奸乱伦$20#欧美精品$21#人妻系列$22#中文字幕$23#动漫精品$24#日韩精品$25#伦理影片$26#制服诱惑$27#自拍偷拍$28#3P合辑$29#AV明星$30#巨乳系列$31#颜射系列$32#口交视频$33#自慰系列$34#国产精品$35#SM重味$36#教师学生$37#大秀视频$38#国产精品$49#华语AV$50#黑料吃瓜$51#欧美$52#禁漫$53#学生$54#乱伦$55#探花$56#日本有码$57#日本无码$58#主播网红$59#日本素人$60#精品推荐$62#国产色情$63#主播直播$64#亚洲无码$65#中文字幕$66#巨乳美乳$67#人妻熟女$68#欧美精品$69#强奸乱伦$70#萝莉少女$71#亚洲有码$72#伦理三级$73#成人动漫$74#自拍偷拍$75#制服丝袜$76#口交颜射$77#日本精品$78#Cosplay$79#素人自拍$80#台湾辣妹$81#日韩无码$133#国产精品$134#日韩精品$135#欧美精品$136#动漫精品$137#自拍偷拍$138#伦理影片$139#中文字幕$140#人妻系列$141#制服诱惑$142#强奸乱伦$143#AV明星$144#SM重味$145#巨乳系列$146#颜射系列$147#口交视频$148#自慰系列$149#教师学生$150#大秀视频$151#明星换脸$152#国产自拍$155#日本无码$156#日本有码$157#中文字幕$158#欧美精品$159#成人动漫$160#日本素人$161#高清名优$162#三级伦理$163#网红主播$164#映画传媒$165#人妻熟女$166#口爆颜射$167#萝莉少女$168#SM调教$169#美乳巨乳$170#短视频$171#制服诱惑$172#女同性爱$173#AI换脸$174#国产自拍$274#主播诱惑$275#探花约炮$276#偷拍偷窥$277#网曝吃瓜$278#抖阴短片$279#传媒剧情$280#日韩主播$281#日韩无码$282#中文字幕$283#AV解说$284#换脸明星$285#强奸乱伦$286#女优明星$287#欧美激情$288#重口激情$289#三级伦理$290#剧情动漫$291#SM调教$292#女同性恋$293#国产视频$297#中文字幕$298#国产传媒$299#日本有码$300#日本无码$301#欧美无码$302#强奸乱伦$303#制服诱惑$304#国产主播$305#激情动漫$306#明星换脸$307#抖阴视频$308#女优明星$309#网曝黑料$310#伦理三级$311#AV解说$312#SM调教$313#萝莉少女$314#极品媚黑$315#女同性恋$316#亚洲情色$348#国产主播$349#国产自拍$350#无码专区$351#欧美性爱$352#熟女人妻$353#强奸乱伦$354#巨乳美乳$355#中文字幕$356#制服诱惑$357#女同性恋$358#卡通动画$359#视频伦理$360#少女萝莉$361#重口色情$362#人兽性交$363#福利姬$364#制服丝袜$366#群交淫乱$367#无码专区$368#偷拍自拍$369#卡通动漫$370#中文字幕$371#欧美性爱$372#巨乳美乳$373#国产裸聊$374#国产自拍$375#国产盗摄$376#伦理三级$377#女同性恋$378#少女萝莉$379#人妖系列$380#虚拟VR$381#国产区$383#AV区$384#欧美区$385#动漫区$386#网红主播$387#国产传媒$388#探花系列$389#人妻熟女$390#日本无码$391#美乳巨乳$392#强制侵犯$393#制服诱惑$394#绝色佳人$395#风俗泡泡浴$396#家庭乱伦$397#AV解说$398#三级电影$399#少女萝莉$400#SM调教$401#绝顶潮吹$402"
}
+257
View File
@@ -0,0 +1,257 @@
# -*- coding: utf-8 -*-
import json
import sys
import traceback
sys.path.append('..')
from base.spider import Spider
class Spider(Spider):
primary_host = 'http://api.hclyz.com:81/mf/'
backup_host = 'http://api.maiyoux.com:81/mf/'
host = primary_host
platforms = []
def init(self, extend=""):
if extend:
h = extend.strip()
if not h.endswith('/'):
h += '/'
self.host = h
else:
self.host = self.primary_host
content = None
for base in [self.host, self.backup_host]:
try:
txt = self.fetch(base + 'json.txt').text
data = None
try:
data = json.loads(txt)
except Exception:
data = None
if data is not None:
self.host = base
self.platforms = self._parse_catalog_json(data)
if self.platforms:
return
else:
plats = self._parse_catalog_text(txt)
if plats:
self.host = base
self.platforms = plats
return
except Exception:
continue
def _parse_catalog_json(self, data):
items = []
if isinstance(data, dict):
if 'pingtai' in data and isinstance(data['pingtai'], list):
items = data['pingtai']
else:
if all(isinstance(v, dict) for v in data.values()):
items = list(data.values())
elif isinstance(data, list):
items = data
platforms = []
for it in items:
name = it.get('mc') or it.get('title') or it.get('name') or ''
img = it.get('tp1') or it.get('xinimg') or it.get('img') or ''
file = it.get('dz') or it.get('address') or it.get('file') or ''
count = it.get('sl') or it.get('Number') or it.get('count') or 0
try:
count = int(count)
except Exception:
pass
if name and file:
if not file.endswith('.txt'):
file += '.txt'
if not file.startswith('json'):
file = 'json' + file
platforms.append({
'name': name,
'img': img,
'file': file,
'count': count
})
return platforms
def _parse_catalog_text(self, txt):
plats = []
block = txt.strip()
if not block:
return plats
if block.startswith('{') and block.endswith('}'):
block = block[1:-1]
chunks = [c for c in block.split('|') if c.strip()]
curr = {'mc': '', 'tp1': '', 'dz': '', 'sl': 0}
def flush():
if curr.get('mc') and curr.get('dz'):
try:
sl = int(curr.get('sl') or 0)
except Exception:
sl = curr.get('sl') or 0
fname = curr.get('dz')
if not fname.endswith('.txt'):
fname += '.txt'
if not fname.startswith('json'):
fname = 'json' + fname
plats.append({
'name': curr.get('mc'),
'img': curr.get('tp1'),
'file': fname,
'count': sl
})
for c in chunks:
s = c.strip()
if s.startswith('@mc'):
if curr.get('mc') or curr.get('dz'):
flush()
curr = {'mc': '', 'tp1': '', 'dz': '', 'sl': 0}
curr['mc'] = s.replace('@mc', '', 1)
elif s.startswith('@tp1'):
curr['tp1'] = s.replace('@tp1', '', 1)
elif s.startswith('@dz'):
curr['dz'] = s.replace('@dz', '', 1)
elif s.startswith('@sl'):
curr['sl'] = s.replace('@sl', '', 1)
if curr.get('mc') or curr.get('dz'):
flush()
return plats
def _load_platform_rooms(self, file_path, pg=1):
url_candidates = [
self.host + file_path,
]
alt_path = file_path.replace('json', '', 1)
if alt_path != file_path:
url_candidates.insert(0, self.host + alt_path)
data = None
raw = None
for u in url_candidates:
try:
raw = self.fetch(u).text
data = json.loads(raw)
break
except Exception:
data = None
continue
rooms = []
if isinstance(data, dict):
if 'zhubo' in data and isinstance(data['zhubo'], list):
rooms = data['zhubo']
elif 'list' in data and isinstance(data['list'], list):
rooms = data['list']
elif 'data' in data and isinstance(data['data'], list):
rooms = data['data']
elif 'rooms' in data and isinstance(data['rooms'], list):
rooms = data['rooms']
elif isinstance(data, list):
rooms = data
videos = []
for idx, r in enumerate(rooms or [], 1):
title = r.get('title') or r.get('name') or r.get('nickname') or f'主播{idx}'
address = r.get('address') or r.get('url') or r.get('stream') or ''
img = r.get('img') or r.get('pic') or r.get('avatar') or ''
remarks = r.get('Number') or r.get('online') or r.get('viewers') or ''
if title and address:
videos.append({
'vod_id': address,
'vod_name': title,
'vod_pic': img,
'vod_remarks': str(remarks)
})
total = len(videos)
if pg > 1:
start = (pg - 1) * 20
videos = videos[start:start + 20]
return videos, total
def isVideoFormat(self, url):
return False
def manualVideoCheck(self):
pass
def getName(self):
return 'Leospring直播'
def homeContent(self, filter):
classes = []
for p in self.platforms:
classes.append({
'type_id': p['file'],
'type_name': p['name'],
})
return {'class': classes}
def homeVideoContent(self):
return {'list': []}
def _find_platform(self, tid):
for p in self.platforms:
if p['file'] == tid or p['name'] == tid:
return p
return None
def categoryContent(self, tid, pg, filter, extend):
p = self._find_platform(tid)
if not p:
return {'list': [], 'page': pg, 'pagecount': 0, 'limit': 0, 'total': 0}
videos, total = self._load_platform_rooms(p['file'], int(pg))
pagecount = (total + 19) // 20
result = {
'list': videos,
'page': pg,
'pagecount': pagecount,
'limit': min(len(videos), 20),
'total': total
}
return result
def searchContent(self, key, quick, pg="1"):
key = (key or '').strip().lower()
out = []
if not key:
return {'list': out}
for p in self.platforms:
videos, _ = self._load_platform_rooms(p['file'])
for v in videos:
if key in v['vod_name'].lower():
out.append(v)
if len(out) >= 50:
break
return {'list': out[:50]}
def detailContent(self, ids):
try:
address = ids[0]
if not address:
return {'list': []}
vod = {
'vod_id': address,
'vod_name': '直播源',
'vod_play_from': '每日必修课',
'vod_play_url': address,
'vod_content': '多看少打卡',
}
return {'list': [vod]}
except Exception as e:
traceback.print_exc()
return {'list': []}
def playerContent(self, flag, id, vipFlags):
return {
'parse': 0,
'url': id
}
def localProxy(self, param):
pass