Sync all projects

This commit is contained in:
github-actions[bot]
2026-07-05 04:58:38 +00:00
parent 286d42c940
commit a45a9bde55
651 changed files with 337816 additions and 0 deletions
+184
View File
@@ -0,0 +1,184 @@
# coding=utf-8
# !/usr/bin/python
import requests
from bs4 import BeautifulSoup
import re
from base.spider import Spider
import sys
import json
import os
import base64
sys.path.append('..')
xurl='https://panyq.com'
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'
}
class Spider(Spider):
global xurl2
global xurl
global headerx
def getName(self):
return "首页"
def init(self, extend):
pass
def isVideoFormat(self, url):
pass
def manualVideoCheck(self):
pass
def homeContent(self, filter):
pass
return result
def homeVideoContent(self):
pass
def categoryContent(self, cid, pg, filter, ext):
pass
def detailContent(self, ids):
try:
data = json.loads(bytes.fromhex(ids[0]).decode())
# 为验证页面的 Server Action 补充请求头
headers_verify = self.getheader(-1)
headers_verify['accept'] = 'text/x-component'
headers_verify['content-type'] = 'text/plain;charset=UTF-8'
verify = requests.post(f'{xurl}/search/{data["hash"]}',
headers=headers_verify,
data=b'[]', # 按照 curl 结构,此处无需传复杂的参数
)
if verify.status_code == 200:
eid = data['data'][0]['eid']
rdata = json.dumps([{"eid": eid}], separators=(",", ":")).encode()
# 为解析页面的 Server Action 补充请求头
headers_go = self.getheader(1)
headers_go['accept'] = 'text/x-component'
headers_go['content-type'] = 'text/plain;charset=UTF-8'
res = requests.post(f'{xurl}/go/{eid}', headers=headers_go, data=rdata)
try:
purl = json.loads(res.text.strip().split('\n')[-1].split(":", 1)[-1])['data']['link']
except Exception as e:
print("解析播放链接失败,返回内容:", res.text)
raise e
if not re.search(r'pwd=|码', purl) and data['password']:
purl = f"{purl}{'&' if '?' in purl else '?'}pwd={data['password']}"
print("获取盘链接为:", purl)
else:
raise Exception(f'验证失败,状态码: {verify.status_code}')
vod = {
'vod_id': '',
'vod_name': '',
'vod_pic': '',
'type_name': '',
'vod_year': '',
'vod_area': '',
'vod_remarks': '',
'vod_actor': '',
'vod_director': '',
'vod_content': '',
'vod_play_from': '集多网盘',
'vod_play_url': purl
}
params = {
"do": "push",
"url": purl
}
requests.post("http://127.0.0.1:9978/action", data=params, headers={
"Content-Type": "application/x-www-form-urlencoded"
})
return {'list': [vod]}
except Exception as e:
print(e)
return {'list': []}
def playerContent(self, flag, id, vipFlags):
pass
def searchContentPage(self, key, quick, page='1'):
sign, sha, hash = self.getsign(key, page)
headers = self.getheader()
res = requests.get(f'{xurl}/api/search', params={'sign': sign}, headers=headers).json()
videos = []
for i in res['data']['hits']:
ccc = [{"eid": i.get("eid"), "sha": sha, "page_num": page}]
ddd = (json.dumps({'sign': sign, 'hash': hash, 'data': ccc, 'password': i.get('password')})).encode().hex()
if i.get('group') == 'quark':
pic = 'https://android-artworks.25pp.com/fs08/2024/12/27/7/125_d45d9de77c805e17ede25e4a2d9d3444_con.png'
elif i.get('group') == 'baidu':
pic = 'https://is4-ssl.mzstatic.com/image/thumb/Purple126/v4/dd/45/eb/dd45eb77-d21d-92f2-c46d-979797a6be4a/AppIcon-0-0-1x_U007emarketing-0-0-0-7-0-0-sRGB-0-0-0-GLES2_U002c0-512MB-85-220-0-0.png/1024x1024bb.jpg'
else:
pic = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.alicdn.com%2Fbao%2Fuploaded%2Fi4%2F2213060290763%2FO1CN01joakK61HVUwob2JIJ_%21%212213060290763.jpg&refer=http%3A%2F%2Fimg.alicdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1757745912&t=e7b98fced3a4f092c8ef26490997b004'
videos.append({
'vod_id': ddd,
'vod_name': i.get('desc').split('<mark>')[0].replace('<mark>', ""),
'vod_pic': pic,
'vod_remarks': i.get('group'),
})
return {'list': videos, 'page': page}
def searchContent(self, key, quick):
return self.searchContentPage(key, quick, '1')
def searchContent(self, key, quick, pg):
return self.searchContentPage(key, quick, pg)
def getsign(self, key, pg):
headers = self.getheader(1)
headers['accept'] = 'text/x-component'
headers['content-type'] = 'text/plain;charset=UTF-8'
data = json.dumps([{"cat": "all", "query": key, "pageNum": int(pg), "enableSearchMusic": False,
"enableSearchGame": False, "enableSearchEbook": False}], separators=(",", ":"),
ensure_ascii=False).encode('utf-8')
res = requests.post(f"{xurl}/", headers=headers, data=data).text
try:
hash_val = re.search(r'"hash"[,\:]\s*"([^"]+)"', res).group(1)
sign_val = re.search(r'"sign"[,\:]\s*"([^"]+)"', res).group(1)
sha_val = re.search(r'"sha"[,\:]\s*"([^"]+)"', res).group(1)
return sign_val, sha_val, hash_val
except AttributeError:
return "", "", ""
def getheader(self, k=0):
kes = ['ecce0904d756da58b9ea5dd03da3cacea9fa29c6', '7ff70cb6e42cac903d7a4d90c06376fad14080fe57',
'7f655bc3fc964d76329b7b195b5c51ff42f446e01a']
headers = {
'origin': xurl,
'referer': f'{xurl}/',
'next-action': kes[k],
'sec-ch-ua': '"Google Chrome";v="137", "Chromium";v="137", "Not/A)Brand";v="24"',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36',
}
return headers
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