229 lines
10 KiB
Python
229 lines
10 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
# @File : buildConfig.py
|
||
# @Author : jade
|
||
# @Date : 2024/4/22 10:53
|
||
# @Email : jadehh@1ive.com
|
||
# @Software : Samples
|
||
# @Desc : 生成配置文件,包含Config,Dist分支
|
||
import json
|
||
import os
|
||
from jade import str_to_bool, CreateSavePath, GetLastDir, GetTimeStamp
|
||
import argparse
|
||
|
||
|
||
class JSMoudle():
|
||
def __init__(self, js_file):
|
||
self.js_file = js_file
|
||
self.js_name = GetLastDir(js_file).split(".")[0]
|
||
self.is_18 = False
|
||
self.getContent()
|
||
|
||
def getContent(self):
|
||
with open(self.js_file, "rb") as f:
|
||
self.js_str = str(f.read(), encoding="utf-8")
|
||
if "🔞" in self.js_str:
|
||
self.is_18 = True
|
||
|
||
def getName(self):
|
||
try:
|
||
name = (self.js_str.split("getName()")[-1].split("}")[0].split("return")[-1].split('"')[1])
|
||
return name
|
||
except:
|
||
return None
|
||
|
||
def getAppName(self):
|
||
try:
|
||
name = (self.js_str.split("getAppName()")[-1].split("}")[0].split("return")[-1].split('"')[1])
|
||
return name
|
||
except Exception as e:
|
||
return None
|
||
|
||
def getJSName(self):
|
||
try:
|
||
name = (self.js_str.split("getJSName()")[-1].split("}")[0].split("return")[-1].split('"')[1])
|
||
return name
|
||
except:
|
||
return None
|
||
|
||
def getType(self):
|
||
try:
|
||
name = (self.js_str.split("getType()")[-1].split("}")[0].split("return")[-1])
|
||
return int(name.strip())
|
||
except:
|
||
return None
|
||
|
||
|
||
class Build():
|
||
def __init__(self, channelKey,aliToken, biliCookie, is_18="False"):
|
||
self.is_18 = str_to_bool(is_18)
|
||
self.aliToken = aliToken
|
||
self.biliCookie = biliCookie
|
||
self.jsMouleList = self.getJsFile(channelKey)
|
||
super().__init__()
|
||
|
||
def getJsFile(self,channelKey):
|
||
jsMoudleList = []
|
||
js_path = "js"
|
||
fileList = os.listdir(js_path)
|
||
for fileName in fileList:
|
||
jsMoudle = JSMoudle(js_path + "/" + fileName)
|
||
if jsMoudle.getName() is not None:
|
||
if len(channelKey):
|
||
if channelKey == jsMoudle.getJSName():
|
||
jsMoudleList.append(jsMoudle)
|
||
else:
|
||
jsMoudleList.append(jsMoudle)
|
||
return jsMoudleList
|
||
|
||
def getBaseConfig(self, baseObj, jsMoudle, tvType="TVBox"):
|
||
baseObj["key"] = jsMoudle.js_name
|
||
baseObj["name"] = jsMoudle.getName()
|
||
baseObj["ext"] = {"box": tvType}
|
||
baseObj["api"] = "./" + jsMoudle.js_file
|
||
baseObj["type"] = jsMoudle.getType()
|
||
return baseObj
|
||
|
||
def getCustomConfig(self, baseObj, jsMoudle):
|
||
if "阿里" in jsMoudle.getAppName() or "厂长直连" in jsMoudle.getAppName():
|
||
baseObj["ext"]["token"] = self.aliToken
|
||
elif jsMoudle.getAppName() == "泥视频":
|
||
baseObj["ext"]["code"] = int(self.is_18)
|
||
elif jsMoudle.getAppName() == "量子资源":
|
||
baseObj["ext"]["code"] = int(self.is_18)
|
||
elif jsMoudle.getAppName() == "哔哩哔哩":
|
||
baseObj["ext"]["cookie"] = self.biliCookie
|
||
return baseObj
|
||
|
||
def getConfig(self, tyType="TVBox", type=3):
|
||
baseObj = {"key": "", "name": "", "api": "", "timeout": 30, "ext": {}}
|
||
if type == 3:
|
||
baseObj["playerType"] = 0
|
||
siteList = []
|
||
for jsMoudle in self.jsMouleList:
|
||
if jsMoudle.is_18 == self.is_18 and jsMoudle.getType() == type:
|
||
siteObj = baseObj.copy()
|
||
siteObj = self.getBaseConfig(siteObj, jsMoudle, tyType)
|
||
siteObj = self.getCustomConfig(siteObj, jsMoudle)
|
||
siteList.append(siteObj)
|
||
return siteList
|
||
|
||
def getJsList(self, tyType="TVBox", type=3):
|
||
jsList = []
|
||
for jsMoudle in self.jsMouleList:
|
||
if jsMoudle.is_18 == self.is_18 and jsMoudle.getType() == type:
|
||
jsList.append(jsMoudle)
|
||
return jsList
|
||
|
||
def getConfigByTvType(self, tvType):
|
||
videoConfig = self.getConfig(tvType, 3)
|
||
bookConfig = self.getConfig(tvType, 10)
|
||
carToonConfig = self.getConfig(tvType, 20)
|
||
jsonConfig = self.getJsonConfigByTvType(tvType)
|
||
return videoConfig, bookConfig, carToonConfig, jsonConfig
|
||
|
||
def getJsonConfigByTvType(self, tvType):
|
||
jsonPath = "json"
|
||
with open(os.path.join(jsonPath, "{}.json".format(tvType)), "rb") as f:
|
||
return json.load(f)
|
||
|
||
def writeJsonConfig(self, tvType, jsonConfig):
|
||
config_name = "{}_config.json".format(tvType)
|
||
if self.is_18:
|
||
config_name = "18_" + config_name
|
||
with open(config_name, "wb") as f:
|
||
f.write(json.dumps(jsonConfig, indent=4, ensure_ascii=False).encode("utf-8"))
|
||
|
||
def writeTVConfig(self):
|
||
print("Write TV Config")
|
||
tvType = "TVBox"
|
||
videoConfig, bookConfig, carToonConfig, jsonConfig = self.getConfigByTvType(tvType)
|
||
jsonConfig["sites"] = videoConfig
|
||
self.writeJsonConfig("tv", jsonConfig)
|
||
|
||
def writeOpenConfig(self):
|
||
print("Write Open Config")
|
||
tvType = "CatOpen"
|
||
videoConfig, bookConfig, carToonConfig, jsonConfig = self.getConfigByTvType(tvType)
|
||
jsonConfig["video"]["sites"] = videoConfig
|
||
jsonConfig["read"]["sites"] = bookConfig
|
||
self.writeJsonConfig("open", jsonConfig)
|
||
|
||
def jsToNodejs(self, jsList, typeName="video"):
|
||
nodejsPath = "nodejs/src/spider/"
|
||
savePath = CreateSavePath(os.path.join(nodejsPath, typeName))
|
||
for jsMoudle in jsList:
|
||
write_content = ""
|
||
with open(os.path.join(nodejsPath, "tmpSpider.txt"), "rb") as f:
|
||
contentlist = f.readlines()
|
||
for content in contentlist:
|
||
write_content = write_content + str(content, encoding="utf-8").replace("temp",
|
||
jsMoudle.getJSName()).replace(
|
||
"updateTime", GetTimeStamp())
|
||
saveJsPath = os.path.join(nodejsPath, typeName, GetLastDir(jsMoudle.js_file))
|
||
with open(saveJsPath, "wb") as f:
|
||
f.write(write_content.encode("utf-8"))
|
||
fileList = []
|
||
fileNameList = os.listdir(os.path.join(nodejsPath, typeName))
|
||
for fileName in fileNameList:
|
||
fileList.append(fileName)
|
||
writeContent,spiderList = self.getImportNameByType(fileList,typeName)
|
||
return writeContent,spiderList
|
||
|
||
def getImportNameByType(self,fileList,typeName="video"):
|
||
writeRoutersContent = ""
|
||
spiderList = []
|
||
for fileName in fileList:
|
||
jsName = fileName.split(".")[0]
|
||
spiderList.append(jsName)
|
||
importStr = "import {} from './spider/{}/{}.js';\n".format(jsName, typeName, jsName)
|
||
writeRoutersContent = writeRoutersContent + importStr
|
||
return writeRoutersContent,spiderList
|
||
|
||
|
||
def writeRouterJs(self,writeRouterStr,spiderList):
|
||
writeRouterStr = writeRouterStr + "const spiders = [{}];".format(",".join(spiderList)) + "\n"
|
||
with open("nodejs/src/router.txt", "rb") as f:
|
||
contentlist = f.readlines()
|
||
for content in contentlist:
|
||
writeRouterStr = writeRouterStr + str(content, encoding="utf-8")
|
||
with open("nodejs/src/router.js", "wb") as f:
|
||
f.write(writeRouterStr.encode("utf-8"))
|
||
|
||
def writeNodeConfig(self):
|
||
writeContent = ""
|
||
with open("nodejs/src/index.config.txt", "rb") as f:
|
||
contentlist = f.readlines()
|
||
for content in contentlist:
|
||
writeContent = writeContent + str(content, encoding="utf-8").replace("temp", self.aliToken).replace(
|
||
"bilitmep", self.biliCookie) + "\n"
|
||
with open("nodejs/src/index.config.js", "wb") as f:
|
||
f.write(writeContent.encode("utf-8"))
|
||
|
||
def writeDistConfig(self):
|
||
tvType = "CatOpen"
|
||
videoWriteContent,videoSpiderList = self.jsToNodejs(self.getJsList(tvType, type=3), "video")
|
||
self.jsToNodejs(self.getJsList(tvType, type=10), "book")
|
||
bookWriteContent,bookSpiderList = self.jsToNodejs(self.getJsList(tvType, type=20), "book")
|
||
panWriteContent,panSpiderList = self.jsToNodejs([], "pan")
|
||
videoSpiderList.extend(bookSpiderList)
|
||
videoSpiderList.extend(panSpiderList)
|
||
self.writeRouterJs(videoWriteContent+bookWriteContent+panWriteContent,videoSpiderList)
|
||
self.writeNodeConfig()
|
||
def build(self):
|
||
self.writeTVConfig()
|
||
self.writeOpenConfig()
|
||
self.writeDistConfig()
|
||
|
||
|
||
if __name__ == '__main__':
|
||
parser = argparse.ArgumentParser()
|
||
parser.add_argument('--key', type=str, default="") ## 添加环境变量
|
||
parser.add_argument('--aliToken', type=str, default="51427b95ab9d47a6921a27951ebd3f1e") ## 添加环境变量
|
||
parser.add_argument('--is_18', type=str, default="False") ## 添加
|
||
parser.add_argument('--biliCookie', type=str,
|
||
default="buvid3=02675249-8ED3-C418-87F5-59E18316459714816infoc; b_nut=1704421014; _uuid=5D435F74-F574-D9AB-62C1-B9294DE465D913102infoc; buvid_fp=e8c5650c749398e9b5cad3f3ddb5081e; buvid4=007E85D1-52C1-7E6E-07CF-837FFBC9349516677-024010502-J5vTDSZDCw4fNnXRejbSVg%3D%3D; rpdid=|()kYJmulRu0J'u~|RRJl)JR; PVID=1; SESSDATA=3be091d3%2C1720332009%2C699ed%2A11CjAcCdwXG5kY1umhCOpQHOn_WP7L9xFBfWO7KKd4BPweodpR6VyIfeNyPiRmkr5jCqsSVjg0R0dZOVVHRUo3RnhPRTZFc3JPbGdiUjFCdHpiRDhiTkticmdKTjVyS1VhbDdvNjFMSDJlbUJydUlRdjFUNGFBNkJlV2ZTa0N1Q1BEVi1QYTQzTUh3IIEC; bili_jct=b0ee7b5d3f27df893545d811d95506d4; DedeUserID=78014638; DedeUserID__ckMd5=4c8c5d65065e468a; enable_web_push=DISABLE; header_theme_version=CLOSE; home_feed_column=5; CURRENT_BLACKGAP=0; CURRENT_FNVAL=4048; b_lsid=75E916AA_18EA1A8D995; bsource=search_baidu; FEED_LIVE_VERSION=V_HEADER_LIVE_NO_POP; browser_resolution=1507-691; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTIzNjk5MTMsImlhdCI6MTcxMjExMDY1MywicGx0IjotMX0.8zQW_fNTCSBlK_JkHnzu3gDw62wuTK1qgKcbGec3swM; bili_ticket_expires=171236985") ## 添加
|
||
args = parser.parse_args()
|
||
build = Build(channelKey=args.key,aliToken=args.aliToken, biliCookie=args.biliCookie, is_18=args.is_18)
|
||
build.build()
|