潇洒更新 202507240351

This commit is contained in:
github-actions[bot]
2025-07-24 03:51:05 +00:00
parent f20438efd6
commit a5bfc33388
9 changed files with 522 additions and 193 deletions

View File

@@ -0,0 +1,20 @@
{
"站名": "",
"主页url": "https://www.freeok.ac",
"请求头": "User-Agent$MOBILE_UA",
"编码": "UTF-8",
"数组": "",
"图片": "data-original=\"&&\"",
"标题": "",
"链接": "href=\"&&\"",
"副标题": "",
"线路数组": "module-tab-item&&</div>",
"线路标题": "data-dropdown-value=\"&&\"",
"播放数组": "",
"播放标题": "",
"跳转播放链接": "urlDecode(Base64(var player_*url\":\"&&\"))",
"搜索url": "https://www.freeok.ac/vodsearch/-------------.html?wd={wd}",
"简介": "<p>&&</p>",
"分类url": "https://www.freeok.ac/type/{cateId}.html",
"分类": "电影$1#连续剧$2#动漫$3#综艺$4#短剧$24"
}

View File

@@ -101,14 +101,14 @@
"name": "咖啡APP",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet2",
"api": "csp_AppGet",
"ext": {
"url": "",
"site": "https://omofun.lol/coffee.txt",
"dataKey": "qwertyuiopqwertm",
"dataIv": "qwertyuiopqwertm",
"site": "https://omofun.lol/1.txt",
"dataKey": "skdhalkshqklwkj1",
"dataIv": "skdhalkshqklwkj1",
"deviceId": "",
"version": "",
"version": "109",
"ua": "okhttp/3.10.0"
}
},
@@ -127,15 +127,15 @@
}
},
{
"key": "APP4K",
"key": "蓝光",
"name": "蓝光APP",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": {
"url": "http://59.153.167.186",
"dataKey": "SDSFET23215FDSF2",
"dataIv": "SDSFET23215FDSF2",
"url": "http://122.228.193.2:9654",
"dataKey": "ca94b06ca3c7d80e",
"dataIv": "ca94b06ca3c7d80e",
"deviceId": "",
"version": "119"
}
@@ -883,16 +883,6 @@
"type": "list"
}
},
{
"key": "懒盘",
"name": "懒盘4K弹幕",
"type": 3,
"api": "./js/cloud.min.js",
"ext": "./js/懒盘.js",
"style": {
"type": "list"
}
},
{
"key": "百酷",
"name": "百酷4K弹幕",
@@ -1228,6 +1218,13 @@
"api": "csp_HBPQ",
"ext": "./XBPQ/海纳影视.json"
},
{
"key": "免费影视",
"name": "免费|影视",
"type": 3,
"api": "csp_HBPQ",
"ext": "./XBPQ/免费影视.json"
},
{
"key": "面包影视",
"name": "面包|影视",
@@ -1765,12 +1762,6 @@
},
"ext": "./json/alist.json"
},
{
"key": "网络直播",
"name": "网络|直播",
"type": 3,
"api": "./py/网络直播.py"
},
{
"key": "88看球",
"name": "88看球",
@@ -1781,6 +1772,18 @@
"type": "list"
}
},
{
"key": "网络直播",
"name": "网络|直播",
"type": 3,
"api": "./py/网络直播.py"
},
{
"key": "哔哩直播",
"name": "哔哩|直播",
"type": 3,
"api": "./py/哔哩直播.py"
},
{
"key": "哔哩合集",
"name": "哔哩|合集",

View File

@@ -31,90 +31,83 @@ var rule = {
二级: {
title: "h1&&Text",
img: "img&&src",
desc: "",
content: "span&&Text",
tabs: `js: pdfh = jsp.pdfh;
pdfa = jsp.pdfa;
pd = jsp.pd;
TABS = []
let d = pdfa(html, 'span a');
let tabsa = [];
let tabsq = [];
let tabsm = false;
let tabse = false;
d.forEach(function(it) {
let burl = pdfh(it, 'a&&href');
if (burl.startsWith("https://pan.quark.cn/s/")) {
tabsq.push("夸克网盘");
} else if (burl.startsWith("magnet")) {
tabsm = true;
} else if (burl.startsWith("ed2k")) {
tabse = true;
}
});
if (tabsm === true) {
TABS.push("磁力");
}
if (tabse === true) {
TABS.push("电驴");
}
let tmpIndex;
tmpIndex = 1;
tabsa.forEach(function(it) {
TABS.push(it + tmpIndex);
tmpIndex = tmpIndex + 1;
});
tmpIndex = 1;
tabsq.forEach(function(it) {
TABS.push(it + tmpIndex);
tmpIndex = tmpIndex + 1;
});
log('alyps TABS >>>>>>>>>>>>>>>>>>' + TABS);`,
lists: `js: log(TABS);
pdfh = jsp.pdfh;
pdfa = jsp.pdfa;
pd = jsp.pd;
LISTS = [];
let d = pdfa(html, 'span a');
let lista = [];
let listq = [];
let listm = [];
let liste = [];
d.forEach(function(it) {
let burl = pdfh(it, 'a&&href');
let title = pdfh(it, 'a&&Text');
log('alyps title >>>>>>>>>>>>>>>>>>>>>>>>>>' + title);
log('alyps burl >>>>>>>>>>>>>>>>>>>>>>>>>>' + burl);
let loopresult = title + '$' + burl;
if (burl.startsWith("https://pan.quark.cn/s/")) {
if (TABS.length == 1) {
burl = burl.replace("?entry=sjss", ""),
burl = "http://127.0.0.1:9978/proxy?do=quark&type=push&confirm=0&url=" + encodeURIComponent(burl);
} else {
burl = burl.replace("?entry=sjss", ""),
burl = "http://127.0.0.1:9978/proxy?do=quark&type=push&url=" + encodeURIComponent(burl);
desc: ".info:eq(0)&&Text",
content: ".content&&Text",
tabs: `js:
pdfh = jsp.pdfh;
pdfa = jsp.pdfa;
pd = jsp.pd;
TABS = [];
let d = pdfa(html, 'span a');
let tabsq = [];
let tabsb = [];
let tabsm = false;
let tabse = false;
d.forEach(function(it) {
let burl = pdfh(it, 'a&&href');
if (burl.includes("pan.quark.cn/s/")) {
tabsq.push("夸克网盘");
} else if (burl.includes("pan.baidu.com/s/")) {
tabsb.push("百度网盘");
} else if (burl.startsWith("magnet")) {
tabsm = true;
} else if (burl.startsWith("ed2k")) {
tabse = true;
}
loopresult = title + '$' + burl;
listq.push(loopresult);
} else if (burl.startsWith("magnet")) {
listm.push(loopresult);
} else if (burl.startsWith("ed2k")) {
liste.push(loopresult);
}
});
if (listm.length > 0) {
LISTS.push(listm.reverse());
}
if (liste.length > 0) {
LISTS.push(liste.reverse());
}
lista.forEach(function(it) {
LISTS.push([it]);
});
listq.forEach(function(it) {
LISTS.push([it]);
});`,
});
if (tabsb.length > 0) TABS.push("百度网盘");
if (tabsq.length > 0) TABS.push("夸克网盘");
if (tabsm) TABS.push("磁力");
if (tabse) TABS.push("电驴");
log('生成TABS: ' + JSON.stringify(TABS));`,
lists: `js:
pdfh = jsp.pdfh;
pdfa = jsp.pdfa;
pd = jsp.pd;
LISTS = [];
let d = pdfa(html, 'span a');
let listm = [];
let liste = [];
let listq = [];
let listb = [];
d.forEach(function(it) {
let burl = pdfh(it, 'a&&href');
let title = pdfh(it, 'a&&Text');
let loopresult = title + '$' + burl;
if (burl.includes("pan.quark.cn/s/")) {
burl = burl.split("?")[0];
loopresult = title + '$' + burl;
listq.push(loopresult);
} else if (burl.includes("pan.baidu.com/s/")) {
let codeMatch = title.match(/提取码[:]?\s*(\w{4})|(\w{4})(?=提取|百度|网盘)/i);
if (codeMatch) {
let code = codeMatch[1] || codeMatch[2];
burl += '#' + code;
}
loopresult = title + '$' + burl;
listb.push(loopresult);
} else if (burl.startsWith("magnet")) {
listm.push(loopresult);
} else if (burl.startsWith("ed2k")) {
liste.push(loopresult);
}
});
if (listb.length > 0) LISTS.push(listb);
if (listq.length > 0) LISTS.push(listq);
if (listm.length > 0) LISTS.push(listm);
if (liste.length > 0) LISTS.push(liste);
if (LISTS.length === 0 && listq.length > 0) {
LISTS = [listq];
}`,
},
搜索: 'li:has(img);h2&&Text;img&&data-original;.tags&&Text;a&&href',
}
};

View File

@@ -30,5 +30,5 @@
"type_id": "42317879720298"
}
],
"Cookie": "JSESSIONID=E1DB8AC0F708B4E282B9998F371F9E3B; cms_token=2e714955704148f99268eaa976de09ce; cms_accessToken=6272a9e68faa49c4a73c684df0c44eee; cms_refreshToken=4908d2845de044d7bcde237f66092415"
"Cookie": "cms_token=91643744d93a42f98e15b6784f0bd310; JSESSIONID=D92622710E6342FD11574AC11CF9DFC6; cms_accessToken=7dab23285f764ee3a0b8d84abdff2fe1; cms_refreshToken=2f4d43120dcc4c258c80d0a1cd2df559"
}

314
xiaosa/py/哔哩直播.py Normal file
View File

@@ -0,0 +1,314 @@
# coding=utf-8
# !/usr/bin/python
"""
作者 丢丢喵 🚓 内容均从互联网收集而来 仅供交流学习使用 版权归原创者所有 如侵犯了您的权益 请通知作者 将及时删除侵权内容
====================Diudiumiao====================
"""
from Crypto.Util.Padding import unpad
from Crypto.Util.Padding import pad
from urllib.parse import unquote
from Crypto.Cipher import ARC4
from urllib.parse import quote
from base.spider import Spider
from Crypto.Cipher import AES
from datetime import datetime
from bs4 import BeautifulSoup
from base64 import b64decode
import urllib.request
import urllib.parse
import datetime
import binascii
import requests
import base64
import json
import time
import sys
import re
import os
sys.path.append('..')
xurl = "https://search.bilibili.com"
xurl1 = "https://api.live.bilibili.com"
headerx = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0'
}
class Spider(Spider):
global xurl
global xurl1
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": "", "type_name": "舞蹈"},
{"type_id": "音乐", "type_name": "音乐"},
{"type_id": "手游", "type_name": "手游"},
{"type_id": "网游", "type_name": "网游"},
{"type_id": "单机游戏", "type_name": "单机游戏"},
{"type_id": "虚拟主播", "type_name": "虚拟主播"},
{"type_id": "电台", "type_name": "电台"},
{"type_id": "体育", "type_name": "体育"},
{"type_id": "聊天", "type_name": "聊天"},
{"type_id": "娱乐", "type_name": "娱乐"},
{"type_id": "电影", "type_name": "影视"},
{"type_id": "新闻", "type_name": "新闻"}]
}
return result
def homeVideoContent(self):
pass
def categoryContent(self, cid, pg, filter, ext):
result = {}
videos = []
if pg:
page = int(pg)
else:
page = 1
url = f'{xurl}/live?keyword={cid}&page={str(page)}'
detail = requests.get(url=url, headers=headerx)
detail.encoding = "utf-8"
res = detail.text
doc = BeautifulSoup(res, "lxml")
soups = doc.find_all('div', class_="video-list-item")
for vod in soups:
names = vod.find('h3', class_="bili-live-card__info--tit")
name = names.text.strip().replace('直播中', '')
id = names.find('a')['href']
id = self.extract_middle_text(id, 'bilibili.com/', '?', 0)
pic = vod.find('img')['src']
if 'http' not in pic:
pic = "https:" + pic
remarks = vod.find('a', class_="bili-live-card__info--uname")
remark = remarks.text.strip()
video = {
"vod_id": id,
"vod_name": name,
"vod_pic": pic,
"vod_remarks": remark
}
videos.append(video)
result = {'list': videos}
result['page'] = pg
result['pagecount'] = 9999
result['limit'] = 90
result['total'] = 999999
return result
def detailContent(self, ids):
did = ids[0]
result = {}
videos = []
xianlu = ''
bofang = ''
url = f'{xurl1}/xlive/web-room/v2/index/getRoomPlayInfo?room_id={did}&platform=web&protocol=0,1&format=0,1,2&codec=0,1'
detail = requests.get(url=url, headers=headerx)
detail.encoding = "utf-8"
data = detail.json()
content = '欢迎观看哔哩直播'
setup = data['data']['playurl_info']['playurl']['stream']
nam = 0
for vod in setup:
try:
host = vod['format'][nam]['codec'][0]['url_info'][1]['host']
except (KeyError, IndexError):
continue
base = vod['format'][nam]['codec'][0]['base_url']
extra = vod['format'][nam]['codec'][0]['url_info'][1]['extra']
id = host + base + extra
nam = nam + 1
namc = f"{nam}号线路"
bofang = bofang + namc + '$' + id + '#'
bofang = bofang[:-1]
xianlu = '哔哩专线'
videos.append({
"vod_id": did,
"vod_content": content,
"vod_play_from": xianlu,
"vod_play_url": bofang
})
result['list'] = videos
return result
def playerContent(self, flag, id, vipFlags):
result = {}
result["parse"] = 0
result["playUrl"] = ''
result["url"] = id
result["header"] = headerx
return result
def searchContentPage(self, key, quick, pg):
result = {}
videos = []
if pg:
page = int(pg)
else:
page = 1
url = f'{xurl}/live?keyword={key}&page={str(page)}'
detail = requests.get(url=url, headers=headerx)
detail.encoding = "utf-8"
res = detail.text
doc = BeautifulSoup(res, "lxml")
soups = doc.find_all('div', class_="video-list-item")
for vod in soups:
names = vod.find('h3', class_="bili-live-card__info--tit")
name = names.text.strip().replace('直播中', '')
id = names.find('a')['href']
id = self.extract_middle_text(id, 'bilibili.com/', '?', 0)
pic = vod.find('img')['src']
if 'http' not in pic:
pic = "https:" + pic
remarks = vod.find('a', class_="bili-live-card__info--uname")
remark = remarks.text.strip()
video = {
"vod_id": id,
"vod_name": name,
"vod_pic": pic,
"vod_remarks": remark
}
videos.append(video)
result['list'] = videos
result['page'] = pg
result['pagecount'] = 9999
result['limit'] = 90
result['total'] = 999999
return result
def searchContent(self, key, quick, pg="1"):
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

View File

@@ -146,7 +146,6 @@ class Spider(Spider):
result = {}
cateManual = {
"虎牙": "huya",
"哔哩": "bili",
"抖音": "douyin",
"斗鱼": "douyu",
"网易": "wangyi"

Binary file not shown.