哔哩哔哩
哔哩哔哩
guaner001125 (317)6天前
❗️特别标注:本源只支持洛雅橙改版阅读Σ最新版https://github.com/Luoyacheng/legado 搜索分类 @用户 %视频 #专栏 &直播 *番剧 ?影视 API来源 https://github.com/SocialSisterYi/bilibili-API-collect url scheme链接来源 AI和网页 ⚙️部分功能说明【自己随便点点点看看吧】 登录使用效果更佳 1、详情页界面 点击书名显示【最新评论】 长按书名显示【热门评论】 点击UP主名字显示 【视频列表/专栏文集】【根据登录页设置来】 长按UP主名字显示 【视频合集/专栏动态】【根据登录页设置来】 点击 查看全部动态【查看动态】 长按 查看全部动态【搜索该up主动态】 点击右上角◎ 打开哔哩哔哩客户端 点击分享按钮,复制分享详情 点击拷贝书籍详情URL 复制网页链接 点击登录 可选择【关注up到b站 [需登录账号]】 2、视频页 点击右上角◎ 打开推荐视频 【影视无效,直播无效】 点击登录 可点赞投币收藏 3、发现页 长按书源选项后打开登录页面,可筛选分类 4、正文页 视频/文章图可点击跳转 🔗📖🎥👤图标可点击跳转
{
"bookSourceComment": "❗️特别标注:本源只支持洛雅橙改版阅读Σ最新版https:\/\/github.com\/Luoyacheng\/legado\n\n搜索分类\n@用户\n%视频\n#专栏\n&直播\n*番剧\n?影视\n\nAPI来源\nhttps:\/\/github.com\/SocialSisterYi\/bilibili-API-collect\n\nurl scheme链接来源\nAI和网页\n\n⚙️部分功能说明【自己随便点点点看看吧】\n登录使用效果更佳\n\n1、详情页界面 \n点击书名显示【最新评论】\n长按书名显示【热门评论】\n\n点击UP主名字显示 【视频列表\/专栏文集】【根据登录页设置来】\n长按UP主名字显示 【视频合集\/专栏动态】【根据登录页设置来】\n\n点击 查看全部动态【查看动态】\n长按 查看全部动态【搜索该up主动态】\n\n点击右上角◎ 打开哔哩哔哩客户端\n点击分享按钮,复制分享详情\n点击拷贝书籍详情URL 复制网页链接\n点击登录 可选择【关注up到b站 [需登录账号]】\n\n2、视频页\n点击右上角◎ 打开推荐视频 【影视无效,直播无效】\n点击登录 可点赞投币收藏\n\n3、发现页\n长按书源选项后打开登录页面,可筛选分类\n\n4、正文页\n视频\/文章图可点击跳转\n🔗📖🎥👤图标可点击跳转",
"bookSourceGroup": "⑩影视",
"bookSourceName": "哔哩哔哩",
"bookSourceType": 0,
"bookSourceUrl": "哔哩哔哩",
"bookUrlPattern": "https:\/\/api(?:\\.live)*\\.bilibili.com\/.*?\\?[^r]?(?:room_)*id=.*",
"customButton": true,
"customOrder": 8,
"enabled": false,
"enabledCookieJar": true,
"enabledExplore": true,
"eventListener": true,
"exploreUrl": "<js>\ntry{\nlet all = [];\n\n\/\/一行个数\nlet num = 3;\n\nlet d = {\n 1: 1,\n 2: 0.4,\n 3: 0.25,\n 4: 0.2,\n 5: 0.15,\n 7: 0.1,\n 10: 0.05\n};\nnum = d[num];\nlet push = (title, url, type, g) => all.push({\n title: title,\n url: url,\n style: {\n layout_flexGrow: g == 0 ? g : 1,\n layout_flexBasisPercent: type\n }\n});\n\nlet mid = JSON.parse(java.ajax(\"https:\/\/api.bilibili.com\/x\/web-interface\/nav\"))?.data?.mid || \"\";\n\npush(\"👤我的\", \"\", 1);\npush(\"推送视频\", \"https:\/\/api.bilibili.com\/x\/web-interface\/index\/top\/feed\/rcmd\", num);\npush(\"热门视频\", \"https:\/\/api.bilibili.com\/x\/web-interface\/popular?pn={\\{page}}\", num);\npush(\"入站必刷\", \"https:\/\/api.bilibili.com\/x\/web-interface\/popular\/precious\", num);\n\nif (mid) {\n push(\"正在直播\", \"https:\/\/api.live.bilibili.com\/xlive\/web-ucenter\/v1\/xfetter\/GetWebList?hit_ab=true\", num);\n\n push(\"专栏动态\", `https:\/\/api.bilibili.com\/x\/polymer\/web-dynamic\/v1\/feed\/all?timezone_offset=-480&type=article&platform=web&offset={\\{if(page==1){source.put(\"nextoffset\",\"\")};source.get(\"nextoffset\")}}&page={\\{page}}`, num);\n push(\"视频动态\", `https:\/\/api.bilibili.com\/x\/polymer\/web-dynamic\/v1\/feed\/all?timezone_offset=-480&type=video&platform=web&offset={\\{if(page==1){source.put(\"nextoffset\",\"\")};source.get(\"nextoffset\")}}&page={\\{page}}`, num);\n push(\"历史记录\", `https:\/\/api.bilibili.com\/x\/web-interface\/history\/cursor?max={\\{if(page==1){source.put(\"nextoffset\",\"\")};source.get(\"nextoffset\")}}`, num, 0);\n\n \n if (M(\"关注分组\") == \"☑️\") {\n push(\"⚙️关注分组\", \"https:\/\/api.bilibili.com\/x\/relation\/followings?vmid=\"+mid+\"&pn={\\{page}}\", 1);\n 关注分组url = \"https:\/\/api.bilibili.com\/x\/relation\/tags\";\n 关注分组data = JSON.parse(java.ajax(关注分组url));\n (关注分组data?.data ?? []).forEach(x => {\n push(x.name, `https:\/\/api.bilibili.com\/x\/relation\/tag?pn={{page}\\}&tagid=${x.tagid}`, num)\n })\n }\n\n\n if (M(\"收藏夹\") == \"☑️\") {\n push(\"🗂收藏夹\", \"\", 1);\n 收藏夹url = \"https:\/\/api.bilibili.com\/x\/v3\/fav\/folder\/created\/list-all?up_mid=\" + mid;\n 收藏夹data = JSON.parse(java.ajax(收藏夹url));\n (收藏夹data?.data?.list ?? []).forEach(x => {\n push(x.title, `https:\/\/api.bilibili.com\/x\/v3\/fav\/resource\/list?media_id=${x.id}&ps=20&pn={\\{page}}`, num)\n })\n }\n}\nlet 分区 = [\"动画::1005\", \"游戏::1008\", \"鬼畜::1007\", \"音乐::1003\", \"舞蹈::1004\", \"影视::1001\", \"娱乐::1002\", \"知识::1010\", \"科技数码::1012\", \"资讯::1009\", \"美食::1020\", \"小剧场::1021\", \"汽车::1013\", \"时尚美妆::1014\", \"体育运动::1018\", \"动物::1024\", \"vlog::1029\", \"绘画::1006\", \"人工智能::1011\", \"家装房产::1015\", \"户外潮流::1016\", \"健身::1017\", \"手工::1019\", \"旅游出行::1022\", \"三农::1023\", \"亲子::1025\", \"健康::1026\", \"情感::1027\", \"生活兴趣::1030\", \"生活经验::1031\", \"神秘学::1028\"];\n\npush(\"📽视频分区\", \"\", 1);\n分区.forEach(x => {\n let a = x.split(\"::\");\n let json = `{display_id:page,request_cnt:20,from_region:${a[1]},device:\"web\",web_location:333.40138}`\n push(a[0], `https:\/\/api.bilibili.com\/x\/web-interface\/region\/feed\/rcmd?{\\{getWbiEnc(${json})}}`, num)\n});\n\nfunction getUrl(st = -1, sv = -1, area = -1, is_finish = -1, cr = -1, ss = -1, year = -1, rd = -1, sid = -1, pid = -1, order = -1) {\n return `https:\/\/api.bilibili.com\/pgc\/season\/index\/result?season_type=${st}&type=1&page={\\{page}}&pagesize=50&season_version=${sv}&area=${area}&is_finish=${is_finish}©right=${cr}&season_status=${ss}&year=${year}&release_date=${rd}&style_id=${sid}&producer_id=${pid}&order=${order}`\n}\n\nlet xh = M(\"1🎬番剧,2🎥电影,3🎞纪录片,4🇨🇳国创,5📺电视剧,6🍿综艺 [显示]\");\nlet 类型 = [];\nif (\/\\d+\/.test(xh)) {\n xh = xh.match(\/\\d\/g);\n 类型 = xh.map(match => {\n let index = parseInt(match) - 1;\n return index\n }).filter(item => item !== undefined);\n}\n\n类型.forEach((x, i) => {\n let name = fenlei[\"类型\"][x];\n let icon = fenlei[\"图标\"][x];\n let st = fenlei[\"类型v\"][x];\n let area = getValueByIconAndName(icon, \"地区\", M(icon + \"地区\"));\n let sv = getValueByIconAndName(icon, \"类别\", M(icon + \"类别\"));\n let is_finish = getValueByIconAndName(icon, \"状态\", M(icon + \"状态\"));\n let cr = getValueByIconAndName(icon, \"版权\", M(icon + \"版权\"));\n let ss = getValueByIconAndName(icon, \"付费\", M(\"💰付费\"));\n let year = getValueByIconAndName(icon, \"年份\", M(icon + \"年份\"));\n let rd = getValueByIconAndName(icon, \"年份\", M(icon + \"年份\"));\n let pid = getValueByIconAndName(icon, \"出品\", M(icon + \"出品\"));\n let order = getValueByIconAndName(icon, \"排序\", M(\"🔁排序\"), null);\n\n push(icon + name, getUrl(st, sv, area, is_finish, cr, ss, year, rd, -1, pid, order), 1);\n fenlei[\"风格\"][name].forEach(y => {\n let url = getUrl(st, sv, area, is_finish, cr, ss, year, rd, y.v, pid, order);\n push(y.n, url, num)\n })\n\n})\n\n\nresult = JSON.stringify(all)\n}catch(e){\n\tjava.longToast(\"本书源只支持最新版洛雅橙改版阅读Σ\\n请安装后重新导入书源\");\tjava.startBrowser(\"https:\/\/loyc.xyz\/c\/legado.html#download\", \"下载阅读Σ\");\n\t\n\tresult = `下载阅读Σ::{\\{java.longToast(\"本书源只支持最新版洛雅橙改版阅读Σ\\\\n请安装后重新导入书源\");java.startBrowser(\"https:\/\/loyc.xyz\/c\/legado.html#download\",\"下载阅读Σ\");}}`;\n\t}\n<\/js>",
"header": "@js:\nJSON.stringify({\n\t\"Referer\":\"https:\/\/www.bilibili.com\/\",\n\t\"Cookie\":cookie.getCookie(\"https:\/\/www.bilibili.com\")\n\t})",
"jsLib": "const fenlei={\"类型\":[\"番剧\",\"电影\",\"纪录片\",\"国创\",\"电视剧\",\"综艺\"],\"类型v\":[1,2,3,4,5,7],\"图标\":[\"🎬\",\"🎥\",\"🎞\",\"🇨🇳\",\"📺\",\"🍿\"],\"排序\":[{\"n\":\"更新时间\",\"v\":0},{\"n\":\"弹幕数量\",\"v\":1},{\"n\":\"播放数量\",\"v\":2},{\"n\":\"追剧人数\",\"v\":3},{\"n\":\"最高评分\",\"v\":4},{\"n\":\"开播时间\",\"v\":5},{\"n\":\"上映时间\",\"v\":6}],\"付费\":[{\"n\":\"全部\",\"v\":\"-1\"},{\"n\":\"免费\",\"v\":\"1\"},{\"n\":\"付费\",\"v\":\"2,6\"},{\"n\":\"大会员\",\"v\":\"4,6\"}],\"类别\":{番剧:[{\"n\":\"全部\",\"v\":\"-1\"},{\"n\":\"正片\",\"v\":\"1\"},{\"n\":\"电影\",\"v\":\"2\"},{\"n\":\"其他\",\"v\":\"3\"}],国创:[{\"n\":\"全部\",\"v\":\"-1\"},{\"n\":\"正片\",\"v\":\"1\"},{\"n\":\"电影\",\"v\":\"2\"},{\"n\":\"其他\",\"v\":\"3\"}]},\"版权\":{国创:[{\"n\":\"全部\",\"v\":\"-1\"},{\"n\":\"独家\",\"v\":\"3\"},{\"n\":\"其他\",\"v\":\"1,2,4\"}]},\"状态\":{番剧:[{\"n\":\"全部\",\"v\":\"-1\"},{\"n\":\"完结\",\"v\":\"1\"},{\"n\":\"连载\",\"v\":\"0\"}],国创:[{\"n\":\"全部\",\"v\":\"-1\"},{\"n\":\"完结\",\"v\":\"1\"},{\"n\":\"连载\",\"v\":\"0\"}]},\"出品\":{纪录片:[{\"n\":\"全部\",\"v\":\"-1\"},{\"n\":\"央视\",\"v\":\"4\"},{\"n\":\"BBC\",\"v\":\"1\"},{\"n\":\"探索频道\",\"v\":\"7\"},{\"n\":\"国家地理\",\"v\":\"14\"},{\"n\":\"NHK\",\"v\":\"2\"},{\"n\":\"历史频道\",\"v\":\"6\"},{\"n\":\"卫视\",\"v\":\"8\"},{\"n\":\"自制\",\"v\":\"9\"},{\"n\":\"ITV\",\"v\":\"5\"},{\"n\":\"SKY\",\"v\":\"3\"},{\"n\":\"ZDF\",\"v\":\"10\"},{\"n\":\"合作机构\",\"v\":\"11\"},{\"n\":\"国内其他\",\"v\":\"12\"},{\"n\":\"国外其他\",\"v\":\"13\"},{\"n\":\"索尼\",\"v\":\"15\"},{\"n\":\"环球\",\"v\":\"16\"},{\"n\":\"派拉蒙\",\"v\":\"17\"},{\"n\":\"华纳\",\"v\":\"18\"},{\"n\":\"迪士尼\",\"v\":\"19\"},{\"n\":\"HBO\",\"v\":\"20\"}]},\"地区\":{\"电视剧\":[{\"n\":\"全部\",\"v\":\"-1\"},{\"n\":\"中国\",\"v\":\"1,6,7\"},{\"n\":\"日本\",\"v\":2},{\"n\":\"美国\",\"v\":3},{\"n\":\"英国\",\"v\":4},{\"n\":\"其他\",\"v\":\"5,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70\"}],\"番剧\":[{\"n\":\"全部\",\"v\":-1},{\"n\":\"日本\",\"v\":2},{\"n\":\"美国\",\"v\":3},{\"n\":\"其他\",\"v\":\"1,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70\"}],\"电影\":[{\"n\":\"全部\",\"v\":-1},{\"n\":\"中国大陆\",\"v\":1},{\"n\":\"中国港台\",\"v\":\"6,7\"},{\"n\":\"美国\",\"v\":3},{\"n\":\"日本\",\"v\":2},{\"n\":\"韩国\",\"v\":8},{\"n\":\"法国\",\"v\":9},{\"n\":\"英国\",\"v\":4},{\"n\":\"德国\",\"v\":15},{\"n\":\"泰国\",\"v\":10},{\"n\":\"意大利\",\"v\":35},{\"n\":\"西班牙\",\"v\":13},{\"n\":\"其他\",\"v\":\"5,11,12,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70\"}]},\"风格\":{电视剧:[{\"n\":\"剧情\",\"v\":10050},{\"n\":\"情感\",\"v\":10084},{\"n\":\"搞笑\",\"v\":10021},{\"n\":\"悬疑\",\"v\":10057},{\"n\":\"都市\",\"v\":10080},{\"n\":\"家庭\",\"v\":10061},{\"n\":\"古装\",\"v\":10081},{\"n\":\"历史\",\"v\":10033},{\"n\":\"奇幻\",\"v\":10018},{\"n\":\"青春\",\"v\":10079},{\"n\":\"战争\",\"v\":10058},{\"n\":\"武侠\",\"v\":10078},{\"n\":\"励志\",\"v\":10039},{\"n\":\"短剧\",\"v\":10103},{\"n\":\"科幻\",\"v\":10023},{\"n\":\"其他\",\"v\":\"10086,10088,10089,10017,10083,10082,10087,10085\"}],番剧:[{\"n\":\"原创\",\"v\":10010},{\"n\":\"漫画改\",\"v\":10011},{\"n\":\"小说改\",\"v\":10012},{\"n\":\"游戏改\",\"v\":10013},{\"n\":\"特摄\",\"v\":10102},{\"n\":\"布袋戏\",\"v\":10015},{\"n\":\"热血\",\"v\":10016},{\"n\":\"穿越\",\"v\":10017},{\"n\":\"奇幻\",\"v\":10018},{\"n\":\"战斗\",\"v\":10020},{\"n\":\"搞笑\",\"v\":10021},{\"n\":\"日常\",\"v\":10022},{\"n\":\"科幻\",\"v\":10023},{\"n\":\"萌系\",\"v\":10024},{\"n\":\"治愈\",\"v\":10025},{\"n\":\"校园\",\"v\":10026},{\"n\":\"少儿\",\"v\":10027},{\"n\":\"泡面\",\"v\":10028},{\"n\":\"恋爱\",\"v\":10029},{\"n\":\"少女\",\"v\":10030},{\"n\":\"魔法\",\"v\":10031},{\"n\":\"冒险\",\"v\":10032},{\"n\":\"历史\",\"v\":10033},{\"n\":\"架空\",\"v\":10034},{\"n\":\"机战\",\"v\":10035},{\"n\":\"神魔\",\"v\":10036},{\"n\":\"声控\",\"v\":10037},{\"n\":\"运动\",\"v\":10038},{\"n\":\"励志\",\"v\":10039},{\"n\":\"音乐\",\"v\":10040},{\"n\":\"推理\",\"v\":10041},{\"n\":\"社团\",\"v\":10042},{\"n\":\"智斗\",\"v\":10043},{\"n\":\"催泪\",\"v\":10044},{\"n\":\"美食\",\"v\":10045},{\"n\":\"偶像\",\"v\":10046},{\"n\":\"乙女\",\"v\":10047},{\"n\":\"职场\",\"v\":10048}],电影:[{\"n\":\"短片\",\"v\":10104},{\"n\":\"剧情\",\"v\":10050},{\"n\":\"喜剧\",\"v\":10051},{\"n\":\"爱情\",\"v\":10052},{\"n\":\"动作\",\"v\":10053},{\"n\":\"恐怖\",\"v\":10054},{\"n\":\"科幻\",\"v\":10023},{\"n\":\"犯罪\",\"v\":10055},{\"n\":\"惊悚\",\"v\":10056},{\"n\":\"悬疑\",\"v\":10057},{\"n\":\"奇幻\",\"v\":10018},{\"n\":\"战争\",\"v\":10058},{\"n\":\"动画\",\"v\":10059},{\"n\":\"传记\",\"v\":10060},{\"n\":\"家庭\",\"v\":10061},{\"n\":\"歌舞\",\"v\":10062},{\"n\":\"历史\",\"v\":10033},{\"n\":\"冒险\",\"v\":10032},{\"n\":\"纪实\",\"v\":10063},{\"n\":\"灾难\",\"v\":10064},{\"n\":\"漫画改\",\"v\":10011},{\"n\":\"小说改\",\"v\":10012}],国创:[{\"n\":\"原创\",\"v\":10010},{\"n\":\"漫画改\",\"v\":10011},{\"n\":\"小说改\",\"v\":10012},{\"n\":\"游戏改\",\"v\":10013},{\"n\":\"动态漫\",\"v\":10014},{\"n\":\"布袋戏\",\"v\":10015},{\"n\":\"热血\",\"v\":10016},{\"n\":\"奇幻\",\"v\":10018},{\"n\":\"玄幻\",\"v\":10019},{\"n\":\"战斗\",\"v\":10020},{\"n\":\"搞笑\",\"v\":10021},{\"n\":\"武侠\",\"v\":10078},{\"n\":\"日常\",\"v\":10022},{\"n\":\"科幻\",\"v\":10023},{\"n\":\"萌系\",\"v\":10024},{\"n\":\"治愈\",\"v\":10025},{\"n\":\"悬疑\",\"v\":10057},{\"n\":\"校园\",\"v\":10026},{\"n\":\"少儿\",\"v\":10027},{\"n\":\"泡面\",\"v\":10028},{\"n\":\"恋爱\",\"v\":10029},{\"n\":\"少女\",\"v\":10030},{\"n\":\"魔法\",\"v\":10031},{\"n\":\"历史\",\"v\":10033},{\"n\":\"机战\",\"v\":10035},{\"n\":\"神魔\",\"v\":10036},{\"n\":\"声控\",\"v\":10037},{\"n\":\"运动\",\"v\":10038},{\"n\":\"励志\",\"v\":10039},{\"n\":\"音乐\",\"v\":10040},{\"n\":\"推理\",\"v\":10041},{\"n\":\"社团\",\"v\":10042},{\"n\":\"智斗\",\"v\":10043},{\"n\":\"催泪\",\"v\":10044},{\"n\":\"美食\",\"v\":10045},{\"n\":\"偶像\",\"v\":10046},{\"n\":\"乙女\",\"v\":10047},{\"n\":\"职场\",\"v\":10048},{\"n\":\"古风\",\"v\":10049}],综艺:[{\"n\":\"音乐\",\"v\":10040},{\"n\":\"访谈\",\"v\":10090},{\"n\":\"脱口秀\",\"v\":10091},{\"n\":\"真人秀\",\"v\":10092},{\"n\":\"选秀\",\"v\":10094},{\"n\":\"美食\",\"v\":10045},{\"n\":\"旅游\",\"v\":10095},{\"n\":\"晚会\",\"v\":10098},{\"n\":\"演唱会\",\"v\":10096},{\"n\":\"情感\",\"v\":10084},{\"n\":\"喜剧\",\"v\":10051},{\"n\":\"亲子\",\"v\":10097},{\"n\":\"文化\",\"v\":10100},{\"n\":\"职场\",\"v\":10048},{\"n\":\"萌宠\",\"v\":10069},{\"n\":\"养成\",\"v\":10099}],纪录片:[{\"n\":\"历史\",\"v\":10033},{\"n\":\"美食\",\"v\":10045},{\"n\":\"人文\",\"v\":10065},{\"n\":\"科技\",\"v\":10066},{\"n\":\"探险\",\"v\":10067},{\"n\":\"宇宙\",\"v\":10068},{\"n\":\"萌宠\",\"v\":10069},{\"n\":\"社会\",\"v\":10070},{\"n\":\"动物\",\"v\":10071},{\"n\":\"自然\",\"v\":10072},{\"n\":\"医疗\",\"v\":10073},{\"n\":\"军事\",\"v\":10074},{\"n\":\"灾难\",\"v\":10064},{\"n\":\"罪案\",\"v\":10075},{\"n\":\"神秘\",\"v\":10076},{\"n\":\"旅行\",\"v\":10077},{\"n\":\"运动\",\"v\":10038},{\"n\":\"电影\",\"v\":-10}]},\"年份\":{电视剧:[{\"n\":\"全部\",\"v\":-1},{\"n\":\"2025\",\"v\":\"[2025-01-01 00:00:00,2026-01-01 00:00:00)\"},{\"n\":\"2024\",\"v\":\"[2024-01-01 00:00:00,2025-01-01 00:00:00)\"},{\"n\":\"2023\",\"v\":\"[2023-01-01 00:00:00,2024-01-01 00:00:00)\"},{\"n\":\"2022\",\"v\":\"[2022-01-01 00:00:00,2023-01-01 00:00:00)\"},{\"n\":\"2021\",\"v\":\"[2021-01-01 00:00:00,2022-01-01 00:00:00)\"},{\"n\":\"2020\",\"v\":\"[2020-01-01 00:00:00,2021-01-01 00:00:00)\"},{\"n\":\"2019\",\"v\":\"[2019-01-01 00:00:00,2020-01-01 00:00:00)\"},{\"n\":\"2018\",\"v\":\"[2018-01-01 00:00:00,2019-01-01 00:00:00)\"},{\"n\":\"2017\",\"v\":\"[2017-01-01 00:00:00,2018-01-01 00:00:00)\"},{\"n\":\"2016\",\"v\":\"[2016-01-01 00:00:00,2017-01-01 00:00:00)\"},{\"n\":\"2015-2010\",\"v\":\"[2010-01-01 00:00:00,2016-01-01 00:00:00)\"},{\"n\":\"2009-2005\",\"v\":\"[2005-01-01 00:00:00,2010-01-01 00:00:00)\"},{\"n\":\"2004-2000\",\"v\":\"[2000-01-01 00:00:00,2005-01-01 00:00:00)\"},{\"n\":\"90年代\",\"v\":\"[1990-01-01 00:00:00,2000-01-01 00:00:00)\"},{\"n\":\"80年代\",\"v\":\"[1980-01-01 00:00:00,1990-01-01 00:00:00)\"},{\"n\":\"更早\",\"v\":\"[,1980-01-01 00:00:00)\"}],番剧:[{\"n\":\"全部\",\"v\":-1},{\"n\":\"2025\",\"v\":\"[2025,2026)\"},{\"n\":\"2024\",\"v\":\"[2024,2025)\"},{\"n\":\"2023\",\"v\":\"[2023,2024)\"},{\"n\":\"2022\",\"v\":\"[2022,2023)\"},{\"n\":\"2021\",\"v\":\"[2021,2022)\"},{\"n\":\"2020\",\"v\":\"[2020,2021)\"},{\"n\":\"2019\",\"v\":\"[2019,2020)\"},{\"n\":\"2018\",\"v\":\"[2018,2019)\"},{\"n\":\"2017\",\"v\":\"[2017,2018)\"},{\"n\":\"2016\",\"v\":\"[2016,2017)\"},{\"n\":\"2015\",\"v\":\"[2015,2016)\"},{\"n\":\"2014-2010\",\"v\":\"[2010,2015)\"},{\"n\":\"2009-2005\",\"v\":\"[2005,2010)\"},{\"n\":\"2004-2000\",\"v\":\"[2000,2005)\"},{\"n\":\"90年代\",\"v\":\"[1990,2000)\"},{\"n\":\"80年代\",\"v\":\"[1980,1990)\"},{\"n\":\"更早\",\"v\":\"[,1980)\"}],电影:[{\"n\":\"全部\",\"v\":-1},{\"n\":\"2025\",\"v\":\"[2025-01-01 00:00:00,2026-01-01 00:00:00)\"},{\"n\":\"2024\",\"v\":\"[2024-01-01 00:00:00,2025-01-01 00:00:00)\"},{\"n\":\"2023\",\"v\":\"[2023-01-01 00:00:00,2024-01-01 00:00:00)\"},{\"n\":\"2022\",\"v\":\"[2022-01-01 00:00:00,2023-01-01 00:00:00)\"},{\"n\":\"2021\",\"v\":\"[2021-01-01 00:00:00,2022-01-01 00:00:00)\"},{\"n\":\"2020\",\"v\":\"[2020-01-01 00:00:00,2021-01-01 00:00:00)\"},{\"n\":\"2019\",\"v\":\"[2019-01-01 00:00:00,2020-01-01 00:00:00)\"},{\"n\":\"2018\",\"v\":\"[2018-01-01 00:00:00,2019-01-01 00:00:00)\"},{\"n\":\"2017\",\"v\":\"[2017-01-01 00:00:00,2018-01-01 00:00:00)\"},{\"n\":\"2016\",\"v\":\"[2016-01-01 00:00:00,2017-01-01 00:00:00)\"},{\"n\":\"2015-2010\",\"v\":\"[2010-01-01 00:00:00,2016-01-01 00:00:00)\"},{\"n\":\"2009-2005\",\"v\":\"[2005-01-01 00:00:00,2010-01-01 00:00:00)\"},{\"n\":\"2004-2000\",\"v\":\"[2000-01-01 00:00:00,2005-01-01 00:00:00)\"},{\"n\":\"90年代\",\"v\":\"[1990-01-01 00:00:00,2000-01-01 00:00:00)\"},{\"n\":\"80年代\",\"v\":\"[1980-01-01 00:00:00,1990-01-01 00:00:00)\"},{\"n\":\"更早\",\"v\":\"[,1980-01-01 00:00:00)\"}],国创:[{\"n\":\"全部\",\"v\":-1},{\"n\":\"2025\",\"v\":\"[2025,2026)\"},{\"n\":\"2024\",\"v\":\"[2024,2025)\"},{\"n\":\"2023\",\"v\":\"[2023,2024)\"},{\"n\":\"2022\",\"v\":\"[2022,2023)\"},{\"n\":\"2021\",\"v\":\"[2021,2022)\"},{\"n\":\"2020\",\"v\":\"[2020,2021)\"},{\"n\":\"2019\",\"v\":\"[2019,2020)\"},{\"n\":\"2018\",\"v\":\"[2018,2019)\"},{\"n\":\"2017\",\"v\":\"[2017,2018)\"},{\"n\":\"2016\",\"v\":\"[2016,2017)\"},{\"n\":\"2015\",\"v\":\"[2015,2016)\"},{\"n\":\"2014-2010\",\"v\":\"[2010,2015)\"},{\"n\":\"2009-2005\",\"v\":\"[2005,2010)\"},{\"n\":\"2004-2000\",\"v\":\"[2000,2005)\"},{\"n\":\"90年代\",\"v\":\"[1990,2000)\"},{\"n\":\"80年代\",\"v\":\"[1980,1990)\"},{\"n\":\"更早\",\"v\":\"[,1980)\"}],纪录片:[{\"n\":\"全部\",\"v\":-1},{\"n\":\"2025\",\"v\":\"[2025-01-01 00:00:00,2026-01-01 00:00:00)\"},{\"n\":\"2024\",\"v\":\"[2024-01-01 00:00:00,2025-01-01 00:00:00)\"},{\"n\":\"2023\",\"v\":\"[2023-01-01 00:00:00,2024-01-01 00:00:00)\"},{\"n\":\"2022\",\"v\":\"[2022-01-01 00:00:00,2023-01-01 00:00:00)\"},{\"n\":\"2021\",\"v\":\"[2021-01-01 00:00:00,2022-01-01 00:00:00)\"},{\"n\":\"2020\",\"v\":\"[2020-01-01 00:00:00,2021-01-01 00:00:00)\"},{\"n\":\"2019\",\"v\":\"[2019-01-01 00:00:00,2020-01-01 00:00:00)\"},{\"n\":\"2018\",\"v\":\"[2018-01-01 00:00:00,2019-01-01 00:00:00)\"},{\"n\":\"2017\",\"v\":\"[2017-01-01 00:00:00,2018-01-01 00:00:00)\"},{\"n\":\"2016\",\"v\":\"[2016-01-01 00:00:00,2017-01-01 00:00:00)\"},{\"n\":\"2015-2010\",\"v\":\"[2010-01-01 00:00:00,2016-01-01 00:00:00)\"},{\"n\":\"2009-2005\",\"v\":\"[2005-01-01 00:00:00,2010-01-01 00:00:00)\"},{\"n\":\"2004-2000\",\"v\":\"[2000-01-01 00:00:00,2005-01-01 00:00:00)\"},{\"n\":\"90年代\",\"v\":\"[1990-01-01 00:00:00,2000-01-01 00:00:00)\"},{\"n\":\"80年代\",\"v\":\"[1980-01-01 00:00:00,1990-01-01 00:00:00)\"},{\"n\":\"更早\",\"v\":\"[,1980-01-01 00:00:00)\"}]}};\n\n\nfunction parseContent(textData) {\n let result,message,emote;\n let pic=\"\";\n var messageMatch = textData.match(\/message=([^,]+?),\/);\n if (messageMatch) {\n message = messageMatch[1].trim(); \n }\n let emoteMatch = textData.match(\/text=\\[.*?\\],\\s*url=[^,]+,\/g);\n if(emoteMatch){\n emoteMatch.forEach(x=>{\n let title = x.match(\/text=(\\[.*?\\])\/)[1]; \n let url = x.match(\/url=([^,]+),\/)[1]; \n title = title.replace(\/(\\[|\\]|\\$)\/g,'\\\\$1'); \n let re = new RegExp(title,\"g\"); \n \n let img = `<img src=\"${url},{style:'text'}\">`;\n message = message.replace(re,img); \n })\n }\n var picturesMatch = textData.match(\/pictures=\\[([^\\]]+)\\],\/);\n if (picturesMatch) {\n var picturesBlock = picturesMatch[1];\n var srcMatch = picturesBlock.match(\/\"img_src\":\"([^\"]+)\"\/g); \n if(srcMatch){\n srcMatch.forEach(x=>{\n let src = x.match(\/\"img_src\":\"([^\"]+)\"\/); \n pic +=`<img src=\"${src[1].replace(\/\\\\\\\/\/g, '\/') }\">`\n })\n } \n }\n result = message+pic\n return result;\n}\n\nfunction getValueByIconAndName(icon, filterType, optionName, typeName) {\n let targetType = typeName;\n \n if (!targetType && icon) {\n let iconIndex = fenlei.图标.indexOf(icon);\n if (iconIndex === -1) {\n \n return -1;\n }\n targetType = fenlei.类型[iconIndex];\n } else if (!targetType) {\n return -1;\n }\n \n if (!fenlei[filterType]) {\n return -1;\n }\n \n let filterData = fenlei[filterType];\n \n if (Array.isArray(filterData)) {\n let option = filterData.find(item => item.n === optionName);\n return option ? option.v : -1;\n }\n \n if (typeof filterData === 'object') {\n if (filterData[targetType]) {\n let typeData = filterData[targetType];\n if (Array.isArray(typeData) && typeData[0] === -1) {\n for (let i = 1; i < typeData.length; i++) {\n if (typeData[i].n === optionName) {\n return typeData[i].v;\n }\n }\n } \n else if (Array.isArray(typeData)) {\n let option = typeData.find(item => item.n === optionName);\n if (option) {\n return option.v;\n }\n }\n }\n \n for (let type in filterData) {\n if (type !== targetType) {\n let typeData = filterData[type];\n \n if (Array.isArray(typeData)) {\n if (typeData[0] === -1) {\n for (let i = 1; i < typeData.length; i++) {\n if (typeData[i].n === optionName) {\n return typeData[i].v;\n }\n }\n } else {\n let option = typeData.find(item => item.n === optionName);\n if (option) {\n return option.v;\n }\n }\n }\n }\n }\n }\n \n \n return -1;\n}\n\nfunction getApi(type,id,other){\n let url = \"\";\n switch(type){\n case \"video\":\n url = `https:\/\/api.bilibili.com\/x\/web-interface\/view?aid=${id}`;\n break;\n \n case \"article\":\n url = `https:\/\/api.bilibili.com\/x\/article\/view?id=${id},{\"js\":\"book?result:'https:\/\/www.bilibili.com\/opus\/${other}?spm_id_from=333.1365.0.0'\"}`;\n break; \n \n case \"articlelist\":\n break;\n \n case \"user\":\n case \"live\":\n url = `https:\/\/api.bilibili.com\/x\/space\/wbi\/acc\/info?${this.getWbiEnc({mid:id})}`;\n break;\n \n case \"forward\":\n url = `https:\/\/api.bilibili.com\/x\/polymer\/web-dynamic\/v1\/detail?timezone_offset=-480&platform=web&gaia_source=main_web&id=${id}&features=itemOpusStyle,opusBigCover,onlyfansVote,endFooterHidden,decorationCard,onlyfansAssetsV2,ugcDelete,onlyfansQaCard,editable,opusPrivateVisible,avatarAutoTheme,sunflowerStyle,eva3CardOpus,eva3CardVideo,eva3CardComment&web_location=333.1368&x-bili-device-req-json=%7B%22platform%22:%22web%22,%22device%22:%22pc%22,%22spmid%22:%22333.1368%22%7D,{\"js\":\"book?result:'https:\/\/t.bilibili.com\/${other}?spm_id_from=333.1365.0.0'\"}`;\n break;\n \n case \"opus\":\n url = `https:\/\/api.bilibili.com\/x\/polymer\/web-dynamic\/v1\/opus\/detail?features=\titemOpusStyle,endFooterHidden,onlyfansAssetsV2,ugcDelete,commentsNewVersion&id=${id},{\"js\":\"book?result:'https:\/\/www.bilibili.com\/opus\/${other}?spm_id_from=333.1365.0.0'\"}`;\n break;\n case \"media_bangumi\":\n case \"media_ft\":\n url = `https:\/\/api.bilibili.com\/pgc\/view\/web\/season?season_id=${id}`;\n break\n }\n \n return url\n}\n\n\/\/分享链接\nfunction getShareUrl(type,id){\n let url = \"\";\n\tswitch(type){\n case \"video\":\n url = `https:\/\/m.bilibili.com\/video\/av${id}`;\n break;\n \n case \"article\":\n url = `https:\/\/m.bilibili.com\/opus\/${id}`\n break;\n \n case \"forward\":\n url = `https:\/\/m.bilibili.com\/dynamic\/${id}`\n break; \n \n case \"user\":\n url = `https:\/\/m.bilibili.com\/space\/${id}`\n break;\n \n case \"articlelist\":\n url = `https:\/\/www.bilibili.com\/read\/readlist\/rl${id}`;\n break \n \n case \"media_bangumi\":\n url = `https:\/\/m.bilibili.com\/bangumi\/play\/ss${id}`;\n break\n\t}\n\treturn url\n}\n\n\/\/打开发现链接\nfunction getEapi(type,id,other){\n let offset = `{\\{if(page==1){source.put(\"nextoffset\",\"\")};source.get(\"nextoffset\");}}`;\n let url = \"\";\n switch(type){\n case \"videolist\":\n url = `https:\/\/api.bilibili.com\/x\/v2\/medialist\/resource\/list?out_referer=https%3A%2F%2Fspace.bilibili.com%2F&mobi_app=web&type=1&biz_id=${id}&ps=20&desc=true&sort_field=1&oid=${offset}&tid=0&bvid=&otype=2&with_current=false&direction=false&preview=0&use_pn=false&pn={{page}}&web_location=333.1245`;\n break;\n case \"space\":\n let key = other?other.split(\"❌❌\"):[\"\",\"\"]\n url = `https:\/\/api.bilibili.com\/x\/polymer\/web-dynamic\/v1\/feed\/space${key[0]}?host_mid=${id}&type=all&features=itemOpusStyle,listOnlyfans,opusBigCover,forwardListHidden,decorationCard,commentsNewVersion,onlyfansAssetsV2,ugcDelete,sunflowerStyle,eva3CardOpus,eva3CardVideo,eva3CardComment&page={{page}}&offset=${offset}${key[1]}`;\n break;\n case \"seasons_series_list\":\n url = `https:\/\/api.bilibili.com\/x\/polymer\/web-space\/seasons_series_list?mid=${id}&page_size=20&page_num={{page}}&web_location=333.1387`;\n break;\n \n }\n \n return url\n \n}\n\n\nfunction getVideoQuality(code) {\n var description = \"\";\n switch (parseInt(code)) {\n case 30000:\n description = \"杜比\";\n break;\n case 20000:\n description = \"4K\";\n break;\n case 10000:\n description = \"原画\";\n break;\n case 400:\n description = \"蓝光\";\n break;\n case 250:\n description = \"超清\";\n break;\n case 150:\n description = \"高清\";\n break;\n case 80:\n description = \"流畅\";\n break;\n default:\n description = \"未知清晰度\";\n }\n return description;\n}\n\nfunction getSeachType(type){\n\tlet result;\n\tswitch(type){\n\t\tcase \"1\":\n \t\tresult= \"番剧\";\n \t\tbreak;\n\t\tcase \"2\":\n \t\tresult= \"电影\"\n \t\tbreak;\n\t\tcase \"3\":\n \t\tresult= \"纪录片\"\n \t\tbreak;\n case \"4\":\n result= \"国创\"\n break;\n case \"5\":\n result= \"电视剧\"\n break;\n case \"7\":\n result= \"综艺\"\n break;\n default:\n return \"\"\n\t\t}\n\t\treturn \"🎬\"+result\n}\n\nfunction getNodes(nodes){\n\t const {java} = this;\n\t let text = \"\";\n let js;\n nodes.forEach(node=>{\n switch(node.type){\n case \"TEXT_NODE_TYPE_WORD\":\n text += node.word.words\n break;\n case \"TEXT_NODE_TYPE_RICH\":\n let rich = node.rich;\n switch(rich.type){\n case \"RICH_TEXT_NODE_TYPE_TEXT\":\n text += rich.text;\n break;\n \n case \"RICH_TEXT_NODE_TYPE_AT\":\n text+=`${this.getClickImg(\"user\",rich.rid)}${rich.text.replace(\/^@\/,'')}`;\n break;\n \n case \"RICH_TEXT_NODE_TYPE_OGV_EP\":\n case \"RICH_TEXT_NODE_TYPE_OGV_SEASON\":\n case \"RICH_TEXT_NODE_TYPE_AV\":\n case \"RICH_TEXT_NODE_TYPE_BV\":\n text+=`\\n${this.getClickImg(\"video\",rich.rid)}${rich.text}\\n`;\n break;\n \n case \"RICH_TEXT_NODE_TYPE_CV\":\n text+=`${this.getClickImg(\"article\",rich.rid)}${rich.text}`;\n break;\n \n case \"RICH_TEXT_NODE_TYPE_EMOJI\":\n text += `<img src=\"${rich.emoji.icon_url},{style:\\\"text\\\"}\">`;\n break;\n \n case \"RICH_TEXT_NODE_TYPE_VIEW_PICTURE\":\n let pics = rich.pics;\n pics.forEach(pic=>{\n text += `<img src=\"${pic.src}\">`\n })\n break;\n \n case \"RICH_TEXT_NODE_TYPE_WEB\":\n text+=`${this.getClickImg(\"link\",rich.jump_url)}${rich.text}`;\n break;\n \n default:\n text += rich?.text??\"\"\n break;\n }\n break;\n }\n })\n return text\t\n}\n\nfunction getLinkCard(data){\n const {java} = this;\n let html = \"\";\n let d,title,cover,desc,desc1,desc2,url;\n let type = data.type;\n switch(type){\n \/\/视频\n case \"ADDITIONAL_TYPE_UGC\":\n case \"LINK_CARD_TYPE_UGC\":\n d = data.ugc;\n title = `${this.getClickImg(\"video\",d.id_str)}${d.title}\\n`;\n cover = `${this.getClickImg(\"video\",d.id_str,d.cover,1)}\\n`;\n let duration = \"时长:\"+d.duration;\n let play = d.desc_second;\n html += title+cover+duration+\" \"+play\n break;\n \n case \"ADDITIONAL_TYPE_COMMON\":\n case \"LINK_CARD_TYPE_COMMON\":\n d = data.common;\n title = d.title;\n desc1 = d.desc1;\n desc2 = d.desc2;\n url = d.jump_url\n cover = `${this.getClickImg(\"link\",url,d.cover,2)}\\n`;\n html += title+cover+desc1+\"\\n\"+desc2\n break;\n \n case \"ADDITIONAL_TYPE_RESERVE\":\n case \"LINK_CARD_TYPE_RESERVE\":\n d = data.reserve;\n title = d.title;\n desc1 = d.desc1.text;\n let status = d.button.status;\n let t = d.button.type;\n let button;\n \n if(status == 1){\n button = d.button?.uncheck?.text\n }else{\n button = d.button?.check?.text\n }\n if(t == 1){\n button = d.button.jump_style.text;\n }\n let svg = `<svg width=\"180\" height=\"80\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><rect x=\"1\" y=\"1\" width=\"178\" height=\"78\" rx=\"4\" fill=\"#50B4E5\" stroke=\"#fff\" stroke-width=\"0.5\"\/><text x=\"${178\/2}\" y=\"${78\/2+12}\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-family=\"Arial, sans-serif\" font-size=\"35\" font-weight=\"bold\" fill=\"#fff\">${button}<\/text><\/svg>`;\n svg = 'data:image\/svg+xml;base64,' + java.base64Encode(svg);\n if(t == 1){\n cover = this.getClickImg(\"link\",d.button.jump_url,svg,2)\n }else{\n cover = this.getClickImg(\"user\",d.up_mid,svg,2)\n }\n \n html += cover+\"\\n\"+title+\"\\n\"+desc1\n break\n \n case \"LINK_CARD_TYPE_OPUS\":\n \/\/未找到测试样本\n return type+\"未找到本测试样本,如果你看到这个信息,请把这个详情页链接给我\"\n break;\n \n case \"LINK_CARD_TYPE_ITEM_NULL\":\n return data..item_null.text\n \n default:\n html = \"\"\n \n }\n return html?\"\\n————————\\n\"+html:html\n}\n\nfunction getMajor(major){\n const {java} = this;\n let html = \"\";\n let js,title,cover,id,desc,t;\n let type = major.type;\n switch(type){\n case \"MAJOR_TYPE_NONE\":\n return \"转发动态已失效\"\n \n case \"MAJOR_TYPE_UGC_SEASON\":\n case \"MAJOR_TYPE_ARCHIVE\":\n let av = major?.archive ?? major.ugc_season;\n title = av.title;\n id = av.aid;\n cover = av.cover;\n if(typeof cover !== \"string\"){\n cover = cover.cover\n }\n desc = av.desc;\n t = \"video\"\n break;\n \n case \"MAJOR_TYPE_LIVE\":\n case \"LINK_CARD_TYPE_LIVE\":\n return this.generateBadgeSVG(major,\"live\");\n \n case \"MAJOR_TYPE_ARTICLE\":\n let article = major.article;\n cover = article.covers[0]\n title = article.title;\n desc = article.desc;\n id = article.id;\n t = \"article\"\n break;\n \n case \"MAJOR_TYPE_DRAW\":\n let items = major.draw.items;\n items.forEach(item=>{\n html += `<img src=\"${item.src}\">`\n });\n return html\n \n case \"MAJOR_TYPE_MUSIC\":\n case \"LINK_CARD_TYPE_MUSIC\":\n return type\n break;\n \n case \"MAJOR_TYPE_COMMON\":\n return this.generateBadgeSVG(major)\n \n \/*\n case \"MAJOR_TYPE_MUSIC\":\n return type\n break;\n *\/\n case \"MAJOR_TYPE_OPUS\":\n let opus = major.opus.summary;\n let rich_text_nodes = opus.rich_text_nodes;\n let pics = major.opus?.pics || [];\n \n rich_text_nodes?rich_text_nodes.forEach(node=>{\n\t \t let nodes = [{}];\n\t \t nodes[0].type = \"TEXT_NODE_TYPE_RICH\";\n\t \t nodes[0].rich = node; \n \t html += this.getNodes(nodes); \t \n\t \t}):null;\n pics.forEach(x=>{\n html += `<img src=\"${x.url}\">`\n })\n return html\n \n default:\n return type+\"\\n\"+JSON.stringify(major)\n }\n \n html +=`\\n${this.getClickImg(t,id)}${title}\\n`;\n js = {\n type : t,\n js:`book?getLinkIcon(\"${t}\",\"${id}\",result):result`\n }\n html += cover?`\\n${this.getClickImg(t,id,cover,1)}\\n`:\"\";\n html += desc\n return html\n}\n\n\n\nfunction getDynamicType(type){\n\tswitch(type){\n\t\tcase \"DYNAMIC_TYPE_AV\":\n\t\treturn \"🎥\"\n\t\tcase \"DYNAMIC_TYPE_UGC_SEASON\":\n\t\treturn \"🗂\"\n\t\tcase \"DYNAMIC_TYPE_ARTICLE\":\n\t\treturn \"📖\"\n\t\tcase \"DYNAMIC_TYPE_LIVE\":\n\t\treturn \"📺\"\n\t\tcase \"DYNAMIC_TYPE_DRAW\":\n\t\treturn \"🖼\"\n\t\tcase \"DYNAMIC_TYPE_WORD\":\n\t\treturn \"📝\"\n\t\tdefault:\n\t\treturn \"\"\n\t\t}\n\t}\n \n \nfunction getDynamicUrl(type,json){\n\tconst {java} = this;\n\tlet url;\n \n\tswitch(type){\n\t\t\/\/转发\n case \"DYNAMIC_TYPE_COMMON_SQUARE\":\n case \"DYNAMIC_TYPE_FORWARD\":\n url = this.getApi(\"forward\",this.S(\"$.id_str\"),this.S(\"$.id_str\"))\n \t\tbreak;\n \n \/\/视频 \n case \"DYNAMIC_TYPE_AV\":\n\t\tcase \"DYNAMIC_TYPE_UGC_SEASON\":\n url = this.getApi(\"video\",this.S(\"$.modules..major..aid\"));\n break;\n \n\t\t\/\/专栏\n\t\tcase \"DYNAMIC_TYPE_ARTICLE\":\n url = this.getApi(\"article\",this.S(\"$.basic.comment_id_str\"),this.S(\"$.id_str\"))\n\t\tbreak;\n\t\t\n\t\t\/\/直播间分享\n\t\tcase \"DYNAMIC_TYPE_LIVE\":\n java.toast(\"未找到样本测试,如果你看到这个信息,请把复制详情页链接给我\");\n return \"未找到样本测试,如果你看到这个信息,请把复制详情页链接给我\"\n\t\tbreak;\n\t\t\n\t\t\/\/直播开播\n\t\tcase \"DYNAMIC_TYPE_LIVE_RCMD\":\n let uid = this.S(\"$..major.live_rcmd.content\").match(\/\"uid\":(\\d+)\/)[1];\n url = this.getApi(\"live\",uid);\n\t\tbreak;\n\t\t\n\t\t\/\/其他动态\n\t\t\/*\n\t\tcase \"DYNAMIC_TYPE_DRAW\":\n\t\tcase \"DYNAMIC_TYPE_WORD\":\n\t\t*\/\n \n\t\tdefault:\n url = this.getApi(\"opus\",this.S(\"$.id_str\"),this.S(\"$.id_str\"))\n\t\tbreak\n\t\t}\n return url\n\t}\n \nfunction generateBadgeSVG(data,type) {\n const {java} = this;\n data = data?.common ?? data?.live\n let badge = data.badge;\n let jstext;\n let width = 180;\n let height = 80;\n let borderRadius = 4;\n \n let textX = width \/ 2;\n let textY = height \/ 2+12;\n \n let svg = `\n<svg width=\"${width}\" height=\"${height}\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n <!-- 背景矩形 -->\n <rect\n x=\"1\"\n y=\"1\"\n width=\"${width - 2}\"\n height=\"${height - 2}\"\n rx=\"${borderRadius}\"\n fill=\"${badge.bg_color}\"\n stroke=\"#fff\"\n stroke-width=\"0.5\"\n \/>\n \n <text\n x=\"${textX}\"\n y=\"${textY}\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n font-family=\"Arial, sans-serif\"\n font-size=\"35\"\n font-weight=\"bold\"\n fill=\"${badge.color}\"\n >\n ${badge.text}\n <\/text>\n<\/svg>`;\n\nif(!type)type = \"link\";\nlet id = type==\"live\"?data.id:data.jump_url;\n svg = 'data:image\/svg+xml;base64,' + java.base64Encode(svg);\n let img = `\\n${this.getClickImg(type,id,svg,2)}标题:${data.title}\\n详细:${data.desc??data.desc_second}\\n${this.getClickImg(type,id,data.cover,1)}\\n`\n return img\n}\n\n \nfunction getReply(oid,type,mode){\n const {java} = this;\n\tlet queryJson = `{oid:\"${oid}\",type:${type},mode:${mode},plat:1,web_location:1315875,pagination_str:JSON.stringify({\"offset\":source.get(\"nextoffset\")})}`;\n\tlet u = `https:\/\/api.bilibili.com\/x\/v2\/reply\/wbi\/main?{{if(page==1){source.put(\"nextoffset\",\"\")};getWbiEnc(${queryJson})}}`;\n\treturn u\n\t}\n\nfunction getOpus(mid,type){\n\tlet queryJson = `{host_mid:${mid},page:page,offset:source.get(\"nextoffset\"),type:\"${type}\",\"web_location\":333.1387}`;\n let u = `https:\/\/api.bilibili.com\/x\/polymer\/web-dynamic\/v1\/opus\/feed\/space?{\\{if(page==1){source.put(\"nextoffset\",\"\")};getWbiEnc(${queryJson})}}`; \n return u\n\t}\n\t\nfunction getType(){\n\tlet type;\n\tif(\/📖\/.test(this.M(\"点击或长按UP主\"))){\n\t\t\ttype = \"article\"\n\t\t}else{\n type = \"video\"\n }\n return type\n\t}\n \n \/\/类型,id,图片链接,样式\nfunction getClickImg(type,id,src,s,t){\n const {java} = this;\n let jstext;\n \n if(src){\n jstext = `book?getLinkIcon(\"${t??type}\",\"${id}\"):result`\n }else{\n src=`data:image\/svg+xml;base64,`;\n jstext = `book?getLinkIcon(\"${t??type}\",\"${id}\"):getSvg(\"${type}\")`\n }\n if(s==1){\n s = \"full\"\n }else if(s==2){\n s = \"default\"\n }\n let js = {\n type : type,\n js:jstext,\n style:s??\"text\"\n }\n let img = `<img src=\"${src},${JSON.stringify(js)}\">`\n return img\n}\n\nfunction processHtml(str){\n const {java} = this;\n let doc = org.jsoup.Jsoup.parse(str);\n let link,js;\n if (!doc) {\n return str;\n }\n var atag = doc.select(\"a\");\n for (var i = 0; i < atag.size(); i++) {\n var e = atag.get(i);\n let link = e.attr(\"href\");\n let text = e.text()?e.text(\"网页链接\"):e.text();\n let img =this.getClickImg(\"link\",link)+text;\n img = img.replace(\/{.*}\/,function (match){\n return match.replace(\/\"\/g,'"')\n });\n \n e.html(img);\n \n }\n \n var videocard = doc.select(\".video-card,.article-card\");\n for (var i = 0; i < videocard.size(); i++) {\n var e = videocard.get(i);\n let aa = \"\";\n let type = \/video\/.test(e.attr(\"class\"))?\"video\":\"article\";\n let link = e.attr(\"aid\");\n if(\/,\/.test(link)){\n let linkl = link.split(\",\");\n linkl.forEach(x=>{\n aa+=this.getClickImg(type,x)+x+\"<br>\";\n });\n e.before(aa.replace(\/\"\/g,'"'))\n }else{\n let img = this.getClickImg(type,link,e.attr(\"src\"),1);\n img = img.match(\/src=\"(.*)\"\/)[1];\n e.attr(\"src\",img);\n }\n \n }\n let result = String(doc.toString()).replace(\/<\\\/img>\/g,'')\n return result\n}\n \nfunction processDelta(data) {\n\tconst {java} = this\n try {\n if (!data || !Array.isArray(data)) {\n return \"无效的数据格式\";\n }\n var html = \"\";\n var prevText = \"\";\n var js;\n for (var i = 0; i < data.length; i++) {\n var item = data[i];\n var currenttext = \"\";\n var insert = item.insert;\n \n if (insert) {\n if (typeof insert === \"string\") {\n \n var attr = item.attributes ?? {}; \n if (attr.link) {\n html += `${this.getClickImg(\"link\",attr.link)}${insert}`\n }else{\n html += insert\n }\n }else if(typeof insert == \"object\"){ \n let image = insert[\"native-image\"];\n if(image){ \t\t\t\n html += `<img src=\"${image.url}\">\\n`\n \t}\n \n let cut_off = insert[\"cut-off\"];\n if(cut_off){\n html += \"\\n‎\\n\";\n }\n \t\t\n let article_card = insert[\"article-card\"];\n if(article_card){\n html += `${this.getClickImg(\"article\",article_card.id,article_card.url,1)}\\n`\n }\n \n let video_card = insert[\"video-card\"];\n \t if(video_card){\n \t\t\thtml += `${this.getClickImg(\"video\",video_card.id,video_card.url,1)}\\n`\n \t }\n }\n }\n }\n return html;\n \n } catch (error) {\n java.log(\"构建HTML时出错: \" + error);\n return \"处理数据时发生错误\";\n }\n}\n\n\nfunction M(e){\n const {source} = this;\n let m = source.getLoginInfoMap();\n return String(m[e])\n\t}\n \nfunction liveToUser(url){\n const {java} = this;\n let uid = JSON.parse(java.ajax(url)).data.uid;\n return this.getApi(\"live\",uid);\n}\n\nfunction getLinkIcon(type,link){\n\t const {java} = this\n \n let url = \"\";\n switch(type){\n case \"link\":\n java.startBrowser(link, \"\");\n return;\n \n case \"live\":\n url = `https:\/\/api.live.bilibili.com\/room\/v1\/Room\/get_info?room_id=${link}`;\n url = this.liveToUser(url);\n break;\n \n case \"video\":\n let aid = link.includes(\"BV1\")?String(bv2av(link)):link;\n \/\/ java.log(aid)\n url = this.getApi(type,aid)\n break;\n \n case \"article\":\n url = this.getApi(type,link,link)\n break;\n \n case \"articlelist\":\n url = \"https:\/\/api.bilibili.com\/x\/article\/list\/web\/articles?id=\"+link;\n \n break\n \n case \"user\":\n url = this.getApi(type,link)\n break\n }\n if(\/\"js\"\/.test(url)){\n let u = url.match(\/,{\"js\".*\/)[0].replace(\/\"}\/,'\",origin:\\\"哔哩哔哩\\\"}');\n url = url.replace(\/,{\"js\".*\/,'')+u;\n \n url = \"legado:\/\/import\/addToBookshelf?src=\"+encodeURIComponent(url)\n\n \n }else{\n \n \n url = \"legado:\/\/import\/addToBookshelf?src=\"+encodeURIComponent(url)+\",{origin:\\\"哔哩哔哩\\\"}\";\n }\n java.openUrl(url);\n return;\n}\n\nfunction getSvg(type){\n const {java} = this;\n let t = \"🔗\";\n if(type == \"link\")t = \"🔗\";;\n if(type ==\"video\")t=\"🎥\";\n if(type == \"article\")t=\"📖\";\n if(type==\"user\")t=\"👤\";\n let svg = `\n <svg width=\"32\" height=\"32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n <text x=\"16\" y=\"27\" font-family=\"Roboto Condensed\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-size=\"24\" font-weight=\"bold\" fill=\"#555\">\n ${t}\n <\/text>\n <\/svg>`;\n \n return \"data:image\/svg+xml;base64,\" + java.base64Encode(svg);\n}\n\nfunction getIs(type){\n\tconst {java,chapter,cache,book} = this;\n let url,name,data,mid,is_followed,bmid;\n \n if(book){\n is_followed = \"\";\n mid = String(cache.get(\"mid\"));\n bmid = String(book.getVariable(\"mid\"));\n mid = bmid?bmid:mid\n if(mid){\n url = this.getApi(\"user\",mid);\n is_followed = String(JSON.parse(java.ajax(url)).data.is_followed);\n if(is_followed == \"true\"){\n name = \"🆙 已关注\";\n cache.put(\"up\",1)\n }else{\n name = \"🆙 关注\"\n cache.put(\"up\",0)\n }\n }\n \n\tif(chapter){\n let aid = this.b64D(chapter.url).split(\"&\")[0];\n switch(type){\n \t case \"like\":\n \t url = \"https:\/\/api.bilibili.com\/x\/web-interface\/archive\/has\/like?aid=\"+aid;\n data = JSON.parse(java.ajax(url)).data;\n if(data == 1){\n name = \"👍🏻 已点赞\"\n cache.put(\"like\",1,300)\n }else{\n name = \"👍🏻 点赞\"\n cache.put(\"like\",0,300)\n }\n \t break\n \t case \"coin\":\n url = \"https:\/\/api.bilibili.com\/x\/web-interface\/archive\/coins?aid=\"+aid;\n data = JSON.parse(java.ajax(url)).data.multiply;\n cache.put(\"coin\",data,300)\n if(data == 0){\n name = \"🪙 投币\" \n }else{\n name = \"🪙 已投\"+data+\"枚\"\n }\n \t break\n \t case \"fav\":\n url = \"https:\/\/api.bilibili.com\/x\/v2\/fav\/video\/favoured?aid=\"+aid;\n data = JSON.parse(java.ajax(url)).data.favoured;\n if(data == true){\n name = \"⭐️ 已收藏\"\n cache.put(\"fav\",1,300)\n }else{\n name = \"⭐️ 收藏\"\n cache.put(\"fav\",0,300)\n }\n \t}\n } \n\t}\nreturn name\t\n\t}\n \nfunction b64D(s){\n\t\tconst {java} = this;\n\t\t let str = s.match(\/base64,(.*?),\/)[1];\n\t\t return String(java.base64Decode(str))\n}\n\nfunction S(s){\n\tconst {java} = this;\n\treturn String(java.getString(s))\n}\n\n\n\/*\nconst XOR_CODE = 23442827791579n; const MASK_CODE = 2251799813685247n; const MAX_AID = 1n << 51n; const BASE = 58n; const data = 'FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf';\n\n function av2bv(aid) { const bytes = ['B', 'V', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0']; let bvIndex = bytes.length - 1; let tmp = (MAX_AID | BigInt(aid)) ^ XOR_CODE; while (tmp > 0) { bytes[bvIndex] = data[Number(tmp % BigInt(BASE))]; tmp = tmp \/ BASE; bvIndex -= 1; } [bytes[3], bytes[9]] = [bytes[9], bytes[3]]; [bytes[4], bytes[7]] = [bytes[7], bytes[4]]; return bytes.join(''); }\n \nfunction bv2av(bvid) { const bvidArr = Array.from(bvid); [bvidArr[3], bvidArr[9]] = [bvidArr[9], bvidArr[3]]; [bvidArr[4], bvidArr[7]] = [bvidArr[7], bvidArr[4]]; bvidArr.splice(0, 3); const tmp = bvidArr.reduce((pre, bvidChar) => pre * BASE + BigInt(data.indexOf(bvidChar)), 0n); return Number((tmp & MASK_CODE) ^ XOR_CODE); } \n\n*\/\n\nconst XOR_CODE = 23442827791579; const MASK_CODE = 2251799813685247; const MAX_AID = 2251799813685248; const BASE = 58; const data = 'FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf'; function av2bv(aid) { var bytes = ['B','V','1','0','0','0','0','0','0','0','0','0']; var bvIndex = 11; var aidNum = Number(aid); var tmp = bitwiseXor(bitwiseOr(MAX_AID, aidNum), XOR_CODE); while (tmp > 0) { bytes[bvIndex] = data[tmp % BASE]; tmp = Math.floor(tmp \/ BASE); bvIndex--; } var temp = bytes[3]; bytes[3] = bytes[9]; bytes[9] = temp; temp = bytes[4]; bytes[4] = bytes[7]; bytes[7] = temp; return bytes.join(''); } function bv2av(bvid) { var bvidArr = bvid.split(''); var temp = bvidArr[3]; bvidArr[3] = bvidArr[9]; bvidArr[9] = temp; temp = bvidArr[4]; bvidArr[4] = bvidArr[7]; bvidArr[7] = temp; bvidArr.splice(0, 3); var tmp = 0; for (var i = 0; i < bvidArr.length; i++) { tmp = tmp * BASE + data.indexOf(bvidArr[i]); } return bitwiseXor(bitwiseAnd(tmp, MASK_CODE), XOR_CODE); } function bitwiseOr(a, b) { var highA = Math.floor(a \/ 4294967296); var lowA = a & 4294967295; var highB = Math.floor(b \/ 4294967296); var lowB = b & 4294967295; var resultHigh = highA | highB; var resultLow = lowA | lowB; return resultHigh * 4294967296 + resultLow; } function bitwiseAnd(a, b) { var highA = Math.floor(a \/ 4294967296); var lowA = a & 4294967295; var highB = Math.floor(b \/ 4294967296); var lowB = b & 4294967295; var resultHigh = highA & highB; var resultLow = lowA & lowB; return resultHigh * 4294967296 + resultLow; } function bitwiseXor(a, b) { var highA = Math.floor(a \/ 4294967296); var lowA = a & 4294967295; var highB = Math.floor(b \/ 4294967296); var lowB = b & 4294967295; var resultHigh = highA ^ highB; var resultLow = lowA ^ lowB; return resultHigh * 4294967296 + resultLow; }\n\n\n \nfunction danmakuToLRC(xmlString, options = {}) {\n let {\n sortByTime = true, \n timeFormat = 's', \n includeMeta = true, \n escapeChars = true \n } = options;\n \n let danmakuPattern = new RegExp('<d\\\\s+p=\"([^\"]+)\">(.*?)<\/d>', 'g');\n let danmakus = [];\n let match;\n \n while ((match = danmakuPattern.exec(xmlString)) !== null) {\n let pAttribute = match[1];\n let textContent = match[2];\n let parts = pAttribute.split(',');\n \n if (parts.length >= 9) {\n let time = parseFloat(parts[0]); \n let text = escapeChars \n ? textContent.replace(\/\\[\/g, '【').replace(\/\\]\/g, '】')\n : textContent;\n \n danmakus.push({ time, text });\n }\n }\n \n if (sortByTime) {\n danmakus.sort((a, b) => a.time - b.time);\n }\n \n let lrcContent = '';\n \n if (includeMeta) {\n lrcContent += '[ti:弹幕歌词]\\n';\n lrcContent += '[ar:Bilibili弹幕]\\n';\n lrcContent += `[re:共${danmakus.length}条弹幕]\\n`;\n lrcContent += `[by:danmaku-to-lrc ${new Date().toISOString().split('T')[0]}]\\n\\n`;\n }\n \n danmakus.forEach((danmaku, index) => {\n let timeTag = '';\n let minutes,seconds;\n if (timeFormat === 'ms') {\n let totalMs = danmaku.time * 1000;\n minutes = Math.floor(totalMs \/ 60000);\n seconds = Math.floor((totalMs % 60000) \/ 1000);\n let milliseconds = Math.floor(totalMs % 1000);\n timeTag = `[${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}.${milliseconds.toString().padStart(3, '0')}]`;\n } else {\n minutes = Math.floor(danmaku.time \/ 60);\n seconds = danmaku.time % 60;\n timeTag = `[${minutes.toString().padStart(2, '0')}:${seconds.toFixed(2).padStart(5, '0')}]`;\n }\n \n lrcContent += `${timeTag}${danmaku.text}\\n`;\n });\n \n return lrcContent;\n}\n\nfunction modifyDanmaku(xmlStr, fontSize) {\n if (!xmlStr) return xmlStr;\n var size = Math.max(1, parseInt(fontSize) || 25);\n return xmlStr.replace(\n \/<d p=\"([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+)\">\/g,\n function(match, t1, t2, t3, t4, t5, t6, t7, t8, t9) {\n \n return `<d p=\"${t1},${t2},${size},${t4},${t5},${t6},${t7},${t8},${t9}\">`;\n }\n );\n}\n\nfunction generateMPD(Data) {\n \n let video = Data.video;\n let videoData;\n \n \n for(let i=1;i<video.length;i++){\n \tif(video[i].codecid === 7){\n \n \t\tvideoData = video[i];\n \t\tbreak\n\t\t}\n\t}\n \n let audioData = Data.audio[1];\n let duration = Data.duration;\n const videoBaseUrl = videoData.baseUrl;\n const audioBaseUrl = audioData.baseUrl;\n \n const videoSegmentBase = videoData.segment_base || videoData.SegmentBase;\n const audioSegmentBase = audioData.segment_base || audioData.SegmentBase;\n \n const videoInitRange = videoSegmentBase.initialization || videoSegmentBase.Initialization;\n const videoIndexRange = videoSegmentBase.index_range || videoSegmentBase.indexRange;\n \n const audioInitRange = audioSegmentBase.initialization || audioSegmentBase.Initialization;\n const audioIndexRange = audioSegmentBase.index_range || videoSegmentBase.indexRange;\n \n \/\/ 将duration格式化为ISO 8601持续时间格式\n \/\/ duration应为秒数,格式化为PTxS格式\n const durationStr = \"PT\" + duration + \"S\";\n \n const mpdContent = `<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\" profiles=\"urn:mpeg:dash:profile:full:2011\" type=\"static\" mediaPresentationDuration=\"${durationStr}\" minBufferTime=\"PT1.5S\">\n <Period id=\"0\" start=\"PT0.0S\">\n <AdaptationSet id=\"0\" contentType=\"video\" width=\"${videoData.width}\" height=\"${videoData.height}\" frameRate=\"${videoData.frameRate || videoData.frame_rate}\" par=\"${videoData.sar}\" segmentAlignment=\"true\">\n <Representation id=\"${videoData.id}\" bandwidth=\"${videoData.bandwidth}\" codecs=\"${videoData.codecs}\" mimeType=\"${videoData.mimeType || videoData.mime_type}\">\n <BaseURL>${videoBaseUrl.replace(\/&\/g,'&')}<\/BaseURL>\n <SegmentBase indexRange=\"${videoIndexRange}\">\n <Initialization range=\"${videoInitRange}\"\/>\n <\/SegmentBase>\n <\/Representation>\n <\/AdaptationSet>\n <AdaptationSet id=\"1\" contentType=\"audio\" segmentAlignment=\"true\">\n <Representation id=\"${audioData.id}\" bandwidth=\"${audioData.bandwidth}\" codecs=\"${audioData.codecs}\" mimeType=\"${audioData.mimeType || audioData.mime_type}\">\n <BaseURL>${audioBaseUrl.replace(\/&\/g,'&')}<\/BaseURL>\n <SegmentBase indexRange=\"${audioIndexRange}\">\n <Initialization range=\"${audioInitRange}\"\/>\n <\/SegmentBase>\n <\/Representation>\n <\/AdaptationSet>\n <\/Period>\n<\/MPD>`;\n \n return mpdContent;\n}\n\nfunction formatTimeDynamic(totalSeconds) {\n const hours = Math.floor(totalSeconds \/ 3600);\n const remainingSeconds = totalSeconds % 3600;\n const minutes = Math.floor(remainingSeconds \/ 60);\n const seconds = remainingSeconds % 60;\n \n const parts = [];\n \n if (hours > 0) {\n parts.push(hours.toString().padStart(2, '0'));\n }\n \n \/\/ 如果有小时,分钟必须是2位\n if (hours > 0) {\n parts.push(minutes.toString().padStart(2, '0'));\n } else {\n parts.push(minutes.toString()); \/\/ 不足1小时,分钟不需要补0\n }\n \n parts.push(seconds.toString().padStart(2, '0'));\n \n return parts.join(':');\n}\n\nfunction formatCount(count) {\n if (count < 10000) return count.toString(); \n const inWan = (count \/ 10000).toFixed(2);\n return inWan.endsWith('.00') \n ? `${inWan.split('.')[0]}万` \n : `${inWan}万`;\n}\n\n function getWbiEnc(queryJson) {\n const {java} = this;\n const mixinKeyEncTab = [\n 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49,\n 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40,\n 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11,\n 36, 20, 34, 44, 52\n ];\n\n \/\/ 对 imgKey 和 subKey 进行字符顺序打乱编码\n function getMixinKey(orig) {\n let temp = '';\n mixinKeyEncTab.forEach((n) => {\n temp += orig[n]\n });\n return temp.slice(0, 32);\n }\n\n \/\/ 为请求参数进行 wbi 签名\n function encWbi(params, img_key, sub_key) {\n const mixin_key = getMixinKey(img_key + sub_key),\n curr_time = Math.round(Date.now() \/ 1000),\n chr_filter = \/[!'\\(\\)*]\/g\n let query = [];\n params = Object.assign(params, { wts: curr_time }); \/\/ 添加 wts 字段\n \/\/ 按照 key 重排参数\n Object.keys(params).sort().forEach((key) => {\n query.push(\n encodeURIComponent(key) +\n '=' +\n \/\/ 过滤 value 中的 \"!'()*\" 字符\n encodeURIComponent(('' + params[key]).replace(chr_filter, ''))\n )\n })\n query = query.join('&');\n const wbi_sign =String(java.md5Encode(query + mixin_key)); \/\/ 计算 w_rid\n return query + '&w_rid=' + wbi_sign;\n }\n\n \/\/ 获取最新的 img_key 和 sub_key\n function getWbiKeys() {\n const json_content = JSON.parse(java.ajax('https:\/\/api.bilibili.com\/x\/web-interface\/nav')).data;\n let img_url = json_content.wbi_img.img_url;\n let sub_url = json_content.wbi_img.sub_url;\n return {\n img_key: img_url.substring(img_url.lastIndexOf('\/') + 1, img_url.length).split('.')[0],\n sub_key: sub_url.substring(sub_url.lastIndexOf('\/') + 1, sub_url.length).split('.')[0]\n }\n }\n\n const wbi_keys = getWbiKeys();\n\n const query = encWbi(\n queryJson,\n wbi_keys.img_key,\n wbi_keys.sub_key\n );\n return query;\n}\n",
"lastUpdateTime": "1766668358607",
"loginCheckJs": "if(typeof java.readBookConfig == \"undefined\"){\tjava.startBrowser(\"https:\/\/loyc.xyz\/c\/legado.html#download\", \"下载阅读Σ\");\n\tjava.longToast(\"本书源只支持最新版洛雅橙改版阅读Σ\\n请安装后重新导入书源\")\n\t}\nresult",
"loginUi": "@js:\nlet d= [];\nlet all = [\n {\n \"name\": \"模式\",\n \"type\": \"select\",\n \"action\":\"test()\",\n \"chars\": [\"🎥 视 频\", \"🎧 音 频\"],\n \"default\": \"🎥 视 频\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.3\n }\n },\n {\n \"name\": \"点击长按UP主\",\n \"type\": \"select\",\n \"chars\": [\"🎬 显示视频\", \"📖 显示专栏\"],\n \"default\": \"🎬 显示视频\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.5\n }\n }, {\n \"name\": \"👤登录\",\n \"type\": \"button\",\n \"action\": \"toLogin()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": (!book && !chapter)?0.2:1\n }\n }]\n \nlet mid = String(cache.get(\"mid\"));\nif(book && !chapter){\n\tlet bmid = String(book.getVariable(\"mid\"));\n\tmid = bmid?bmid:mid;\n if(mid){\n all.push({\n \"name\": \"🆙 关注\",\n \"viewName\": `getIs()`,\n \"action\":`toLcf('up',\"${mid}\")`,\n \"type\": \"button\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n },{\n \"name\": \"🆙加入书架\",\n \"action\":`addShlef(\"${mid}\")`,\n \"type\": \"button\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4\n }\n })\n }\n}\n\nif(chapter){\n\t if(!\/x\\\/article|data:liveurl\/.test(chapter.url)){\n let mymid = JSON.parse(java.ajax(\"https:\/\/api.bilibili.com\/x\/web-interface\/nav\"))?.data?.mid || \"\";\n if(mymid!=\"\"){\n let button = [{\n \"name\": \"当前视频:\"+chapter.title,\n \"type\": \"text\"\n },\n {\n \"name\": \"👍🏻 点赞\",\n \"viewName\": `getIs('like')`,\n \"action\":\"toLcf('like')\",\n \"type\": \"button\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n },\n {\n \"name\": \"⭐️ 收藏\",\n \"viewName\": `getIs('fav')`,\n \"type\": \"button\",\n \"action\":\"toLcf('fav')\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n },\n {\n \"name\": \"🪙 投币\",\n \"viewName\": `getIs('coin')`,\n \"type\": \"button\",\n \"action\":\"toLcf('coin')\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.25\n }\n },\n {\n \"name\": \"一👍🏻键🪙三⭐️连\",\n \"action\": `toLcf('all')`,\n \"type\": \"button\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n }]\n all = all.concat(button)\n }\n }\n}\n\nif(!book && !chapter){\n all.push({\n \"name\": \"关注分组\",\n \"type\": \"toggle\",\n \"chars\": [\"❎\", \"☑️\"],\n \"default\": \"❎\",\n \"action\":\"source.refreshExplore()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },{\n \"name\": \"收藏夹\",\n \"type\": \"toggle\",\n \"chars\": [\"❎\", \"☑️\"],\n \"action\":\"source.refreshExplore()\",\n \"default\": \"❎\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n });\n \n\tall.push({\n \"name\": \"1🎬番剧,2🎥电影,3🎞纪录片,4🇨🇳国创,5📺电视剧,6🍿综艺 [显示]\",\n \"default\":\"123456\",\n \"type\": \"text\",\n \n \"style\": {\n \"layout_flexGrow\": 1, \n \"layout_flexBasisPercent\": 1\n }\n });\n d = [{\n \"name\": `🔁排序`,\n \"type\": \"select\",\n \n \"chars\": [\"更新时间\", \"弹幕数量\", \"播放数量\",\"追剧人数\",\"最高评分\",\"开播时间\",\"上映时间\"],\n \"default\": \"追剧人数\",\n \"style\": {\n \"layout_flexGrow\": 1, \n \"layout_flexBasisPercent\": 0.4,\n \"layout_justifySelf\": \"flex_end\"\n }\n },{\n \"name\": `💰付费`,\n \"type\": \"select\",\n \n \"chars\": [\"全部\", \"免费\",\"付费\", \"大会员\"],\n \"default\": \"全部\",\n \"style\": {\n \"layout_flexGrow\": 1, \n \"layout_flexBasisPercent\": 0.4,\n \"layout_justifySelf\": \"flex_end\"\n }\n }];\n \nfunction createFilterFromData(typeKey, namePrefix, fenleiData, f, icon) {\n const dataArray = [];\n (fenleiData[f] ?? []).forEach(x => {\n dataArray.push(x.n);\n });\n if (dataArray.length) {\n d.push({\n \"name\": icon + namePrefix,\n \"type\": \"select\",\n \"chars\": dataArray,\n \"default\": \"全部\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.4,\n \"layout_justifySelf\": \"flex_end\"\n }\n });\n }\n}\n\nfenlei[\"类型\"].forEach((f, i) => {\n const icon = fenlei[\"图标\"][i];\n createFilterFromData(\"出品\", \"出品\", fenlei[\"出品\"], f, icon);\n createFilterFromData(\"状态\", \"状态\", fenlei[\"状态\"], f, icon);\n createFilterFromData(\"版权\", \"版权\", fenlei[\"版权\"], f, icon);\n createFilterFromData(\"类别\", \"类别\", fenlei[\"类别\"], f, icon);\n createFilterFromData(\"地区\", \"地区\", fenlei[\"地区\"], f, icon);\n createFilterFromData(\"年份\", \"年份\", fenlei[\"年份\"], f, icon);\n});\n}\nall = all.concat(d)\nresult = JSON.stringify(all);\nsource.putLoginInfo(result);\nresult",
"loginUrl": "function login(){\n\tsource.refreshExplore();\n\t}\n\nfunction addShlef(id,type){\n\tgetLinkIcon(\"user\",id)\n\t}\n\t\n\t\nfunction toLogin(){\n\tlet url = \"https:\/\/www.bilibili.com\";\n\tcookie.setCookie(url,\"\")\n java.startBrowser(url,\"登录\");\n\t}\n\nfunction toLcf(type,mid){\n\tlet url,name,data,aid;\n try{\t\n let info = source.getLoginInfoMap();\n let csrf = String(cookie.getKey(\"https:\/\/www.bilibili.com\",\"bili_jct\"));\n let b64 = chapter?chapter.url:\"\";\n let aid = b64?this.b64D(b64).split(\"&\")[0]:\"\";\n let isLcy = Number(cache.get(type));\n \n switch(type){\n \t case \"like\":\n \t isLcy = isLcy==1?2:1 \t \n \t url = \"https:\/\/api.bilibili.com\/x\/web-interface\/archive\/like,\"+JSON.stringify({\n \"method\":\"POST\",\n \"body\":\"aid=\"+aid+\"&like=\"+isLcy+\"&csrf=\"+ csrf\n });\n data = java.ajax(url);\n code = JSON.parse(data).code;\n if(code == 0){\n \t if(isLcy == 2){\n \t \t info[\"👍🏻 点赞\"] = \"👍🏻 点赞\";\n \t \t java.toast(\"已取消点赞\");\n \t \t cache.put(type,0,300)\n \t \t}else if(isLcy == 1){\n \t \t\t info[\"👍🏻 点赞\"] = \"👍🏻 已点赞\";\n java.toast(\"已点赞\");\n cache.put(type,1,300)\n \t\t}\n }else if(code == 65004){\n \t \t code = JSON.parse(java.ajax(url.replace(\/like=2\/,'like=1'))).data.code;\n \t \t if(code == 0){\n \t \t \t java.toast(\"已点赞\");\n cache.put(type,1,300)\n \t \t \t}\n }else if(code == 65006){\n \t \t code = JSON.parse(java.ajax(url.replace(\/like=1\/,'like=2'))).data.code;\n \t \t if(code == 0){\n \t \t \t java.toast(\"已取消点赞\");\n cache.put(type,0,300)\n \t \t \t}\n }else{\n java.toast(JSON.parse(data).message)\n }\n \t break\n \t case \"coin\":\n url = \"https:\/\/api.bilibili.com\/x\/web-interface\/coin\/add,\"+JSON.stringify({\n \"method\":\"POST\",\n \"body\":\"multiply=1&del_media_ids=&aid=\"+aid+\"&csrf=\"+ csrf\n });\n if(isLcy==2){\n java.toast(\"该视频已达投币上限\")\n }else{\n data = java.ajax(url);\n code = JSON.parse(data).code;\n if(code == 0){\n isLcy += 1;\n info[\"🪙 投币\"] = \"🪙 已投\"+isLcy+\"枚\";\n java.toast(\"成功投币1枚\");\n cache.put(type,isLcy,300)\n }else{\n java.toast(JSON.parse(data).message)\n }\n }\n \t break\n \t case \"fav\":\n let n = isLcy ==1?\"add_media_ids=&del_media_ids=0\":\"add_media_ids=0&del_media_ids=\";\n \n \t url = \"https:\/\/api.bilibili.com\/medialist\/gateway\/coll\/resource\/deal,\"+JSON.stringify({\n \"method\":\"POST\",\n \"body\":n+\"&rid=\"+aid+\"&type=2\"+\"&csrf=\"+ csrf\n });\n data = java.ajax(url);\n code = JSON.parse(data).code;\n if(code == 0){\n if(isLcy == 0){\n info[\"⭐️ 收藏\"] = \"⭐️ 已收藏\"\n \t java.toast(\"已收藏至默认收藏夹\");\n \t cache.put(type,1,300)\n }else if(isLcy == 1){\n info[\"⭐️ 收藏\"] = \"⭐️ 收藏\"\n \t java.toast(\"已从默认收藏夹取消\");\n \t cache.put(type,0,300)\n }\n }else{\n java.toast(JSON.parse(data).message)\n }\n break;\n case \"all\":\n url = \"https:\/\/api.bilibili.com\/x\/web-interface\/archive\/like\/triple,\"+JSON.stringify({\n \"method\":\"POST\",\n \"body\":\"aid=\"+aid+\"&csrf=\"+csrf\n });\n data = java.ajax(url);\n code = JSON.parse(data).code;\n if(code == 0){\n info[\"👍🏻 点赞\"] = \"👍🏻 已点赞\"\n info[\"⭐️ 收藏\"] = \"⭐️ 已收藏\"\n info[\"🪙 投币\"] = \"🪙 已投2枚\"\n java.toast(\"👍🏻🪙⭐️一键三连成功\")\n }else{\n java.toast(JSON.parse(data).message)\n }\n break;\n \n case \"up\":\n isLcy = isLcy==1?2:1;\n url = \"https:\/\/api.bilibili.com\/x\/relation\/modify,\"+JSON.stringify({\n \"method\":\"POST\",\n \"body\":\"fid=\"+mid+\"&act=\"+isLcy+\"&csrf=\"+ csrf\n });\n data = java.ajax(url);\n code = JSON.parse(data).code;\n if(code == 0){\n if(isLcy == 1){\n info[\"🆙 关注\"] = \"🆙 已关注\"\n \t java.toast(\"已关注至默认分组\");\n \t cache.put(type,1,300)\n }else if(isLcy == 2){\n info[\"🆙 关注\"] = \"🆙 关注\"\n \t java.toast(\"已从默认分组取消关注\");\n \t cache.put(type,0,300)\n }\n }else{\n java.toast(JSON.parse(data).message)\n }\n break\n \t}\n java.upLoginData(info)\n }catch(e){\n java.log(e)\n \n }\n\t\n\t}",
"respondTime": 180000,
"ruleBookInfo": {
"author": "$.owner.name||$.author.name\n<js>\nif(\/acc\\\/info\/.test(baseUrl)){\n\tresult = \"查看全部动态\"\n\t}else if(\/season_id=\/.test(baseUrl)){\n\t\tresult = \"查看系列视频\"\n\t\t}\nresult\n<\/js>",
"canReName": "1",
"coverUrl": "$.pic||$..origin_image_urls[0]||$.list.image_urls[0]||$.list.image_url||$.face||$.cover.url||$.cover",
"init": "<js>\nif(S(\"$.message\")!=0 &&S(\"$.message\")!=\"success\" && S(\"$.message\")!=\"OK\"){\n\tjava.toast(\"\\n❌\"+S(\"$.message\")+\"\\n\"+\"如是账号相关问题\\n请尝试点击登录进网页拿Cookie\");\n\t}\n\nif((\/,\"type\":1}}}\/.test(result) ||S(\"$.data.fallback.id\"))&& \/opus\/.test(baseUrl)){\n\tlet rid = S(\"$.data.fallback.id\") || result.match(\/\"rid_str\":\"(\\d+)\",\/)[1];\n\tlet id = baseUrl.match(\/id=(\\d+)\/)[1]\n\tlet url = \n\t\tgetApi(\"article\",rid,id);\n\tjava.put(\"url\",url);\n\t java.setContent(String(java.ajax(url)));\n}\n\n if(!S(\"$.data\") && \/api\/.test(baseUrl)){\n\tresult = java.getElement(\"$.result\");\n\turl = \"https:\/\/api.bilibili.com\/pgc\/web\/season\/section?season_id=\"+S(\"$.result.season_id\");\n\tjava.put(\"url\",url)\n\t}else if(S(\"$.data\")){\n\t\tresult = java.getElement(\"$.data\");\t\t\n\t\t}else if(!\/api\/.test(baseUrl)){\n\t result = JSON.stringify({data:{}})\n\t}\n\tresult\n<\/js>",
"intro": "  \n🕑 时长:{{formatTimeDynamic(S(\"$.duration\"))}}\n📤 发布:{{S(\"$.pubtime||$.meta.ptime||$.pubdate||$.list.publish_time\")?java.timeFormat(Number(S(\"$.pubtime||$.meta.ptime||$.pubdate||$.list.publish_time\")+\"000\")):\"\"}}\n⌨️ 更新:{{S(\"$.list.update_time||$.update_time\")?java.timeFormat(Number(S(\"$.list.update_time||$.update_time\")+\"000\")):\"\"}}\n—————————————\n👍🏻 点赞:{{formatCount(S(\"$.stat.like||$.stats.like\"))}}\n⭐️ 收藏:{{formatCount(S(\"$.stat.favorite||$.stats.view\"))}}\n🪙 投币:{{formatCount(S(\"$.stat.coin||$.stats.coin\"))}}\n—————————————\n👁 观看:{{formatCount(S(\"$.stat.view||$.stats.view\"))}}\n📖 阅读:{{formatCount(S(\"$.stats.view||$.list.read\"))}}\n🗯 弹幕:{{formatCount(S(\"$.stat.danmaku\"))}}\n💬 评论:{{formatCount(S(\"$.stat.reply||$.stats.reply\"))}}\n🔗 分享:{{formatCount(S(\"$.stat.share||$.stats.share\"))}}\n—————————————\n{{$.desc}}\n{{$.summary||$.list.summary||$.sign||$.evaluate}}\n{{S(\"$.seasons[*].season_title\")?\"<br>‎<br>同系列剧集:\":\"\"}}\n{{S(\"$.seasons[*].season_title\")?S(\"$.seasons[*].season_title\").split(\"\\n\").map((x,i)=>{let b =S(\"$.seasons[*].new_ep.index_show\").split(\"\\n\");return x+\"【\"+b[i]+\"】\"}).join(\"\\n\"):\"\"}}\n{{content = \"\\n‎\\n\"+S(\"$.root.content.message\");pic = S(\"$.root.content.pictures\");pic?content+\"[图片]\":content}}\n{{if(S(\"$.replies\")){let r = java.getElements(\"$.replies[*]\");let x=\"\";r.forEach(y=>{x+=\"👤【\"+y.member.uname+\"】 \"+y.reply_control.time_desc+\"\\n\"+y.content.message+(y.content.pictures?\"[图片]\":\"\")+\"\\n‎\\n\";});\"\\n‎\\n————回复————\\n\"+x};}}\n<js>##(📤 发布|💬 评论|🗯 弹幕|👁 观看|🪙 投币|⭐️ 收藏|👍🏻 点赞|🔗 分享|🕑 时长|📖 阅读|⌨️ 更新):\\n|🕑 时长:0:00<\/js>\n<js>##(—————————————\\n){2,}<\/js>\n<js>if(\/  \\s+‎\/.test(result)){result = \"  \"+book.intro}result<\/js>\n##null",
"kind": "{{if(S(\"$.publish.is_finish\")==\"0\"){\"连载\"};if(S(\"$.publish.is_finish\")==\"1\"){\"完结\"};}},{{$.areas[*].name}},{{$.type_name}},{{S(\"$.rating.score\")?S(\"$.rating.score\")+\"分\":\"\"}},{{$.styles}},{{getSeachType(S(\"$.type\"))}},{{$.payment.tip}},{{$.vip.label.text}},{{$.sex##保密}},{{$.official.title}},{{$.tname_v2&&$.tname}},合集共{{$.ugc_season.ep_count}}个视频,所属合集:{{$.ugc_season.title||$.list.name}}##所属合集:$|合集共个视频",
"lastChapter": "{{$.new_ep.title}}",
"name": "$.title||$.list.name||$.name\n<js>\nif(\/acc\\\/info\/.test(baseUrl)){\n\tresult = \"👤\" + result\n\t}\nresult\n<\/js>",
"tocUrl": "@js:java.get(\"url\");",
"wordCount": "{{$.list.words}}"
},
"ruleContent": {
"callBackJs": "let bu = String(book?book.tocUrl:\"\");\nlet mid = String(book?book.getVariable(\"mid\"):\"\");\nmid = mid || bu.match(\/mid=(\\d+)\/)?.[1];\nfalse;\nif(event == \"startRead\"){\n\tif(\/⚪️\/.test(book.durChapterTitle)){\n\t\tjava.toast(\"当前主播可能未开播,刷新目录再尝试进入\");\n\t\t}\n\t}\n\n \/\/定制\nif (event == \"clickCustomButton\") {\n\t\n if(chapter&&\/data:bilibili|series_id\/.test(chapter.url)&&!\/section\/.test(bu)){\n let a = b64D(chapter.url).split(\"&\")[0];\n let u = `https:\/\/api.bilibili.com\/x\/web-interface\/archive\/related?aid=${a}`\n java.open(\"explore\", u, \"推荐视频\");\n }else if(\/article\\\/view\/.test(bu)) {\n java.openUrl(\"bilibili:\/\/article\/cv\" + bu.match(\/id=(\\d+)\/)[1]);\n }else if(chapter && \/data:liveurl\/.test(chapter.url)){\n java.openUrl(\"bilibili:\/\/live\/\" + b64D(chapter.url).split(\"❌\")[1]);\n }else if(\/acc\\\/info\/.test(bu)){\n java.openUrl(\"bilibili:\/\/space\/\" + bu.match(\/mid=(\\d+)\/)[1]);\n }else if(\/opus\\\/de\/.test(bu)){\n \tjava.openUrl(\"bilibili:\/\/opus\/detail\/\" + bu.match(\/id=(\\d+)\/)[1]);\n\t}else if(\/v1\\\/detail\/.test(bu)){\n java.openUrl(\"bilibili:\/\/following\/detail\/\" + (bu.match(\/id=(\\d+)\/)?.[1] ?? book.durChapterTitle.match(\/id(\\d+)$\/)[1]));\n\t}else if(chapter && \/data:liveurl\/.test(chapter.url)){\n java.openUrl(\"bilibili:\/\/live\/\" + b64(chapter.url));\n }else if(\/article\\\/list\/.test(bu)){\n java.openUrl(\"bilibili:\/\/article\/readlist\/\" + bu.match(\/id=(\\d+)\/)[1]);\n }else if(\/reply\\\/reply\/.test(bu)){\n java.toast(\"这里啥也没有\")\n }else if(\/season_id=\/.test(bu)){\n \tjava.openUrl(\"bilibili:\/\/pgc\/season\/\" + (bu.match(\/_id=(\\d+)\/)?.[1]))\n \t}else{\n java.openUrl(\"bilibili:\/\/video\/av\" + (bu.match(\/[a_]id=(\\d+)\/)?.[1] ?? book.durChapterTitle.match(\/id(\\d+)$\/)[1]));\n }\n \n}\n\n\/\/分享\nif (event == \"clickShareBook\") {\n let t = \"\";\n if (\/article\\\/view\/.test(bu)) {\n t = getShareUrl(\"article\",bu.match(\/opus\\\/(\\d+)\/)[1]);\n t = `我正在看 UP主:${book.author}的文章《${book.name}》\\n文章链接:${t}`;\n }else if(\/acc\\\/info\/.test(bu)){\n t = getShareUrl(\"user\",bu.match(\/mid=(\\d+)\/)[1]);\n t = `我正在看 UP主:${book.name}\\n访问主页:${t}`;\n }else if(\/opus\\\/de\/.test(bu)){\n t = getShareUrl(\"article\",bu.match(\/id=(\\d+)\/)[1]);\n t = `我正在看 UP主:${book.author}的动态《${book.name}》\\n动态链接:${t}`;\n\t}else if(\/v1\\\/detail\/.test(bu)){\n t = getShareUrl(\"forward\",(bu.match(\/id=(\\d+)\/)?.[1] ?? book.durChapterTitle.match(\/id(\\d+)$\/)[1]));\n t = `我正在看 UP主:${book.author}的动态《${book.name}》\\n动态链接:${t}`;\n\t}else if(\/article\\\/list\/.test(bu)){\n t = getShareUrl(\"articlelist\",bu.match(\/id=(\\d+)\/)[1]);\n t = `我正在看 UP主:${book.author}的文集《${book.name}》\\n文集链接:${t}`;\n }else if(\/reply\\\/reply\/.test(bu)){\n java.toast(\"这里啥也没有\")\n }else if(\/season_id\/.test(bu)){\n t = getShareUrl(\"media_bangumi\",bu.match(\/id=(\\d+)\/)[1]);\n t = `我正在看剧集《${book.name}》\\n剧集链接:${t}`;\n }else {\n t = getShareUrl(\"video\",(bu.match(\/aid=(\\d+)\/)?.[1] ?? book.durChapterTitle.match(\/id(\\d+)$\/)[1]));\n t = `我正在看 UP主:${book.author}的视频《${book.name}》\\n视频链接:${t}`;\n }\n \n java.copyText(t);\n java.toast(\"\\n已复制,请去粘贴分享\\n\" + t);\n true\n}\n\n\/\/书名\nif (event == \"clickBookName\") {\n if(\/series_id\/.test(bu)) {\n java.open(\"explore\", String(bu).replace(\/pn=\\d+\/, 'pn={{page}\\}'), \"当前合集视频列表\");\n }else if(\/v1\\\/detail\/.test(bu)){\n let u = getReply(bu.match(\/id=(\\d+)\/)[1], 17, 3);\n java.open(\"explore\", u, \"热门评论\");\n }else if(\/article\\\/view\/.test(bu)){\n let u = getReply(bu.match(\/\\?id=(\\d+)\/)[1], 12, 3)\n java.open(\"explore\", u, \"热门评论\");\n }else if(\/opus\\\/detail\/.test(bu)){\n let u = getReply(book.getVariable(\"id\"), 11, 3)\n java.open(\"explore\", u, \"热门评论\");\n }else if(\/article\\\/list\/.test(bu)){\n let queryJson = `{mid:${mid},sort:0,\"web_location\":333.1387}`;\n let u = `https:\/\/api.bilibili.com\/x\/article\/up\/lists?{\\{getWbiEnc(${queryJson})}}`; \n java.open(\"explore\", u, \"专栏文集\");\n }else if(\/reply\\\/reply\/.test(bu)){\n java.toast(\"这里啥也没有\")\n }else if(!\/acc\\\/info\/.test(bu)) {\n let aid = (bu.match(\/aid=(\\d+)\/)?.[1]??String(book.getVariable(\"aid\")))||cache.get(\"aid\");\n let name = \"\";\n if(aid){\n let u = getReply(aid, 1, 3);\n if(\/season_id\/.test(bu)){\n name = book.durChapterTitle;\n java.toast(\"热门评论\")\n }\n java.open(\"explore\", u, name+\"热门评论\");\n }\n }\n \n if(\/🎬\/.test(M(\"点击长按UP主\")) && \/acc\\\/info\/.test(bu)){\n url = getEapi(\"videolist\",mid);\n java.open(\"explore\", url, book.author + \" - 视频 - 最新发布\")\n }else if(\/📖\/.test(M(\"点击长按UP主\")) && \/acc\\\/info\/.test(bu)){\n let queryJson = `{mid:${mid},sort:0,\"web_location\":333.1387}`;\n let u = `https:\/\/api.bilibili.com\/x\/article\/up\/lists?{\\{getWbiEnc(${queryJson})}}`; \n java.open(\"explore\", u, \"专栏文集\");\n } \n true\n}\n\n\/\/长按书名\nif (event == \"longClickBookName\") {\n if (\/series_id\/.test(bu)) {\n let url = \"https:\/\/api.bilibili.com\/x\/web-interface\/view?aid=\" + book.durChapterTitle.match(\/id(\\d+)$\/)[1];\n java.open(\"explore\", url, \"当前视频分P\");\n } else if(\/v1\\\/detail\/.test(bu)){\n let u = getReply(bu.match(\/id=(\\d+)\/)[1], 17, 2);\n java.open(\"explore\", u, \"最新评论\");\n }else if(\/article\\\/view\/.test(bu)){\n let u = getReply(bu.match(\/\\?id=(\\d+)\/)[1], 12, 2)\n java.open(\"explore\", u, \"最新评论\");\n }else if(\/opus\\\/detail\/.test(bu)){\n let u = getReply(book.getVariable(\"id\"), 11, 3)\n java.open(\"explore\", u, \"最新评论\");\n }else if(\/article\\\/list\/.test(bu)){\n let u = getOpus(mid,\"article\");\n java.open(\"explore\", u, \"专栏动态\");\n }else if(\/reply\\\/reply\/.test(bu)){\n java.toast(\"这里啥也没有\")\n } else if (!\/acc\\\/info\/.test(book.tocUrl)) {\n let aid = (bu.match(\/aid=(\\d+)\/)?.[1]??String(book.getVariable(\"aid\")))||cache.get(\"aid\");\n let name = \"\"\n if(aid){\n let u = getReply(aid, 1, 2);\n if(\/season_id\/.test(bu)){\n name = book.durChapterTitle;\n java.toast(\"最新评论\")\n }\n java.open(\"explore\", u, name+\"最新评论\");\n \n }\n }\n \n if(\/🎬\/.test(M(\"点击长按UP主\")) && \/acc\\\/info\/.test(bu)){\n url = getEapi(\"seasons_series_list\",mid);\n java.open(\"explore\", url, book.author + \" - 视频合集列表\")\n }else if(\/📖\/.test(M(\"点击长按UP主\")) && \/acc\\\/info\/.test(bu)){\n let u = getOpus(mid,\"article\");\n java.open(\"explore\", u, \"专栏动态\");\n }\n true\n}\n\n\/\/作者\nif (event == \"clickAuthor\") {\n if(\/🎬\/.test(M(\"点击长按UP主\")) && !\/acc\\\/info|season_id\/.test(bu)){\n url = getEapi(\"videolist\",mid);\n java.open(\"explore\", url, book.author + \" - 视频 - 最新发布\")\n }else if(\/📖\/.test(M(\"点击长按UP主\")) && !\/acc\\\/info|season_id\/.test(bu)){\n let queryJson = `{mid:${mid},sort:0,\"web_location\":333.1387}`;\n let u = `https:\/\/api.bilibili.com\/x\/article\/up\/lists?{\\{getWbiEnc(${queryJson})}}`; \n java.open(\"explore\", u, \"专栏文集\");\n }\n \n if(\/acc\\\/info\/.test(bu)){\n let u = getEapi(\"space\",mid);\n java.open(\"explore\", u, book.name + \"的动态\");\n }else if(\/season_id=\/.test(bu)){\n java.open(\"explore\", book.bookUrl, \"系列视频\");\n }\n true\n}\n\n\/\/长按作者\nif (event == \"longClickAuthor\") {\n if(\/🎬\/.test(M(\"点击长按UP主\")) && !\/acc\\\/info|season_id\/.test(bu)){\n url = getEapi(\"seasons_series_list\",mid);\n java.open(\"explore\", url, book.author + \" - 视频合集列表\")\n }else if(\/📖\/.test(M(\"点击长按UP主\")) && !\/acc\\\/info|season_id\/.test(bu)){\n let u = getOpus(mid,\"article\");\n java.open(\"explore\", u, \"专栏动态\");\n }\n \n if(\/acc\\\/info\/.test(bu)){\n let svg=String(java.base64Encode(`<svg width=\"1190\" height=\"300\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><rect width=\"100%\" height=\"100%\" fill=\"#ffffff\"\/><text x=\"200\" y=\"100\" font-family=\"Arial, sans-serif\" font-size=\"70\" fill=\"#333\" font-weight=\"bold\">输入要搜索的关键词<\/text><\/svg>`));\n \n let key = java.getVerificationCode('data:image\/svg+xml;base64,'+svg);\n let u = getEapi(\"space\",mid,\"\/search❌❌&keyword=\"+key);\n java.open(\"explore\", u, book.name + \"的动态\");\n }\n true\n}\n\n\nif (event == \"clickCopyBookUrl\") {\n let t = \"\";\n if (\/article\\\/view\/.test(bu)) {\n t = getShareUrl(\"article\",bu.match(\/opus\\\/(\\d+)\/)[1]);\n }else if(\/acc\\\/info\/.test(bu)){\n t = getShareUrl(\"user\",bu.match(\/mid=(\\d+)\/)[1]); \n }else if(\/opus\\\/de\/.test(bu)){\n t = getShareUrl(\"article\",bu.match(\/id=(\\d+)\/)[1]); \n\t}else if(\/v1\\\/detail\/.test(bu)){\n t = getShareUrl(\"forward\",(bu.match(\/id=(\\d+)\/)?.[1] ?? book.durChapterTitle.match(\/id(\\d+)$\/)[1]));\n\t}else if(\/article\\\/list\/.test(bu)){\n t = getShareUrl(\"articlelist\",bu.match(\/id=(\\d+)\/)[1]);\n }else if(\/reply\\\/reply\/.test(bu)){\n java.toast(\"这里啥也没有\")\n }else if(\/season_id\/.test(bu)){\n t = getShareUrl(\"media_bangumi\",bu.match(\/id=(\\d+)\/)[1]);\n }else {\n t = getShareUrl(\"video\",(bu.match(\/aid=(\\d+)\/)?.[1] ?? book.durChapterTitle.match(\/id(\\d+)$\/)[1]));\n }\n \n t?java.copyText(t):null\n t?java.toast(t):null\n true\n}\n",
"content": "@js:\nif(\/data:reply\/.test(baseUrl)){\n let j = String(java.hexDecodeToString(result));\n \tresult = parseContent(j);\n\t}else if(\/x\\\/article\/.test(baseUrl)){\n\t\t\n let json = JSON.parse(src);\n book.author = json.data.author.name;\n \n if(S(\"$.data.type\") == \"3\"){\n let data = JSON.parse(S(\"$.data.content\")); \n result = `${processDelta(data.ops)}`\n }else if(S(\"$.data.type\") == \"0\"){\n result = S(\"$.data.content\");\n result = processHtml(result);\n }else if(S(\"$.data.type\") == \"2\"){\n result = S(\"$.data.content\")\n }\n if(JSON.parse(src).data.list){\n let articlelist = JSON.parse(src).data.list;\n let name = articlelist.name;\n if(!\/article\\\/list\/.test(book.bookUrl)){\n result = `${this.getClickImg(\"link\",articlelist.id,null,null,\"articlelist\")}所属文集:${name}\\n`+result;\n }\n }\n if(json.data?.top_video_info?.bvid){\n result = `${this.getClickImg(\"video\",json.data.top_video_info.bvid,json.data.top_video_info.pic,1)}`+result;\n let title = `${this.getClickImg(\"video\",json.data.top_video_info.bvid)}${json.data.top_video_info.title}`;\n result = title+\"\\n\"+result\n }\n}else if(\/opus\\\/detail\/.test(baseUrl)){\n let modules = JSON.parse(result)?.data?.item?.modules;\n let html = \"\";\n modules?modules.forEach(module=>{\n switch(module.module_type){\n case \"MODULE_TYPE_TOP\":\n let pics = module?.module_top?.display?.album?.pics;\n if(pics){\n pics.forEach(pic=>{\n html += `<img src=\"${pic.url}\">\\n`\n });\n }\n break;\n \n case \"MODULE_TYPE_CONTENT\":\n let paragraphs = module?.module_content?.paragraphs;\n paragraphs?paragraphs.forEach(paragraph=>{\n let type = paragraph.para_type;\n switch(type){\n case 1:\n case 4:\n let nodes = paragraph?.text?.nodes;\n html+= getNodes(nodes)\n break;\n \n case 2:\n let pics = paragraph?.pic?.pics;\n pics.forEach(pic=>{\n html += `<img src=\"${pic.url}\">\\n`\n });\n break;\n \n case 3:\n let pic = paragraph?.line?.pic?.url;\n html += `<img src=\"${pic}\">\\n`\n break;\n \n \/\/列表\n case 5:\n let items = paragraph?.list?.items;\n items.forEach(item=>{\n html+= item.order+ getNodes(item.nodes)+\"\\n\"\n });\n break;\n \n \/\/卡片 \n case 6:\n let card = paragraph.link_card.card;\n if(card.type==\"LINK_CARD_TYPE_LIVE\"){\n html += getMajor(card)\n }else{\n html += getLinkCard(card)\n }\n break;\n \n case 7:\n html += JSON.stringify(paragraph)\n break;\n }\n }):null\n break\n }\n \t}):null\n \n result = html;\n \n}else if(\/v1\\\/detail\/.test(baseUrl)){\n \tlet html = \"\";\n\t let item = JSON.parse(src).data.item;\n \n\t let module_dynamic = item.modules.module_dynamic;\n\t let module_author = item.modules.module_author;\n\t \n\t html += \"🕥 \"+module_author.pub_time+\" 发布\\n\";\n\t \n\t rich_text_nodes = module_dynamic?.desc?.rich_text_nodes;\n\t rich_text_nodes?rich_text_nodes.forEach(node=>{\n\t \t let nodes = [{}];\n\t \t nodes[0].type = \"TEXT_NODE_TYPE_RICH\";\n\t \t nodes[0].rich = node; \n \t html += getNodes(nodes); \t \n\t \t}):null;\n\t \n\t \tif(module_dynamic.major){\n\t \t\thtml+=getMajor(module_dynamic.major)\n\t \t\t}\n\t if(module_dynamic.additional){\n html += getLinkCard(module_dynamic.additional)\n }\n \n\t let orig = item?.orig?.modules?.module_dynamic;\n if(orig){\n module_author = item?.orig?.modules?.module_author;\n let mid = module_author?.mid;\n name = module_author.name\n html+=`\\n—转发自:${this.getClickImg(\"user\",mid)}${name}—\\n`\n rich_text_nodes = orig?.desc?.rich_text_nodes;\n rich_text_nodes?rich_text_nodes.forEach(node=>{\n let nodes = [{}];\n nodes[0].type = \"TEXT_NODE_TYPE_RICH\";\n nodes[0].rich = node; \n html += getNodes(nodes); \t \n }):null;\n \n if(orig.major){\n html+=getMajor(orig.major)\n\t \t\t}\n if(orig.additional){\n html += getLinkCard(orig.additional)\n }\n\t }\n\t result = html\n}else if(\/data:live\/.test(baseUrl)){\n\t\tresult = String(java.hexDecodeToString(result));\n let c = result.split(\"❌\");\n if(\/\\d+&\\d+❌\/.test(result)){\n let code = c[0].split(\"&\");\n let data = java.ajax(\"https:\/\/api.live.bilibili.com\/xlive\/web-room\/v2\/index\/getRoomPlayInfo?room_id=\"+c[1]+\"&protocol=0,1&format=0,1,2&codec=0,1&qn=\"+code[1]);\n data = JSON.parse(data).data;\n let stream = data.playurl_info?.playurl?.stream;\n let codec = stream[0].format[0].codec[0];\n let base_url = codec.base_url;\n let host = codec.url_info[code[0]].host;\n let extra = codec.url_info[code[0]].extra;\n result = host+base_url+extra;\n }else{\n result = c[0];\n }\n if(!result){result = 1;java.toast(\"当前直播可能未开播,尝试刷新详情页更新状态\")}\n\t}else{\n \n let aid,cid;\n aid = java.hexDecodeToString(result);\n if(\/series_id\/.test(baseUrl)){\n let data = java.ajax(getApi(\"video\",aid));\n p = JSON.parse(data).data;\n if(p.pages.length > 1){\n \tjava.longToast(\"当前视频分 \"+p.pages.length+\" P\\n可在详情页点击书名或长按书名查看更多分P视频\")\n \t}\n book.author = p.owner.name\n cid = p.cid;\n }else{\n let l = java.hexDecodeToString(result).split(\"&\");\n aid = l[0];\n cid = l[1];\n }\n \n \/\/dash视频\n url = `http:\/\/api.bilibili.com\/x\/player\/playurl?avid=${aid}&cid=${cid}&qn=116&fnver=0&fnval=16&fourk=1`;\n \n if(\/season_id=\/.test(book.bookUrl)){\n url = `https:\/\/api.bilibili.com\/pgc\/player\/web\/playurl?avid=${aid}&cid=${cid}&qn=116&fnver=0&fnval=16&fourk=1`;\n }\n \n let data = java.ajax(url);\n let json = JSON.parse(data);\n book.putVariable(\"aid\",aid);\n cache.put(\"aid\",aid,300)\n \n if(json.data){\n json = json.data\n }else if(json.result){\n json = json.result\n }\n \n \n dm = String(java.ajax('https:\/\/comment.bilibili.com\/' + cid + '.xml')); \n java.put(\"dm\",modifyDanmaku(dm,15));\n if(\/DASH\/i.test(json.type)||!json.type){\n if(json.dash.video[0].id<64){\n \/\/切换mp4线路\n url = `http:\/\/api.bilibili.com\/x\/player\/playurl?avid=${aid}&cid=${cid}&qn=116&fnver=0&fnval=1&fourk=1`;\n data = java.ajax(url);\n result = JSON.parse(data).data.durl[0].url;\n }else{\n if(\/🎧\/.test(M(\"模式\"))){\n java.put(\"dm\",danmakuToLRC(dm));\n \/\/result = JSON.parse(data).data.durl[0].url;\n result = json.dash.audio[1].baseUrl;\n }else{\n result = generateMPD(json.dash);\n \/\/result = JSON.parse(data).data.durl[0].url\n }\n }\n }else if(\/mp4\/i.test(json.type)){\n result = json.durl[0].url\n }\n}\n\nresult",
"imageStyle": "FULL",
"subContent": "@js:\njava.get(\"dm\")",
"title": "@js:\nif(\/data:reply\/.test(baseUrl)){\n\t result = chapter.tag\n\t\t}else{\n\t\t\tresult = title\n\t\t\t}\nresult"
},
"ruleExplore": {
"author": "$.owner.name||$.member.uname||$.upper.name||$.modules.module_author.name||$.uname||$.author_name||$.author.name\n<js>\nif(\/relation\/.test(baseUrl)){\n\tresult = \"查看全部动态\"\n\t}\n\tresult\n<\/js>",
"bookList": "$.data.item[*]||$.data.list[*]||$.data.medias[*]||$.data.lists[*]||$.data.top_replies[*]&&$.data.replies[*]||$.data.media_list[*]||$.data.items[*]||$.data.archives[*]||$.data.items_lists.seasons_list[*]&&$.data.items_lists.series_list[*]||$.data.pages[*]||$.result.seasons[*]||$.data[*]\n<js>\nif(\/aid=(\\d+)\/.test(baseUrl)){\n\tjava.log(baseUrl)\n\tjava.put(\"aid\",baseUrl.match(\/aid=(\\d+)\/)[1])\n\t}\nif(JSON.parse(src)?.data?.aid){\n\tjava.put(\"aid\",JSON.parse(src)?.data?.aid)\n\t}\nif(\/medialist\/.test(baseUrl)){\nlet m =\tJSON.parse(src || \"[]\")?.data?.media_list ?? [];\n\nif(m.length>=1){\n source.put(\"nextoffset\",m[m.length-1].id);\n}else{\n\tresult = \"[]\";\n\t}\n}\n\nif(\/reply\\\/wbi\\\/main\/.test(baseUrl)){\n\tif(JSON.parse(src || \"[]\")?.data?.replies.length<1){\n\t\tresult = \"[]\"\n\t\t}else if(!JSON.parse(src || \"[]\")?.data){\n\t\t\tm = JSON.parse(src || \"[]\")?.message;\n\t\tm?java.toast(m):null\n\t\tresult = \"[]\"\n\t\t\t}else{\n\t\t\ta = JSON.parse(src || \"[]\").data.cursor.pagination_reply.next_offset;\nsource.put(\"nextoffset\",a);\n\t\t\t}\n}\nif(\/feed\\\/all|web-dynamic\/.test(baseUrl)){\na = JSON.parse(src || \"[]\").data.offset;\nsource.put(\"nextoffset\",a);\n}\nif(\/history\/.test(baseUrl)){\na = JSON.parse(src || \"[]\").data.cursor.max;\nbusiness = JSON.parse(src || \"[]\").data.cursor.business;\nview_at = JSON.parse(src || \"[]\").data.cursor.view_at;\na = a+\"&business=\"+business+\"&view_at=\"+view_at\nsource.put(\"nextoffset\",a);\n}\n\nif(\/feed\\\/space\/.test(baseUrl)){\n\t if(!JSON.parse(src||\"[]\")?.data?.items.length)result = \"[]\"\n\t}\n\t\nif(\/fav\/.test(baseUrl)){\n\t if(!JSON.parse(src||\"[]\")?.data?.medias.length)result = \"[]\"\n\t}\nresult\n<\/js>\n$.[*]",
"bookUrl": "https:\/\/api.bilibili.com\/x\/web-interface\/view?aid={{$.id||$.aid||$.archives[0].aid||$.modules..aid||$.mid||$.opus_id||$.history.oid}}&cid={{$.cid}}@put:{\"cid\":\"$.cid\"}\n@js:\nif (S(\"$.rpid\")) {\n result = `https:\/\/api.bilibili.com\/x\/v2\/reply\/reply?oid=${S(\"$.oid\")}&type=${baseUrl.match(\/type=(\\d+)\/)[1]}&root=${S(\"$.rpid\")}&ps=100&pn=1&web_location=333.788`;\n \n} else if (S(\"$.meta.series_id\")) {\n result = `https:\/\/api.bilibili.com\/x\/series\/archives?mid=${baseUrl.match(\/mid=(\\d+)\/)[1]}&series_id=${S(\"$.meta.series_id\")}&only_normal=true&sort=desc&ps=1000&pn=1&web_location=333.1387`;\n} else if (\/feed\\\/all.*?type=article\/.test(baseUrl)) {\n result = getApi(\"article\",S(\"$..rid_str\"),S(\"$..id_str\"))\n}else if(\/opus\\\/feed\/.test(baseUrl)){\n\t\n\tresult = getApi(\"opus\",S(\"$.opus_id\"),S(\"$.opus_id\"))\n\t} else if(\/article\\\/up\\\/lists\/.test(baseUrl)){\n\t\tresult = \"https:\/\/api.bilibili.com\/x\/article\/list\/web\/articles?id=\"+S(\"$.id\")\n\t} else if(\/\\\/pgc\\\/\/.test(baseUrl)){\n\t\t result = getApi(\"media_bangumi\",S(\"$.season_id||$.id\"))\n\t\t}else if(\/x\\\/relation|xlive\/.test(baseUrl)){\n result = getApi(\"user\",S(\"$.mid||$.uid\"))\n\t}else if(\/feed\\\/space\/.test(baseUrl)){\n\t\t result = getDynamicUrl(S(\"$.type\"),src);\n\t\t}else {\n\t\t\tif(\/aid=&\/.test(result)){\n\t\t\t\tresult = result.replace(\/aid=&\/,'aid='+java.get('aid')+'&');\n\t\t\t\t}\n result = result\n}",
"coverUrl": "$.cover.url||$.pic||$.cover||$.member.avatar||$.meta.cover||$.modules..cover||$.covers[0]||$.modules..pics[0].url||$.orig..cover||$.orig..pics[0].url||$.first_frame||$..face||$..module_author.face",
"intro": "{{$.modules..major..desc||$.desc||$.intro||$.sign||$.modules..major..summary.text||$.summary||$.subTitle||$.title}}\n{{let a;if(S(\"$.orig\")){a = `  ${S(\"$.modules..major..title||$.modules..desc.text\")}\\n‎\\n-转发 @${S(\"$.orig..module_author.name\")} 的${getDynamicType(S(\"$.orig.type\"))}-\\n${S(\"$.orig..title||$.orig..summary.text\")}`};a}}\n<br>‎<br>\n{{$.modules.module_dynamic.additional.reserve.title}}\n{{$.modules.module_dynamic.additional.reserve.desc1.text}}\n {{content = \"\\n‎\\n\"+java.getString(\"$.content.message\");pic = String(java.getString(\"$.content.pictures\"));pic?content+\"[图片]\":content}}\n{{if(String(java.getString(\"$.replies\"))){let r = java.getElements(\"$.replies[*]\");let x=\"\";r.forEach(y=>{x+=\"👤【\"+y.member.uname+\"】 \"+y.reply_control.time_desc+\"\\n\"+y.content.message+(y.content.pictures?\"[图片]\":\"\")+\"\\n‎\\n\";});\"\\n‎\\n————回复————\\n\"+x};}}##null",
"kind": "{{$.area_name&&$.area_v2_name&&$.area_v2_parent_name}},{{$.vip.label.text}},{{$.badge}},🕑 {{formatTimeDynamic(java.getString(\"$.duration\"))}}\n👍🏻 {{formatCount(java.getString(\"$.stat.like||$.cnt_info.thumb_up\"))}}\n▶️ {{formatCount(java.getString(\"$.stat.view||$.cnt_info.play\"))}}\n🗯 {{formatCount(java.getString(\"$.stat.danmaku||$.cnt_info.danmaku\"))}}\n##🕑 0:00|(?:👍🏻|▶️)\\s+(?!\\d)|🗯$",
"lastChapter": "分{{$.page}}P {{$.new_ep.index_show||$.index_show}}{{S(\"$.articles_count\")?S(\"$.articles_count\")+\"篇文章\":\"\"}} {{$.modules.module_author.pub_time}} {{$.reply_control.time_desc}} {{S(\"$.publish_time||$.pubtime||$.meta.ptime||$.pubdate\")?java.timeFormat(Number(java.getString(\"$.pubtime||$.meta.ptime||$.pubdate||$.publish_time\")+\"000\")):\"\"}} 💬{{$.rcount}}条回复 👍🏻{{$.like}}##分P|💬条回复|发布|👍🏻$",
"name": "{{getDynamicType(S(\"$.type\"))}}{{$.modules..major..summary.text||$.season_title||$.meta.name||$.title||$.content.message||$.modules..major..title||$.modules..desc.text||$.modules..major..desc||$.uname||$.part||$.content||$.name||$.modules..major.live_rcmd.content}}{{S(\"$.id_str\")?\"【\"+S(\"$.id_str\").replace(\/^\\d{13}\/,'')+\"】\":\"\"}}\n<js>\nif(\/relation\/.test(baseUrl)){\n\tresult = \"👤\"+result\n}else if(\/,\"live_play_info\/.test(result)){\n\tresult = \"📺\"+ result.match(\/\"title\":\"([^\"]+)\"\/)[1]\n\t}\n\tresult\n<\/js>",
"wordCount": "$.words"
},
"ruleSearch": {
"author": "$.author||$.uname##<\/*em.*?>",
"bookList": "$.data.result[*].data[*]&&$.data.result.live_user[*]&&$.data.result.live_room[*]||$.data.result[*]",
"bookUrl": "https:\/\/api.bilibili.com\/x\/web-interface\/view?aid={{$.id}}@put:{\"cid\":\"$.cid\"}\n<js>\nlet type = S(\"$.type\");\nswitch(type){\n\tcase \"live_user\":\n\tcase \"live_room\":\n\tcase \"bili_user\":\n result = getApi(\"user\",S(\"$.uid||$.mid\"));\n\tbreak;\n\t\n\tcase \"article\":\n result = getApi(type,S(\"$.id\"))\n break;\n case \"media_bangumi\":\n case \"media_ft\":\n result = getApi(type,S(\"$.season_id\"))\n\t}\n\nresult\n<\/js>",
"checkKeyWord": "--https:\/\/api.bilibili.com\/x\/article\/view?id=34980384,{\"js\":\"book?result:'https:\/\/www.bilibili.com\/opus\/937892609776418850?spm_id_from=333.1365.0.0'\"}",
"coverUrl": "$.pic||$.cover||$.user_cover||$.cover||$.image_urls[0]||$.uface||$.upic",
"intro": "$.description||$.desc||$.usign##<\/*em.*?>",
"kind": "{{S(\"$.type\")==\"live_room\"?\"📺直播间\":\"\"}}\n,{{S(\"$.type\")==\"article\"?\"📖专栏\":\"\"}},{{S(\"$.type\")==\"live_user\"?\"📺主播\":\"\"}}\n,{{S(\"$.type\")==\"bili_user\"?\"👤用户\":\"\"}}\n{{S(\"$.fans\")?\"粉丝:\"+formatCount(S(\"$.fans\")):\"\"}}\n,{{S(\"$.live_status\")==\"true\"?\"已开播\":(S(\"$.live_status\")==\"false\"?\"未开播\":\"\")}}\n{{$.official_verify.desc},}{{$.category_name}}\n,{{$.cate_name}},{{getSeachType(S(\"$.media_type||$.season_type\"))}},{{$.tag||$.tas}},{{$.category_name}}\n,{{S(\"$.media_score.score\")?S(\"$.media_score.score\")+\"分\":\"\"}},{{$.styles}},{{$.areas}},\n🕑 {{S(\"$.duration\")}},👍🏻 {{formatCount(S(\"$.like\"))}},👁 {{formatCount(S(\"$.play||$.view\"))}},🗯 {{formatCount(S(\"$.danmaku||$.reply\"))}}\n##🕑 ,|👍🏻 ,|👁 ,|🗯$|<\/*em.*?>|,0分",
"lastChapter": "{{$.live_time##0000-00-00.*}}{{S(\"$.pubtime||$.meta.ptime||$.pubdate||$.pub_time\")?java.timeFormat(Number(S(\"$.pubtime||$.meta.ptime||$.pubdate||$.pub_time\")+\"000\")):\"\"}}",
"name": "$.title||$.uname##<\/*em.*?>"
},
"ruleToc": {
"chapterList": "<js>\nlet b = String(book.bookUrl);\nlet bmid = S(\"$.data.mid||$.data.list.mid||$.data.item.basic.uid||$.data.item.modules.module_author.mid||$.data.owner.mid||$.data.root.mid\");\n\nbook.putVariable(\"mid\", bmid);\ncache.put(\"mid\",bmid);\n\ncaid = String(cache.get(\"aid\"));\tcache.put(\"aid\",S(\"$.result.main_section.episodes[0].aid\"));\n\nbook.putVariable(\"id\",S(\"$.data.item.basic.comment_id_str\"));\n\nif (\/web-interface\\\/view|series|season_id=\/.test(b)) {\n if (\/^🎧\/.test(M(\"模式\"))) {\n book.type = 32;\n } else if (\/^🎥\/.test(M(\"模式\"))) {\n book.type = 4;\n }\n} else if (\/reply\\\/reply|article\/.test(b)) {\n book.type = 8;\n}\n\nif(\/acc\\\/info\/.test(b)){\n\tbook.type = 4;\n\t}\n\n\nif (\/web-interface\\\/view\/.test(baseUrl)) {\n var p = JSON.parse(result).data;\n book.putVariable(\"mid\", p.owner.mid);\n var d = [];\n var aid = p.aid;\n if (p.pages.length == 1) {\n cid = p.pages[0].cid;\n d.push({\n title: p.title,\n url: `data:bilibili;base64,${java.base64Encode(aid+\"&\"+p.cid)},{\"type\":\"c\"}`,\n pubdate: p.pubdate,\n desc: formatTimeDynamic(p.duration)\n });\n } else if (p.pages.length > 1) {\n p.pages.forEach(item => {\n cid = item.cid;\n d.push({\n title: item.part,\n desc: formatTimeDynamic(item.duration),\n url: `data:bilibili;base64,${java.base64Encode(aid+\"&\"+item.cid)},{\"type\":\"c\"}`,\n pubdate: item.pubdate,\n\n })\n })\n }\n if (p.ugc_season) {\n d.unshift({\n title: \"当前视频\",\n vol: true\n });\n\n let s = p.ugc_season.sections;\n let singleVideos = [];\n\n s.forEach(el => {\n el.episodes.forEach(x => {\n if (x.pages.length == 1) {\n singleVideos.push({\n title: x.title,\n url: `data:bilibili;base64,${java.base64Encode(x.aid + \"&\" + (x.pages[0] ? x.pages[0].cid : x.cid))},{\"type\":\"\"}`,\n pubdate: x.arc.pubdate,\n desc: formatTimeDynamic(x.arc.duration)\n });\n }\n });\n });\n\n if (singleVideos.length > 0) {\n d.push({\n title: \"单个视频合集\",\n vol: true\n });\n\n singleVideos.forEach(video => {\n d.push(video);\n });\n }\n\n s.forEach(el => {\n el.episodes.forEach(x => {\n if (x.pages.length > 1) {\n d.push({\n title: x.title,\n vol: true\n });\n\n x.pages.forEach(y => {\n d.push({\n title: y.part,\n url: `data:bilibili;base64,${java.base64Encode(x.aid + \"&\" + y.cid)},{\"type\":\"\"}`,\n pubdate: y?.arc?.pubdate ?? \"\",\n desc: formatTimeDynamic(y?.arc.duration ?? y.duration)\n });\n });\n }\n });\n });\n }\n result = JSON.stringify(d)\n} else if (\/reply\\\/reply\/.test(baseUrl)) {\n book.putVariable(\"mid\", JSON.parse(src).data.root.mid);\n} else if (\/x\\\/article\\\/view\/.test(baseUrl)) {\n book.putVariable(\"mid\", S(\"$.data.author.mid\"));\n result = JSON.stringify([{\n \"title\": S(\"$.data.title\"),\n \"url\": getApi(\"article\",S(\"$.data.id\"),S(\"$.data.dyn_id_str\"))\n }])\n} else if (\/acc\\\/info\/.test(baseUrl)) {\n let name = S(\"$.data.name\");\n \n let mid = S(\"$.data.mid\");\n let d = [];\n let roomid = S(\"$.data.live_room.roomid\");\n \n let liveStatus = S(\"$.data.live_room.liveStatus\");\n if (liveStatus == \"1\") {\n liveStatus = \"🔴\";\n java.toast(\"【\" + name + \"】正在直播\");\n java.log(\"【\" + name + \"】正在直播\");\n } else if (liveStatus == \"0\") {\n liveStatus = \"⚪️\"\n }\n if (S(\"$.data.live_room.roundStatus\") == \"1\") {\n liveStatus = \"🟢\"\n }\n let title = S(\"$.data.live_room.title\");\n \n if (\/🔴|🟢\/.test(liveStatus)) {\n result = java.ajax(\"https:\/\/api.live.bilibili.com\/xlive\/web-room\/v2\/index\/getRoomPlayInfo?room_id=\"+roomid+\"&protocol=0,1&format=0,1,2&codec=0,1&qn=30000\");\n let data = JSON.parse(result).data;\n let stream = data.playurl_info?.playurl?.stream;\n \n if(stream){\n let codec = stream[0].format[0].codec[0];\n let base_url = codec.base_url;\n let accept_qn = codec.accept_qn;\n accept_qn.forEach(code=>{\n d.push({\n title:getVideoQuality(code),\n vol:true\n });\n \n codec.url_info.forEach((u,i)=>{\n if(codec.current_qn==code){\n let host = u.host;\n let extra = u.extra;\n d.push({\n title: (liveStatus+getVideoQuality(code)+(i+1) + \"、【\" + title + \"】\" + \" \" + name + \"的直播间\").replace(\/【】\/, \"\"),\n url: `data:liveurl;base64,${java.base64Encode(host+base_url+extra+\"❌\"+roomid)},{type:\"live\"}`\n })\n }else{\n d.push({\n title: (liveStatus+getVideoQuality(code)+(i+1) + \"、【\" + title + \"】\" + \" \" + name + \"的直播间\").replace(\/【】\/, \"\"),\n url: `data:liveurl;base64,${java.base64Encode(i+\"&\"+code+\"❌\"+roomid)},{type:\"live\"}`\n })\n }\n })\n })\n \n }else if(data.playurl_info == null){\n d.push({\n title: (liveStatus+\"直播已结束【\" + title + \"】\" + \" \" + name + \"的直播间\").replace(\/【】\/, \"\"),\n url: `data:liveurl;base64,${java.base64Encode(\"❌\"+roomid)},{type:\"live\"}`\n })\n }\n }else {\n d.push({\n title: (liveStatus+\"【\" + title + \"】\" + \" \" + name + \"的直播间\").replace(\/【】\/, \"\"),\n url: `data:liveurl;base64,${java.base64Encode(\"❌\"+roomid)},{type:\"live\"}`\n })\n }\n \n \n \/*\n \/\/ 直接获取视频流\n if (\/中\/.test(liveStatus)) {\n let liveApi = \"https:\/\/api.live.bilibili.com\/room\/v1\/Room\/playUrl?qn=30000&cid=\" + roomid;\n let data = java.ajax(liveApi);\n let durl = JSON.parse(data).data.durl;\n durl.forEach((x,i) => {\n \tjava.log(durl.length-1-i)\n d.push({\n title: \"线路\" + x.order,\n vol: true\n }, {\n title: (x.order + \"、【\" + title + \"】\" + liveStatus + \" \" + name + \"的直播间\").replace(\/【】\/, \"\"),\n url: `data:liveurl;base64,${java.base64Encode(durl[durl.length-1-i].url)},{type:\"live\"}`\n })\n })\n } else {\n d.push({\n title: (\"【\" + title + \"】\" + liveStatus + \" \" + name + \"的直播间\").replace(\/【】\/, \"\"),\n url: `data:liveurl;base64,${java.base64Encode(roomid+\"&\"+mid)},{type:\"live\"}`\n })\n }\n *\/\n \n result = JSON.stringify(d)\n} else if (\/data:dynamic_type|opus\\\/detail|v1\\\/detail\/.test(baseUrl)) {\n \n result = JSON.stringify([{\n title:String(book.name),\n url:baseUrl\n }])\n}\nresult\n\n<\/js>\n$.[*]&&$.data.root&&$.data.replies[*]&&$.data.archives[*]&&$.data.articles[*]||$.data.items[*]||$.result.main_section.episodes[*]&&$.result.section[*].episodes[*]",
"chapterName": "$.title||$.long_title||$.content.message||$..root.content.message||$.modules.module_dynamic.major.opus.title||$.modules.module_dynamic.desc.text||$.modules..major..title||$.modules..major..title\n@js:\nif(\/series_id=\/.test(baseUrl)){\n\tresult = result?result + \"id{{$.aid}}\":\"\"\n\t}\nif(\/season_id=\/.test(baseUrl)){\n\tresult = S(\"$.title\")+\" \"+S(\"$.long_title\")+\"【\"+S(\"$.badge_info.text\")+\"】\"\n\t}\nresult.replace(\/【】|^ \/g,'')",
"chapterUrl": "$.url||$..root.rpid||$.rpid||$.aid||$.id||$.basic.rid_str||$..major..aid||$..id_str\n@js:\nif (\/reply\\\/reply\/.test(baseUrl)) {\t\n\t content = S(\"$.root.content||$.content\").replace(\/(?:mtime|max_line|jump_url|meta|suggest|jump_title|members|package_id|state|type|attr|id)=.*?,\\s*\/g,'')\n result = `data:reply;base64,${java.base64Encode(content+\"&\"+S(\"$.mid\"))},{\"type\":\"\"}`;\n} else if (\/series_id=\/.test(baseUrl)) {\n result = `data:series_id;base64,${java.base64Encode(result)},{\"type\":\"\"}`;\n} else if (\/article\\\/list\/.test(baseUrl)) {\n result = getApi(\"article\",S(\"$.id\"),S(\"$.dyn_id_str\"))\n}else if(\/feed\\\/space\/.test(baseUrl)){\n\tlet type = S(\"$.type\");\n\tresult = getDynamicUrl(type,src);\n}else if(\/season_id=\/.test(baseUrl)){\n\t\n\tresult = `data:bilibili;base64,${java.base64Encode(S(\"$.aid\")+\"&\"+S(\"$.cid\"))},{\"type\":\"\"}`\n\t}\nresult",
"formatJs": "title.replace(\/【\\d{6}】$\/,'')",
"isVolume": "vol",
"nextTocUrl": "@js:\nlet list = [];\nif(\/series_id=\/.test(baseUrl) && !\/pn=2\/.test(baseUrl)){\n\tlet page = Math.ceil(Number(java.getString(\"$.data.page.total\"))\/1000);\n\tfor(i = 2;i<=page;i++){\n\t\t list.push(baseUrl.replace(\/pn=\\d+\/,'pn='+i))\n\t\t}\n\t}\nlist",
"updateTime": "👤{{$..root.member.uname||$.member.uname}} {{$..root.reply_control.time_desc||$.reply_control.time_desc}} {{S(\"$.pubtime||$.meta.ptime||$.pubdate||$.pub_time\")?java.timeFormat(Number(S(\"$.pubtime||$.meta.ptime||$.pubdate||$.pub_time\")+\"000\")):\"\"}} 时长:{{$.desc}}{{$.modules.module_dynamic.additional..title&&$.modules.module_dynamic.major.opus.summary.text##\\n## | }}##👤\\s+|👤\\s*$|时长:(?!\\d)"
},
"searchUrl": "@js:\nlet start = key.slice(0,1);\nlet type;\nswitch(start){\n\tcase \"@\":\n\t type = \"bili_user\";\n\t break;\n\tcase \"#\":\n\tcase \"#\":\n\t type = \"article\"\n\t break;\n\tcase \"%\":\n\t type = \"video\"\n\t break\n\tcase \"&\":\n\t type = \"live\"\n\t break;\n\tcase \"*\":\n\t type = \"media_bangumi\";\n\t break;\n\t case \"?\":\n\t case \"?\":\n\t type = \"media_ft\"\n\t break\n\t}\nif(type){\nqueryJson = {\n __refresh__: true,\n _extra: '',\n context: '',\n page: page,\n page_size: 30,\n order: '',\n duration: '',\n from_source: '',\n from_spmid: 333.337,\n platform: 'pc',\n highlight: 1,\n single_column: 0,\n keyword: key,\n search_type: type,\n preload: true,\n com2co: true\n }\n parms = getWbiEnc(queryJson);\n result = 'https:\/\/api.bilibili.com\/x\/web-interface\/wbi\/search\/type?' + parms;\n\n}else{\nresult = \"https:\/\/api.bilibili.com\/x\/web-interface\/wbi\/search\/all\/v2?\"+getWbiEnc({keyword:key,page: page,page_size: 30})\n}",
"weight": 0
}