diff --git a/jtxtv10/lib/兔小贝.js b/jtxtv10/lib/兔小贝.js
new file mode 100644
index 0000000..905d963
--- /dev/null
+++ b/jtxtv10/lib/兔小贝.js
@@ -0,0 +1,26 @@
+var rule = {
+ title:'兔小贝',
+ host:'https://www.tuxiaobei.com',
+ homeUrl:'',
+ url:'/list/mip-data?typeId=fyclass&page=fypage&callback=',
+ detailUrl:'/play/fyid',
+ searchUrl:'/search/index?key=**',
+ searchable:2,
+ headers:{
+ 'User-Agent':'MOBILE_UA'
+ },
+ timeout:5000,
+ class_url:'2&3&4&25',
+ class_name:'儿歌&故事&国学&启蒙',
+ //class_name:'#page-viewport&&ul&&li;.text&&Text;a&&href;/(.*)',
+ cate_exclude:'应用',
+ 推荐:'.pic-list.list-box;.items;.text&&Text;mip-img&&src;.all&&Text;a&&href',
+ double:true,
+ limit:5,
+ play_parse:true,
+ lazy:'js:fetch_params.headers["user-agent"] = IOS_UA;let html=fetch(input,fetch_params);let src = jsp.pdfh(html,"body&videoWrap&&video-src");input=src;',
+ // 一级:'json:data.items;name;image;collect_num;category_id+video_id',
+ 一级:'json:data.items;name;image;duration_string;video_id',
+ 二级:'*',
+ 搜索:'.list-con&&.items;.text&&Text;mip-img&&src;.time&&Text;a&&href',
+}
\ No newline at end of file
diff --git a/jtxtv10/lib/斗鱼直播.js b/jtxtv10/lib/斗鱼直播.js
new file mode 100644
index 0000000..e2a4966
--- /dev/null
+++ b/jtxtv10/lib/斗鱼直播.js
@@ -0,0 +1,5 @@
+var rule={title:"斗鱼直播",host:"https://m.douyu.com",homeUrl:"/api/home/mix",url:"/api/room/list?page=fypage&type=fyfilter",filterable:1,filter_url:"{{fl.cateId}}",filter:{yl:[{key:"cateId",name:"分类",value:[{n:"原创IP",v:"ip"},{n:"一起看",v:"yqk"},{n:"二次元",v:"ecy"},{n:"音乐",v:"music"},{n:"户外",v:"HW"},{n:"美食",v:"ms"},{n:"心动派对",v:"xdpd"},{n:"音遇恋人",v:"yinyu"},{n:"星秀",v:"xingxiu"},{n:"心动FM",v:"dtxs"},{n:"娱乐推荐",v:"yltj"},{n:"新选",v:"xinxuan"}]}],PCgame:[{key:"cateId",name:"分类",value:[{n:"英雄联盟",v:"LOL"},{n:"热门游戏",v:"rmyx"},{n:"穿越火线",v:"CF"},{n:"重生边缘",v:"CSBYOL"},{n:"无畏契约",v:"VALORANT"},{n:"CFHD",v:"CFHD"},{n:"命运方舟",v:"LostArk"},{n:"DNF",v:"DNF"},{n:"DOTA2",v:"DOTA2"},{n:"使命召唤",v:"COD"},{n:"炉石传说",v:"How"},{n:"CS2",v:"CounterStrike"},{n:"lol云顶之弈",v:"ydzhy"},{n:"魔兽争霸",v:"mszb"},{n:"魔兽怀旧服",v:"wowclassic"},{n:"全民街篮",v:"qmjl"},{n:"自走棋",v:"dota2rpg"},{n:"传奇",v:"cq"},{n:"跑跑卡丁车",v:"Popkart"},{n:"网易游戏",v:"wyyx"},{n:"星际争霸",v:"SC"},{n:"守望先锋",v:"Overwatch"},{n:"DOTA",v:"DOTA"},{n:"魔兽世界",v:"WOW"},{n:"剑网3",v:"JX3"},{n:"魔域",v:"EudemonsOnline"},{n:"我的世界",v:"MC"},{n:"超激斗梦境",v:"cjdmj"},{n:"冒险岛",v:"mxd"},{n:"三国杀",v:"sanguosha"},{n:"梦幻西游",v:"MHXYOL"},{n:"天涯明月刀",v:"tianya"},{n:"街头篮球",v:"jtlq"},{n:"NBA2KOL2",v:"NBA2KOL2"},{n:"QQ飞车端游",v:"qqfcdy"},{n:"战地之王",v:"AVA"},{n:"军事游戏",v:"jsyx"},{n:"棋牌娱乐",v:"qipai"},{n:"FC ONLINE",v:"FCOL"},{n:"热门网游",v:"rmwy"},{n:"卡拉彼丘",v:"klbq"},{n:"诛仙世界",v:"zxsj"},{n:"千古风流",v:"qgflpc"},{n:"APEX",v:"APEX"},{n:"流放之路POE",v:"PathofExile"},{n:"剑网3缘起",v:"JW3YQ"},{n:"逆水寒",v:"nsh"},{n:"风暴英雄",v:"HOTS"},{n:"逆战",v:"NZ"},{n:"坦克世界",v:"TKSJ"},{n:"战舰世界",v:"wfws"},{n:"巫师之昆特牌",v:"wszktp"},{n:"反恐精英Online",v:"CS"},{n:"暗黑破坏神",v:"DIABLO"},{n:"梦三国2",v:"msg2"},{n:"传奇世界",v:"cqsj"},{n:"方舟:生存进化",v:"fzscjh"},{n:"神武4电脑版",v:"swdnb"},{n:"群雄逐鹿",v:"qxzl"},{n:"堡垒之夜",v:"blzy"},{n:"无限法则",v:"roe"},{n:"问道电脑版",v:"wddnb"},{n:"西山居游戏",v:"Seasun"},{n:"最终幻想14",v:"FF14"},{n:"战意",v:"WYZY"},{n:"剑灵",v:"BladeSoul"},{n:"星际战甲",v:"Warframe"},{n:"龙之谷",v:"DragonNest"},{n:"铁甲雄兵",v:"tjxb"},{n:"古剑奇谭网络版",v:"gjqtwlb"},{n:"轩辕传奇",v:"XYCQ"},{n:"神途",v:"shentu"},{n:"激战2",v:"GuildWars2"},{n:"高达文化区",v:"gdyxq"},{n:"忍者村大战2",v:"rzcdz2"},{n:"RPG网游专区",v:"rpgwyzq"},{n:"诛仙3",v:"zhuxian3"},{n:"笑傲江湖OL",v:"xajhol"},{n:"冒险岛2",v:"MXD2"},{n:"超击突破",v:"SuperPeople"},{n:"无尽战区",v:"WJZQ"},{n:"斗战神",v:"dzs"},{n:"永恒之塔",v:"AION"},{n:"九阴真经",v:"JYZJ"},{n:"FPS综合网游",v:"FPSOL"},{n:"劲舞团",v:"jwt"},{n:"天下",v:"tianxai"},{n:"泡泡堂",v:"ppt"},{n:"武侠乂",v:"wxy"},{n:"音乐游戏",v:"MG"},{n:"新倩女幽魂",v:"ONLINE"},{n:"天谕",v:"tianyu"},{n:"征途2",v:"zhengtu2"},{n:"QQ炫舞",v:"qqxw"},{n:"泰亚史诗",v:"tyss"},{n:"怪物猎人ol",v:"MHol"},{n:"手工星球",v:"sgxq"},{n:"星战前夜:晨曦",v:"EVE"},{n:"热血传奇:本源",v:"rxcqhjsgb"},{n:"枪火重生",v:"qhcs"},{n:"彩虹岛",v:"CHD"},{n:"御龙在天",v:"YLZT"},{n:"英魂之刃",v:"YHZR"},{n:"自由篮球",v:"ZYLQ"},{n:"洛奇英雄传",v:"LQYXZ"},{n:"封印者",v:"FYZ"},{n:"合金弹头",v:"HJDT"},{n:"新英雄年代",v:"XYXSD"},{n:"星尘传说",v:"XCCS"},{n:"盛趣游戏",v:"SQYX"},{n:"新热血英豪",v:"XRXYH"},{n:"沙盒游戏",v:"SHYX"},{n:"我的世界:地下城",v:"MD"},{n:"恐鬼症",v:"KGZ"},{n:"领地人生",v:"LDRS"},{n:"梦塔防",v:"TDOTK"},{n:"大话西游2",v:"dhxy2"},{n:"猎人",v:"lr"},{n:"热血江湖online",v:"rxjhol"},{n:"千年3",v:"qn3"},{n:"逍遥情缘",v:"xyqy"},{n:"快乐西游",v:"klxy"},{n:"鹿鼎记",v:"ldj"},{n:"新桃花源记",v:"xthyj"},{n:"疾风之刃电脑版",v:"jfzr1"},{n:"武魂2电脑版",v:"wh2pc"},{n:"奇迹世界sun",v:"qjsjsun"},{n:"剑侠世界2电脑版",v:"jxsj2pc"},{n:"斩魂",v:"zhpc"},{n:"大唐2",v:"dt2pc"},{n:"蜀山:初章",v:"ssczpc"},{n:"狼人对决网游",v:"lrdjpc"},{n:"武林群侠传",v:"wlqxzpc"},{n:"飘流幻境",v:"plhjpc"},{n:"破天一剑",v:"ptyj"},{n:"四国军棋",v:"sgjq"},{n:"新大话西游3",v:"xy3"},{n:"装甲战争",v:"zjzz"},{n:"暴雪游戏综合",v:"g_bliz"},{n:"长尾4部虚拟分区",v:"cw4bxnfq"},{n:"燕云十六声",v:"WHEREWINDSMEET"},{n:"THE FINALS",v:"THEFINALS"},{n:"NBA2K Online",v:"NBA2KOL"},{n:"塔瑞斯世界",v:"Tarisland"},{n:"跑跑卡丁车:漂移",v:"KartRiderDrift"},{n:"传奇永恒",v:"EternalLegend"},{n:"全境封锁2",v:"TheDivision2"},{n:"盛趣传奇",v:"sqcq"},{n:"火爆热游",v:"hbry"},{n:"火爆传奇",v:"hbcq"}]}],djry:[{key:"cateId",name:"分类",value:[{n:"主机游戏",v:"TVgame"},{n:"刺客信条:英灵殿",v:"AC"},{n:"马里奥制造",v:"Mario"},{n:"逃离塔科夫",v:"EFT"},{n:"命运2",v:"MY2"},{n:"恐怖游戏",v:"Horror"},{n:"荒野大镖客",v:"hydbk"},{n:"灵魂筹码",v:"lhcm"},{n:"骑马与砍杀",v:"MountAndBlade"},{n:"只狼",v:"ZL"},{n:"格斗游戏",v:"FTG"},{n:"饥荒",v:"DontStarve"},{n:"全境封锁",v:"qjfs"},{n:"怀旧游戏",v:"classic"},{n:"NBA2K",v:"NBA2K"},{n:"八方旅人",v:"OT"},{n:"血污:夜之仪式",v:"Blood"},{n:"人类一败涂地",v:"Human"},{n:"环世界",v:"RimWorld"},{n:"古墓丽影",v:"gmly"},{n:"鬼泣",v:"DMC"},{n:"往日不再",v:"WRBZ"},{n:"仙剑奇侠传",v:"PAL"},{n:"神秘海域",v:"Uncharted"},{n:"塞尔达系列",v:"TLoZ"},{n:"僵尸世界大战",v:"WWZ"},{n:"足球游戏",v:"zq"},{n:"橙光",v:"cg"},{n:"了不起的修仙模拟器",v:"ACS"},{n:"女神异闻录",v:"P5"},{n:"超级马里奥",v:"SMO"},{n:"三国志系列",v:"Sangokushi"},{n:"最终幻想",v:"FF"},{n:"中土世界:战争之影",v:"MiddleEarth"},{n:"流放者柯南",v:"Conan"},{n:"三国群英传",v:"SANGO"},{n:"无主之地",v:"Bor"},{n:"辐射",v:"fs"},{n:"SCUM",v:"Scum"},{n:"文明",v:"CVI"},{n:"仁王",v:"NIOH"},{n:"缺氧",v:"ONI"},{n:"全面吃鸡模拟器",v:"TAB"},{n:"古剑奇谭",v:"GuJian3"},{n:"皇牌空战",v:"hpkz"},{n:"体育游戏",v:"tyyx"},{n:"海岛大亨",v:"hddh"},{n:"碧海黑帆",v:"klhdt"},{n:"植物大战僵尸:花园战争系列",v:"PvsZ"},{n:"蜘蛛侠",v:"Spide"},{n:"勇者斗恶龙:建造者2",v:"DQB2"},{n:"遗迹:灰烬重生",v:"Rem"},{n:"血源",v:"BB"},{n:"旺达与巨像",v:"SotC"},{n:"死亡搁浅",v:"DS"},{n:"模拟人生",v:"Sims"},{n:"空洞骑士",v:"HKS"},{n:"胡闹厨房",v:"Overcooked"},{n:"地铁:离去",v:"ME"},{n:"生死狙击2",v:"ssjjtwo"},{n:"三国战纪",v:"sgzj"},{n:"怀旧FC",v:"edwcy"},{n:"经典单机",v:"jddj"},{n:"英雄无敌",v:"HoMM"},{n:"街机游戏",v:"jjyx"},{n:"合金装备",v:"MetalGear"},{n:"红色警戒",v:"hsjj"},{n:"镜之边缘",v:"MsE"},{n:"勿忘我",v:"Remw"},{n:"火焰纹章系列",v:"FireEmblem"},{n:"星露谷物语",v:"Stardew"},{n:"火炬之光",v:"Torchlight"},{n:"赛博朋克2077",v:"Cyberpunk"},{n:"中国式家长",v:"CP"},{n:"精灵宝可梦系列",v:"Pokemon"},{n:"尼尔:机械纪元",v:"NieR"},{n:"无人深空",v:"NMS"},{n:"EVOTINCTION",v:"EVOTINCTION"},{n:"GT赛车7",v:"GT"},{n:"超级机器人大战",v:"SRW"},{n:"这是我的战争",v:"TWoM"},{n:"杀戮尖塔",v:"sljt"},{n:"冰汽时代",v:"Frostpunk"},{n:"帝国时代",v:"AoEIV"},{n:"死亡空间",v:"swkj"},{n:"凯瑟琳Full Body",v:"CFB"},{n:"足球经理",v:"Football"},{n:"雨中冒险",v:"RoR"},{n:"亿万僵尸",v:"Billions"},{n:"武装突袭",v:"ArmA"},{n:"石油大亨",v:"Oil"},{n:"欧洲卡车模拟器",v:"Truck"},{n:"美国逃亡者",v:"Fugitive"},{n:"漫漫长夜",v:"mmcy"},{n:"永恒轮回",v:"Survival"},{n:"孤岛惊魂",v:"FarCry"},{n:"都市:天际线",v:"Skylines"},{n:"盗贼之海",v:"hdzh"},{n:"Dayz",v:"DayZ"},{n:"60秒",v:"60S"},{n:"俄罗斯钓鱼",v:"RF"},{n:"猎人:荒野的召唤",v:"theHunter"},{n:"恐怖黎明",v:"GD"},{n:"看门狗",v:"kmg"},{n:"真三国无双",v:"DW"},{n:"战斗砖块剧场",v:"BT"},{n:"泰拉瑞亚",v:"Terraria"},{n:"异星工厂",v:"Factorio"},{n:"UFC",v:"UFC"},{n:"底特律:变人",v:"Detroit"},{n:"恶魔城",v:"Castlevania"},{n:"毁灭战士",v:"Doom"},{n:"火影忍者:究极忍者风暴",v:"Naruto"},{n:"坎巴拉太空计划",v:"Kerbal"},{n:"龙珠:超宇宙",v:"DBX"},{n:"马里奥赛车",v:"MarioKart"},{n:"欧陆风云",v:"EU"},{n:"乞丐模拟器",v:"HoboToughLife"},{n:"小偷模拟器",v:"ThiefSimulator"},{n:"逆转裁判",v:"AceA"},{n:"超越光速",v:"FTL"},{n:"植物大战僵尸",v:"PvZ"},{n:"游戏开发者",v:"GGM"},{n:"最后的绿洲",v:"LO"},{n:"大富翁",v:"RichMan"},{n:"反恐精英",v:"fkjy"},{n:"英雄连",v:"yxl"},{n:"永劫无间",v:"NB"},{n:"初音未来:歌姬计划",v:"MIKU"},{n:"部落与弯刀",v:"BLYWD"},{n:"一起开火车!",v:"Unrailed"},{n:"霓虹深渊",v:"NA"},{n:"主机其他游戏",v:"OG"},{n:"战场兄弟",v:"ZCXD"},{n:"地狱潜者",v:"DYQZ"},{n:"地下城",v:"dxc"},{n:"人间地狱",v:"RJDY"},{n:"temtem",v:"temtem"},{n:"弹丸论破",v:"dwlp"},{n:"皇家美食",v:"HJMS"},{n:"基佬大乱斗",v:"jldld"},{n:"僵尸毁灭工程",v:"jshmgc"},{n:"岛屿生存者",v:"Sur"},{n:"冬日计划",v:"drjh"},{n:"四海兄弟",v:"shxd"},{n:"创世理想乡",v:"Craftopia"},{n:"柯娜:精神之桥",v:"Kena"},{n:"幽灵线:东京",v:"GTO"},{n:"Solar Ash",v:"Ash"},{n:"BUGSNAX",v:"BUGSNAX"},{n:"生化危机4重制版",v:"ResidentEvil"},{n:"Grounded",v:"Grounded"},{n:"Superliminal",v:"Superliminal"},{n:"Omno",v:"Omno"},{n:"Röki",v:"Roki"},{n:"Undungeon",v:"Undungeon"},{n:"糖豆人",v:"FallGuys"},{n:"渡神纪",v:"Gods"},{n:"Aeolis Tournament",v:"Aeolis"},{n:"猛兽派对",v:"Animals"},{n:"Olija",v:"Olija"},{n:"Creaks",v:"Creaks"},{n:"暗影火炬城",v:"FIST"},{n:"阿尔比恩",v:"Albion"},{n:"Uragun",v:"Uragun"},{n:"戴森球计划",v:"DSP"},{n:"Muse Dash",v:"MuseDash"},{n:"恐惧之间",v:"Fearsurrounds"},{n:"孤岛惊魂6",v:"FarCry6"},{n:"怪物猎人",v:"MonsterHunterRise"},{n:"黑神话:悟空",v:"BlackMythWuKong"},{n:"仁王2",v:"Nioh2"},{n:"三国群英传8",v:"TheThreeKingdoms8"},{n:"三国志14",v:"THREEKINGDOMSXIV"},{n:"杀手3",v:"Hitman3"},{n:"双人成行",v:"ittakestwo"},{n:"Scrapnaut",v:"Scrapnaut"},{n:"租房达人",v:"TheTenants"},{n:"狙击手:幽灵战士契约2",v:"SniperContracts2"},{n:"全面战争",v:"TotalWarWARHAMMER"},{n:"复体",v:"TheComplex"},{n:"战争机器:战术小队",v:"GearsTactics"},{n:"海绵宝宝:比奇堡的冒险",v:"BattleforBikini"},{n:"分离",v:"Disintegration"},{n:"奇妙探险队2",v:"CuriousExpedition2"},{n:"刺客信条:奥德赛",v:"Odyssey"},{n:"丧尸围城4",v:"DeadRising4"},{n:"星球大战:前线",v:"Battlefront"},{n:"Moonray",v:"Moonray"},{n:"灵魂旅人",v:"SpiritFarerlhlr"},{n:"面容",v:"Visage"},{n:"车祸现场模拟器",v:"Accident"},{n:"破门而入2:北方特遣队",v:"DoorKickers2"},{n:"俄罗斯方块效应:连接",v:"TetrisEffect"},{n:"SD高达G世纪:起源",v:"SDGundamG"},{n:"东方计划:不可思议的幻想乡",v:"TouHou"},{n:"Fate/EXTELLA",v:"FateEXTELLA"},{n:"临终:重生试炼",v:"DYINGReborn"},{n:"虚拟现实乐园",v:"VRWorlds"},{n:"苍翼默示录:神观之梦",v:"CentralFiction"},{n:"晚班",v:"LateShift"},{n:"子弹风暴",v:"Bulletstorm"},{n:"巡警",v:"BeatCop"},{n:"耻辱之日",v:"DayofInfamy"},{n:"狙击精英4",v:"SniperElite4"},{n:"热血物语:地下世界",v:"RiverCityRansom"},{n:"史诗战争模拟器",v:"BattleSimulator"},{n:"银河护卫队",v:"Guardians"},{n:"上古卷轴:传奇",v:"ScrollsLegends"},{n:"闪乱神乐:少女们的选择",v:"SenranKagura"},{n:"幽灵行动:荒野",v:"GhostReconWildland"},{n:"白色情人节",v:"WhiteDay"},{n:"誓死坚守",v:"UntilWeDie"},{n:"狂战传说",v:"TalesofBerseria"},{n:"双截龙4",v:"DoubleDragon4"},{n:"地下蚁国",v:"Undergrowth"},{n:"寻找天堂",v:"findparadise"},{n:"画中世界",v:"Gorogoa"},{n:"现代战争",v:"ModernCombat"},{n:"绯红结系",v:"SCARLETNEXUS"},{n:"罪恶装备:STRIVE",v:"GuiltyGear"},{n:"涅克罗蒙达:赏金猎人",v:"NHiredGun"},{n:"骑士精神2",v:"Chivalry2"},{n:"Rune Knights",v:"RuneKnights"},{n:"红至日2:幸存者",v:"TheRed2"},{n:"真女神转生3",v:"ShinMegami3"},{n:"速降王者",v:"Descenders"},{n:"工业崛起",v:"RiseIndustry"},{n:"前往中世纪",v:"GoMedieval"},{n:"Arid",v:"Arid"},{n:"伊始之地",v:"TerraNil"},{n:"进击的巨人2",v:"AttackonTitan2"},{n:"魔域之书",v:"Bookofdevil"},{n:"自由人:游击战争",v:"Freeman"},{n:"战国无双5",v:"SWarriors5"},{n:"不要喂食猴子",v:"NotFeedMonkeys"},{n:"古剑奇谭3",v:"GuJianqitan3"},{n:"剑士",v:"KenshiJS"},{n:"GRIS",v:"GRIS"},{n:"古剑奇谭:永夜",v:"gujianyongye"},{n:"永恒边缘",v:"EdgeEternity"},{n:"Below",v:"Below"},{n:"彩虹坠入",v:"IrisFall"},{n:"嗜血印",v:"BloodySpell"},{n:"兽人必须死3",v:"OrcsDie3"},{n:"狙击精英VR",v:"SniperEliteVR"},{n:"遗忘之城",v:"ForgotCity"},{n:"Last Stop",v:"LastStop"},{n:"边界之外",v:"OutofLine"},{n:"从军",v:"jointhearmy"},{n:"石炉",v:"Stonehearth"},{n:"狂热运输2",v:"TransportFever2"},{n:"机甲战士5",v:"MechWarrior5"},{n:"PICO PARK",v:"PICOPARK"},{n:"光明记忆:无限",v:"Brightmemory"},{n:"秘馆疑踪",v:"HeavenDust"},{n:"侠盗公司",v:"RogueCompany"},{n:"英雄传说:创之轨迹",v:"HajimariNOKiseki"},{n:"战地系列",v:"Battlefiel"},{n:"塞尔达传说:天空之剑HD",v:"SkywardSword"},{n:"尘埃异变",v:"GRIME"},{n:"异形:火力小队精英",v:"FireteamElite"},{n:"12分钟",v:"TwelveMinutes"},{n:"九十六号公路",v:"Road96"},{n:"FORECLOSED",v:"FORECLOSED"},{n:"RiMS Racing",v:"RiMSRacing"},{n:"钢铁之尾",v:"TailsofIron"},{n:"剑侠图",v:"JianXiaTu"},{n:"审判之逝",v:"Lostjudgment"},{n:"帝国神话",v:"mythofempires"},{n:"艾尔登法环",v:"ELDENRING"},{n:"极限竞速:地平线5",v:"ForzaHorizon5"},{n:"使命召唤系列",v:"CALLOFDUTYCOD"},{n:"网吧模拟器",v:"InternetCS"},{n:"The Anacrusis",v:"TheAnacrusis"},{n:"浩劫前夕",v:"TheDayBefore"},{n:"文字游戏",v:"WordGame"},{n:"消逝的光芒2",v:"DyingLight2"},{n:"无主之地3",v:"Borderlands3"},{n:"战神:诸神黄昏",v:"GodofWarRagnarok"},{n:"海上狼人杀",v:"DreadHunger"},{n:"侠乂行:浪迹天涯",v:"XIAYIXING"},{n:"最终幻想:起源",v:"STRANGEROFPARADISE"},{n:"HordeCore",v:"HordeCore"},{n:"双子星:盛气凌人",v:"YoungSouls"},{n:"Indies’ Lies",v:"IndiesLies"},{n:"Deck of Ashes",v:"DeckofAshes"},{n:"星空",v:"Starfield"},{n:"Ilysia",v:"Ilysia"},{n:"Project Q",v:"ProjectQ"},{n:"Pummel Party",v:"PummelParty"},{n:"Holomento",v:"Holomento"},{n:"Overprime",v:"Overprime"},{n:"森林之子",v:"SonsOfTheForest"},{n:"弈仙牌",v:"yixianpai"},{n:"夜族崛起",v:"VRising"},{n:"罗马复兴",v:"RomanRenaissance"},{n:"萤火突击",v:"LostLight"},{n:"High on Life",v:"HighonLife"},{n:"匹诺曹的谎言",v:"LiesofP"},{n:"Isonzo",v:"Isonzo"},{n:"瘟疫传说:安魂曲",v:"Requiem"},{n:"漂泊牧歌",v:"WanderingVillage"},{n:"塞尔达传说:王国之泪",v:"TEARSKINGDOM"},{n:"破碎线",v:"Shatterline"},{n:"卧龙:苍天陨落",v:"Wolong"},{n:"卡库远古封印",v:"KAKU"},{n:"原子之心",v:"AtomicHeart"},{n:"Warhaven",v:"Warhaven"},{n:"宝可梦:朱/紫",v:"ScarletandViolet"},{n:"Evercore Heroes",v:"EvercoreHeroes"},{n:"灵魂石幸存者",v:"SoulstoneSurvivors"},{n:"主机一起看",v:"zjyqk"},{n:"社交互动游戏",v:"SJHDYX"},{n:"轮回修仙路",v:"lhxxl"},{n:"Divine Knockout",v:"DivineKnockout"},{n:"至暗时刻",v:"DarkandDarker"},{n:"自杀小队:杀死正义联盟",v:"KTJL"},{n:"XDefiant",v:"XDefiant"},{n:"Warlander",v:"Warlander"},{n:"Scars Above",v:"ScarsAbove"},{n:"Pacific Drive",v:"PacificDrive"},{n:"最终幻想16",v:"FinalFantasyXVI"},{n:"街头霸王",v:"StreetFighter"},{n:"Tchia",v:"Tchia"},{n:"大侠立志传",v:"HerosAdventure"},{n:"最后纪元",v:"LastEpoch"},{n:"魔戒:咕噜",v:"Gollum"},{n:"Prison Life 2",v:"PrisonLife"},{n:"Innchanted",v:"Innchanted"},{n:"幻兽帕鲁",v:"Palworld"},{n:"Life by You",v:"LifebyYou"},{n:"Eresys",v:"Eresys"},{n:"Pax Dei",v:"PaxDei"},{n:"Teravit",v:"Teravit"},{n:"Caliber",v:"Caliber"},{n:"沙盒与副本:英勇之地",v:"HerosLand"},{n:"Coridden",v:"Coridden"},{n:"Unrecord",v:"Unrecord"},{n:"Deducto 2",v:"Deducto2"},{n:"装甲核心6:境界天火",v:"ArmoredCore"},{n:"Wayfinder",v:"Wayfinder"},{n:"迷瘴纪事",v:"MiasmaChronicles"},{n:"Minigame Madness",v:"MinigameMadness"},{n:"严阵以待",v:"ReadyorNot"},{n:"上古卷轴OL",v:"TheElderScrolls"},{n:"弹幕风暴",v:"dmfb"},{n:"学园构想家",v:"SchoolHomeroom"},{n:"弈仙牌手游",v:"YiXianm"},{n:"Jusant",v:"JUSANT"},{n:"潜水员戴夫",v:"DAVETHEDIVER"},{n:"GYLT",v:"GYLT"},{n:"索利斯堡",v:"FortSolis"},{n:"Towerborne",v:"Towerborne"},{n:"33 Immortals",v:"33Immortals"},{n:"Wildmender",v:"Wildmender"},{n:"How 2 Escape",v:"How2Escape"},{n:"碧蓝幻想:Relink",v:"Relink"},{n:"漫威蜘蛛侠2",v:"MarvelSpiderman2"},{n:"王权与自由",v:"ThroneandLiberty"},{n:"博德之门3",v:"BG3"},{n:"Eternights",v:"Eternights"},{n:"Project F",v:"ProjectF"},{n:"BaldMan Climbs Up",v:"BaldManClimbsUp"},{n:"FC24",v:"FC24"},{n:"NBA 2K24",v:"NBA2K24"},{n:"沉没之地",v:"Sunkenland"},{n:"七日世界",v:"qrsj"},{n:"雾锁王国",v:"wswg"}]}],syxx:[{key:"cateId",name:"分类",value:[{n:"元梦之星",v:"YMZX"},{n:"王者荣耀",v:"wzry"},{n:"LOL手游",v:"LOLM"},{n:"崩坏:星穹铁道",v:"bhxqtd"},{n:"和平精英",v:"hpjy"},{n:"暗区突围",v:"aqtw"},{n:"蛋仔派对",v:"dzpd"},{n:"高能英雄",v:"gnyx"},{n:"幻塔",v:"ht"},{n:"火影忍者",v:"hyrz"},{n:"COD手游",v:"smzhsy"},{n:"lol电竞经理",v:"EGAME"},{n:"DNF手游",v:"mdnf"},{n:"金铲铲之战",v:"JGAME"},{n:"天刀手游",v:"tdsy"},{n:"原神",v:"yuanshen"},{n:"航海王热血航线",v:"HHWRXHX"},{n:"逆水寒手游",v:"NSHM"},{n:"万国觉醒",v:"wgjx"},{n:"鸿图之下",v:"htzx"},{n:"欢乐麻将",v:"HLMJ"},{n:"王者模拟战",v:"wzrpg"},{n:"中国象棋",v:"ZGXQ"},{n:"天谕手游",v:"tysy"},{n:"巅峰坦克",v:"DFTK"},{n:"新游中心",v:"xyzx"},{n:"热门手游",v:"phone"},{n:"梦幻手游",v:"mhxy"},{n:"QQ飞车",v:"qqfcsy"},{n:"第五人格",v:"dwrg"},{n:"欢乐斗地主",v:"hlddz"},{n:"荒野乱斗",v:"hyld"},{n:"阴阳师",v:"yys"},{n:"狼人杀",v:"LRS"},{n:"JJ斗地主",v:"jj"},{n:"梦幻新诛仙",v:"mhxzx"},{n:"街霸对决",v:"jbdj"},{n:"机动都市阿尔法",v:"jddsaef"},{n:"一人之下",v:"yrzx"},{n:"多多自走棋",v:"zzq"},{n:"崩坏3",v:"bhxl"},{n:"风云岛行动",v:"fydxd"},{n:"云游戏",v:"cloudgame"},{n:"跑跑手游",v:"PPKDCSY"},{n:"率土之滨",v:"stzb"},{n:"灌篮高手",v:"glgs"},{n:"皇室战争",v:"hszz"},{n:"忍者必须死3",v:"rzbxs3"},{n:"神武4手游",v:"sw3"},{n:"梦幻模拟战",v:"mhmnz"},{n:"实况足球",v:"skzq"},{n:"剑与远征",v:"jyyz"},{n:"航海王:燃烧意志",v:"hhwrsyz"},{n:"球球大作战",v:"qqdzz"},{n:"英雄杀",v:"yxs"},{n:"魔域口袋版",v:"mykdb"},{n:"口袋新旅程",v:"KDXLC"},{n:"剑网3:指尖江湖",v:"jw3zjjh"},{n:"部落冲突",v:"blct"},{n:"剑与家园",v:"jyjy"},{n:"新笑傲江湖",v:"xxajh"},{n:"猫和老鼠",v:"mhls"},{n:"猎人手游",v:"lrlr"},{n:"明日之后",v:"mrzh"},{n:"影之诗",v:"yzs"},{n:"决战平安京",v:"jzpaj"},{n:"魂斗罗归来",v:"DLHGL"},{n:"贪吃蛇大作战",v:"tcsdzz"},{n:"圣斗士星矢",v:"sdsxs"},{n:"魔力宝贝手游",v:"mlbbsy"},{n:"哈利波特:魔法觉醒",v:"HarryPotter"},{n:"手游推广",v:"rmsy"},{n:"魔灵召唤",v:"mlzh"},{n:"香肠派对",v:"xcpd"},{n:"迷你世界",v:"MNSJ"},{n:"荒野行动",v:"hyxd"},{n:"大话西游2口袋版",v:"dhxy2kdb"},{n:"FC足球世界",v:"FCZQSJ"},{n:"街篮",v:"jl"},{n:"一起来捉妖",v:"yiqilaizhuoyao"},{n:"明日方舟",v:"mrfz"},{n:"自由幻想手游",v:"zyhx"},{n:"一梦江湖",v:"ymjh"},{n:"王牌战争:文明重启",v:"wmcq"},{n:"完美世界手游",v:"wmsjsy"},{n:"拳皇98OL",v:"kof98"},{n:"赛尔号",v:"srh"},{n:"猎魂觉醒",v:"lhjx"},{n:"仙境传说",v:"xjcs"},{n:"逃跑吧少年",v:"tpbsn"},{n:"石器时代",v:"sqsd"},{n:"英魂之刃口袋版",v:"yh"},{n:"拉结尔",v:"lje"},{n:"倩女幽魂手游",v:"qnyhsy"},{n:"决斗之城2",v:"jdzc2"},{n:"传奇手游",v:"cqsy"},{n:"欢乐升级",v:"hlsj"},{n:"雀魂",v:"Majsoul"},{n:"二次元手游",v:"ecysy"},{n:"天龙八部online",v:"tianlongbabuonline"},{n:"征途2手游",v:"zt2sy"},{n:"万王之王3D",v:"wwzw3D"},{n:"武林外传",v:"wlwz"},{n:"我叫MT4",v:"MT4"},{n:"元气骑士",v:"yuanqiqishi"},{n:"红警OL手游",v:"hjolsy"},{n:"植物大战僵尸手游",v:"ZWDZJS"},{n:"龙之谷手游",v:"lzgsy"},{n:"创造与魔法",v:"ccymf"},{n:"境界-死神激斗",v:"jjssjd"},{n:"奇迹觉醒",v:"qjjx"},{n:"光遇",v:"skygy"},{n:"游戏王:决斗链接",v:"yxwjdlj"},{n:"巅峰战舰",v:"dfzj"},{n:"绝世战魂",v:"jszh"},{n:"寻仙",v:"xunxian"},{n:"天天象棋",v:"ttxq"},{n:"王国纪元",v:"wgjy"},{n:"龙族幻想",v:"lzhx"},{n:"剑网3指尖对弈",v:"jwszjdy"},{n:"剑侠情缘2:剑歌行",v:"jianxiaqingyuan"},{n:"三国杀移动版",v:"SGSSY"},{n:"罗布乐思",v:"Roblox"},{n:"足球手游",v:"zqsy"},{n:"月圆之夜",v:"yyzy"},{n:"王牌战争",v:"wpzz"},{n:"秦时明月世界",v:"qsmysj"},{n:"独立手游",v:"dlsy"},{n:"神都夜行录",v:"sdyxl"},{n:"风之大陆",v:"fzdl"},{n:"金属对决",v:"jsdj"},{n:"轩辕剑龙舞云山",v:"xyjlwys"},{n:"微乐棋牌",v:"WLQP"},{n:"辐射:避难所Online",v:"fsbnsonline"},{n:"街篮2",v:"jl2"},{n:"极光计划",v:"jgjh"},{n:"不良人3",v:"blr3"},{n:"镇魔曲手游",v:"zmq"},{n:"传奇世界手游",v:"cqsjsy"},{n:"永恒纪元",v:"yhjy"},{n:"乱世王者",v:"lswz"},{n:"数码宝贝:相遇",v:"smbbxy"},{n:"仙剑4",v:"xjqxz4"},{n:"长安幻世绘",v:"cahsh"},{n:"篮球手游",v:"lqsy"},{n:"鬼泣-巅峰之战",v:"gqdfzz"},{n:"射击类手游",v:"qtsy"},{n:"命运歌姬",v:"mygj"},{n:"光明大陆",v:"gmdl"},{n:"暗黑不朽",v:"diabloimmortal"},{n:"新神魔大陆",v:"xsmdl"},{n:"公主连结Re:Dive",v:"gzlj"},{n:"三国志战略版",v:"sgzzlb"},{n:"天地劫:幽城再临",v:"tdj"},{n:"Disorder",v:"Disorder"},{n:"凹凸世界",v:"atsj"},{n:"云上城之歌",v:"ysczg"},{n:"五子棋",v:"wzq"},{n:"围棋",v:"wq"},{n:"梦想新大陆",v:"mxxdl"},{n:"三国志幻想大陆:国创加强版",v:"sgzhxdl"},{n:"全球行动",v:"qqxd"},{n:"诛仙手游",v:"zxsy"},{n:"妄想山海",v:"wxsh"},{n:"黎明觉醒:生机",v:"lmjx"},{n:"龙之谷2手游",v:"lzg2sy"},{n:"庆余年",v:"QYN"},{n:"我的侠客",v:"wdxk"},{n:"曙光英雄",v:"sgyx"},{n:"真三国无双霸",v:"zsgwsb"},{n:"大话西游手游",v:"dhxysy"},{n:"口袋进化",v:"kdjh"},{n:"开心消消乐",v:"kxxxl"},{n:"战争怒吼",v:"zznh"},{n:"忘川风华录",v:"wcfhl"},{n:"新剑侠情缘手游",v:"xjxqysy"},{n:"重生细胞",v:"csxb"},{n:"汉家江湖",v:"HJJH"},{n:"海岛奇兵",v:"hdqb"},{n:"钢铁力量2",v:"gtll2"},{n:"仙剑奇侠传九野",v:"xjqxzjy"},{n:"魔域手游",v:"mysy"},{n:"大唐无双手游",v:"dtwssy"},{n:"地铁跑酷",v:"dtpk"},{n:"战舰世界闪击战",v:"zjsjsjz"},{n:"狂暴之翼",v:"kbzy"},{n:"西游女儿国",v:"xyneg"},{n:"少年三国志",v:"snsgz"},{n:"钢琴师",v:"gqs"},{n:"横扫千军",v:"hsqj"},{n:"节奏大爆炸",v:"jzdbz"},{n:"喵斯快跑",v:"mskp"},{n:"双子",v:"sz"},{n:"梦想世界3手游",v:"mxsj3"},{n:"精灵之境",v:"jlzj"},{n:"镇魂街:武神躯",v:"zhjwsq"},{n:"斗罗大陆:斗神再临",v:"dldldszl"},{n:"斗罗大陆:武魂觉醒",v:"dldlwhjx"},{n:"斗罗大陆2绝世唐门",v:"dldl2jstm"},{n:"战神觉醒",v:"zsjx"},{n:"九州仙剑传H5",v:"jzxjzh5"},{n:"荣耀大天使",v:"rydts"},{n:"蓝月传奇",v:"lycq"},{n:"凡人修仙传挂机版H5",v:"frxxzgjbh5"},{n:"我的帝国H5",v:"wddgh5"},{n:"盗墓笔记",v:"dmbj"},{n:"剑与轮回",v:"jylh"},{n:"混沌起源",v:"hdqy"},{n:"大天使之剑",v:"dtszj"},{n:"战斗少女跑酷",v:"zdsnpk"},{n:"绝世仙王",v:"jsxw"},{n:"一刀传世",v:"ydcs"},{n:"斗罗大陆",v:"dldl"},{n:"破雪刃",v:"pxr"},{n:"JJ象棋",v:"jjxq"},{n:"天姬变",v:"tjb"},{n:"剑玲珑",v:"jll"},{n:"火线精英",v:"hxjy"},{n:"造梦西游OL",v:"zmxyol"},{n:"奥奇传说手游",v:"aqcssy"},{n:"战斗吧龙魂",v:"zdblh"},{n:"剑开仙门",v:"jkxm"},{n:"机甲爱丽丝",v:"jjals"},{n:"狼人对决",v:"lrdj"},{n:"最终幻想:勇气启示录 幻影战争",v:"hyzz"},{n:"贝比岛",v:"bbd"},{n:"葫芦娃兄弟",v:"hlwxd"},{n:"造梦西游4",v:"zmxy4"},{n:"比特小队",v:"btxd"},{n:"流言侦探",v:"lyzt"},{n:"少女前线",v:"snqx"},{n:"遇见",v:"yj"},{n:"霓虹深渊:无限",v:"nhsywx"},{n:"胡莱三国3",v:"hlsg3"},{n:"奥拉星",v:"alx"},{n:"先游云游戏",v:"Gamer"},{n:"绿茵信仰",v:"lyxy"},{n:"蜀山掌门",v:"sszm"},{n:"球球联盟",v:"qqlm"},{n:"碧蓝航线手游",v:"blhxsy"},{n:"300大作战",v:"300dzz"},{n:"第七史诗",v:"dqss"},{n:"宝可梦大集结",v:"PokemonUNITE"},{n:"无极仙途",v:"wjxt"},{n:"汉末霸业",v:"hmby"},{n:"EVE星战前夜:无烬星河",v:"evexzqywjxh"},{n:"少女前线2:追放",v:"sq2zf"},{n:"火力苏打(T3)",v:"T3"},{n:"植物大战僵尸2",v:"zwdzjs2"},{n:"球球英雄",v:"qqyx"},{n:"悠长假期",v:"ycjq"},{n:"无悔华夏",v:"whrhx"},{n:"猫之城",v:"mzc"},{n:"墨斗",v:"modou"},{n:"圣斗士星矢:正义传说",v:"sdsxszyz"},{n:"未定事件簿",v:"wdsjp"},{n:"白夜极光",v:"byjg"},{n:"斗罗大陆:魂师对决",v:"dldlhsdj"},{n:"古墓丽影传说:迷踪",v:"gmlycsmz"},{n:"放置与召唤",v:"fzyzh"},{n:"闪烁之光",v:"syzg"},{n:"老农种树",v:"lnzs"},{n:"三国演义:吞噬无界",v:"sgyytswj"},{n:"偶像梦幻祭2",v:"oxmhj2"},{n:"卡卡保皇",v:"kkbh"},{n:"灵猫传",v:"lmz"},{n:"绝对演绎",v:"jdyy"},{n:"剑侠世界3",v:"jxsj3"},{n:"召唤与合成2",v:"zhyhc2"},{n:"仙侠第一放置",v:"xxdyfz"},{n:"弓箭手大作战",v:"gjsdzz"},{n:"挨饿荒野",v:"aehy"},{n:"诺亚之心",v:"nyzx"},{n:"闪耀暖暖",v:"synn"},{n:"模拟城市:我是市长",v:"mncswssc"},{n:"重返帝国",v:"cfdg"},{n:"长安幻想",v:"cahx"},{n:"火炬之光:无限",v:"hjzgwx"},{n:"富豪闯三国",v:"fhcsg"},{n:"拂晓",v:"fx"},{n:"火影忍者:忍者新世代",v:"hyrzrzxsd"},{n:"滚动的天空",v:"gddtk"},{n:"新斗罗大陆",v:"xdldl"},{n:"登山赛车",v:"dssc"},{n:"荒野乱斗(腾讯版)",v:"hyldtxb"},{n:"小小勇者",v:"xxyz"},{n:"小冰冰传奇",v:"xbbcq"},{n:"三国战纪2手游",v:"sgzj2"},{n:"我的战舰",v:"wdzj"},{n:"我是大东家",v:"wsddj"},{n:"幸存者危城",v:"xczwc"},{n:"暗魔领主",v:"amlz"},{n:"冒险公社手游",v:"mxgs"},{n:"欧陆战争5:帝国",v:"olzz5dg"},{n:"纪念碑谷2",v:"jnbg2"},{n:"大航海探险物语",v:"dhhtxwy"},{n:"我在7年后等着你",v:"wz7nhdzn"},{n:"航海日记",v:"hhrj"},{n:"一拳超人:最强之男",v:"yqcrzqzn"},{n:"王国保卫战4",v:"wgbwz4"},{n:"半世界之旅",v:"bsjzl"},{n:"奥特曼宇宙英雄",v:"atmyzyx"},{n:"新三国杀",v:"xsgs"},{n:"奶块",v:"nk"},{n:"策魂三国",v:"chsg"},{n:"奥特曼系列OL",v:"atmxlol"},{n:"洪荒文明",v:"hhwm"},{n:"街头足球",v:"jtzq"},{n:"同人圣三国蜀汉传",v:"trssgshc"},{n:"我做夫人那些年",v:"wzfrnxn"},{n:"小小五千年",v:"xxwqn"},{n:"实况球会经理",v:"skqhjl"},{n:"时空猎人",v:"sklr"},{n:"星际逆战",v:"xjnz"},{n:"LoveLive! 学园偶像祭",v:"lovelivexyoxj"},{n:"黑色沙漠手游",v:"hesmsy"},{n:"魔力宝贝:旅人",v:"mlbblr"},{n:"盾之勇者成名录:浪潮",v:"dzyzcmllc"},{n:"魔力宝贝归来",v:"mlbbgl"},{n:"荣耀新三国",v:"ryxsg"},{n:"巅峰极速",v:"dfjs"},{n:"新盗墓笔记",v:"xdmbj"},{n:"卧龙吟2",v:"wly2"},{n:"武林闲侠",v:"wlxx"},{n:"淘米游戏",v:"tmyx"},{n:"暖雪",v:"warmsnow"},{n:"无期迷途",v:"wqmt"},{n:"逆光潜入",v:"ngqr"},{n:"CF手游",v:"CFSY"},{n:"新天龙八部手游",v:"xtlbbsy"},{n:"无神之界",v:"wszj"},{n:"尘白禁区",v:"cbjq"},{n:"传奇天下",v:"CQTX"},{n:"全民大灌篮",v:"qmdgl"},{n:"枪火重生手游",v:"GunfireReborn"},{n:"火影三国志",v:"g_hysg"},{n:"网易其它组",v:"g_wyqt"},{n:"三国战纪手游",v:"sgzjsy"},{n:"染·钟楼谜团",v:"BOTC"},{n:"绝区零",v:"jql"},{n:"魔兽弧光大作战",v:"warcraftrumble"},{n:"重返CODM",v:"RECODM"},{n:"综合手游",v:"zhsy"},{n:"IP游戏",v:"ipyx"},{n:"鸣潮",v:"cm"},{n:"棋牌游戏",v:"QPYX"},{n:"奥比岛:梦想国度",v:"abdmxgd"},{n:"铃兰之剑",v:"llzjwzhpdsj"},{n:"晶核",v:"jhcoa"},{n:"星之破晓",v:"dhpx"},{n:"赛尔计划",v:"srjh"},{n:"SLG综合",v:"SLG"},{n:"代号:伙伴",v:"DHGB"},{n:"天使之战",v:"tszz"},{n:"全明星街球派对",v:"hoopheroes"},{n:"合金弹头:觉醒",v:"MetalSlug"},{n:"白荆回廊",v:"BJHL"},{n:"三国志战棋版",v:"g_sgzzqb"},{n:"鹅鸭杀手游",v:"GooseDuck"},{n:"太空杀",v:"SuperSus"},{n:"天龙八部2:飞龙战天",v:"tlbb2flzt"},{n:"西行纪 燃魂",v:"xxjrh"},{n:"决胜巅峰",v:"jueshengdianfeng"},{n:"冒险岛:枫之传说",v:"MapleStory"},{n:"石器时代:觉醒",v:"sqsdjx"},{n:"星球:重启",v:"xqcq"},{n:"决战玛法",v:"jzmf"},{n:"二次元游戏",v:"ECYYX"},{n:"圣境之塔",v:"sjzt"},{n:"传说法师手游",v:"CSFSSY"},{n:"钢岚",v:"Mecharashi"},{n:"勇闯三国",v:"ycsg"},{n:"绯色回响",v:"fshxgf"},{n:"三国:谋定天下",v:"sgmdtx"}]}],kjwh:[{key:"cateId",name:"分类",value:[{n:"数码科技",v:"smkj"},{n:"纪录片",v:"jlp"},{n:"成年教育",v:"jiaoyu"},{n:"人文社科",v:"Humanities"}]}],yp:[{key:"cateId",name:"分类",value:[{n:"派对",v:"paidui"},{n:"心动FM.",v:"DIANT"},{n:"一起玩",v:"yiqiwan"}]}],voice:[{key:"cateId",name:"分类",value:[{n:"语音交友",v:"yyjy"},{n:"音乐之声",v:"yyzs"},{n:"连麦互动",v:"lianmaihudong"},{n:"娱乐开黑",v:"ylkh"}]}]},filter_def:{yl:{cateId:"yqk"},PCgame:{cateId:"LOL"},djry:{cateId:"TVgame"},syxx:{cateId:"wzry"},yz:{cateId:"yz"},kjwh:{cateId:"smkj"},yp:{cateId:"yiqiwan"},voice:{cateId:"yyzs"},znl:{cateId:"znl"}},class_name:"娱乐天地&网游竞技&单机热游&手游休闲&颜值&科技文化&语音互动&语音直播&正能量",class_url:"yl&PCgame&djry&syxx&yz&kjwh&yp&voice&znl",detailUrl:"https://m.douyu.com/fyid?dyshid=0-1c6d52c74b1e6bec7aa63a8e000617p1&dyshci=181",searchUrl:"/api/search/liveRoom?#did=10000000000000000000000000001501&limit=20&offset=0&sk=**;post",searchable:2,quickSearch:0,headers:{"User-Agent":"MOBILE_UA"},timeout:5e3,limit:8,play_parse:!0,lazy:"","推荐":"js:\n let d = [];\n let jo = JSON.parse(request(input)).data;\n jo.forEach((it,idex) => {\n let slist = jo[idex].list ;\n slist.forEach(it => {\n d.push({\n url: it.rid,\n title: it.roomName,\n img: it.roomSrc,\n desc: '👁' + it.hn + ' 🆙' + it.nickname,\n })\n });\n });\n setResult(d);\n ","一级":"js:\n let d = [];\n let jo = JSON.parse(request(input)).data.list;\n jo.forEach(it => {\n d.push({\n url: it.rid,\n title: it.roomName,\n img: it.roomSrc,\n desc: '👁' + it.hn + ' 🆙' + it.nickname,\n })\n });\n setResult(d);\n ",
+
+ 二级:'*',
+
+"搜索":"js:\n var d = [];\n let rurls = input.split(';')[0].split('#');\n let rurl = rurls[0];\n let params = rurls.length > 1 ?rurls[1]:'';\n let _fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));\n let postData = {body:params};\n Object.assign(_fetch_params,postData);\n let jo = JSON.parse(post(rurl,_fetch_params)).data.list;\n jo.forEach(it => {\n d.push({\n url: it.roomId,\n title: it.roomName,\n img: it.roomSrc,\n desc: '👁' + it.hn + ' 🆙' + it.nickname,\n })\n });\n setResult(d);\n ",sniffer:1,isVideo:"js:\n log(input);\n if(/\\/huya/.test(input)) {\n input = true\n } else if(/\\.flv?|\\.m3u8?|\\.mp4?/.test(input)){\n input = true\n }else{\n input = false\n }\n "};
\ No newline at end of file
diff --git a/jtxtv10/lib/模板.js b/jtxtv10/lib/模板.js
new file mode 100644
index 0000000..82b037b
--- /dev/null
+++ b/jtxtv10/lib/模板.js
@@ -0,0 +1,304 @@
+if (typeof Object.assign != 'function') {
+ Object.assign = function () {
+ var target = arguments[0];
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) {
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
+ target[key] = source[key];
+ }
+ }
+ }
+ return target;
+};
+}
+function getMubans() {
+ var mubanDict = { // 模板字典
+ mxpro: {
+ title: '',
+ host: '',
+ // homeUrl:'/',
+ url: '/vodshow/fyclass--------fypage---.html',
+ searchUrl: '/vodsearch/**----------fypage---.html',
+ searchable: 2,//是否启用全局搜索,
+ quickSearch: 0,//是否启用快速搜索,
+ filterable: 0,//是否启用分类筛选,
+ headers: {//网站的请求头,完整支持所有的,常带ua和cookies
+ 'User-Agent': 'MOBILE_UA',
+ // "Cookie": "searchneed=ok"
+ },
+ class_parse: '.navbar-items li:gt(2):lt(8);a&&Text;a&&href;/(\\d+).html',
+ play_parse: true,
+ lazy: '',
+ limit: 6,
+ 推荐: '.tab-list.active;a.module-poster-item.module-item;.module-poster-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href',
+ double: true, // 推荐内容是否双层定位
+ 一级: 'body a.module-poster-item.module-item;a&&title;.lazyload&&data-original;.module-item-note&&Text;a&&href',
+ 二级: {
+ "title": "h1&&Text;.module-info-tag&&Text",
+ "img": ".lazyload&&data-original",
+ "desc": ".module-info-item:eq(1)&&Text;.module-info-item:eq(2)&&Text;.module-info-item:eq(3)&&Text",
+ "content": ".module-info-introduction&&Text",
+ "tabs": ".module-tab-item",
+ "lists": ".module-play-list:eq(#id) a"
+ },
+ 搜索: 'body .module-item;.module-card-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href;.module-info-item-content&&Text',
+ },
+ mxone5: {
+ title: '',
+ host: '',
+ url: '/show/fyclass--------fypage---.html',
+ searchUrl: '/search/**----------fypage---.html',
+ searchable: 2,//是否启用全局搜索,
+ quickSearch: 0,//是否启用快速搜索,
+ filterable: 0,//是否启用分类筛选,
+ class_parse: '.nav-menu-items&&li;a&&Text;a&&href;.*/(.*?).html',
+ play_parse: true,
+ lazy: '',
+ limit: 6,
+ 推荐: '.module-list;.module-items&&.module-item;a&&title;img&&data-src;.module-item-text&&Text;a&&href',
+ double: true, // 推荐内容是否双层定位
+ 一级: '.module-items .module-item;a&&title;img&&data-src;.module-item-text&&Text;a&&href',
+ 二级: {
+ "title": "h1&&Text;.tag-link&&Text",
+ "img": ".module-item-pic&&img&&data-src",
+ "desc": ".video-info-items:eq(0)&&Text;.video-info-items:eq(1)&&Text;.video-info-items:eq(2)&&Text;.video-info-items:eq(3)&&Text",
+ "content": ".vod_content&&Text",
+ "tabs": ".module-tab-item",
+ "lists": ".module-player-list:eq(#id)&&.scroll-content&&a"
+ },
+ 搜索: '.module-items .module-search-item;a&&title;img&&data-src;.video-serial&&Text;a&&href',
+ },
+ 首图: {
+ title: '',
+ host: '',
+ url: '/vodshow/fyclass--------fypage---/',
+ searchUrl: '/vodsearch/**----------fypage---.html',
+ searchable: 2,//是否启用全局搜索,
+ quickSearch: 0,//是否启用快速搜索,
+ filterable: 0,//是否启用分类筛选,
+ headers: {//网站的请求头,完整支持所有的,常带ua和cookies
+ 'User-Agent': 'MOBILE_UA',
+ // "Cookie": "searchneed=ok"
+ },
+ class_parse: '.myui-header__menu li.hidden-sm:gt(0):lt(5);a&&Text;a&&href;/(\\d+).html',
+ play_parse: true,
+ lazy: '',
+ limit: 6,
+ 推荐: 'ul.myui-vodlist.clearfix;li;a&&title;a&&data-original;.pic-text&&Text;a&&href',
+ double: true, // 推荐内容是否双层定位
+ 一级: '.myui-vodlist li;a&&title;a&&data-original;.pic-text&&Text;a&&href',
+ 二级: {
+ "title": ".myui-content__detail .title&&Text;.myui-content__detail p:eq(-2)&&Text",
+ "img": ".myui-content__thumb .lazyload&&data-original",
+ "desc": ".myui-content__detail p:eq(0)&&Text;.myui-content__detail p:eq(1)&&Text;.myui-content__detail p:eq(2)&&Text",
+ "content": ".content&&Text",
+ "tabs": ".nav-tabs:eq(0) li",
+ "lists": ".myui-content__list:eq(#id) li"
+ },
+ 搜索: '#searchList li;a&&title;.lazyload&&data-original;.text-muted&&Text;a&&href;.text-muted:eq(-1)&&Text',
+ },
+ 首图2: {
+ title: '',
+ host: '',
+ url: '/list/fyclass-fypage.html',
+ searchUrl: '/vodsearch/**----------fypage---.html',
+ searchable: 2,//是否启用全局搜索,
+ quickSearch: 0,//是否启用快速搜索,
+ filterable: 0,//是否启用分类筛选,
+ headers: {
+ 'User-Agent': 'UC_UA',
+ // "Cookie": ""
+ },
+ // class_parse:'.stui-header__menu li:gt(0):lt(7);a&&Text;a&&href;/(\\d+).html',
+ class_parse: '.stui-header__menu li:gt(0):lt(7);a&&Text;a&&href;.*/(.*?).html',
+ play_parse: true,
+ lazy: '',
+ limit: 6,
+ 推荐: 'ul.stui-vodlist.clearfix;li;a&&title;.lazyload&&data-original;.pic-text&&Text;a&&href',
+ double: true, // 推荐内容是否双层定位
+ 一级: '.stui-vodlist li;a&&title;a&&data-original;.pic-text&&Text;a&&href',
+ 二级: {
+ "title": ".stui-content__detail .title&&Text;.stui-content__detail p:eq(-2)&&Text",
+ "img": ".stui-content__thumb .lazyload&&data-original",
+ "desc": ".stui-content__detail p:eq(0)&&Text;.stui-content__detail p:eq(1)&&Text;.stui-content__detail p:eq(2)&&Text",
+ "content": ".detail&&Text",
+ "tabs": ".stui-vodlist__head h3",
+ "lists": ".stui-content__playlist:eq(#id) li"
+ },
+ 搜索: 'ul.stui-vodlist__media:eq(0) li,ul.stui-vodlist:eq(0) li,#searchList li;a&&title;.lazyload&&data-original;.text-muted&&Text;a&&href;.text-muted:eq(-1)&&Text',
+ 搜索1: 'ul.stui-vodlist&&li;a&&title;.lazyload&&data-original;.text-muted&&Text;a&&href;.text-muted:eq(-1)&&Text',
+ 搜索2: 'ul.stui-vodlist__media&&li;a&&title;.lazyload&&data-original;.text-muted&&Text;a&&href;.text-muted:eq(-1)&&Text',
+ },
+ 默认: {
+ title: '',
+ host: '',
+ url: '/vodshow/fyclass--------fypage---.html',
+ searchUrl: '/vodsearch/-------------.html?wd=**',
+ searchable: 2,//是否启用全局搜索,
+ quickSearch: 0,//是否启用快速搜索,
+ filterable: 0,//是否启用分类筛选,
+ headers: {
+ 'User-Agent': 'MOBILE_UA',
+ },
+ play_parse: true,
+ lazy: '',
+ limit: 6,
+ double: true, // 推荐内容是否双层定位
+ },
+ vfed: {
+ title: '',
+ host: '',
+ url: '/index.php/vod/show/id/fyclass/page/fypage.html',
+ searchUrl: '/index.php/vod/search/page/fypage/wd/**.html',
+ searchable: 2,//是否启用全局搜索,
+ quickSearch: 0,//是否启用快速搜索,
+ filterable: 0,//是否启用分类筛选,
+ headers: {
+ 'User-Agent': 'UC_UA',
+ },
+ // class_parse:'.fed-pops-navbar&&ul.fed-part-rows&&a.fed-part-eone:gt(0):lt(5);a&&Text;a&&href;.*/(.*?).html',
+ class_parse: '.fed-pops-navbar&&ul.fed-part-rows&&a;a&&Text;a&&href;.*/(.*?).html',
+ play_parse: true,
+ lazy: '',
+ limit: 6,
+ 推荐: 'ul.fed-list-info.fed-part-rows;li;a.fed-list-title&&Text;a&&data-original;.fed-list-remarks&&Text;a&&href',
+ double: true, // 推荐内容是否双层定位
+ 一级: '.fed-list-info&&li;a.fed-list-title&&Text;a&&data-original;.fed-list-remarks&&Text;a&&href',
+ 二级: {
+ "title": "h1.fed-part-eone&&Text;.fed-deta-content&&.fed-part-rows&&li&&Text",
+ "img": ".fed-list-info&&a&&data-original",
+ "desc": ".fed-deta-content&&.fed-part-rows&&li:eq(1)&&Text;.fed-deta-content&&.fed-part-rows&&li:eq(2)&&Text;.fed-deta-content&&.fed-part-rows&&li:eq(3)&&Text",
+ "content": ".fed-part-esan&&Text",
+ "tabs": ".fed-drop-boxs&&.fed-part-rows&&li",
+ "lists": ".fed-play-item:eq(#id)&&ul:eq(1)&&li"
+ },
+ 搜索: '.fed-deta-info;h1&&Text;.lazyload&&data-original;.fed-list-remarks&&Text;a&&href;.fed-deta-content&&Text',
+ },
+ 海螺3: {
+ title: '',
+ host: '',
+ searchUrl: '/v_search/**----------fypage---.html',
+ url: '/vod_____show/fyclass--------fypage---.html',
+ headers: {
+ 'User-Agent': 'MOBILE_UA'
+ },
+ timeout: 5000,
+ class_parse: 'body&&.hl-nav li:gt(0);a&&Text;a&&href;.*/(.*?).html',
+ cate_exclude: '明星|专题|最新|排行',
+ limit: 40,
+ play_parse: true,
+ lazy: '',
+ 推荐: '.hl-vod-list;li;a&&title;a&&data-original;.remarks&&Text;a&&href',
+ double: true,
+ 一级: '.hl-vod-list&&.hl-list-item;a&&title;a&&data-original;.remarks&&Text;a&&href',
+ 二级: {
+ "title": ".hl-infos-title&&Text;.hl-text-conch&&Text",
+ "img": ".hl-lazy&&data-original",
+ "desc": ".hl-infos-content&&.hl-text-conch&&Text",
+ "content": ".hl-content-text&&Text",
+ "tabs": ".hl-tabs&&a",
+ "lists": ".hl-plays-list:eq(#id)&&li"
+ },
+ 搜索: '.hl-list-item;a&&title;a&&data-original;.remarks&&Text;a&&href',
+ searchable: 2,//是否启用全局搜索,
+ quickSearch: 0,//是否启用快速搜索,
+ filterable: 0,//是否启用分类筛选,
+ },
+ 海螺2: {
+ title: '',
+ host: '',
+ searchUrl: '/index.php/vod/search/page/fypage/wd/**/',
+ url: '/index.php/vod/show/id/fyclass/page/fypage/',
+ headers: {
+ 'User-Agent': 'MOBILE_UA'
+ },
+ timeout: 5000,
+ class_parse: '#nav-bar li;a&&Text;a&&href;id/(.*?)/',
+ limit: 40,
+ play_parse: true,
+ lazy: '',
+ 推荐: '.list-a.size;li;a&&title;.lazy&&data-original;.bt&&Text;a&&href',
+ double: true,
+ 一级: '.list-a&&li;a&&title;.lazy&&data-original;.list-remarks&&Text;a&&href',
+ 二级: {
+ "title": "h2&&Text;.deployment&&Text",
+ "img": ".lazy&&data-original",
+ "desc": ".deployment&&Text",
+ "content": ".ec-show&&Text",
+ "tabs": "#tag&&a",
+ "lists": ".play_list_box:eq(#id)&&li"
+ },
+ 搜索: '.search-list;a&&title;.lazy&&data-original;.deployment&&Text;a&&href',
+ searchable: 2,//是否启用全局搜索,
+ quickSearch: 0,//是否启用快速搜索,
+ filterable: 0,//是否启用分类筛选,
+ },
+ 短视: {
+ title: '',
+ host: '',
+ // homeUrl:'/',
+ url: '/channel/fyclass-fypage.html',
+ searchUrl: '/search.html?wd=**',
+ searchable: 2,//是否启用全局搜索,
+ quickSearch: 0,//是否启用快速搜索,
+ filterable: 0,//是否启用分类筛选,
+ headers: {//网站的请求头,完整支持所有的,常带ua和cookies
+ 'User-Agent': 'MOBILE_UA',
+ // "Cookie": "searchneed=ok"
+ },
+ class_parse: '.menu_bottom ul li;a&&Text;a&&href;.*/(.*?).html',
+ cate_exclude: '解析|动态',
+ play_parse: true,
+ lazy: '',
+ limit: 6,
+ 推荐: '.indexShowBox;ul&&li;a&&title;img&&data-src;.s1&&Text;a&&href',
+ double: true, // 推荐内容是否双层定位
+ 一级: '.pic-list&&li;a&&title;img&&data-src;.s1&&Text;a&&href',
+ 二级: {
+ "title": "h1&&Text;.content-rt&&p:eq(0)&&Text",
+ "img": ".img&&img&&data-src",
+ "desc": ".content-rt&&p:eq(1)&&Text;.content-rt&&p:eq(2)&&Text;.content-rt&&p:eq(3)&&Text;.content-rt&&p:eq(4)&&Text;.content-rt&&p:eq(5)&&Text",
+ "content": ".zkjj_a&&Text",
+ "tabs": ".py-tabs&&option",
+ "lists": ".player:eq(#id) li"
+ },
+ 搜索: '.sr_lists&&ul&&li;h3&&Text;img&&data-src;.int&&p:eq(0)&&Text;a&&href',
+ },
+ 短视2:{
+ title: '',
+ host: '',
+ class_name:'电影&电视剧&综艺&动漫',
+ class_url:'1&2&3&4',
+ searchUrl: '/index.php/ajax/suggest?mid=1&wd=**&limit=50',
+ searchable: 2,
+ quickSearch: 0,
+ headers:{'User-Agent':'MOBILE_UA'},
+ url: '/index.php/api/vod#type=fyclass&page=fypage',
+ filterable:0,//是否启用分类筛选,
+ filter_url:'',
+ filter: {},
+ filter_def:{},
+ detailUrl:'/index.php/vod/detail/id/fyid.html',
+ play_parse: true,
+ lazy: '',
+ limit: 6,
+ 推荐:'.list-vod.flex .public-list-box;a&&title;.lazy&&data-original;.public-list-prb&&Text;a&&href',
+ 一级:'js:let body=input.split("#")[1];let t=Math.round(new Date/1e3).toString();let key=md5("DS"+t+"DCC147D11943AF75");let url=input.split("#")[0];body=body+"&time="+t+"&key="+key;print(body);fetch_params.body=body;let html=post(url,fetch_params);let data=JSON.parse(html);VODS=data.list.map(function(it){it.vod_pic=urljoin2(input.split("/i")[0],it.vod_pic);return it});',
+ 二级:{
+ "title":".slide-info-title&&Text;.slide-info:eq(3)--strong&&Text",
+ "img":".detail-pic&&data-original",
+ "desc":".fraction&&Text;.slide-info-remarks:eq(1)&&Text;.slide-info-remarks:eq(2)&&Text;.slide-info:eq(2)--strong&&Text;.slide-info:eq(1)--strong&&Text",
+ "content":"#height_limit&&Text",
+ "tabs":".anthology.wow.fadeInUp.animated&&.swiper-wrapper&&a",
+ "tab_text":".swiper-slide&&Text",
+ "lists":".anthology-list-box:eq(#id) li"
+ },
+ 搜索:'json:list;name;pic;;id',
+ }
+ };
+ return JSON.parse(JSON.stringify(mubanDict));
+}
+var mubanDict = getMubans();
+var muban = getMubans();
+export default {muban,getMubans};
\ No newline at end of file
diff --git a/jtxtv10/lib/河马短剧.py b/jtxtv10/lib/河马短剧.py
new file mode 100644
index 0000000..eeee8ba
--- /dev/null
+++ b/jtxtv10/lib/河马短剧.py
@@ -0,0 +1,581 @@
+# -*- coding: utf-8 -*-
+import requests
+import re
+import json
+import traceback
+import sys
+
+sys.path.append('../../')
+try:
+ from base.spider import Spider
+except ImportError:
+ # 定义一个基础接口类,用于本地测试
+ class Spider:
+ def init(self, extend=""):
+ pass
+
+class Spider(Spider):
+ def __init__(self):
+ self.siteUrl = "https://www.kuaikaw.cn"
+ self.nextData = None # 缓存NEXT_DATA数据
+ self.cateManual = {
+ "甜宠": "462",
+ "古装仙侠": "1102",
+ "现代言情": "1145",
+ "青春": "1170",
+ "豪门恩怨": "585",
+ "逆袭": "417-464",
+ "重生": "439-465",
+ "系统": "1159",
+ "总裁": "1147",
+ "职场商战": "943"
+ }
+
+ def getName(self):
+ # 返回爬虫名称
+ return "河马短剧"
+
+ def init(self, extend=""):
+ return
+
+ def fetch(self, url, headers=None):
+ """统一的网络请求接口"""
+ if headers is None:
+ headers = {
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
+ "Referer": self.siteUrl,
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
+ "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8"
+ }
+
+ try:
+ response = requests.get(url, headers=headers, timeout=10, allow_redirects=True)
+ response.raise_for_status()
+ return response
+ except Exception as e:
+ print(f"请求异常: {url}, 错误: {str(e)}")
+ return None
+
+ def isVideoFormat(self, url):
+ # 检查是否为视频格式
+ video_formats = ['.mp4', '.mkv', '.avi', '.wmv', '.m3u8', '.flv', '.rmvb']
+ for format in video_formats:
+ if format in url.lower():
+ return True
+ return False
+
+ def manualVideoCheck(self):
+ # 不需要手动检查
+ return False
+
+ def homeContent(self, filter):
+ """获取首页分类及筛选"""
+ result = {}
+ # 分类列表,使用已初始化的cateManual
+ classes = []
+ for k in self.cateManual:
+ classes.append({
+ 'type_name': k,
+ 'type_id': self.cateManual[k]
+ })
+ result['class'] = classes
+ # 获取首页推荐视频
+ try:
+ result['list'] = self.homeVideoContent()['list']
+ except:
+ result['list'] = []
+
+ return result
+
+ def homeVideoContent(self):
+ """获取首页推荐视频内容"""
+ videos = []
+ try:
+ response = self.fetch(self.siteUrl)
+ html_content = response.text
+ # 提取NEXT_DATA JSON数据
+ next_data_pattern = r''
+ next_data_match = re.search(next_data_pattern, html_content, re.DOTALL)
+ if next_data_match:
+ next_data_json = json.loads(next_data_match.group(1))
+ page_props = next_data_json.get("props", {}).get("pageProps", {})
+ # 获取轮播图数据 - 这些通常是推荐内容
+ if "bannerList" in page_props and isinstance(page_props["bannerList"], list):
+ banner_list = page_props["bannerList"]
+ for banner in banner_list:
+ book_id = banner.get("bookId", "")
+ book_name = banner.get("bookName", "")
+ cover_url = banner.get("coverWap", banner.get("wapUrl", ""))
+ # 获取状态和章节数
+ status = banner.get("statusDesc", "")
+ total_chapters = banner.get("totalChapterNum", "")
+ if book_id and book_name:
+ videos.append({
+ "vod_id": f"/drama/{book_id}",
+ "vod_name": book_name,
+ "vod_pic": cover_url,
+ "vod_remarks": f"{status} {total_chapters}集" if total_chapters else status
+ })
+
+ # SEO分类下的推荐
+ if "seoColumnVos" in page_props and isinstance(page_props["seoColumnVos"], list):
+ for column in page_props["seoColumnVos"]:
+ book_infos = column.get("bookInfos", [])
+ for book in book_infos:
+ book_id = book.get("bookId", "")
+ book_name = book.get("bookName", "")
+ cover_url = book.get("coverWap", "")
+ status = book.get("statusDesc", "")
+ total_chapters = book.get("totalChapterNum", "")
+
+ if book_id and book_name:
+ videos.append({
+ "vod_id": f"/drama/{book_id}",
+ "vod_name": book_name,
+ "vod_pic": cover_url,
+ "vod_remarks": f"{status} {total_chapters}集" if total_chapters else status
+ })
+
+ # # 去重
+ # seen = set()
+ # unique_videos = []
+ # for video in videos:
+ # if video["vod_id"] not in seen:
+ # seen.add(video["vod_id"])
+ # unique_videos.append(video)
+ # videos = unique_videos
+
+ except Exception as e:
+ print(f"获取首页推荐内容出错: {e}")
+
+ result = {
+ "list": videos
+ }
+ return result
+
+ def categoryContent(self, tid, pg, filter, extend):
+ """获取分类内容"""
+ result = {}
+ videos = []
+ url = f"{self.siteUrl}/browse/{tid}/{pg}"
+ response = self.fetch(url)
+ html_content = response.text
+ # 提取NEXT_DATA JSON数据
+ next_data_pattern = r''
+ next_data_match = re.search(next_data_pattern, html_content, re.DOTALL)
+ if next_data_match:
+ next_data_json = json.loads(next_data_match.group(1))
+ page_props = next_data_json.get("props", {}).get("pageProps", {})
+ # 获取总页数和当前页
+ current_page = page_props.get("page", 1)
+ total_pages = page_props.get("pages", 1)
+ # 获取书籍列表
+ book_list = page_props.get("bookList", [])
+ # 转换为通用格式
+ for book in book_list:
+ book_id = book.get("bookId", "")
+ book_name = book.get("bookName", "")
+ cover_url = book.get("coverWap", "")
+ status_desc = book.get("statusDesc", "")
+ total_chapters = book.get("totalChapterNum", "")
+ if book_id and book_name:
+ videos.append({
+ "vod_id": f"/drama/{book_id}",
+ "vod_name": book_name,
+ "vod_pic": cover_url,
+ "vod_remarks": f"{status_desc} {total_chapters}集" if total_chapters else status_desc
+ })
+ # 构建返回结果
+ result = {
+ "list": videos,
+ "page": int(current_page),
+ "pagecount": total_pages,
+ "limit": len(videos),
+ "total": total_pages * len(videos) if videos else 0
+ }
+ return result
+
+ def switch(self, key, pg):
+ # 搜索功能
+ search_results = []
+ # 获取第一页结果,并检查总页数
+ url = f"{self.siteUrl}/search?searchValue={key}&page={pg}"
+ response = self.fetch(url)
+ html_content = response.text
+ # 提取NEXT_DATA JSON数据
+ next_data_pattern = r''
+ next_data_match = re.search(next_data_pattern, html_content, re.DOTALL)
+ if next_data_match:
+ next_data_json = json.loads(next_data_match.group(1))
+ page_props = next_data_json.get("props", {}).get("pageProps", {})
+ # 获取总页数
+ total_pages = page_props.get("pages", 1)
+ # 处理所有页的数据
+ all_book_list = []
+ # 添加第一页的书籍列表
+ book_list = page_props.get("bookList", [])
+ all_book_list.extend(book_list)
+ # 如果有多页,获取其他页的数据
+ if total_pages > 1 : # quick模式只获取第一页
+ for page in range(2, total_pages + 1):
+ next_page_url = f"{self.siteUrl}/search?searchValue={key}&page={page}"
+ next_page_response = self.fetch(next_page_url)
+ next_page_html = next_page_response.text
+ next_page_match = re.search(next_data_pattern, next_page_html, re.DOTALL)
+ if next_page_match:
+ next_page_json = json.loads(next_page_match.group(1))
+ next_page_props = next_page_json.get("props", {}).get("pageProps", {})
+ next_page_books = next_page_props.get("bookList", [])
+ all_book_list.extend(next_page_books)
+ # 转换为统一的搜索结果格式
+ for book in all_book_list:
+ book_id = book.get("bookId", "")
+ book_name = book.get("bookName", "")
+ cover_url = book.get("coverWap", "")
+ total_chapters = book.get("totalChapterNum", "0")
+ status_desc = book.get("statusDesc", "")
+ # 构建视频项
+ vod = {
+ "vod_id": f"/drama/{book_id}",
+ "vod_name": book_name,
+ "vod_pic": cover_url,
+ "vod_remarks": f"{status_desc} {total_chapters}集"
+ }
+ search_results.append(vod)
+ result = {
+ "list": search_results,
+ "page": pg
+ }
+ return result
+
+ def searchContent(self, key, quick, pg=1):
+ result = self.switch(key, pg=pg)
+ result['page'] = pg
+ return result
+
+ def searchContentPage(self, key, quick, pg=1):
+ return self.searchContent(key, quick, pg)
+
+ def detailContent(self, ids):
+ # 获取剧集信息
+ vod_id = ids[0]
+ episode_id = None
+ chapter_id = None
+
+ if not vod_id.startswith('/drama/'):
+ if vod_id.startswith('/episode/'):
+ episode_info = vod_id.replace('/episode/', '').split('/')
+ if len(episode_info) >= 2:
+ episode_id = episode_info[0]
+ chapter_id = episode_info[1]
+ vod_id = f'/drama/{episode_id}'
+ else:
+ vod_id = '/drama/' + vod_id
+
+ drama_url = self.siteUrl + vod_id
+ print(f"请求URL: {drama_url}")
+
+ headers = {
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
+ "Referer": self.siteUrl,
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
+ "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8"
+ }
+
+ rsp = self.fetch(drama_url, headers=headers)
+ if not rsp or rsp.status_code != 200:
+ print(f"请求失败,状态码: {getattr(rsp, 'status_code', 'N/A')}")
+ return {}
+
+ html = rsp.text
+ next_data_match = re.search(r'', html, re.DOTALL)
+
+ if not next_data_match:
+ print("未找到NEXT_DATA内容")
+ return {}
+
+ try:
+ next_data = json.loads(next_data_match.group(1))
+ page_props = next_data.get("props", {}).get("pageProps", {})
+ print(f"找到页面属性,包含 {len(page_props.keys())} 个键")
+
+ book_info = page_props.get("bookInfoVo", {})
+ chapter_list = page_props.get("chapterList", [])
+
+ title = book_info.get("title", "")
+ sub_title = f"{book_info.get('totalChapterNum', '')}集"
+
+ categories = []
+ for category in book_info.get("categoryList", []):
+ categories.append(category.get("name", ""))
+
+ vod_content = book_info.get("introduction", "")
+
+ vod = {
+ "vod_id": vod_id,
+ "vod_name": title,
+ "vod_pic": book_info.get("coverWap", ""),
+ "type_name": ",".join(categories),
+ "vod_year": "",
+ "vod_area": book_info.get("countryName", ""),
+ "vod_remarks": sub_title,
+ "vod_actor": ", ".join([p.get("name", "") for p in book_info.get("performerList", [])]),
+ "vod_director": "",
+ "vod_content": vod_content
+ }
+
+ # 处理播放列表
+ play_url_list = []
+ episodes = []
+
+ if chapter_list:
+ print(f"找到 {len(chapter_list)} 个章节")
+
+ # 先检查是否有可以直接使用的MP4链接作为模板
+ mp4_template = None
+ first_mp4_chapter_id = None
+
+ # 先搜索第一个章节的MP4链接
+ # 为提高成功率,尝试直接请求第一个章节的播放页
+ if chapter_list and len(chapter_list) > 0:
+ first_chapter = chapter_list[0]
+ first_chapter_id = first_chapter.get("chapterId", "")
+ drama_id_clean = vod_id.replace('/drama/', '')
+
+ if first_chapter_id and drama_id_clean:
+ first_episode_url = f"{self.siteUrl}/episode/{drama_id_clean}/{first_chapter_id}"
+ print(f"请求第一集播放页: {first_episode_url}")
+
+ first_rsp = self.fetch(first_episode_url, headers=headers)
+ if first_rsp and first_rsp.status_code == 200:
+ first_html = first_rsp.text
+ # 直接从HTML提取MP4链接
+ mp4_pattern = r'(https?://[^"\']+\.mp4)'
+ mp4_matches = re.findall(mp4_pattern, first_html)
+ if mp4_matches:
+ mp4_template = mp4_matches[0]
+ first_mp4_chapter_id = first_chapter_id
+ print(f"找到MP4链接模板: {mp4_template}")
+ print(f"模板对应的章节ID: {first_mp4_chapter_id}")
+
+ # 如果未找到模板,再检查章节对象中是否有MP4链接
+ if not mp4_template:
+ for chapter in chapter_list[:5]: # 只检查前5个章节以提高效率
+ if "chapterVideoVo" in chapter and chapter["chapterVideoVo"]:
+ chapter_video = chapter["chapterVideoVo"]
+ mp4_url = chapter_video.get("mp4", "") or chapter_video.get("mp4720p", "") or chapter_video.get("vodMp4Url", "")
+ if mp4_url and ".mp4" in mp4_url:
+ mp4_template = mp4_url
+ first_mp4_chapter_id = chapter.get("chapterId", "")
+ print(f"从chapterVideoVo找到MP4链接模板: {mp4_template}")
+ print(f"模板对应的章节ID: {first_mp4_chapter_id}")
+ break
+
+ # 遍历所有章节处理播放信息
+ for chapter in chapter_list:
+ chapter_id = chapter.get("chapterId", "")
+ chapter_name = chapter.get("chapterName", "")
+
+ # 1. 如果章节自身有MP4链接,直接使用
+ if "chapterVideoVo" in chapter and chapter["chapterVideoVo"]:
+ chapter_video = chapter["chapterVideoVo"]
+ mp4_url = chapter_video.get("mp4", "") or chapter_video.get("mp4720p", "") or chapter_video.get("vodMp4Url", "")
+ if mp4_url and ".mp4" in mp4_url:
+ episodes.append(f"{chapter_name}${mp4_url}")
+ continue
+
+ # 2. 如果有MP4模板,尝试替换章节ID构建MP4链接
+ if mp4_template and first_mp4_chapter_id and chapter_id:
+ # 替换模板中的章节ID部分
+ if first_mp4_chapter_id in mp4_template:
+ new_mp4_url = mp4_template.replace(first_mp4_chapter_id, chapter_id)
+ episodes.append(f"{chapter_name}${new_mp4_url}")
+ continue
+
+ # 3. 如果上述方法都不可行,回退到使用chapter_id构建中间URL
+ if chapter_id and chapter_name:
+ url = f"{vod_id}${chapter_id}${chapter_name}"
+ episodes.append(f"{chapter_name}${url}")
+
+ if not episodes and vod_id:
+ # 尝试构造默认的集数
+ total_chapters = int(book_info.get("totalChapterNum", "0"))
+ if total_chapters > 0:
+ print(f"尝试构造 {total_chapters} 个默认集数")
+
+ # 如果知道章节ID的模式,可以构造
+ if chapter_id and episode_id:
+ for i in range(1, total_chapters + 1):
+ chapter_name = f"第{i}集"
+ url = f"{vod_id}${chapter_id}${chapter_name}"
+ episodes.append(f"{chapter_name}${url}")
+ else:
+ # 使用普通的构造方式
+ for i in range(1, total_chapters + 1):
+ chapter_name = f"第{i}集"
+ url = f"{vod_id}${chapter_name}"
+ episodes.append(f"{chapter_name}${url}")
+
+ if episodes:
+ play_url_list.append("#".join(episodes))
+ vod['vod_play_from'] = '河马剧场'
+ vod['vod_play_url'] = '$$$'.join(play_url_list)
+
+ result = {
+ 'list': [vod]
+ }
+ return result
+ except Exception as e:
+ print(f"解析详情页失败: {str(e)}")
+ print(traceback.format_exc())
+ return {}
+
+ def playerContent(self, flag, id, vipFlags):
+ result = {}
+ print(f"调用playerContent: flag={flag}, id={id}")
+
+ headers = {
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
+ "Referer": self.siteUrl,
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
+ "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8"
+ }
+
+ # 解析id参数
+ parts = id.split('$')
+ drama_id = None
+ chapter_id = None
+
+ if len(parts) >= 2:
+ drama_id = parts[0]
+ chapter_id = parts[1]
+ chapter_name = parts[2] if len(parts) > 2 else "第一集"
+ print(f"解析参数: drama_id={drama_id}, chapter_id={chapter_id}")
+ else:
+ # 处理旧数据格式
+ print(f"使用原始URL格式: {id}")
+ result["parse"] = 0
+ result["url"] = id
+ result["header"] = json.dumps(headers)
+ return result
+
+ # 直接检查chapter_id是否包含http(可能已经是视频链接)
+ if 'http' in chapter_id and '.mp4' in chapter_id:
+ print(f"已经是MP4链接: {chapter_id}")
+ result["parse"] = 0
+ result["url"] = chapter_id
+ result["header"] = json.dumps(headers)
+ return result
+
+ # 构建episode页面URL
+ drama_id_clean = drama_id.replace('/drama/', '')
+ episode_url = f"{self.siteUrl}/episode/{drama_id_clean}/{chapter_id}"
+ print(f"请求episode页面: {episode_url}")
+
+ try:
+ rsp = self.fetch(episode_url, headers=headers)
+ if not rsp or rsp.status_code != 200:
+ print(f"请求失败,状态码: {getattr(rsp, 'status_code', 'N/A')}")
+ result["parse"] = 0
+ result["url"] = id
+ result["header"] = json.dumps(headers)
+ return result
+
+ html = rsp.text
+ print(f"获取页面大小: {len(html)} 字节")
+
+ # 尝试从NEXT_DATA提取视频链接
+ mp4_url = None
+
+ # 方法1: 从NEXT_DATA提取
+ next_data_match = re.search(r'', html, re.DOTALL)
+ if next_data_match:
+ try:
+ print("找到NEXT_DATA")
+ next_data = json.loads(next_data_match.group(1))
+ page_props = next_data.get("props", {}).get("pageProps", {})
+
+ # 从chapterList中查找当前章节
+ chapter_list = page_props.get("chapterList", [])
+ print(f"找到章节列表,长度: {len(chapter_list)}")
+
+ for chapter in chapter_list:
+ if chapter.get("chapterId") == chapter_id:
+ print(f"找到匹配的章节: {chapter.get('chapterName')}")
+ chapter_video = chapter.get("chapterVideoVo", {})
+ mp4_url = chapter_video.get("mp4", "") or chapter_video.get("mp4720p", "") or chapter_video.get("vodMp4Url", "")
+ if mp4_url:
+ print(f"从chapterList找到MP4链接: {mp4_url}")
+ break
+
+ # 如果未找到,尝试从当前章节获取
+ if not mp4_url:
+ current_chapter = page_props.get("chapterInfo", {})
+ if current_chapter:
+ print("找到当前章节信息")
+ chapter_video = current_chapter.get("chapterVideoVo", {})
+ mp4_url = chapter_video.get("mp4", "") or chapter_video.get("mp4720p", "") or chapter_video.get("vodMp4Url", "")
+ if mp4_url:
+ print(f"从chapterInfo找到MP4链接: {mp4_url}")
+ except Exception as e:
+ print(f"解析NEXT_DATA失败: {str(e)}")
+ print(traceback.format_exc())
+
+ # 方法2: 直接从HTML中提取MP4链接
+ if not mp4_url:
+ mp4_pattern = r'(https?://[^"\']+\.mp4)'
+ mp4_matches = re.findall(mp4_pattern, html)
+ if mp4_matches:
+ # 查找含有chapter_id的链接
+ matched_mp4 = False
+ for url in mp4_matches:
+ if chapter_id in url:
+ mp4_url = url
+ matched_mp4 = True
+ print(f"从HTML直接提取章节MP4链接: {mp4_url}")
+ break
+
+ # 如果没找到包含chapter_id的链接,使用第一个
+ if not matched_mp4 and mp4_matches:
+ mp4_url = mp4_matches[0]
+ print(f"从HTML直接提取MP4链接: {mp4_url}")
+
+ if mp4_url and ".mp4" in mp4_url:
+ print(f"最终找到的MP4链接: {mp4_url}")
+ result["parse"] = 0
+ result["url"] = mp4_url
+ result["header"] = json.dumps(headers)
+ return result
+ else:
+ print(f"未找到有效的MP4链接,尝试再次解析页面内容")
+ # 再尝试一次从HTML中广泛搜索所有可能的MP4链接
+ all_mp4_pattern = r'(https?://[^"\']+\.mp4)'
+ all_mp4_matches = re.findall(all_mp4_pattern, html)
+ if all_mp4_matches:
+ mp4_url = all_mp4_matches[0]
+ print(f"从HTML广泛搜索找到MP4链接: {mp4_url}")
+ result["parse"] = 0
+ result["url"] = mp4_url
+ result["header"] = json.dumps(headers)
+ return result
+
+ print(f"未找到视频链接,返回原episode URL: {episode_url}")
+ result["parse"] = 0
+ result["url"] = episode_url
+ result["header"] = json.dumps(headers)
+ return result
+ except Exception as e:
+ print(f"请求或解析失败: {str(e)}")
+ print(traceback.format_exc())
+ result["parse"] = 0
+ result["url"] = id
+ result["header"] = json.dumps(headers)
+ return result
+
+ def localProxy(self, param):
+ # 本地代理处理,此处简单返回传入的参数
+ return [200, "video/MP2T", {}, param]
+
+ def destroy(self):
+ # 资源回收
+ pass
\ No newline at end of file
diff --git a/jtxtv10/lib/金牌影视.py b/jtxtv10/lib/金牌影视.py
new file mode 100644
index 0000000..815951a
--- /dev/null
+++ b/jtxtv10/lib/金牌影视.py
@@ -0,0 +1,225 @@
+# -*- coding: utf-8 -*-
+# by @嗷呜
+import json
+import sys
+import threading
+import uuid
+import requests
+sys.path.append('..')
+from base.spider import Spider
+import time
+from Crypto.Hash import MD5, SHA1
+
+class Spider(Spider):
+ '''
+ 配置示例:
+ {
+ "key": "xxxx",
+ "name": "xxxx",
+ "type": 3,
+ "api": ".所在路径/金牌.py",
+ "searchable": 1,
+ "quickSearch": 1,
+ "filterable": 1,
+ "changeable": 1,
+ "ext": {
+ "site": "https://www.jiabaide.cn,域名2,域名3"
+ }
+ },
+ '''
+ def init(self, extend=""):
+ if extend:
+ hosts=json.loads(extend)['site']
+ self.host = self.host_late(hosts)
+ pass
+
+ def getName(self):
+ pass
+
+ def isVideoFormat(self, url):
+ pass
+
+ def manualVideoCheck(self):
+ pass
+
+ def destroy(self):
+ pass
+
+ def homeContent(self, filter):
+ cdata = self.fetch(f"{self.host}/api/mw-movie/anonymous/get/filer/type", headers=self.getheaders()).json()
+ fdata = self.fetch(f"{self.host}/api/mw-movie/anonymous/v1/get/filer/list", headers=self.getheaders()).json()
+ result = {}
+ classes = []
+ filters={}
+ for k in cdata['data']:
+ classes.append({
+ 'type_name': k['typeName'],
+ 'type_id': str(k['typeId']),
+ })
+ sort_values = [{"n": "最近更新", "v": "2"},{"n": "人气高低", "v": "3"}, {"n": "评分高低", "v": "4"}]
+ for tid, d in fdata['data'].items():
+ current_sort_values = sort_values.copy()
+ if tid == '1':
+ del current_sort_values[0]
+ filters[tid] = [
+ {"key": "type", "name": "类型",
+ "value": [{"n": i["itemText"], "v": i["itemValue"]} for i in d["typeList"]]},
+
+ *([] if not d["plotList"] else [{"key": "v_class", "name": "剧情",
+ "value": [{"n": i["itemText"], "v": i["itemText"]}
+ for i in d["plotList"]]}]),
+
+ {"key": "area", "name": "地区",
+ "value": [{"n": i["itemText"], "v": i["itemText"]} for i in d["districtList"]]},
+
+ {"key": "year", "name": "年份",
+ "value": [{"n": i["itemText"], "v": i["itemText"]} for i in d["yearList"]]},
+
+ {"key": "lang", "name": "语言",
+ "value": [{"n": i["itemText"], "v": i["itemText"]} for i in d["languageList"]]},
+
+ {"key": "sort", "name": "排序", "value": current_sort_values}
+ ]
+ result['class'] = classes
+ result['filters'] = filters
+ return result
+
+ def homeVideoContent(self):
+ data1 = self.fetch(f"{self.host}/api/mw-movie/anonymous/v1/home/all/list", headers=self.getheaders()).json()
+ data2=self.fetch(f"{self.host}/api/mw-movie/anonymous/home/hotSearch",headers=self.getheaders()).json()
+ data=[]
+ for i in data1['data'].values():
+ data.extend(i['list'])
+ data.extend(data2['data'])
+ vods=self.getvod(data)
+ return {'list':vods}
+
+ def categoryContent(self, tid, pg, filter, extend):
+
+ params = {
+ "area": extend.get('area', ''),
+ "filterStatus": "1",
+ "lang": extend.get('lang', ''),
+ "pageNum": pg,
+ "pageSize": "30",
+ "sort": extend.get('sort', '1'),
+ "sortBy": "1",
+ "type": extend.get('type', ''),
+ "type1": tid,
+ "v_class": extend.get('v_class', ''),
+ "year": extend.get('year', '')
+ }
+ data = self.fetch(f"{self.host}/api/mw-movie/anonymous/video/list?{self.js(params)}", headers=self.getheaders(params)).json()
+ result = {}
+ result['list'] = self.getvod(data['data']['list'])
+ result['page'] = pg
+ result['pagecount'] = 9999
+ result['limit'] = 90
+ result['total'] = 999999
+ return result
+
+ def detailContent(self, ids):
+ data=self.fetch(f"{self.host}/api/mw-movie/anonymous/video/detail?id={ids[0]}",headers=self.getheaders({'id':ids[0]})).json()
+ vod=self.getvod([data['data']])[0]
+ vod['vod_play_from']='金牌'
+ vod['vod_play_url'] = '#'.join(
+ f"{i['name'] if len(vod['episodelist']) > 1 else vod['vod_name']}${ids[0]}@@{i['nid']}" for i in
+ vod['episodelist'])
+ vod.pop('episodelist', None)
+ return {'list':[vod]}
+
+ def searchContent(self, key, quick, pg="1"):
+ params = {
+ "keyword": key,
+ "pageNum": pg,
+ "pageSize": "8",
+ "sourceCode": "1"
+ }
+ data=self.fetch(f"{self.host}/api/mw-movie/anonymous/video/searchByWord?{self.js(params)}",headers=self.getheaders(params)).json()
+ vods=self.getvod(data['data']['result']['list'])
+ return {'list':vods,'page':pg}
+
+ def playerContent(self, flag, id, vipFlags):
+ self.header = {
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.61 Chrome/126.0.6478.61 Not/A)Brand/8 Safari/537.36',
+ 'sec-ch-ua-platform': '"Windows"',
+ 'DNT': '1',
+ 'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
+ 'sec-ch-ua-mobile': '?0',
+ 'Origin': self.host,
+ 'Referer': f'{self.host}/'
+ }
+ ids=id.split('@@')
+ pdata = self.fetch(f"{self.host}/api/mw-movie/anonymous/v2/video/episode/url?clientType=1&id={ids[0]}&nid={ids[1]}",headers=self.getheaders({'clientType':'1','id': ids[0], 'nid': ids[1]})).json()
+ vlist=[]
+ for i in pdata['data']['list']:vlist.extend([i['resolutionName'],i['url']])
+ return {'parse':0,'url':vlist,'header':self.header}
+
+ def localProxy(self, param):
+ pass
+
+ def host_late(self, url_list):
+ if isinstance(url_list, str):
+ urls = [u.strip() for u in url_list.split(',')]
+ else:
+ urls = url_list
+ if len(urls) <= 1:
+ return urls[0] if urls else ''
+
+ results = {}
+ threads = []
+
+ def test_host(url):
+ try:
+ start_time = time.time()
+ response = requests.head(url, timeout=1.0, allow_redirects=False)
+ delay = (time.time() - start_time) * 1000
+ results[url] = delay
+ except Exception as e:
+ results[url] = float('inf')
+ for url in urls:
+ t = threading.Thread(target=test_host, args=(url,))
+ threads.append(t)
+ t.start()
+ for t in threads:
+ t.join()
+ return min(results.items(), key=lambda x: x[1])[0]
+
+ def md5(self, sign_key):
+ md5_hash = MD5.new()
+ md5_hash.update(sign_key.encode('utf-8'))
+ md5_result = md5_hash.hexdigest()
+ return md5_result
+
+ def js(self, param):
+ return '&'.join(f"{k}={v}" for k, v in param.items())
+
+ def getheaders(self, param=None):
+ if param is None:param = {}
+ t=str(int(time.time()*1000))
+ param['key']='cb808529bae6b6be45ecfab29a4889bc'
+ param['t']=t
+ sha1_hash = SHA1.new()
+ sha1_hash.update(self.md5(self.js(param)).encode('utf-8'))
+ sign = sha1_hash.hexdigest()
+ deviceid = str(uuid.uuid4())
+ headers = {
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.61 Chrome/126.0.6478.61 Not/A)Brand/8 Safari/537.36',
+ 'Accept': 'application/json, text/plain, */*',
+ 'sign': sign,
+ 't': t,
+ 'deviceid':deviceid
+ }
+ return headers
+
+ def convert_field_name(self, field):
+ field = field.lower()
+ if field.startswith('vod') and len(field) > 3:
+ field = field.replace('vod', 'vod_')
+ if field.startswith('type') and len(field) > 4:
+ field = field.replace('type', 'type_')
+ return field
+
+ def getvod(self, array):
+ return [{self.convert_field_name(k): v for k, v in item.items()} for item in array]
+