├── .DS_Store ├── HotKids-JS ├── .DS_Store └── scripts.conf ├── Q-Search.list ├── QuanX-RuleSet-Divine-Engine.json ├── QuantumultX_Profiles.conf ├── README.md ├── Scripts ├── .DS_Store ├── Cron-Switch.json ├── IPCheck.js ├── IPConfig.js ├── IPCustom.js ├── IPInfo.js ├── IP_API.js ├── IP_bili.js ├── IP_bili_cn.js ├── TaskGallery.json ├── UI-Action.json ├── disney-ui-check.js ├── emoji.json ├── geo_location.js ├── nf-ui-check.js ├── nf_ytb_ui-check.js ├── nfcheck.js ├── resource-parser.js ├── streaming-ui-check.js ├── switch-check-disneyplus.js ├── switch-check-google.js ├── switch-check-nf.js ├── switch-check-ytb.js ├── traffic-check.js ├── ytb-ui-check.js └── ytbcheck.js ├── TikTok_Rewrite.list ├── img ├── .DS_Store ├── dragonball │ ├── 1.PNG │ ├── 10.PNG │ ├── 11.PNG │ ├── 12.PNG │ ├── 13.PNG │ ├── 14.PNG │ ├── 15.PNG │ ├── 16.PNG │ ├── 17.PNG │ ├── 18.PNG │ ├── 19.PNG │ ├── 2.PNG │ ├── 20.PNG │ ├── 21.PNG │ ├── 22.PNG │ ├── 23.PNG │ ├── 24.PNG │ ├── 25.PNG │ ├── 26.PNG │ ├── 27.PNG │ ├── 28.PNG │ ├── 29.PNG │ ├── 3.PNG │ ├── 30.PNG │ ├── 31.PNG │ ├── 32.PNG │ ├── 33.PNG │ ├── 34.PNG │ ├── 4.PNG │ ├── 7.PNG │ ├── 8.PNG │ └── 9.PNG ├── others │ └── lee.png ├── policy │ ├── apple.png │ ├── as.PNG │ ├── cn.PNG │ ├── cn0.PNG │ ├── downloads.png │ ├── eu.PNG │ ├── final.png │ ├── hk.PNG │ ├── jp.PNG │ ├── mine.PNG │ ├── mo.PNG │ ├── netflix.png │ ├── proxy.png │ ├── telegram.png │ ├── us.png │ ├── youtube.png │ └── ytb.png ├── southpark │ ├── .DS_Store │ ├── 1.png │ ├── 10.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png └── sub │ └── Dler.png └── remote-resource.json /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/.DS_Store -------------------------------------------------------------------------------- /HotKids-JS/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/HotKids-JS/.DS_Store -------------------------------------------------------------------------------- /HotKids-JS/scripts.conf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/HotKids-JS/scripts.conf -------------------------------------------------------------------------------- /Q-Search.list: -------------------------------------------------------------------------------- 1 | #From 🐩️哥 (https://raw.githubusercontent.com/Neurogram-R/Surge/master/module/Q-Search.sgmodule) 2 | #- Safari 内输入 命令 + 空格 + 关键词 快速指定搜索引擎搜索 3 | #注:先进入设置更改 Safari 默认搜索为 DuckDuckGO 4 | 5 | hostname = duckduckgo.com 6 | 7 | 8 | ^https:\/\/duckduckgo.com\/\?q=db\+([^&]+).+ url 302 https://m.douban.com/search/?query=$1 9 | ^https:\/\/duckduckgo.com\/\?q=ddg\+([^&]+).+ url 302 https://duckduckgo.com/?ia=about&q=$1 10 | ^https:\/\/duckduckgo.com\/\?q=bd\+([^&]+).+ url 302 https://www.baidu.com/s?wd=$1 11 | ^https:\/\/duckduckgo.com\/\?q=gh\+([^&]+).+ url 302 https://github.com/search?q=$1 12 | ^https:\/\/duckduckgo.com\/\?q=gm\+([^&]+).+ url 302 https://www.google.com/search?&tbm=isch&q=$1 13 | ^https:\/\/duckduckgo.com\/\?q=yd\+([^&]+).+ url 302 https://dict.youdao.com/search?q=$1 14 | ^https:\/\/duckduckgo.com\/\?q=([^&]+).+ url 302 https://www.google.com/search?q=$1 15 | -------------------------------------------------------------------------------- /QuanX-RuleSet-Divine-Engine.json: -------------------------------------------------------------------------------- 1 | { 2 | "list": [ 3 | { 4 | "enable": true, 5 | "url": "https://gist.githubusercontent.com/Fndroid/58106962a852aa5c45bd1803b34b8651/raw/aa4649d63190a909a22e1c44fc23bfda382809dc/LAN.list", 6 | "note": "LAN", 7 | "policy": "DIRECT" 8 | }, 9 | { 10 | "enable": true, 11 | "url": "https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Apple.list", 12 | "note": "苹果", 13 | "policy": "Apple" 14 | }, 15 | { 16 | "enable": true, 17 | "url": "https://gist.githubusercontent.com/Fndroid/58106962a852aa5c45bd1803b34b8651/raw/97d927bf19d7b61a7da0c8b305728f958f22b0eb/SYSTEM.list", 18 | "note": "SYSTEM", 19 | "policy": "DIRECT" 20 | }, 21 | { 22 | "enable": true, 23 | "url": "https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Advertising.list", 24 | "note": "黑名单", 25 | "policy": "REJECT" 26 | }, 27 | { 28 | "enable": true, 29 | "url": "https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Hijacking.list", 30 | "note": "运营商劫持", 31 | "policy": "REJECT" 32 | }, 33 | { 34 | "enable": true, 35 | "url": "https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Global.list", 36 | "note": "代理", 37 | "policy": "PROXY" 38 | }, 39 | { 40 | "enable": true, 41 | "url": "https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Telegram.list", 42 | "note": "Telegram", 43 | "policy": "PROXY" 44 | }, 45 | { 46 | "enable": true, 47 | "url": "https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/ForeignMedia.list", 48 | "note": "国外媒体", 49 | "policy": "PROXY" 50 | }, 51 | { 52 | "enable": true, 53 | "url": "https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/China.list", 54 | "note": "国内", 55 | "policy": "DIRECT" 56 | }, 57 | { 58 | "enable": true, 59 | "url": "https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/DomesticMedia.list", 60 | "note": "国内媒体", 61 | "policy": "DIRECT" 62 | } 63 | ] 64 | } 65 | -------------------------------------------------------------------------------- /QuantumultX_Profiles.conf: -------------------------------------------------------------------------------- 1 | ;2022-09-26:增加对各个模块的说明(部分内容只适用于 1.1.0 以上版本) 2 | ;⚠️注意⚠️: 以下内容中,带“;” “#”的都是注释符号,去掉前面的符号,该行才有效 3 | 4 | ;general 模块内为一些通用的设置参数项 5 | [general] 6 | 7 | ;Quantumult X 会对 server_check_url 指定的网址进行相应测试,以确认节点的可用性 8 | ;你同样可以在 server_local/remote 中,为节点、订阅单独指定server_check_url参数 9 | ;如您为节点单独指定了 url,则所有相关延迟测试中,均会采用此 url 地址 10 | server_check_url= http://www.qualcomm.cn/generate_204 11 | ;节点延迟测试超时参数,需小于 5000 毫秒才生效 12 | server_check_timeout=2000 13 | 14 | ;👍👍👍资源解析器,可用于自定义各类远程资源的转换,如节点,规则 filter,复写 rewrite 等,url 地址可远程,可 本地/iCloud(Quantumult X/Scripts目录); 15 | ;下面是我写的一个解析器,具体内容直接参照链接里的使用说明 16 | resource_parser_url= https://fastly.jsdelivr.net/gh/KOP-XIAO/QuantumultX@master/Scripts/resource-parser.js 17 | 18 | ;👍👍geo_location_checker用于节点页面的节点信息展示,可完整自定义展示内容与方式 19 | ; extreme-ip-lookup为Quantumult X 作者提供的示范 api 20 | ;geo_location_checker=http://extreme-ip-lookup.com/json/, https://raw.githubusercontent.com/crossutility/Quantumult-X/master/sample-location-with-script.js 21 | ;下面是我所使用的 api 及获取、展示节点信息的 js 22 | geo_location_checker=http://ip-api.com/json/?lang=zh-CN, https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/IP_API.js 23 | 24 | 25 | ;👍👍👍运行模式模块,running_mode_trigger 设置,即根据网络自动切换 分流/直连/全局代理 等模式。 26 | ;running-mode-trigger 模式下,跟手动切换直连/全局代理 等效,rewrite/task 模块始终会生效,比 ssid 策略组设置简单,比 ssid-suspend 更灵活。 27 | 28 | ;running_mode_trigger=filter, filter, asus-5g:all_direct, asus:all_proxy 29 | ; 上述写法,前两个 filter 先后表示 在 [数据蜂窝网络] 跟 [一般 Wi-Fi] 下,走 filter(分流)模式,后面则表示在 asus-5g 下切换为全局直连[all_direct],asus 切换为全局代理[all_proxy] 30 | ; 如需使用,相应 SSID 换成你自己 Wi-Fi 名即可 31 | 32 | ;ssid_suspended_list,让 Quantumult X 在特定 Wi-Fi 网络下暂停工作(仅 task 模块会继续工作),多个Wi-Fi用“,”连接 33 | ;ssid_suspended_list=Asus, Shawn-Wifi 34 | 35 | ;dns exclusion list中的域名将不使用fake-ip方式. 其它域名则全部采用 fake-ip 及远程解析的模式 36 | ;dns_exclusion_list=*.qq.com 37 | 38 | ;UDP 白名单,留空则默认所有为端口。不在udp白名单列表中的端口,将被丢弃处理(返回 ICMP “端口不可达” 信息)。 39 | ;udp_whitelist=53, 80-427, 444-65535 40 | 41 | ; UDP Drop名单,同白名单类似,但不会返回 ICMP “端口不可达” 信息 42 | ; drop 名单仅处理 whitelist名单中的端口 43 | ;udp_drop_list = 1900, 80 44 | 45 | # 参数 fallback_udp_policy 仅支持 v1.0.19 以及之后的版本。 46 | # 参数 fallback_udp_policy 的值仅支持末端策略(末端策略为经由规则模块和策略模块后所命中的策略,例如:direct、reject 以及节点;不支持内置策略 proxy 以及其它自定义策略)。 47 | fallback_udp_policy=direct 48 | 49 | ;下列表中的内容将不经过 QuantumultX的处理,设置后建议重启设备 50 | ;excluded_routes= 192.168.0.0/16, 172.16.0.0/12, 100.64.0.0/10, 10.0.0.0/8 51 | ;icmp_auto_reply=true 52 | 53 | ;指定 DoH 请求所使用的 User-Agent 54 | ;doh_user_agent=Agent/1.0 55 | 56 | ;指定服务器测试时所使用的 User-Agent 57 | ;server_check_user_agent = Agent/1.0 58 | 59 | // 默认当 DNS 层面某domain 被reject时,将返回loopback IP。你可以通过下面的参数 60 | // 修改成为 “no-error-no-answer”,或者 “nxdomain” 61 | ;dns_reject_domain_behavior = loopback 62 | 63 | 64 | 65 | [dns] 66 | ; 禁用系统 DNS(no-system) 以及 ipv6 67 | ;no-system 68 | ;no-ipv6 69 | ;支持参数 excluded_ssids , included_ssids(1.0.29+) 指定在特定 Wi-Fi下失效/生效 70 | 71 | // circumvent-ipv4-answer, circumvent-ipv6-answer 参数 72 | //1、当并发向多个上游 DNS 进行查询时,如响应最快的上游 DNS 抢答的结果命中了该条目,则 Quantumult X Tunnel DNS 模块会等待其他 DNS 服务器的响应结果(如抢答的结果中至少有一个不属于该条目,则不会等待其他 DNS 的响应,此时有效结果采用不属于该条目的所有记录) 73 | //2、如所有上游 DNS 返回的所有结果均命中该条目,则判定为 DNS 查询失败 74 | //3、如配置的上游 DNS 包含有去广告功能的 DNS 服务器,请勿使用该参数 75 | ;circumvent-ipv4-answer = 127.0.0.1, 0.0.0.0 76 | ;circumvent-ipv6-answer = :: 77 | 78 | //如需使用 DoH3,DNS over HTTP/3,请开启下面👇参数 79 | ;prefer-doh3 80 | 81 | ;指定 dns 服务器,并发响应选取最优结果 82 | server=114.114.114.114 83 | server=202.141.176.93 84 | server=202.141.178.13 85 | server=117.50.10.10 86 | server=223.5.5.5 87 | server=119.29.29.29:53 88 | server=119.28.28.28 89 | 90 | ;如指定 doh 服务,则👆️上面的一般 dns 解析均失效 额外参数,在特定网络下禁用该 doh 91 | ;doh-server=xxx.com, excluded_ssids=SSID1, SSID2 92 | ; 1.0.29 版本后支持多个 doh 并发,👇 93 | ;doh-server=xx1.com,xx2.com,excluded_ssids=SSID1, SSID2 94 | ; 1.0.29 版本后支持 alias 映射类型 95 | ;alias=/example.com/another-example.com 96 | 97 | 98 | ;如指定了 DoQ 服务,则 DoH 以及其它 dns解析均失效 99 | ;doq-server = quic://dns.adguard.com 100 | ;doq-server = quic://dns1.example.com, quic://dns2.example.com 101 | ;doq-server = quic://dns.adguard.com, excluded_ssids=SSID1 102 | ;doq-server = quic://dns.adguard.com, included_ssids=SSID2 103 | 104 | 105 | 106 | ;指定域名解析dns, 下面为示范,按需启用, 同样支持 excluded_ssids/included_ssids 参数 107 | ;server=/*.taobao.com/223.5.5.5, excluded_ssids=My-Wifi, Your-Wifi 108 | ;server=/*.tmall.com/223.5.5.5, included_ssids=His-Wifi 109 | ;server=/example1.com/8.8.4.4 110 | ;server=/*.example2.com/223.5.5.5 111 | ;server=/example4.com/[2001:4860:4860::8888]:53 112 | ;address=/example5.com/192.168.16.18 113 | ;address=/example6.com/[2001:8d3:8d3:8d3:8d3:8d3:8d3:8d3] 114 | //映射域名到其它域名的类型 115 | ;alias = /example7.com/another-example.com 116 | 117 | 118 | [task_local] 119 | ;包含3⃣️种类型: cron 定时任务,UI交互脚本,网络切换脚本 120 | 121 | ; 1⃣️ 任务模块,可用于签到,天气话费查询等 122 | ;js文件放于iCloud或者本机的Quantumult X/Scripts 路径下。TF版本可直接使用远程js链接 123 | ;从 “分” 开始的5位cron 写法,具体 cron 表达式可自行 Google 124 | ;比如上述语句 代表每天 12 点 2 分,自动执行一次; 125 | ;tag参数为 task 命名标识; 126 | ;img-url参数用于指定 task 的图标(108*108) 127 | 128 | 2 12 * * * sample.js, tag=本地示范(左滑编辑,右滑执行), enabled=false, img-url=https://raw.githubusercontent.com/crossutility/Quantumult-X/master/quantumult-x.png 129 | 13 12 * * * https://raw.githubusercontent.com/crossutility/Quantumult-X/master/sample-task.js, tag=远程示范(点击缓存/更新脚本), enabled=false, img-url=https://raw.githubusercontent.com/crossutility/Quantumult-X/master/quantumult-x.png 130 | 131 | # 2⃣️ UI交互查询脚本示范,在首页长按 节点/策略组 唤出 132 | event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/streaming-ui-check.js, tag = 流媒体 - 解锁查询,img-url=checkmark.seal.system, enabled=true 133 | 134 | # 3⃣️ 网络切换/变化时 触发的脚本类型 135 | ;event-network sample-taks.js 136 | 137 | 138 | #以下为策略组[policy]部分 139 | # static 策略组中,你需要手动选择想要的节点/策略组。 140 | # available 策略组将按顺序选择你列表中第一个可用的节点。 141 | # round-robin 策略组,将按列表的顺序轮流使用其中的节点。 142 | # url-latency-benchmark 延迟策略组,选取延迟最优节点。 143 | # dest-hash 策略组,随机负载均衡,但相同域名走固定节点。 144 | # ssid 策略组,将根据你所设定的网络来自动切换节点/策略组 145 | ;img-url 参数用于指定策略组图标,可远程,也可本地/iCloud(Quantumult X/Images路径下) (108*108 大小) 146 | ;direct/proxy/reject 则只能用本地图标,名字分别为 direct.png, proxy.png,reject.png 放置于 Images 文件夹下即可生效 (108*108 大小) 147 | 148 | [policy] 149 | static=🍎 苹果服务, direct, proxy, img-url= https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Apple.png 150 | static=💻 国外影视, proxy, direct, img-url= https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/ForeignMedia.png 151 | static=📽 国内视频, direct, proxy, img-url= https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/DomesticMedia.png 152 | static=🎬 YouTube, proxy, direct, img-url= https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/YouTube.png 153 | static=📺 Netflix, proxy, direct, img-url= https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Netflix_Letter.png 154 | static=🌏 国外网站, proxy,direct,🇭🇰️ 香港(正则示范), img-url= https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Global.png 155 | static=🕹 终极清单,direct, proxy, img-url= https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Final.png 156 | static= 🇭🇰️ 香港(正则示范), server-tag-regex= 香港|🇭🇰️|HK|Hong, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/HK.png 157 | 158 | #server-tag-regex 以及 resource-tag-regex 参数用于正则筛选来建立策略组 159 | #具体可参见教程部分: https://shrtm.nu/DAFP 160 | 161 | #以下是quantumultX的3普通种策略组类型写法,也可以用正则参数 server-tag-regex 或者 resource-tag-regex 来筛选 162 | ;static=policy-name-1, Sample-A, Sample-B, Sample-C 163 | ;available=policy-name-2, Sample-A, Sample-B, Sample-C 164 | ;round-robin=policy-name-3, Sample-A, Sample-B, Sample-C 165 | ;url-latency-benchmark=policy-name-4, Sample-A, Sample-B, Sample-C 166 | ;dest-hash=policy-name-5, Sample-A, Sample-B, Sample-C 167 | #下面是ssid策略组示范 168 | ;ssid=policy-name-4, Sample-A, Sample-B, LINK_22E171:Sample-B, LINK_22E172:Sample-C 169 | 170 | 171 | # "tag" 跟 "enabled" 为可选参数,分别表示 “标签”及“开启状态”, true 为开启,false 关闭. 172 | # update-interval 为更新时间参数,单位 秒, 默认更新时间为 24*60*60=86400 秒,也就是24小时. 173 | # opt-parser=true/false 用于控制是否对本订阅 开启资源解析器,不写或者 false 表示不启用解析器; 174 | 175 | #服务器远程订阅 176 | [server_remote] 177 | #远程服务器订阅模块,可直接订阅SSR,SS链接,以及Quantumult X格式的vmess/trojan/https订阅 178 | #其它格式可用 opt-parser 参数开启解析器导入使用 179 | #img-url参数用于指定图标,格式要求同样为 108*108 的 png 图片,可远程,可本地 180 | https://raw.githubusercontent.com/crossutility/Quantumult-X/master/server.snippet#rename=[香港], tag=URI格式示范(请导入自己订阅), update-interval=86400, opt-parser=true, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Quantumult_X.png, enabled=true 181 | https://raw.githubusercontent.com/crossutility/Quantumult-X/master/server-complete.snippet, tag=QuanX格式示范(导入后删除这两个示范), img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Quantumult_X.png, enabled=true 182 | 183 | #支持本地/iCloud的节点文件/片段,位于Quantumult X/Profiles路径下 184 | ;servers.snippet, tag=本地服务器, img-url=https://raw.githubusercontent.com/crossutility/Quantumult-X/master/quantumult-x.png, enabled=false 185 | 186 | #规则分流远程订阅 187 | [filter_remote] 188 | #远程分流模块,可使用force-policy来强制使用策略偏好, 替换远程规则内所指定的策略组 189 | ;同样的 190 | # update-interval 为更新时间参数,单位 秒, 默认更新时间为 24*60*60=86400 秒,也就是24小时. 191 | # opt-parser=true/false 用于控制是否对本订阅 开启资源解析器,不写或者 false 表示不启用解析器; 192 | 193 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/Guard/Advertising.list, tag=🚦去广告, update-interval=86400, opt-parser=true, enabled=true 194 | 195 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/Guard/Hijacking.list, tag=🚫 运营商劫持, enabled=true 196 | 197 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/StreamingMedia/StreamingCN.list, force-policy=📽 国内视频, tag=📽 国内视频, enabled=true 198 | 199 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/StreamingMedia/Video/Netflix.list, tag=📺 Netflix, force-policy=📺 Netflix, enabled=true 200 | 201 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/StreamingMedia/Video/YouTube.list, tag=🎬 YouTube, force-policy=🎬 YouTube, enabled=true 202 | 203 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/StreamingMedia/Streaming.list, tag=💻 国外影视,force-policy= 💻 国外影视, enabled=true 204 | 205 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/Global.list, tag=🌍 国外网站, force-policy= 🌏 国外网站, enabled=true 206 | 207 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/Extra/Apple/Apple.list, tag= Apple服务, force-policy=🍎 苹果服务,enabled=true 208 | 209 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/Extra/Apple/BlockiOSUpdate.list, tag= 屏蔽更新,enabled=true 210 | 211 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/China.list, tag=🐼 国内网站, enabled=true 212 | 213 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/Extra/ChinaIP.list, tag=🇨🇳️ 国内IP池, enabled=true 214 | 215 | #支持本地/iCloud规则文件,位于Quantumult X/Profiles路径下 216 | ;filter.txt, tag=本地分流, enabled=false 217 | 218 | #rewrite 复写远程订阅 219 | [rewrite_remote] 220 | #远程复写模块,内包含主机名hostname以及复写rewrite规则 221 | # update-interval 为更新时间参数,单位 秒, 默认更新时间为 24*60*60=86400 秒,也就是24小时. 222 | # opt-parser=true/false 用于控制是否对本订阅 开启资源解析器,不写或者 false 表示不启用解析器; 223 | 224 | 225 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Rewrite/Block/Advertising.conf, tag=神机复写(⛔️去广告), update-interval=86400, opt-parser=false, enabled=true 226 | 227 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Rewrite/General.conf, tag=神机复写(😄️通用), update-interval=86400, opt-parser=false, enabled=true 228 | 229 | ;Youtube premium 会员请勿开启此条 230 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Rewrite/Block/YouTubeAds.conf, tag=神机复写(🈲YouTube-AD) , update-interval=86400, opt-parser=false, enabled=false 231 | 232 | #支持本地/iCloud的复写规则文件,位于Quantumult X/Profiles路径下 233 | ;rewrite.txt, tag=本地复写, opt-parser=false, enabled=false 234 | 235 | # 本地服务器部分 236 | [server_local] 237 | # 以下示范都是 ip(域名):端口, 238 | # 比如 vmess-a.203.167.55.4:777 ,实际是 203.167.55.4:777 239 | # 前面的 ss-a,ws-tls这些,只是为了让你快速找到自己节点的类型 240 | # 实际使用时,请不要真的 傻乎乎的 写 vmess-a.203.167.55.4:777 这种。 241 | # 目前支持 shadowsocks/shadowsocksR/Vmess/Trojan/http(s)/Socks5 等类型 242 | # 支持 tls-cert-sha256 以及 tls-pubkey-sha256 参数等自定义TLS验证 243 | 244 | #shadowsocks以及shadowsocksR类型, 支持 V2-Plugin 245 | #支持UDP,支持UDP-OVER-TCP(版本1.0.29 665+) 246 | ;shadowsocks=ss-a.example.com:80, method=chacha20, password=pwd, obfs=http, obfs-host=bing.com, obfs-uri=/resource/file, fast-open=false, udp-relay=false, server_check_url=http://www.apple.com/generate_204, tag=Sample-A 247 | ;shadowsocks=ss-b.example.com:80, method=chacha20, password=pwd, obfs=http, obfs-host=bing.com, obfs-uri=/resource/file, fast-open=false, udp-relay=false, tag=Sample-B 248 | ;shadowsocks=ss-c.example.com:443, method=chacha20, password=pwd, obfs=tls, obfs-host=bing.com, fast-open=false, udp-relay=false, tag=Sample-C 249 | ;shadowsocks=ssr-a.example.com:443, method=chacha20, password=pwd, ssr-protocol=auth_chain_b, ssr-protocol-param=def, obfs=tls1.2_ticket_fastauth, obfs-host=bing.com, tag=Sample-D 250 | ;shadowsocks=ws-a.example.com:80, method=aes-128-gcm, password=pwd, obfs=ws, obfs-uri=/ws, fast-open=false, udp-relay=false, tag=Sample-E 251 | ;shadowsocks=ws-b.example.com:80, method=aes-128-gcm, password=pwd, obfs=ws, fast-open=false, udp-relay=false, tag=Sample-F 252 | ;shadowsocks=ws-tls-a.example.com:443, method=aes-128-gcm, password=pwd, obfs=wss, obfs-uri=/ws, fast-open=false, udp-relay=false, tag=Sample-G 253 | ;shadowsocks=ws-tls-a.example.com:443, method=aes-128-gcm, password=pwd, udp-over-tcp=true fast-open=false, udp-relay=false, tag=Sample-H 254 | 255 | # vmess 类型,ws,wss(ws+tls),over-tls,tcp,支持 UDP 256 | # vmess 类型节点默认开启 aead,关闭请用 aead=false 257 | ; ws 类型 258 | ;vmess=ws-c.example.com:80, method=chacha20-ietf-poly1305, password= 23ad6b10-8d1a-40f7-8ad0-e3e35cd32291, obfs-host=ws-c.example.com, obfs=ws, obfs-uri=/ws, fast-open=false, udp-relay=false, aead=false, tag=Sample-H 259 | ; wss(ws+tls) 类型 260 | ;vmess=ws-tls-b.example.com:443, method=chacha20-ietf-poly1305, password= 23ad6b10-8d1a-40f7-8ad0-e3e35cd32291, obfs-host=ws-tls-b.example.com, obfs=wss, obfs-uri=/ws, tls-verification=true,fast-open=false, udp-relay=false, tag=Sample-I 261 | ; http 类型 262 | ;vmess=example.com:80, method=chacha20-poly1305, password=23ad6b10-8d1a-40f7-8ad0-e3e35cd32291, obfs=http, obfs-host=bing.com, obfs-uri=/resource/file, fast-open=false, udp-relay=false, server_check_url=http://www.apple.com/generate_204, tag=vmess-http 263 | ; tcp 类型 264 | ;vmess=vmess-a.example.com:80, method=aes-128-gcm, password=23ad6b10-8d1a-40f7-8ad0-e3e35cd32291, fast-open=false, udp-relay=false, tag=Sample-J 265 | ;vmess=vmess-b.example.com:80, method=none, password=23ad6b10-8d1a-40f7-8ad0-e3e35cd32291, fast-open=false, udp-relay=false, tag=Sample-K 266 | ; over-tls 类型 267 | ;vmess=vmess-over-tls.example.com:443, method=none, password=23ad6b10-8d1a-40f7-8ad0-e3e35cd32291, obfs-host=vmess-over-tls.example.com, obfs=over-tls, tls-verification=true, fast-open=false, udp-relay=false, tag=Sample-L 268 | 269 | ; http(s) 类型 270 | ;http=http.example.com:80, username=name, password=pwd, fast-open=false, udp-relay=false, tag=http 271 | ;http=https.example.com:443, username=name, password=pwd, over-tls=true, tls-verification=true, tls-host=example.com, tls-verification=true, fast-open=false, udp-relay=false, tag=http-tls 272 | 273 | # socks5 类型节点 274 | ;socks5=example.com:80,fast-open=false, udp-relay=false, tag=socks5-01 275 | ;socks5=example.com:80, username=name, password=pwd, fast-open=false, udp-relay=false, tag=socks5-02 276 | ;socks5=example.com:443, username=name, password=pwd, over-tls=true, tls-host=example.com, tls-verification=true, fast-open=false, udp-relay=false, tag=socks5-tls-01 277 | ;socks5=example.com:443, username=name, password=pwd, over-tls=true, tls-host=example.com, tls-verification=true, tls-pubkey-sha256=eb5ec6684564fd0d04975903ed75342d1b9fdc2096ea54b4cf8caf4740f4ae25, fast-open=false, udp-relay=false, tag=socks5-tls-02 278 | 279 | ; trojan 类型, 支持 over-tls 以及 websockets,支持 UDP 280 | ;trojan=example.com:443, password=pwd, over-tls=true, tls-verification=true, fast-open=false, udp-relay=true, tag=trojan-tls-01 281 | ;trojan=example1.com:443, password=pwd, over-tls=true, tls-host=example.com, tls-verification=true, fast-open=false, udp-relay=false, tag=trojan-tls-02 282 | ;trojan=192.168.1.1:443, password=pwd, obfs=wss, obfs-host=example.com, obfs-uri=/path, udp-relay=true, tag=trojan-wss-05 283 | 284 | 285 | #本地分流规则(对于完全相同的某条规则,本地的将优先生效) 286 | [filter_local] 287 | // 如开启其他设置中的 “分流匹配优化” 选项,则匹配优先级为👇 288 | 289 | // host > host-suffix > host-keyword(wildcard) > geoip = ip-cidr > user-agennt 290 | 291 | // 完整域名匹配 292 | ;host, www.google.com, proxy 293 | // 域名关键词匹配 294 | ;host-keyword, adsite, reject 295 | // 域名后缀匹配 296 | ;host-suffix, googleapis.com, proxy 297 | // 域名通配符匹配 298 | ;host-wildcard, *abc.com, proxy 299 | 300 | // User-Agent 匹配 301 | ;user-agent, ?abc*, proxy 302 | 303 | 304 | //强制分流走蜂窝网络 305 | ;host-suffix, googleapis.com, proxy, force-cellular 306 | //让分流走蜂窝网络跟 Wi-Fi 中的优选结果 307 | ;host-suffix, googleapis.com, proxy, multi-interface 308 | //让分流走蜂窝网络跟 Wi-Fi 中的负载均衡,提供更大带宽出入接口 309 | ;host-suffix, googleapis.com, proxy, multi-interface-balance 310 | //指定分流走特定网络接口 311 | ;host-suffix, googleapis.com, proxy, via-interface=pdp_ip0 312 | 313 | // %TUN% 参数,回传给 Quantumult X 接口,可用于曲线实现代理链功能 314 | ;host-suffix, example.com, ServerA, via-interface=%TUN% 315 | ;ip-cidr, ServerA's IP Range, ServerB 316 | 317 | // ip 规则 318 | ip-cidr, 10.0.0.0/8, direct 319 | ip-cidr, 127.0.0.0/8, direct 320 | ip-cidr, 172.16.0.0/12, direct 321 | ip-cidr, 192.168.0.0/16, direct 322 | ip-cidr, 224.0.0.0/24, direct 323 | //ipv6 规则 324 | ;ip6-cidr, 2001:4860:4860::8888/32, direct 325 | # 已采用 ip 池数据,因此注释掉 geoip cn 326 | ;geoip, cn, direct 327 | 328 | # 1.0.28 build628 后支持如下的geoip库写法(需 GEO-IP 库支持) 329 | ;geoip, netflix, proxy 330 | 331 | #不在上述规则中(远程以及本地)的剩余请求,将走final 指定的节点/策略,这里即是 → 🕹 终极清单, 请根据自己的需求来选择直连或节点、策略 332 | final, 🕹 终极清单 333 | 334 | 335 | #本地复写规则 336 | [rewrite_local] 337 | 338 | #以下为证书&主机名部分 339 | [mitm] 340 | ;以下模块去掉;才生效 341 | ;请自行在 APP 的UI中 生成证书 并安装&信任(💡请按确保照文字提示操作💡) 342 | ;skip_validating_cert = false 343 | ;force_sni_domain_name = false 344 | 345 | //当使用 Quantumult X 在 M 芯片的 Mac 设备上作为局域网网关时,使用下面的参数来 跳过某些特定设备的 mitm 需求 346 | ;skip_src_ip = 192.168.4.50, 92.168.4.51 347 | 348 | // 当多个不同的 TCP 连接(非域名类请求)的目标 IP 不同,但这些连接的 TSL 握手 SNI 字段相同时,如需跳过其中某些连接的 MitM hostname 匹配过程,可使用👇参数。 349 | ;skip_dst_ip = 123.44.55.4 350 | 351 | ;hostname 为主机名,用,分隔多个 352 | ;hostname = *.example.com, *.sample.com 353 | 354 | //以下为证书参数,可去UI界面自行生成并安装证书,会在此生成对应信息 355 | ;passphrase = 356 | ;p12 = 357 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # QuantumultX 2 | > 纯自用,无规则,无维护,无更新 3 | 4 | 仅以下项目可能会更新维护: 5 | 6 | 1⃣️ Quantumult X 资源解析器: 7 | 8 | 9 | https://github.com/KOP-XIAO/QuantumultX/blob/master/Scripts/resource-parser.js 10 | 11 | 12 | 13 | 有bug请反馈 [@Shawn_Parser_Bot](https://t.me/Shawn_Parser_Bot) 14 | 15 | 更新请关注 tg 频道 https://t.me/QuanX_API 16 | 17 | 18 | 19 | 觉得有帮助可以请喝咖啡: 20 | 21 | 22 | 23 | IMG_5957 24 | 25 | -------------------------------------------------------------------------------- /Scripts/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/Scripts/.DS_Store -------------------------------------------------------------------------------- /Scripts/Cron-Switch.json: -------------------------------------------------------------------------------- 1 | { 2 | "name":"流媒体定时切换合集 @Shawn", 3 | "description":"Crontab Script Gallery by Shawn", 4 | "task":[ 5 | "0 8 * * * https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/switch-check-ytb.js, tag=YouTube 定时切换, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/YouTube_Letter.png, enabled=true", 6 | "1 8 * * * https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/switch-check-nf.js, tag=Netflix 定时切换, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/Netflix_Letter.png, enabled=true", 7 | "2 8 * * * https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/switch-check-disneyplus.js, tag=Disneyᐩ 定时切换, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/Disney.png, enabled=true", 8 | "3 8 * * * https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/switch-check-google.js, tag=Google 送中定时切换, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/Google.png, enabled=true", 9 | ] 10 | } -------------------------------------------------------------------------------- /Scripts/IPCheck.js: -------------------------------------------------------------------------------- 1 | 2 | // if ($response.statusCode != 200) { 3 | // $done(Null); 4 | // } 5 | const emojis= ['🆘','🈲','⚠️','🔞','📵','🚦','🏖','🖥','📺','🐧','🐬','🦉','🍄','⛳️','🚴','🤑','👽','🤖','🎃', '👺', '👁', '🐶', '🐼','🐌', '👥'] 6 | 7 | function getRandomInt(max) { 8 | return Math.floor(Math.random() * Math.floor(max)); 9 | } 10 | 11 | function ValidCheck(para) { 12 | if(para) { 13 | return para 14 | } else 15 | { 16 | return emojis[getRandomInt(emojis.length)] 17 | } 18 | } 19 | 20 | var flags = new Map([[ "AC" , "🇦🇨" ] ,["AE","🇦🇪"], [ "AF" , "🇦🇫" ] , [ "AI" , "🇦🇮" ] , [ "AL" , "🇦🇱" ] , [ "AM" , "🇦🇲" ] , [ "AQ" , "🇦🇶" ] , [ "AR" , "🇦🇷" ] , [ "AS" , "🇦🇸" ] , [ "AT" , "🇦🇹" ] , [ "AU" , "🇦🇺" ] , [ "AW" , "🇦🇼" ] , [ "AX" , "🇦🇽" ] , [ "AZ" , "🇦🇿" ] , ["BA", "🇧🇦"], [ "BB" , "🇧🇧" ] , [ "BD" , "🇧🇩" ] , [ "BE" , "🇧🇪" ] , [ "BF" , "🇧🇫" ] , [ "BG" , "🇧🇬" ] , [ "BH" , "🇧🇭" ] , [ "BI" , "🇧🇮" ] , [ "BJ" , "🇧🇯" ] , [ "BM" , "🇧🇲" ] , [ "BN" , "🇧🇳" ] , [ "BO" , "🇧🇴" ] , [ "BR" , "🇧🇷" ] , [ "BS" , "🇧🇸" ] , [ "BT" , "🇧🇹" ] , [ "BV" , "🇧🇻" ] , [ "BW" , "🇧🇼" ] , [ "BY" , "🇧🇾" ] , [ "BZ" , "🇧🇿" ] , [ "CA" , "🇨🇦" ] , [ "CF" , "🇨🇫" ] , [ "CH" , "🇨🇭" ] , [ "CK" , "🇨🇰" ] , [ "CL" , "🇨🇱" ] , [ "CM" , "🇨🇲" ] , [ "CN" , "🇨🇳" ] , [ "CO" , "🇨🇴" ] , [ "CP" , "🇨🇵" ] , [ "CR" , "🇨🇷" ] , [ "CU" , "🇨🇺" ] , [ "CV" , "🇨🇻" ] , [ "CW" , "🇨🇼" ] , [ "CX" , "🇨🇽" ] , [ "CY" , "🇨🇾" ] , [ "CZ" , "🇨🇿" ] , [ "DE" , "🇩🇪" ] , [ "DG" , "🇩🇬" ] , [ "DJ" , "🇩🇯" ] , [ "DK" , "🇩🇰" ] , [ "DM" , "🇩🇲" ] , [ "DO" , "🇩🇴" ] , [ "DZ" , "🇩🇿" ] , [ "EA" , "🇪🇦" ] , [ "EC" , "🇪🇨" ] , [ "EE" , "🇪🇪" ] , [ "EG" , "🇪🇬" ] , [ "EH" , "🇪🇭" ] , [ "ER" , "🇪🇷" ] , [ "ES" , "🇪🇸" ] , [ "ET" , "🇪🇹" ] , [ "EU" , "🇪🇺" ] , [ "FI" , "🇫🇮" ] , [ "FJ" , "🇫🇯" ] , [ "FK" , "🇫🇰" ] , [ "FM" , "🇫🇲" ] , [ "FO" , "🇫🇴" ] , [ "FR" , "🇫🇷" ] , [ "GA" , "🇬🇦" ] , [ "GB" , "🇬🇧" ] , [ "HK" , "🇭🇰" ] ,["HU","🇭🇺"], [ "ID" , "🇮🇩" ] , [ "IE" , "🇮🇪" ] , [ "IL" , "🇮🇱" ] , [ "IM" , "🇮🇲" ] , [ "IN" , "🇮🇳" ] , [ "IS" , "🇮🇸" ] , [ "IT" , "🇮🇹" ] , [ "JP" , "🇯🇵" ] , [ "KR" , "🇰🇷" ] , [ "LU" , "🇱🇺" ] , [ "MO" , "🇲🇴" ] , [ "MX" , "🇲🇽" ] , [ "MY" , "🇲🇾" ] , [ "NL" , "🇳🇱" ] , [ "PH" , "🇵🇭" ] , [ "RO" , "🇷🇴" ] , [ "RS" , "🇷🇸" ] , [ "RU" , "🇷🇺" ] , [ "RW" , "🇷🇼" ] , [ "SA" , "🇸🇦" ] , [ "SB" , "🇸🇧" ] , [ "SC" , "🇸🇨" ] , [ "SD" , "🇸🇩" ] , [ "SE" , "🇸🇪" ] , [ "SG" , "🇸🇬" ] , [ "TH" , "🇹🇭" ] , [ "TN" , "🇹🇳" ] , [ "TO" , "🇹🇴" ] , [ "TR" , "🇹🇷" ] , [ "TV" , "🇹🇻" ] , [ "TW" , "🇨🇳" ] , [ "UK" , "🇬🇧" ] , [ "UM" , "🇺🇲" ] , [ "US" , "🇺🇸" ] , [ "UY" , "🇺🇾" ] , [ "UZ" , "🇺🇿" ] , [ "VA" , "🇻🇦" ] , [ "VE" , "🇻🇪" ] , [ "VG" , "🇻🇬" ] , [ "VI" , "🇻🇮" ] , [ "VN" , "🇻🇳" ] , [ "ZA" , "🇿🇦"]]) 21 | var body = $response.body; 22 | var obj = JSON.parse(body); 23 | var title = flags.get(obj['countryCode']) + ' '+ obj['country']; 24 | var subtitle =''+ValidCheck(obj['city'])+'-'+'('+obj['org']+')'+''; 25 | var ip = obj['query']; 26 | var description = obj['country'] + '-' +ValidCheck(obj['city']) + '\n' + obj['org'] + '\n'+obj['ipName']+ '\n' + obj['query']; 27 | 28 | $done({title, subtitle, ip, description}); 29 | -------------------------------------------------------------------------------- /Scripts/IPConfig.js: -------------------------------------------------------------------------------- 1 | // if ($response.statusCode != 200) { 2 | // $done(Null); 3 | // } 4 | 5 | // var body = $response.body; 6 | // var obj = JSON.parse(body); 7 | 8 | if ($response.statusCode != 200) { 9 | $done(Null); 10 | } 11 | 12 | const emojis= ['🆘','🈲','⚠️','🔞','📵','🚦','🏖','🖥','📺','🐧','🐬','🦉','🍄','⛳️','🚴','🤑','👽','🤖','🎃', '👺', '👁', '🐶', '🐼','🐌', '👥'] 13 | 14 | function getRandomInt(max) { 15 | return Math.floor(Math.random() * Math.floor(max)); 16 | } 17 | 18 | function ValidCheck(para) { 19 | if(para) { 20 | return para 21 | } else 22 | { 23 | return emojis[getRandomInt(emojis.length)] 24 | } 25 | } 26 | 27 | var flags = new Map([[ "AC" , "🇦🇨" ] ,["AE","🇦🇪"], [ "AF" , "🇦🇫" ] , [ "AI" , "🇦🇮" ] , [ "AL" , "🇦🇱" ] , [ "AM" , "🇦🇲" ] , [ "AQ" , "🇦🇶" ] , [ "AR" , "🇦🇷" ] , [ "AS" , "🇦🇸" ] , [ "AT" , "🇦🇹" ] , [ "AU" , "🇦🇺" ] , [ "AW" , "🇦🇼" ] , [ "AX" , "🇦🇽" ] , [ "AZ" , "🇦🇿" ] , ["BA", "🇧🇦"], [ "BB" , "🇧🇧" ] , [ "BD" , "🇧🇩" ] , [ "BE" , "🇧🇪" ] , [ "BF" , "🇧🇫" ] , [ "BG" , "🇧🇬" ] , [ "BH" , "🇧🇭" ] , [ "BI" , "🇧🇮" ] , [ "BJ" , "🇧🇯" ] , [ "BM" , "🇧🇲" ] , [ "BN" , "🇧🇳" ] , [ "BO" , "🇧🇴" ] , [ "BR" , "🇧🇷" ] , [ "BS" , "🇧🇸" ] , [ "BT" , "🇧🇹" ] , [ "BV" , "🇧🇻" ] , [ "BW" , "🇧🇼" ] , [ "BY" , "🇧🇾" ] , [ "BZ" , "🇧🇿" ] , [ "CA" , "🇨🇦" ] , [ "CF" , "🇨🇫" ] , [ "CH" , "🇨🇭" ] , [ "CK" , "🇨🇰" ] , [ "CL" , "🇨🇱" ] , [ "CM" , "🇨🇲" ] , [ "CN" , "🇨🇳" ] , [ "CO" , "🇨🇴" ] , [ "CP" , "🇨🇵" ] , [ "CR" , "🇨🇷" ] , [ "CU" , "🇨🇺" ] , [ "CV" , "🇨🇻" ] , [ "CW" , "🇨🇼" ] , [ "CX" , "🇨🇽" ] , [ "CY" , "🇨🇾" ] , [ "CZ" , "🇨🇿" ] , [ "DE" , "🇩🇪" ] , [ "DG" , "🇩🇬" ] , [ "DJ" , "🇩🇯" ] , [ "DK" , "🇩🇰" ] , [ "DM" , "🇩🇲" ] , [ "DO" , "🇩🇴" ] , [ "DZ" , "🇩🇿" ] , [ "EA" , "🇪🇦" ] , [ "EC" , "🇪🇨" ] , [ "EE" , "🇪🇪" ] , [ "EG" , "🇪🇬" ] , [ "EH" , "🇪🇭" ] , [ "ER" , "🇪🇷" ] , [ "ES" , "🇪🇸" ] , [ "ET" , "🇪🇹" ] , [ "EU" , "🇪🇺" ] , [ "FI" , "🇫🇮" ] , [ "FJ" , "🇫🇯" ] , [ "FK" , "🇫🇰" ] , [ "FM" , "🇫🇲" ] , [ "FO" , "🇫🇴" ] , [ "FR" , "🇫🇷" ] , [ "GA" , "🇬🇦" ] , [ "GB" , "🇬🇧" ] , [ "HK" , "🇭🇰" ] ,["HU","🇭🇺"], [ "ID" , "🇮🇩" ] , [ "IE" , "🇮🇪" ] , [ "IL" , "🇮🇱" ] , [ "IM" , "🇮🇲" ] , [ "IN" , "🇮🇳" ] , [ "IS" , "🇮🇸" ] , [ "IT" , "🇮🇹" ] , [ "JP" , "🇯🇵" ] , [ "KR" , "🇰🇷" ] , [ "LU" , "🇱🇺" ] , [ "MO" , "🇲🇴" ] , [ "MX" , "🇲🇽" ] , [ "MY" , "🇲🇾" ] , [ "NL" , "🇳🇱" ] , [ "PH" , "🇵🇭" ] , [ "RO" , "🇷🇴" ] , [ "RS" , "🇷🇸" ] , [ "RU" , "🇷🇺" ] , [ "RW" , "🇷🇼" ] , [ "SA" , "🇸🇦" ] , [ "SB" , "🇸🇧" ] , [ "SC" , "🇸🇨" ] , [ "SD" , "🇸🇩" ] , [ "SE" , "🇸🇪" ] , [ "SG" , "🇸🇬" ] , [ "TH" , "🇹🇭" ] , [ "TN" , "🇹🇳" ] , [ "TO" , "🇹🇴" ] , [ "TR" , "🇹🇷" ] , [ "TV" , "🇹🇻" ] , [ "TW" , "🇨🇳" ] , [ "UK" , "🇬🇧" ] , [ "UM" , "🇺🇲" ] , [ "US" , "🇺🇸" ] , [ "UY" , "🇺🇾" ] , [ "UZ" , "🇺🇿" ] , [ "VA" , "🇻🇦" ] , [ "VE" , "🇻🇪" ] , [ "VG" , "🇻🇬" ] , [ "VI" , "🇻🇮" ] , [ "VN" , "🇻🇳" ] , [ "ZA" , "🇿🇦"]]) 28 | var body = $response.body; 29 | var obj = JSON.parse(body); 30 | var title = flags.get(obj['country_iso']) + ' '+ obj['country']; 31 | var subtitle =''+ValidCheck(obj['city'])+'-'+'('+obj['asn_org']+')'+''; 32 | var ip = obj['ip']; 33 | var description = obj['country'] + '-' +ValidCheck(obj['city']) + '\n' + obj['asn'] + '\n' + obj['asn_org']+ '\n' + obj['ip']; 34 | 35 | $done({title, subtitle, ip, description}); 36 | -------------------------------------------------------------------------------- /Scripts/IPCustom.js: -------------------------------------------------------------------------------- 1 | // if ($response.statusCode != 200) { 2 | // $done(Null); 3 | // } 4 | 5 | // var body = $response.body; 6 | // var obj = JSON.parse(body); 7 | 8 | if ($response.statusCode != 200) { 9 | $done(Null); 10 | } 11 | 12 | function getRandomInt(max) { 13 | return Math.floor(Math.random() * Math.floor(max)); 14 | } 15 | 16 | const foods = ['🍺','🍩','🍭','🦴','🥮','🍎', '🍐', '🍊', '🍋', '🍌', '🍉', '🍇', '🍓', '🍈', '🍒', '🍑', '🥭', '🍅', '🥑'] 17 | const emojis= ['🆘','🈲','⚠️','🔞','📵','🚦','🏖','🖥','📺','🐧','🐬','🦉','🍄','⛳️','🚴','🤑','👽','🤖','🎃', '👺', '👁', '🐶', '🐼','🐌', '👥'] 18 | 19 | var body = $response.body; 20 | var obj = JSON.parse(body); 21 | var title = emojis[getRandomInt(emojis.length)] +obj['country']+ '-' +obj['city']+ foods[getRandomInt(foods.length)]; 22 | var subtitle =''+ obj['isp']+ '('+obj['ipType']+')'; 23 | var ip = obj['query']; 24 | var description = obj['country'] + '-' + obj['city'] + '\n' + obj['isp'] + '\n' + obj['ipType']+ '\n' + ip; 25 | 26 | $done({title, subtitle, ip, description}); 27 | -------------------------------------------------------------------------------- /Scripts/IPInfo.js: -------------------------------------------------------------------------------- 1 | // if ($response.statusCode != 200) { 2 | // $done(Null); 3 | // } 4 | 5 | const emojis= ['🆘','🈲','⚠️','🔞','📵','🚦','🏖','🖥','📺','🐧','🐬','🦉','🍄','⛳️','🚴','🤑','👽','🤖','🎃', '👺', '👁', '🐶', '🐼','🐌', '👥'] 6 | 7 | function getRandomInt(max) { 8 | return Math.floor(Math.random() * Math.floor(max)); 9 | } 10 | 11 | function ValidCheck(para) { 12 | if(para) { 13 | return para 14 | } else 15 | { 16 | return emojis[getRandomInt(emojis.length)] 17 | } 18 | } 19 | 20 | var flags = new Map([[ "AC" , "🇦🇨" ] ,["AE","🇦🇪"], [ "AF" , "🇦🇫" ] , [ "AI" , "🇦🇮" ] , [ "AL" , "🇦🇱" ] , [ "AM" , "🇦🇲" ] , [ "AQ" , "🇦🇶" ] , [ "AR" , "🇦🇷" ] , [ "AS" , "🇦🇸" ] , [ "AT" , "🇦🇹" ] , [ "AU" , "🇦🇺" ] , [ "AW" , "🇦🇼" ] , [ "AX" , "🇦🇽" ] , [ "AZ" , "🇦🇿" ] , ["BA", "🇧🇦"], [ "BB" , "🇧🇧" ] , [ "BD" , "🇧🇩" ] , [ "BE" , "🇧🇪" ] , [ "BF" , "🇧🇫" ] , [ "BG" , "🇧🇬" ] , [ "BH" , "🇧🇭" ] , [ "BI" , "🇧🇮" ] , [ "BJ" , "🇧🇯" ] , [ "BM" , "🇧🇲" ] , [ "BN" , "🇧🇳" ] , [ "BO" , "🇧🇴" ] , [ "BR" , "🇧🇷" ] , [ "BS" , "🇧🇸" ] , [ "BT" , "🇧🇹" ] , [ "BV" , "🇧🇻" ] , [ "BW" , "🇧🇼" ] , [ "BY" , "🇧🇾" ] , [ "BZ" , "🇧🇿" ] , [ "CA" , "🇨🇦" ] , [ "CF" , "🇨🇫" ] , [ "CH" , "🇨🇭" ] , [ "CK" , "🇨🇰" ] , [ "CL" , "🇨🇱" ] , [ "CM" , "🇨🇲" ] , [ "CN" , "🇨🇳" ] , [ "CO" , "🇨🇴" ] , [ "CP" , "🇨🇵" ] , [ "CR" , "🇨🇷" ] , [ "CU" , "🇨🇺" ] , [ "CV" , "🇨🇻" ] , [ "CW" , "🇨🇼" ] , [ "CX" , "🇨🇽" ] , [ "CY" , "🇨🇾" ] , [ "CZ" , "🇨🇿" ] , [ "DE" , "🇩🇪" ] , [ "DG" , "🇩🇬" ] , [ "DJ" , "🇩🇯" ] , [ "DK" , "🇩🇰" ] , [ "DM" , "🇩🇲" ] , [ "DO" , "🇩🇴" ] , [ "DZ" , "🇩🇿" ] , [ "EA" , "🇪🇦" ] , [ "EC" , "🇪🇨" ] , [ "EE" , "🇪🇪" ] , [ "EG" , "🇪🇬" ] , [ "EH" , "🇪🇭" ] , [ "ER" , "🇪🇷" ] , [ "ES" , "🇪🇸" ] , [ "ET" , "🇪🇹" ] , [ "EU" , "🇪🇺" ] , [ "FI" , "🇫🇮" ] , [ "FJ" , "🇫🇯" ] , [ "FK" , "🇫🇰" ] , [ "FM" , "🇫🇲" ] , [ "FO" , "🇫🇴" ] , [ "FR" , "🇫🇷" ] , [ "GA" , "🇬🇦" ] , [ "GB" , "🇬🇧" ] , [ "HK" , "🇭🇰" ] ,["HU","🇭🇺"], [ "ID" , "🇮🇩" ] , [ "IE" , "🇮🇪" ] , [ "IL" , "🇮🇱" ] , [ "IM" , "🇮🇲" ] , [ "IN" , "🇮🇳" ] , [ "IS" , "🇮🇸" ] , [ "IT" , "🇮🇹" ] , [ "JP" , "🇯🇵" ] , [ "KR" , "🇰🇷" ] , [ "LU" , "🇱🇺" ] , [ "MO" , "🇲🇴" ] , [ "MX" , "🇲🇽" ] , [ "MY" , "🇲🇾" ] , [ "NL" , "🇳🇱" ] , [ "PH" , "🇵🇭" ] , [ "RO" , "🇷🇴" ] , [ "RS" , "🇷🇸" ] , [ "RU" , "🇷🇺" ] , [ "RW" , "🇷🇼" ] , [ "SA" , "🇸🇦" ] , [ "SB" , "🇸🇧" ] , [ "SC" , "🇸🇨" ] , [ "SD" , "🇸🇩" ] , [ "SE" , "🇸🇪" ] , [ "SG" , "🇸🇬" ] , [ "TH" , "🇹🇭" ] , [ "TN" , "🇹🇳" ] , [ "TO" , "🇹🇴" ] , [ "TR" , "🇹🇷" ] , [ "TV" , "🇹🇻" ] , [ "TW" , "🇨🇳" ] , [ "UK" , "🇬🇧" ] , [ "UM" , "🇺🇲" ] , [ "US" , "🇺🇸" ] , [ "UY" , "🇺🇾" ] , [ "UZ" , "🇺🇿" ] , [ "VA" , "🇻🇦" ] , [ "VE" , "🇻🇪" ] , [ "VG" , "🇻🇬" ] , [ "VI" , "🇻🇮" ] , [ "VN" , "🇻🇳" ] , [ "ZA" , "🇿🇦"]]) 21 | var body = $response.body; 22 | //$notify("TEST","test",body); 23 | //var bd=body.split('\n')[1]; 24 | var obj = JSON.parse(body); 25 | var title =flags.get(obj['country_code']) + ' '+ obj['country_name']; 26 | var subtitle =''+ValidCheck(obj['city'])+'-'+'('+ValidCheck(obj['continent_name'])+')'+''; 27 | var ip = obj['ip']; 28 | var description = obj['country_name'] + '-' +ValidCheck(obj['city']) + '\n' + obj['type'] + '\n' + obj['ip']; 29 | $done({title, subtitle, ip, description}); 30 | -------------------------------------------------------------------------------- /Scripts/IP_API.js: -------------------------------------------------------------------------------- 1 | if ($response.statusCode != 200) { 2 | $done(null); 3 | } 4 | 5 | const emojis= ['🆘','🈲','⚠️','🔞','📵','🚦','🏖','🖥','📺','🐧','🐬','🦉','🍄','⛳️','🚴','🤑','👽','🤖','🎃', '👺', '👁', '🐶', '🐼','🐌', '👥'] 6 | var city0 = "高谭市"; 7 | var isp0 = "Cross-GFW.org"; 8 | function getRandomInt(max) { 9 | return Math.floor(Math.random() * Math.floor(max)); 10 | } 11 | 12 | function City_ValidCheck(para) { 13 | if(para) { 14 | return para 15 | } else 16 | { 17 | return city0 18 | //emojis[getRandomInt(emojis.length)] 19 | } 20 | } 21 | 22 | function ISP_ValidCheck(para) { 23 | if(para) { 24 | return para 25 | } else 26 | { 27 | return isp0 28 | //emojis[getRandomInt(emojis.length)] 29 | } 30 | } 31 | 32 | function Area_check(para) { 33 | if(para=="中华民国"){ 34 | return "台湾" 35 | } else 36 | { 37 | return para 38 | } 39 | } 40 | 41 | var flags = new Map([["AC","🇦🇨"],["AD","🇦🇩"],["AE","🇦🇪"],["AF","🇦🇫"],["AG","🇦🇬"],["AI","🇦🇮"],["AL","🇦🇱"],["AM","🇦🇲"],["AO","🇦🇴"],["AQ","🇦🇶"],["AR","🇦🇷"],["AS","🇦🇸"],["AT","🇦🇹"],["AU","🇦🇺"],["AW","🇦🇼"],["AX","🇦🇽"],["AZ","🇦🇿"],["BA","🇧🇦"],["BB","🇧🇧"],["BD","🇧🇩"],["BE","🇧🇪"],["BF","🇧🇫"],["BG","🇧🇬"],["BH","🇧🇭"],["BI","🇧🇮"],["BJ","🇧🇯"],["BM","🇧🇲"],["BN","🇧🇳"],["BO","🇧🇴"],["BR","🇧🇷"],["BS","🇧🇸"],["BT","🇧🇹"],["BV","🇧🇻"],["BW","🇧🇼"],["BY","🇧🇾"],["BZ","🇧🇿"],["CA","🇨🇦"],["CD","🇨🇩"],["CF","🇨🇫"],["CG","🇨🇬"],["CH","🇨🇭"],["CI","🇨🇮"],["CK","🇨🇰"],["CL","🇨🇱"],["CM","🇨🇲"],["CN","🇨🇳"],["CO","🇨🇴"],["CP","🇨🇵"],["CR","🇨🇷"],["CU","🇨🇺"],["CV","🇨🇻"],["CW","🇨🇼"],["CX","🇨🇽"],["CY","🇨🇾"],["CZ","🇨🇿"],["DE","🇩🇪"],["DG","🇩🇬"],["DJ","🇩🇯"],["DK","🇩🇰"],["DM","🇩🇲"],["DO","🇩🇴"],["DZ","🇩🇿"],["EA","🇪🇦"],["EC","🇪🇨"],["EE","🇪🇪"],["EG","🇪🇬"],["EH","🇪🇭"],["ER","🇪🇷"],["ES","🇪🇸"],["ET","🇪🇹"],["EU","🇪🇺"],["FI","🇫🇮"],["FJ","🇫🇯"],["FK","🇫🇰"],["FM","🇫🇲"],["FO","🇫🇴"],["FR","🇫🇷"],["GA","🇬🇦"],["GB","🇬🇧"],["GD","🇬🇩"],["GE","🇬🇪"],["GF","🇬🇫"],["GH","🇬🇭"],["GI","🇬🇮"],["GL","🇬🇱"],["GM","🇬🇲"],["GN","🇬🇳"],["GP","🇬🇵"],["GR","🇬🇷"],["GT","🇬🇹"],["GU","🇬🇺"],["GW","🇬🇼"],["GY","🇬🇾"],["HK","🇭🇰"],["HN","🇭🇳"],["HR","🇭🇷"],["HT","🇭🇹"],["HU","🇭🇺"],["ID","🇮🇩"],["IE","🇮🇪"],["IL","🇮🇱"],["IM","🇮🇲"],["IN","🇮🇳"],["IR","🇮🇷"],["IS","🇮🇸"],["IT","🇮🇹"],["JM","🇯🇲"],["JO","🇯🇴"],["JP","🇯🇵"],["KE","🇰🇪"],["KG","🇰🇬"],["KH","🇰🇭"],["KI","🇰🇮"],["KM","🇰🇲"],["KN","🇰🇳"],["KP","🇰🇵"],["KR","🇰🇷"],["KW","🇰🇼"],["KY","🇰🇾"],["KZ","🇰🇿"],["LA","🇱🇦"],["LB","🇱🇧"],["LC","🇱🇨"],["LI","🇱🇮"],["LK","🇱🇰"],["LR","🇱🇷"],["LS","🇱🇸"],["LT","🇱🇹"],["LU","🇱🇺"],["LV","🇱🇻"],["LY","🇱🇾"],["MA","🇲🇦"],["MC","🇲🇨"],["MD","🇲🇩"],["MG","🇲🇬"],["MH","🇲🇭"],["MK","🇲🇰"],["ML","🇲🇱"],["MM","🇲🇲"],["MN","🇲🇳"],["MO","🇲🇴"],["MP","🇲🇵"],["MQ","🇲🇶"],["MR","🇲🇷"],["MS","🇲🇸"],["MT","🇲🇹"],["MU","🇲🇺"],["MV","🇲🇻"],["MW","🇲🇼"],["MX","🇲🇽"],["MY","🇲🇾"],["MZ","🇲🇿"],["NA","🇳🇦"],["NC","🇳🇨"],["NE","🇳🇪"],["NF","🇳🇫"],["NG","🇳🇬"],["NI","🇳🇮"],["NL","🇳🇱"],["NO","🇳🇴"],["NP","🇳🇵"],["NR","🇳🇷"],["NZ","🇳🇿"],["OM","🇴🇲"],["PA","🇵🇦"],["PE","🇵🇪"],["PF","🇵🇫"],["PG","🇵🇬"],["PH","🇵🇭"],["PK","🇵🇰"],["PL","🇵🇱"],["PM","🇵🇲"],["PR","🇵🇷"],["PS","🇵🇸"],["PT","🇵🇹"],["PW","🇵🇼"],["PY","🇵🇾"],["QA","🇶🇦"],["RE","🇷🇪"],["RO","🇷🇴"],["RS","🇷🇸"],["RU","🇷🇺"],["RW","🇷🇼"],["SA","🇸🇦"],["SB","🇸🇧"],["SC","🇸🇨"],["SD","🇸🇩"],["SE","🇸🇪"],["SG","🇸🇬"],["SI","🇸🇮"],["SK","🇸🇰"],["SL","🇸🇱"],["SM","🇸🇲"],["SN","🇸🇳"],["SR","🇸🇷"],["ST","🇸🇹"],["SV","🇸🇻"],["SY","🇸🇾"],["SZ","🇸🇿"],["TC","🇹🇨"],["TD","🇹🇩"],["TG","🇹🇬"],["TH","🇹🇭"],["TJ","🇹🇯"],["TL","🇹🇱"],["TM","🇹🇲"],["TN","🇹🇳"],["TO","🇹🇴"],["TR","🇹🇷"],["TT","🇹🇹"],["TV","🇹🇻"],["TW","🇨🇳"],["TZ","🇹🇿"],["UA","🇺🇦"],["UG","🇺🇬"],["UK","🇬🇧"],["UM","🇺🇲"],["US","🇺🇸"],["UY","🇺🇾"],["UZ","🇺🇿"],["VA","🇻🇦"],["VC","🇻🇨"],["VE","🇻🇪"],["VG","🇻🇬"],["VI","🇻🇮"],["VN","🇻🇳"],["VU","🇻🇺"],["WS","🇼🇸"],["YE","🇾🇪"],["YT","🇾🇹"],["ZA","🇿🇦"],["ZM","🇿🇲"],["ZW","🇿🇼"]]) 42 | 43 | var body = $response.body; 44 | var obj = JSON.parse(body); 45 | var title =flags.get(obj['countryCode']) + ' '+ City_ValidCheck(obj['city']);//+Area_check(obj['country']); 46 | var subtitle = ISP_ValidCheck(obj['org']); 47 | var ip = obj['query']; 48 | var description = '服务商:'+obj['isp'] + '\n'+'地区:' +City_ValidCheck(obj['regionName'])+ '\n' + 'IP:'+ obj['query'] + '\n' +'时区:'+ obj['timezone']; 49 | $done({title, subtitle, ip, description}); 50 | -------------------------------------------------------------------------------- /Scripts/IP_bili.js: -------------------------------------------------------------------------------- 1 | if ($response.statusCode != 200) { 2 | $done(null); 3 | } 4 | 5 | console.log("haha") 6 | const emojis= ['🆘','🈲','⚠️','🔞','📵','🚦','🏖','🖥','📺','🐧','🐬','🦉','🍄','⛳️','🚴','🤑','👽','🤖','🎃', '👺', '👁', '🐶', '🐼','🐌', '👥'] 7 | var city0 = "高谭市"; 8 | var isp0 = "Cross-GFW.org"; 9 | function getRandomInt(max) { 10 | return Math.floor(Math.random() * Math.floor(max)); 11 | } 12 | 13 | function City_ValidCheck(para) { 14 | if(para) { 15 | if (para.length<7) { 16 | return para 17 | } else { 18 | return para.slice(0,6) 19 | } 20 | 21 | } else 22 | { 23 | return city0 24 | //emojis[getRandomInt(emojis.length)] 25 | } 26 | } 27 | 28 | function ISP_ValidCheck(para) { 29 | if(para) { 30 | return para 31 | } else 32 | { 33 | return isp0 34 | //emojis[getRandomInt(emojis.length)] 35 | } 36 | } 37 | 38 | function Area_check(para) { 39 | if(para=="中华民国"){ 40 | return "台湾" 41 | } else 42 | { 43 | return para 44 | } 45 | } 46 | 47 | var flags = new Map([ [ "巴基斯坦" , "🇵🇰" ] ,[ "乌克兰" , "🇺🇦" ] ,[ "新西兰" , "🇳🇿" ] ,[ "南非" , "🇦🇫" ] , [ "安吉拉" , "🇦🇮" ] , [ "阿尔巴尼亚" , "🇦🇱" ] , [ "亚美尼亚" , "🇦🇲" ] , [ "南极洲" , "🇦🇶" ] , [ "阿根廷" , "🇦🇷" ] , [ "美属萨尼亚" , "🇦🇸" ] , [ "奥地利" , "🇦🇹" ] , [ "澳大利亚" , "🇦🇺" ] , [ "阿鲁巴" , "🇦🇼" ] , [ "奥兰" , "🇦🇽" ] , [ "阿塞拜疆" , "🇦🇿" ] , [ "巴巴多斯" , "🇧🇧" ] , [ "孟加拉" , "🇧🇩" ] , [ "比利时" , "🇧🇪" ] , [ "布基纳法索" , "🇧🇫" ] , [ "保加利亚" , "🇧🇬" ] , [ "巴林" , "🇧🇭" ] , [ "布隆迪" , "🇧🇮" ] , [ "贝宁" , "🇧🇯" ] , [ "百慕大" , "🇧🇲" ] , [ "文莱" , "🇧🇳" ] , [ "玻利维亚" , "🇧🇴" ] , [ "巴西" , "🇧🇷" ] , [ "巴哈马" , "🇧🇸" ] , [ "不丹" , "🇧🇹" ] , [ "挪威" , "🇧🇻" ] , [ "博茨瓦纳" , "🇧🇼" ] , [ "白俄罗斯" , "🇧🇾" ] , [ "伯利兹" , "🇧🇿" ] , [ "加拿大" , "🇨🇦" ] , [ "中非共和国" , "🇨🇫" ] , [ "瑞士" , "🇨🇭" ] , [ "库克群岛" , "🇨🇰" ] , [ "智利" , "🇨🇱" ] , [ "喀麦隆" , "🇨🇲" ] , [ "中国" , "🇨🇳" ] , [ "哥伦比亚" , "🇨🇴" ] , [ "CP" , "🇨🇵" ] , [ "哥斯达黎加" , "🇨🇷" ] , [ "古巴" , "🇨🇺" ] , [ "佛得角" , "🇨🇻" ] , [ "库拉索" , "🇨🇼" ] , [ "圣诞岛" , "🇨🇽" ] , [ "塞浦路斯" , "🇨🇾" ] , [ "捷克" , "🇨🇿" ] , [ "德国" , "🇩🇪" ] , [ "DG" , "🇩🇬" ] , [ "吉布提" , "🇩🇯" ] , [ "丹麦" , "🇩🇰" ] , [ "多米尼克" , "🇩🇲" ] , [ "多米尼加" , "🇩🇴" ] , [ "阿尔及利亚" , "🇩🇿" ] , [ "西班牙" , "🇪🇦" ] , [ "厄瓜多尔" , "🇪🇨" ] , [ "爱沙尼亚" , "🇪🇪" ] , [ "埃及" , "🇪🇬" ] , [ "西撒哈拉" , "🇪🇭" ] , [ "厄立特里亚" , "🇪🇷" ] , [ "西班牙" , "🇪🇸" ] , [ "埃塞俄比亚" , "🇪🇹" ] , [ "欧盟" , "🇪🇺" ] , [ "芬兰" , "🇫🇮" ] , [ "斐济" , "🇫🇯" ] , [ "福克兰群岛" , "🇫🇰" ] , [ "密克罗尼西亚联邦" , "🇫🇲" ] , [ "法罗群岛" , "🇫🇴" ] , [ "法国" , "🇫🇷" ] , [ "加蓬" , "🇬🇦" ] , [ "英国" , "🇬🇧" ] , [ "香港" , "🇭🇰" ] ,["匈牙利","🇭🇺"], [ "印度尼西亚" , "🇮🇩" ] , [ "爱尔兰" , "🇮🇪" ] , [ "以色列" , "🇮🇱" ] , [ "曼岛" , "🇮🇲" ] , [ "印度" , "🇮🇳" ] , [ "冰岛" , "🇮🇸" ] , [ "意大利" , "🇮🇹" ] , [ "日本" , "🇯🇵" ] , [ "韩国" , "🇰🇷" ] , [ "卢森堡" , "🇱🇺" ] , [ "澳门" , "🇲🇴" ] , [ "墨西哥" , "🇲🇽" ] , [ "马来西亚" , "🇲🇾" ] , [ "荷兰" , "🇳🇱" ] , [ "菲律宾" , "🇵🇭" ] , [ "罗马尼亚" , "🇷🇴" ] , [ "塞尔维亚" , "🇷🇸" ] , [ "俄罗斯" , "🇷🇺" ] , [ "卢旺达" , "🇷🇼" ] , [ "沙特阿拉伯" , "🇸🇦" ] , [ "所罗门群岛" , "🇸🇧" ] , [ "塞舌尔" , "🇸🇨" ] , [ "苏丹" , "🇸🇩" ] , [ "瑞典" , "🇸🇪" ] , [ "新加坡" , "🇸🇬" ] , [ "泰国" , "🇹🇭" ] , [ "突尼西亚" , "🇹🇳" ] , [ "汤加" , "🇹🇴" ] , [ "土耳其" , "🇹🇷" ] , [ "图瓦卢" , "🇹🇻" ] , [ "台湾" , "🇨🇳" ] , [ "英国" , "🇬🇧" ] , [ "美属离岛" , "🇺🇲" ] , [ "美国" , "🇺🇸" ] , [ "乌拉圭" , "🇺🇾" ] , [ "乌兹别克" , "🇺🇿" ] , [ "梵蒂冈" , "🇻🇦" ] , [ "委内瑞拉" , "🇻🇪" ] , [ "英属维京群岛" , "🇻🇬" ] , [ "美属维京群岛" , "🇻🇮" ] , [ "越南" , "🇻🇳" ] , [ "南非" , "🇿🇦"], ["马恩岛", "🇮🇲"],["波斯尼亚和黑塞哥维那","🇧🇦"],["阿联酋","🇦🇪"]]) 48 | var body = $response.body; 49 | var obj = JSON.parse(body)["data"]; 50 | var emoji = flags.get(obj['country'])? flags.get(obj['country']):"🏴‍☠️" 51 | emoji=City_ValidCheck(obj['province']) == "香港"? "🇭🇰️":emoji 52 | emoji=City_ValidCheck(obj['province']) == "澳门"? "️🇲🇴️":emoji 53 | emoji=City_ValidCheck(obj['province']) == "台湾"? "️️🇹🇼":emoji 54 | var title = emoji + "" + '「'+ City_ValidCheck(obj['province'])+"」";//+Area_check(obj['country']); 55 | var subtitle = ""+ ISP_ValidCheck(obj['isp']).toUpperCase() + " ™"+ " ➠ "+ obj['country']; 56 | var ip = obj['addr']; 57 | var description = '服务商:'+obj['isp'] + '\n'+'定位: [' +obj["latitude"]+","+obj["longitude"]+"]"+ '\n' + 'IP:'+ obj['addr'] + '\n' +'时区:'+ obj['timezone']; 58 | $done({title, subtitle, ip, description}); 59 | -------------------------------------------------------------------------------- /Scripts/IP_bili_cn.js: -------------------------------------------------------------------------------- 1 | if ($response.statusCode != 200) { 2 | $done(null); 3 | } 4 | 5 | const emojis= ['🆘','🈲','⚠️','🔞','📵','🚦','🏖','🖥','📺','🐧','🐬','🦉','🍄','⛳️','🚴','🤑','👽','🤖','🎃', '👺', '👁', '🐶', '🐼','🐌', '👥'] 6 | var city0 = "高谭市"; 7 | var isp0 = "Cross-GFW.org"; 8 | function getRandomInt(max) { 9 | return Math.floor(Math.random() * Math.floor(max)); 10 | } 11 | 12 | function City_ValidCheck(para) { 13 | if(para) { 14 | if (para.length<6) { 15 | return para 16 | } else { 17 | return para.slice(0,5) 18 | } 19 | 20 | } else 21 | { 22 | return city0 23 | //emojis[getRandomInt(emojis.length)] 24 | } 25 | } 26 | 27 | function ISP_ValidCheck(para) { 28 | if(para) { 29 | return para 30 | } else 31 | { 32 | return isp0 33 | //emojis[getRandomInt(emojis.length)] 34 | } 35 | } 36 | 37 | function Area_check(para) { 38 | if(para=="中华民国"){ 39 | return "台湾" 40 | } else 41 | { 42 | return para 43 | } 44 | } 45 | 46 | var flags = new Map([ [ "巴基斯坦" , "🇵🇰" ] ,[ "乌克兰" , "🇺🇦" ] ,[ "新西兰" , "🇳🇿" ] ,[ "南非" , "🇦🇫" ] , [ "安吉拉" , "🇦🇮" ] , [ "阿尔巴尼亚" , "🇦🇱" ] , [ "亚美尼亚" , "🇦🇲" ] , [ "南极洲" , "🇦🇶" ] , [ "阿根廷" , "🇦🇷" ] , [ "美属萨尼亚" , "🇦🇸" ] , [ "奥地利" , "🇦🇹" ] , [ "澳大利亚" , "🇦🇺" ] , [ "阿鲁巴" , "🇦🇼" ] , [ "奥兰" , "🇦🇽" ] , [ "阿塞拜疆" , "🇦🇿" ] , [ "巴巴多斯" , "🇧🇧" ] , [ "孟加拉" , "🇧🇩" ] , [ "比利时" , "🇧🇪" ] , [ "布基纳法索" , "🇧🇫" ] , [ "保加利亚" , "🇧🇬" ] , [ "巴林" , "🇧🇭" ] , [ "布隆迪" , "🇧🇮" ] , [ "贝宁" , "🇧🇯" ] , [ "百慕大" , "🇧🇲" ] , [ "文莱" , "🇧🇳" ] , [ "玻利维亚" , "🇧🇴" ] , [ "巴西" , "🇧🇷" ] , [ "巴哈马" , "🇧🇸" ] , [ "不丹" , "🇧🇹" ] , [ "挪威" , "🇧🇻" ] , [ "博茨瓦纳" , "🇧🇼" ] , [ "白俄罗斯" , "🇧🇾" ] , [ "伯利兹" , "🇧🇿" ] , [ "加拿大" , "🇨🇦" ] , [ "中非共和国" , "🇨🇫" ] , [ "瑞士" , "🇨🇭" ] , [ "库克群岛" , "🇨🇰" ] , [ "智利" , "🇨🇱" ] , [ "喀麦隆" , "🇨🇲" ] , [ "中国" , "🇨🇳" ] , [ "哥伦比亚" , "🇨🇴" ] , [ "CP" , "🇨🇵" ] , [ "哥斯达黎加" , "🇨🇷" ] , [ "古巴" , "🇨🇺" ] , [ "佛得角" , "🇨🇻" ] , [ "库拉索" , "🇨🇼" ] , [ "圣诞岛" , "🇨🇽" ] , [ "塞浦路斯" , "🇨🇾" ] , [ "捷克" , "🇨🇿" ] , [ "德国" , "🇩🇪" ] , [ "DG" , "🇩🇬" ] , [ "吉布提" , "🇩🇯" ] , [ "丹麦" , "🇩🇰" ] , [ "多米尼克" , "🇩🇲" ] , [ "多米尼加" , "🇩🇴" ] , [ "阿尔及利亚" , "🇩🇿" ] , [ "西班牙" , "🇪🇦" ] , [ "厄瓜多尔" , "🇪🇨" ] , [ "爱沙尼亚" , "🇪🇪" ] , [ "埃及" , "🇪🇬" ] , [ "西撒哈拉" , "🇪🇭" ] , [ "厄立特里亚" , "🇪🇷" ] , [ "西班牙" , "🇪🇸" ] , [ "埃塞俄比亚" , "🇪🇹" ] , [ "欧盟" , "🇪🇺" ] , [ "芬兰" , "🇫🇮" ] , [ "斐济" , "🇫🇯" ] , [ "福克兰群岛" , "🇫🇰" ] , [ "密克罗尼西亚联邦" , "🇫🇲" ] , [ "法罗群岛" , "🇫🇴" ] , [ "法国" , "🇫🇷" ] , [ "加蓬" , "🇬🇦" ] , [ "英国" , "🇬🇧" ] , [ "香港" , "🇭🇰" ] ,["匈牙利","🇭🇺"], [ "印度尼西亚" , "🇮🇩" ] , [ "爱尔兰" , "🇮🇪" ] , [ "以色列" , "🇮🇱" ] , [ "曼岛" , "🇮🇲" ] , [ "印度" , "🇮🇳" ] , [ "冰岛" , "🇮🇸" ] , [ "意大利" , "🇮🇹" ] , [ "日本" , "🇯🇵" ] , [ "韩国" , "🇰🇷" ] , [ "卢森堡" , "🇱🇺" ] , [ "澳门" , "🇲🇴" ] , [ "墨西哥" , "🇲🇽" ] , [ "马来西亚" , "🇲🇾" ] , [ "荷兰" , "🇳🇱" ] , [ "菲律宾" , "🇵🇭" ] , [ "罗马尼亚" , "🇷🇴" ] , [ "塞尔维亚" , "🇷🇸" ] , [ "俄罗斯" , "🇷🇺" ] , [ "卢旺达" , "🇷🇼" ] , [ "沙特阿拉伯" , "🇸🇦" ] , [ "所罗门群岛" , "🇸🇧" ] , [ "塞舌尔" , "🇸🇨" ] , [ "苏丹" , "🇸🇩" ] , [ "瑞典" , "🇸🇪" ] , [ "新加坡" , "🇸🇬" ] , [ "泰国" , "🇹🇭" ] , [ "突尼西亚" , "🇹🇳" ] , [ "汤加" , "🇹🇴" ] , [ "土耳其" , "🇹🇷" ] , [ "图瓦卢" , "🇹🇻" ] , [ "台湾" , "🇨🇳" ] , [ "英国" , "🇬🇧" ] , [ "美属离岛" , "🇺🇲" ] , [ "美国" , "🇺🇸" ] , [ "乌拉圭" , "🇺🇾" ] , [ "乌兹别克" , "🇺🇿" ] , [ "梵蒂冈" , "🇻🇦" ] , [ "委内瑞拉" , "🇻🇪" ] , [ "英属维京群岛" , "🇻🇬" ] , [ "美属维京群岛" , "🇻🇮" ] , [ "越南" , "🇻🇳" ] , [ "南非" , "🇿🇦"], ["马恩岛", "🇮🇲"],["波斯尼亚和黑塞哥维那","🇧🇦"],["阿联酋","🇦🇪"]]) 47 | 48 | 49 | var body = $response.body; 50 | var obj = JSON.parse(body)["data"]; 51 | var emoji = flags.get(obj['country'])? flags.get(obj['country']):"🏴‍☠️" 52 | emoji=City_ValidCheck(obj['province']) == "香港"? "🇭🇰️":emoji 53 | emoji=City_ValidCheck(obj['province']) == "澳门"? "️🇲🇴️":emoji 54 | // emoji=City_ValidCheck(obj['province']) == "台湾"? "️️🇹🇼":emoji 55 | var title = emoji +'『'+ City_ValidCheck(obj['province'])+'』';//+Area_check(obj['country']); 56 | var subtitle = "💋 "+ ISP_ValidCheck(obj['isp']) + " ➠ "+ obj['country']; 57 | var ip = obj['addr']; 58 | var description = '服务商:'+obj['isp'] + '\n'+'定位: [' +obj["latitude"]+","+obj["longitude"]+"]"+ '\n' + 'IP:'+ obj['addr'] + '\n' +'时区:'+ obj['timezone']; 59 | $done({title, subtitle, ip, description}); 60 | -------------------------------------------------------------------------------- /Scripts/TaskGallery.json: -------------------------------------------------------------------------------- 1 | { 2 | "name":"HotKids", 3 | "description":"Crontab Task Gallery", 4 | "task":[ 5 | {"config":"0 12 * * 1 https://raw.githubusercontent.com/Peng-YM/QuanX/master/Tasks/epic.js, tag=cookie重写, img-url=https://raw.githubusercontent.com/crossutility/Quantumult-X/master/quantumult-x.png","addons":"https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/GetCookie.conf"}, 6 | "0 12 * * 1 https://raw.githubusercontent.com/Peng-YM/QuanX/master/Tasks/epic.js, tag=每周 Epic 游戏限免, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/epic.png", 7 | "0 9 * * * https://raw.githubusercontent.com/evilbutcher/Quantumult_X/master/check_in/idaily/idaily.js, tag=iDaily·每日环球视野, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/iDaily.png", 8 | "0 9 * * * https://raw.githubusercontent.com/zZPiglet/Task/master/MovieCalendar/MovieCalendar.js, tag=豆瓣·电影日历, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/douban.png", 9 | "0 10 * * * https://raw.githubusercontent.com/Peng-YM/QuanX/master/Tasks/exchange.js, tag=每日汇率, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/exchange.png", 10 | "30 23 * * * https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/script/10010/unicom_checkin.js, tag=中国联通, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/10010.png", 11 | "50 23 * * * https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/script/didichuxing/didi_checkin.js, tag=滴滴出行, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/didi.png", 12 | "0 9 * * * https://raw.githubusercontent.com/HotKids/Rules/master/Script/xiami.js, tag=虾米音乐, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/xiami.png", 13 | "0 6 * * * https://raw.githubusercontent.com/lowking/Scripts/master/sony/sonyClub.js, tag=My SONY Club, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/sony.png", 14 | "0 6 * * * https://raw.githubusercontent.com/chavyleung/scripts/master/wps/wps.js, tag=WPS, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/wps.png", 15 | "0 7 * * * https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/script/famijia/famijia_checkin.js, tag=全家, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/famijia.png", 16 | "0 1,6 * * * https://raw.githubusercontent.com/NobyDa/Script/master/JD-DailyBonus/JD_DailyBonus.js, tag=京东, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/jd.png", 17 | "10 6 * * 1 https://gitee.com/lxk0301/scripts/raw/master/jd_unsubscribe.js, tag=取关京东店铺及商品, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/jd.png", 18 | "30 9 * * * https://raw.githubusercontent.com/toulanboy/scripts/master/jd_price_detect/jd_price_detect.js, tag=京东价格提醒, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/jd.png", 19 | "30 9 * * * https://raw.githubusercontent.com/id77/QuantumultX/master/task/jdWuLiu.js, tag=京东派件提醒, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/jd.png", 20 | "30 9 * * * https://gitee.com/lxk0301/scripts/raw/master/jd_bean_change.js, tag=京豆变动通知, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/jd.png", 21 | "0 5 * * * https://raw.githubusercontent.com/chavyleung/scripts/master/suning/suning.js, tag=苏宁易购, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/suning.png", 22 | "1 5 * * * https://raw.githubusercontent.com/chavyleung/scripts/master/meituan/meituan.js, tag=美团, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/meituan.png", 23 | "2 5 * * * https://raw.githubusercontent.com/zZPiglet/Task/master/elem/elemCheckIn.js, tag=饿了么, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/ele.png", 24 | "3 5 * * * https://raw.githubusercontent.com/chavyleung/scripts/master/jddj/jddj.js, tag=京东到家, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/jddj.png", 25 | "4 5 * * * https://raw.githubusercontent.com/chavyleung/scripts/master/mcdd/mcdd.js, tag=叮咚买菜, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/ddmc.png", 26 | "4 5 * * * https://raw.githubusercontent.com/iepngs/Script/master/dingdong/index.js, tag=叮咚农场, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/ddmc.png", 27 | "5 5 * * * https://raw.githubusercontent.com/NobyDa/Script/master/iQIYI-DailyBonus/iQIYI.js, tag=爱奇艺, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/iqiyi.png", 28 | "6 5 * * * https://raw.githubusercontent.com/chavyleung/scripts/master/videoqq/videoqq.js, tag=腾讯视频, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/tencentvideo.png", 29 | "7 5 * * * https://raw.githubusercontent.com/chavyleung/scripts/master/mgtv/mgtv.js, tag=芒果 TV, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/mgtv.png", 30 | "8 5 * * * https://raw.githubusercontent.com/chavyleung/scripts/master/bilibili/bilibili.js, tag=哔哩哔哩, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/bilibili.png", 31 | "8 5 * * 1 https://raw.githubusercontent.com/chavyleung/scripts/master/bilibili/bilibili.silver2coin.js, tag=B站银瓜子转硬币, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/bilibiliblue.png", 32 | "9 5 * * * https://raw.githubusercontent.com/NobyDa/Script/master/Bilibili-DailyBonus/Manga.js, tag=哔哩哔哩漫画, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/bilibilimanga.png", 33 | "10 5 * * * https://raw.githubusercontent.com/chavyleung/scripts/master/neteasemusic/quanx/neteasemusic.js, tag=网易云音乐, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/neteasemusic.png", 34 | "11 5 * * * https://raw.githubusercontent.com/chavyleung/scripts/master/ximalaya/ximalaya.js, tag=喜马拉雅, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/himalaya.png", 35 | "12 5 * * * https://raw.githubusercontent.com/chavyleung/scripts/master/zimuzu/zimuzu.js, tag=人人字幕组, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/zimuzu.png", 36 | "13 5 * * * https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/script/smzdm/smzdm_checkin.js, tag=什么值得买, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/smzdm.png", 37 | "13 5 * * * https://raw.githubusercontent.com/chavyleung/scripts/master/smzdm/quanx/smzdm.js, tag=什么值得买, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/smzdm.png", 38 | "14 5 * * * https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/script/manmanbuy/manmanbuy_checkin.js, tag=慢慢买, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/manmanbuy.png", 39 | "15 5 * * * https://raw.githubusercontent.com/chavyleung/scripts/master/sfexpress/sfexpress.js, tag=顺丰速运, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/sfexpress.png", 40 | "16 5 * * * https://raw.githubusercontent.com/chavyleung/scripts/master/duokan/duokan.js, tag=多看阅读, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/duokan.png", 41 | "17 5 * * * https://raw.githubusercontent.com/chavyleung/scripts/master/dbsj/dbsj.js, tag=豆瓣时间, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/douban.png", 42 | "18 5 * * * https://raw.githubusercontent.com/zZPiglet/Task/master/Haidilao/Haidilao.js, tag=海底捞, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/hdl.png", 43 | "19 5 * * * https://raw.githubusercontent.com/chavyleung/scripts/master/pagoda/pagoda.js, tag=百果园, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/pagoda.png", 44 | "20 5 * * * https://raw.githubusercontent.com/zZPiglet/Task/master/Blibee/Blibee.js, tag=便利蜂, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/Blibee.png", 45 | "21 5 * * * https://raw.githubusercontent.com/zZPiglet/Task/master/umetrip/umetrip.js,tag=航旅纵横, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/UmeTrip.png", 46 | "22 5 * * * https://raw.githubusercontent.com/barrym-chen/Script/master/ctrip/ctrip.js, tag=携程 App, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/ctrip.png", 47 | "22 5 * * * https://raw.githubusercontent.com/barrym-chen/Script/master/ctrip_wx/ct_sign.js, tag=携程 小程序, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/ctrip.png", 48 | "23 5 * * * https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/script/hellobike/hellobike.js, tag=哈啰出行, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/hellobike.png", 49 | "24 5 * * * https://ooxx.be/js/jegotrip.js, tag=无忧行, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/JegoTrip.png", 50 | "25 5 * * * https://raw.githubusercontent.com/chavyleung/scripts/master/flyertea/flyertea.js, tag=飞客茶馆, img-url=https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/Images/Task/flyertea.png" 51 | ] 52 | } 53 | -------------------------------------------------------------------------------- /Scripts/UI-Action.json: -------------------------------------------------------------------------------- 1 | { 2 | "name":"UI 脚本合集", 3 | "description":"UI-Interaction Script Gallery by Shawn", 4 | "task":[ 5 | "event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/streaming-ui-check.js, tag=流媒体-解锁查询, img-url=checkmark.seal.system, enabled=true", 6 | "event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/geo_location.js, tag=GeoIP 查询, img-url=location.fill.viewfinder.system", 7 | "event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/ytb-ui-check.js, tag=YouTube 查询, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/YouTube_Letter.png, enabled=true", 8 | "event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/nf-ui-check.js, tag=Netflix 查询, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/Netflix_Letter.png, enabled=true", 9 | "event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/disney-ui-check.js, tag=Disneyᐩ 查询, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/Disney.png, enabled=true", 10 | "event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/switch-check-ytb.js, tag=YouTube 切换, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/YouTube_Letter.png, enabled=true", 11 | "event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/switch-check-nf.js, tag=Netflix 切换, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/Netflix_Letter.png, enabled=true", 12 | "event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/switch-check-disneyplus.js, tag=Disneyᐩ 切换, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/Disney.png, enabled=true", 13 | "event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/switch-check-google.js, tag=Google 切换, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/Google.png, enabled=true", 14 | "event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/traffic-check.js, tag=策略流量查询, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/Download.png, enabled=true" 15 | ] 16 | } -------------------------------------------------------------------------------- /Scripts/disney-ui-check.js: -------------------------------------------------------------------------------- 1 | /*** 2 | 3 | Thanks to & modified from 4 | 1. https://gist.githubusercontent.com/Hyseen/b06e911a41036ebc36acf04ddebe7b9a/raw/nf_check.js 5 | 2. https://github.com/AtlantisGawrGura/Quantumult-X-Scripts/blob/main/media.js 6 | 3. https://github.com/CoiaPrant/MediaUnlock_Test/blob/main/check.sh 7 | 8 | 9 | For Quantumult-X 598+ ONLY!! 10 | 11 | 2022-07-23 12 | 13 | [task_local] 14 | 15 | event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/disney-ui-check.js, tag=Disney⁺ 查询, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/Disney.png, enabled=true" 16 | 17 | @XIAO_KOP 18 | 19 | **/ 20 | 21 | const UA = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36' 22 | 23 | // 即将登陆 24 | const STATUS_COMING = 2 25 | // 支持解锁 26 | const STATUS_AVAILABLE = 1 27 | // 不支持解锁 28 | const STATUS_NOT_AVAILABLE = 0 29 | // 检测超时 30 | const STATUS_TIMEOUT = -1 31 | // 检测异常 32 | const STATUS_ERROR = -2 33 | 34 | var opts = { 35 | policy: $environment.params 36 | }; 37 | 38 | 39 | let result = { 40 | "title": ' 🎬 Disney⁺ 解锁查询', 41 | "status": '⚠️ 检测失败,请重试', 42 | //"Google": "Google 定位: 检测失败,请重试" 43 | 44 | } 45 | 46 | ;(async () => { 47 | let { region, status } = await testDisneyPlus() 48 | console.log(`testDisneyPlus: region=${region}, status=${status}`) 49 | if (status==STATUS_COMING) { 50 | //console.log(1) 51 | result["status"] = "🚦 即将登陆 ➟ "+'⟦'+flags.get(region.toUpperCase())+"⟧" 52 | } else if (status==STATUS_AVAILABLE){ 53 | //console.log(2) 54 | result["status"] = "✅ 已支持 ➟ "+'⟦'+flags.get(region.toUpperCase())+"⟧" 55 | console.log(result["status"]) 56 | } else if (status==STATUS_NOT_AVAILABLE) { 57 | //console.log(3) 58 | result["status"] = "🛑 不支持 " 59 | } 60 | cnt = `

` +'----------------------

'+result["status"]+'

----------------------
'+$environment.params + `

` 61 | $done({"title":result["title"],"htmlMessage":cnt}) 62 | })() 63 | .finally(() => $done({"title":result["title"],"htmlMessage":`

`+'----------------------

'+result["status"]+'

----------------------
'+$environment.params + `

`})); 64 | 65 | 66 | async function testDisneyPlus() { 67 | try { 68 | let { region, cnbl } = await Promise.race([testHomePage(), timeout(7000)]) 69 | console.log(`homepage: region=${region}, cnbl=${cnbl}`) 70 | // 即将登陆 71 | // if (cnbl == 2) { 72 | // return { region, status: STATUS_COMING } 73 | // } 74 | let { countryCode, inSupportedLocation, accessToken } = await Promise.race([getLocationInfo(), timeout(7000)]) 75 | console.log(`getLocationInfo: countryCode=${countryCode}, inSupportedLocation=${inSupportedLocation}`) 76 | 77 | region = countryCode ?? region 78 | console.log( "region:"+region) 79 | // 即将登陆 80 | if (inSupportedLocation === false || inSupportedLocation === 'false') { 81 | return { region, status: STATUS_COMING } 82 | } else { 83 | // 支持解锁 84 | return { region, status: STATUS_AVAILABLE } 85 | } 86 | 87 | let support = await Promise.race([testPublicGraphqlAPI(accessToken), timeout(7000)]) 88 | if (!support) { 89 | return { status: STATUS_NOT_AVAILABLE } 90 | } 91 | // 支持解锁 92 | return { region, status: STATUS_AVAILABLE } 93 | 94 | } catch (error) { 95 | console.log("error:"+error) 96 | 97 | // 不支持解锁 98 | if (error === 'Not Available') { 99 | console.log("不支持") 100 | return { status: STATUS_NOT_AVAILABLE } 101 | } 102 | 103 | // 检测超时 104 | if (error === 'Timeout') { 105 | return { status: STATUS_TIMEOUT } 106 | } 107 | 108 | return { status: STATUS_ERROR } 109 | } 110 | 111 | } 112 | 113 | function getLocationInfo() { 114 | return new Promise((resolve, reject) => { 115 | let opts0 = { 116 | url: 'https://disney.api.edge.bamgrid.com/graph/v1/device/graphql', 117 | method: "POST", 118 | opts: opts, 119 | headers: { 120 | 'Accept-Language': 'en', 121 | "Authorization": 'ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84', 122 | 'Content-Type': 'application/json', 123 | 'User-Agent': UA, 124 | }, 125 | body: JSON.stringify({ 126 | query: 'mutation registerDevice($input: RegisterDeviceInput!) { registerDevice(registerDevice: $input) { grant { grantType assertion } } }', 127 | variables: { 128 | input: { 129 | applicationRuntime: 'chrome', 130 | attributes: { 131 | browserName: 'chrome', 132 | browserVersion: '94.0.4606', 133 | manufacturer: 'apple', 134 | model: null, 135 | operatingSystem: 'macintosh', 136 | operatingSystemVersion: '10.15.7', 137 | osDeviceIds: [], 138 | }, 139 | deviceFamily: 'browser', 140 | deviceLanguage: 'en', 141 | deviceProfile: 'macosx', 142 | }, 143 | }, 144 | }), 145 | } 146 | 147 | $task.fetch(opts0).then(response => { 148 | let data = response.body 149 | console.log("locationinfo:"+response.statusCode) 150 | if (response.statusCode !== 200) { 151 | console.log('getLocationInfo: ' + data) 152 | reject('Not Available') 153 | return 154 | } else { 155 | let { 156 | token: { accessToken }, 157 | session: { 158 | inSupportedLocation, 159 | location: { countryCode }, 160 | }, 161 | } = JSON.parse(data)?.extensions?.sdk 162 | resolve({ inSupportedLocation, countryCode, accessToken }) 163 | } 164 | }, reason => { 165 | reject('Error') 166 | return 167 | }) 168 | }) 169 | } 170 | 171 | function testPublicGraphqlAPI(accessToken) { 172 | return new Promise((resolve, reject) => { 173 | let opts = { 174 | url: 'https://disney.api.edge.bamgrid.com/v1/public/graphql', 175 | headers: { 176 | 'Accept-Language': 'en', 177 | Authorization: accessToken, 178 | 'Content-Type': 'application/json', 179 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36', 180 | }, 181 | body: JSON.stringify({ 182 | query: 183 | 'query($preferredLanguages: [String!]!, $version: String) {globalization(version: $version) { uiLanguage(preferredLanguages: $preferredLanguages) }}', 184 | variables: { version: '1.5.0', preferredLanguages: ['en'] }, 185 | }), 186 | } 187 | 188 | $task.fetch(opts).then( response => { 189 | 190 | resolve(response.status === 200) 191 | }, reason => { 192 | reject('Error') 193 | return 194 | }) 195 | }) 196 | } 197 | 198 | function testHomePage() { 199 | return new Promise((resolve, reject) => { 200 | let opts0 = { 201 | url: 'https://www.disneyplus.com/', 202 | opts: opts, 203 | headers: { 204 | 'Accept-Language': 'en', 205 | 'User-Agent': UA, 206 | }, 207 | } 208 | $task.fetch(opts0).then(response => { 209 | let data = response.body 210 | //console.log("homepage"+response.statusCode) 211 | if (response.statusCode !== 200 || data.indexOf('not available in your') !== -1) { 212 | reject('Not Available') 213 | return 214 | } else { 215 | let match = data.match(/Region: ([A-Za-z]{2})[\s\S]*?CNBL: ([12])/) 216 | if (!match) { 217 | resolve({ region: '', cnbl: '' }) 218 | return 219 | } else { 220 | let region = match[1] 221 | let cnbl = match[2] 222 | //console.log("homepage"+region+cnbl) 223 | resolve({ region, cnbl }) 224 | } 225 | } 226 | }, reason => { 227 | reject('Error') 228 | return 229 | }) 230 | }) 231 | } 232 | 233 | function timeout(delay = 5000) { 234 | return new Promise((resolve, reject) => { 235 | setTimeout(() => { 236 | reject('Timeout') 237 | }, delay) 238 | }) 239 | } 240 | 241 | var flags = new Map([[ "AC" , "🇦🇨" ] ,["AE","🇦🇪"], [ "AF" , "🇦🇫" ] , [ "AI" , "🇦🇮" ] , [ "AL" , "🇦🇱" ] , [ "AM" , "🇦🇲" ] , [ "AQ" , "🇦🇶" ] , [ "AR" , "🇦🇷" ] , [ "AS" , "🇦🇸" ] , [ "AT" , "🇦🇹" ] , [ "AU" , "🇦🇺" ] , [ "AW" , "🇦🇼" ] , [ "AX" , "🇦🇽" ] , [ "AZ" , "🇦🇿" ] , ["BA", "🇧🇦"], [ "BB" , "🇧🇧" ] , [ "BD" , "🇧🇩" ] , [ "BE" , "🇧🇪" ] , [ "BF" , "🇧🇫" ] , [ "BG" , "🇧🇬" ] , [ "BH" , "🇧🇭" ] , [ "BI" , "🇧🇮" ] , [ "BJ" , "🇧🇯" ] , [ "BM" , "🇧🇲" ] , [ "BN" , "🇧🇳" ] , [ "BO" , "🇧🇴" ] , [ "BR" , "🇧🇷" ] , [ "BS" , "🇧🇸" ] , [ "BT" , "🇧🇹" ] , [ "BV" , "🇧🇻" ] , [ "BW" , "🇧🇼" ] , [ "BY" , "🇧🇾" ] , [ "BZ" , "🇧🇿" ] , [ "CA" , "🇨🇦" ] , [ "CF" , "🇨🇫" ] , [ "CH" , "🇨🇭" ] , [ "CK" , "🇨🇰" ] , [ "CL" , "🇨🇱" ] , [ "CM" , "🇨🇲" ] , [ "CN" , "🇨🇳" ] , [ "CO" , "🇨🇴" ] , [ "CP" , "🇨🇵" ] , [ "CR" , "🇨🇷" ] , [ "CU" , "🇨🇺" ] , [ "CV" , "🇨🇻" ] , [ "CW" , "🇨🇼" ] , [ "CX" , "🇨🇽" ] , [ "CY" , "🇨🇾" ] , [ "CZ" , "🇨🇿" ] , [ "DE" , "🇩🇪" ] , [ "DG" , "🇩🇬" ] , [ "DJ" , "🇩🇯" ] , [ "DK" , "🇩🇰" ] , [ "DM" , "🇩🇲" ] , [ "DO" , "🇩🇴" ] , [ "DZ" , "🇩🇿" ] , [ "EA" , "🇪🇦" ] , [ "EC" , "🇪🇨" ] , [ "EE" , "🇪🇪" ] , [ "EG" , "🇪🇬" ] , [ "EH" , "🇪🇭" ] , [ "ER" , "🇪🇷" ] , [ "ES" , "🇪🇸" ] , [ "ET" , "🇪🇹" ] , [ "EU" , "🇪🇺" ] , [ "FI" , "🇫🇮" ] , [ "FJ" , "🇫🇯" ] , [ "FK" , "🇫🇰" ] , [ "FM" , "🇫🇲" ] , [ "FO" , "🇫🇴" ] , [ "FR" , "🇫🇷" ] , [ "GA" , "🇬🇦" ] , [ "GB" , "🇬🇧" ] , [ "HK" , "🇭🇰" ] ,["HU","🇭🇺"], [ "ID" , "🇮🇩" ] , [ "IE" , "🇮🇪" ] , [ "IL" , "🇮🇱" ] , [ "IM" , "🇮🇲" ] , [ "IN" , "🇮🇳" ] , [ "IS" , "🇮🇸" ] , [ "IT" , "🇮🇹" ] , [ "JP" , "🇯🇵" ] , [ "KR" , "🇰🇷" ] , [ "LU" , "🇱🇺" ] , [ "MO" , "🇲🇴" ] , [ "MX" , "🇲🇽" ] , [ "MY" , "🇲🇾" ] , [ "NL" , "🇳🇱" ] , [ "PH" , "🇵🇭" ] , [ "RO" , "🇷🇴" ] , [ "RS" , "🇷🇸" ] , [ "RU" , "🇷🇺" ] , [ "RW" , "🇷🇼" ] , [ "SA" , "🇸🇦" ] , [ "SB" , "🇸🇧" ] , [ "SC" , "🇸🇨" ] , [ "SD" , "🇸🇩" ] , [ "SE" , "🇸🇪" ] , [ "SG" , "🇸🇬" ] , [ "TH" , "🇹🇭" ] , [ "TN" , "🇹🇳" ] , [ "TO" , "🇹🇴" ] , [ "TR" , "🇹🇷" ] , [ "TV" , "🇹🇻" ] , [ "TW" , "🇨🇳" ] , [ "UK" , "🇬🇧" ] , [ "UM" , "🇺🇲" ] , [ "US" , "🇺🇸" ] , [ "UY" , "🇺🇾" ] , [ "UZ" , "🇺🇿" ] , [ "VA" , "🇻🇦" ] , [ "VE" , "🇻🇪" ] , [ "VG" , "🇻🇬" ] , [ "VI" , "🇻🇮" ] , [ "VN" , "🇻🇳" ] , [ "ZA" , "🇿🇦"]]) 242 | -------------------------------------------------------------------------------- /Scripts/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "🏳️‍🌈": ["流量", "套餐", "剩余", "重置", "到期" , "时间", "应急", "过期", "Bandwidth", "expire", "Traffic", "traffic"], 3 | "🇦🇩": ["安道尔", "Andorra"], 4 | "🇦🇿": ["阿塞拜疆","Azerbaijan"], 5 | "🇦🇹": ["奥地利", "奧地利", "Austria", "维也纳"], 6 | "🇦🇺": ["AU", "Australia", "Sydney", "澳大利亚", "澳洲", "墨尔本", "悉尼" ,"土澳", "京澳","廣澳","滬澳","沪澳","广澳"], 7 | "🇧🇪": ["BE", "比利時","比利时","Belgium"], 8 | "🇧🇬": ["保加利亚", "保加利亞","Bulgaria"], 9 | "🇵🇰": ["巴基斯坦","Pakistan", "PAKISTAN"], 10 | "🇧🇭": ["巴林","Bahrain"], 11 | "🇵🇾": ["巴拉圭","Paraguay"], 12 | "🇰🇭": ["柬埔寨","Cambodia"], 13 | "🇺🇦": ["烏克蘭","乌克兰","Ukraine"], 14 | "🇺🇿": ["乌兹别克斯坦", "烏茲別克斯坦","Uzbekistan"], 15 | "🇭🇷": ["克罗地亚","HR","克羅地亞", "Croatia"], 16 | "🇨🇦": ["CA", "Canada","CANADA", "CAN", "Waterloo", "加拿大", "蒙特利尔", "温哥华", "楓葉", "枫叶", "滑铁卢", "多伦多"], 17 | "🇨🇭": ["瑞士", "苏黎世", "Switzerland"], 18 | "🇳🇬": ["尼日利亚", "NG", "尼日利亞","拉各斯", "Nigeria"], 19 | "🇨🇿": ["Czechia", "捷克"], 20 | "🇸🇰": ["斯洛伐克", "SK" , "Slovakia"], 21 | "🇸🇮": ["斯洛文尼亚", "斯洛文尼亞", "Slovenia"], 22 | "🇦🇲": ["亚美尼亚", "亞美尼亞", "Armenia"], 23 | "🇷🇸": ["RS ","RS_", "塞尔维亚", "塞爾維亞", "Seville", "Sevilla"], 24 | "🇲🇩": ["摩爾多瓦","MD","摩尔多瓦", "Moldova"], 25 | "🇩🇪": [" DE ", "DE-", "DE_", "German", "GERMAN", "德国", "德國", "法兰克福","京德","滬德","廣德","沪德","广德"], 26 | "🇩🇰": ["DK","DNK","丹麦","丹麥", "Denmark"], 27 | "🇪🇸": ["ES", "西班牙", "Spain"], 28 | "🇪🇺": ["EU", "欧盟", "欧罗巴","欧洲", "European"], 29 | "🇫🇮": ["Finland", "芬兰","芬蘭","赫尔辛基"], 30 | "🇫🇷": ["FR", "France", "法国", "法國", "巴黎"], 31 | "🇷🇪": ["留尼汪", "留尼旺", "Réunion", "Reunion"], 32 | "🇨🇼": ["库拉索", "庫拉索", "Curaçao"], 33 | "🇬🇧": ["UK", "GB ", "England", "United Kingdom", "英国", "伦敦", "英"], 34 | "🇲🇴": ["MO", "Macao","Macau", "MAC", "澳门", "澳門", "CTM"], 35 | "🇰🇿": ["哈萨克斯坦", "哈薩克斯坦", "Kazakhstan"], 36 | "🇱🇦": ["老挝","老挝", "Laos"], 37 | "🇭🇺": ["匈牙利", "Hungary"], 38 | "🇱🇹": ["立陶宛", "Lithuania"], 39 | "🇱🇰": ["斯里兰卡", "斯里蘭卡", "Sri Lanka"], 40 | "🇧🇾": ["BY","白俄罗斯","白俄羅斯", "White Russia", "Republic of Belarus", "Belarus"], 41 | "🇷🇺": ["RU ","RU-", "RU_", "RUS", "Russia", "俄罗斯", "毛子", "俄国", "俄羅斯", "伯力", "莫斯科", "圣彼得堡", "西伯利亚", "新西伯利亚", "京俄", "杭俄","廣俄","滬俄","广俄","沪俄"], 42 | "🇸🇬": ["SG", "Singapore","SINGAPORE", "新加坡", "狮城", "沪新", "京新", "泉新", "穗新", "深新", "杭新", "广新","廣新","滬新"], 43 | "🇺🇸": ["US", "USA", "America", "United States", "美国", "美", "京美", "波特兰", "达拉斯", "俄勒冈", "凤凰城", "费利蒙", "硅谷", "矽谷", "拉斯维加斯", "洛杉矶", "圣何塞", "圣荷西", "圣克拉拉", "西雅图", "芝加哥", "沪美", "哥伦布", "纽约"], 44 | "🇹🇼": ["TW", "Taiwan","TAIWAN", "台湾", "台北", "台中", "新北", "彰化", "CHT", "台", "HINET"], 45 | "🇮🇩": ["ID ", "IDN ", "Indonesia", "印尼", "印度尼西亚", "雅加达"], 46 | "🇮🇪": ["Ireland", "IRELAND", "爱尔兰", "愛爾蘭", "都柏林"], 47 | "🇮🇱": ["Israel", "以色列"], 48 | "🇮🇳": ["India", "IND", "INDIA","印度", "孟买", "Mumbai","IN "], 49 | "🇮🇸": ["IS","ISL", "冰岛","冰島", "Iceland"], 50 | "🇰🇵": ["KP", "朝鲜", "North Korea"], 51 | "🇰🇷": ["KR", "Korea", "KOR", "韩国", "首尔", "韩", "韓","春川"], 52 | "🇬🇭": ["加纳", "Ghana"], 53 | "🇱🇺": ["卢森堡", "Luxembourg"], 54 | "🇱🇻": ["Latvia", "Latvija", "拉脱维亚"], 55 | "🇧🇩": ["孟加拉", "Bengal"], 56 | "🇲🇽️": ["MEX", "MX", "墨西哥", "Mexico", "MEXICO"], 57 | "🇲🇾": ["MY", "Malaysia","MALAYSIA", "马来西亚", "马来", "馬來", "大马", "大馬", "馬來西亞", "吉隆坡"], 58 | "🇳🇱": ["NL", "Netherlands", "荷兰", "荷蘭", "尼德蘭", "阿姆斯特丹"], 59 | "🇵🇭": ["PH", "Philippines", "菲律宾", "菲律賓"], 60 | "🇷🇴": [" RO ", "罗马尼亚", "Rumania"], 61 | "🇸🇦": ["沙特", "利雅得", "Saudi Arabia", "Saudi"], 62 | "🇸🇪": ["SE", "Sweden","瑞典"], 63 | "🇹🇭": ["TH", "Thailand", "泰国", "泰國", "曼谷"], 64 | "🇹🇷": ["TR ","TR-", "TR_", "TUR", "Turkey", "土耳其", "伊斯坦布尔"], 65 | "🇻🇳": ["VN", "越南", "胡志明市", "Vietnam"], 66 | "🇮🇹": ["Italy", " IT ", "Nachash", "意大利", "米兰", "義大利"], 67 | "🇿🇦": ["South Africa", "南非", "Johannesburg"], 68 | "🇦🇪": ["United Arab Emirates", "阿联酋","AE ", "迪拜", "Dubai"], 69 | "🇧🇷": ["BR", "Brazil", "巴西", "圣保罗"], 70 | "🇯🇵": ["JP", "Japan","JAPAN", "日本", "东京", "大阪", "埼玉", "京日", "苏日", "沪日", "穗日", "川日", "中日", "泉日", "杭日", "深日", "辽日", "广日", "Tokyo"], 71 | "🇦🇷": ["AR", "Argentina", "阿根廷"], 72 | "🇳🇴": ["Norway", "挪威", "NO"], 73 | "🇵🇱": [" PL", "POL", "波兰","波蘭", "Poland"], 74 | "🇨🇱": ["智利","Chile","CHILE"], 75 | "🇳🇿": ["新西蘭","新西兰", "New Zealand"], 76 | "🇬🇷": ["希腊","希臘", "Greece"], 77 | "🇪🇬": ["埃及", "Egypt"], 78 | "🇮🇲": ["马恩岛","馬恩島", "Isle of Man", "Mannin"], 79 | "🇵🇹": ["葡萄牙", "Portugal"], 80 | "🇲🇳": ["蒙古", "Mongolia"], 81 | "🇵🇪": ["秘鲁","祕魯", "Peru"], 82 | "🇨🇴": ["哥伦比亚", "Colombia"], 83 | "🇪🇪": ["爱沙尼亚", "Estonia"], 84 | "🇱🇾": ["利比亚","Libya"], 85 | "🇲🇰": ["马其顿","馬其頓", "Macedonia"], 86 | "🇲🇹": ["马耳他", "Malta"], 87 | "🇻🇪": ["委内瑞拉", "Venezuela"], 88 | "🇧🇦": ["波黑共和国","波黑", "Bosnia and Herzegovina"], 89 | "🇬🇪": ["格魯吉亞","格鲁吉亚", "Georgia"], 90 | "🇦🇱": ["阿爾巴尼亞","阿尔巴尼亚", "Albania"], 91 | "🇨🇾": ["CY","塞浦路斯", "Cyprus"], 92 | "🇨🇷": ["哥斯达黎加", "Costa Rica"], 93 | "🇹🇳": ["突尼斯", "Tunisia"], 94 | "🇵🇦": ["巴拿马","巴拿馬", "Panama"], 95 | "🇮🇷": ["伊朗", "Iran"], 96 | "🇯🇴": ["约旦", "約旦", "Jordan"], 97 | "🇺🇾": ["乌拉圭" , "烏拉圭", "Uruguay"], 98 | "🇰🇪": ["肯尼亚", "肯尼亞", "Kenya"], 99 | "🇰🇬": ["吉尔吉斯坦","吉尔吉斯斯坦", "Kyrghyzstan"], 100 | "🇳🇵": ["尼泊尔", "Nepal"], 101 | "🇽🇰": ["科索沃", "Kosovo"], 102 | "🇲🇦": ["摩洛哥", "Morocco"], 103 | "🇪🇨": ["厄瓜多尔","EC", "Ecuador"], 104 | "🇲🇺": ["毛里求斯", "Mauritius"], 105 | "🇵🇷": ["波多黎各", "PR", "Puerto Rico"], 106 | "🇭🇰": ["HK", "Hongkong", "Hong Kong", "HongKong", "HONG KONG","香港", "深港", "沪港", "呼港", "HKT", "HKBN", "HGC", "WTT", "CMI", "穗港", "京港", "港"], 107 | "🇨🇳": ["CN", "China", "回国", "中国","中國", "江苏", "北京", "上海", "广州", "深圳", "杭州", "徐州", "青岛", "宁波", "镇江", "back"], 108 | "🇱🇧": ["黎巴嫩","LB", "Lebanon"], 109 | "🇧🇳": ["文莱","BRN","Negara Brunei Darussalam"], 110 | "🌏": ["亚洲","Asia"] 111 | } -------------------------------------------------------------------------------- /Scripts/geo_location.js: -------------------------------------------------------------------------------- 1 | /*** 2 | [task_local] 3 | event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/geo_location.js, tag=GeoIP 查询, img-url=location.fill.viewfinder.system 4 | 5 | @XIAO_KOP 6 | 7 | **/ 8 | 9 | // var content= `

` + response.body + `

`; 10 | 11 | var url = "https://api.ip.sb/geoip" 12 | var opts = { 13 | policy: $environment.params 14 | }; 15 | var myRequest = { 16 | url: url, 17 | opts: opts, 18 | timeout: 4000 19 | }; 20 | 21 | var message = "" 22 | const paras = ["ip","isp","country_code","city"] 23 | const paran = ["IP","ISP","地区","城市"] 24 | $task.fetch(myRequest).then(response => { 25 | message = response? json2info(response.body,paras) : "" 26 | $done({"title": " 🔎 IP.SB 查询结果", "htmlMessage": message}); 27 | }, reason => { 28 | message = "

🛑 查询超时" 29 | message = `

` + message + `

` 30 | $done({"title": "🔎 IP.SB 查询结果", "htmlMessage": message}); 31 | }) 32 | 33 | 34 | function json2info(cnt,paras) { 35 | var res = "------------------------------" 36 | cnt =JSON.parse(cnt) 37 | for (i=0;i"+ "" +paran[i] + " : " + ""+ ""+cnt[paras[i]] +"
" : res 40 | } 41 | res =res+ "------------------------------"+"
"+""+"节点 ➟ " + $environment.params+ "" 42 | res = `

` + res + `

` 43 | return res 44 | } 45 | 46 | 47 | var flags = new Map([[ "AC" , "🇦🇨" ] ,["AE","🇦🇪"], [ "AF" , "🇦🇫" ] , [ "AI" , "🇦🇮" ] , [ "AL" , "🇦🇱" ] , [ "AM" , "🇦🇲" ] , [ "AQ" , "🇦🇶" ] , [ "AR" , "🇦🇷" ] , [ "AS" , "🇦🇸" ] , [ "AT" , "🇦🇹" ] , [ "AU" , "🇦🇺" ] , [ "AW" , "🇦🇼" ] , [ "AX" , "🇦🇽" ] , [ "AZ" , "🇦🇿" ] , ["BA", "🇧🇦"], [ "BB" , "🇧🇧" ] , [ "BD" , "🇧🇩" ] , [ "BE" , "🇧🇪" ] , [ "BF" , "🇧🇫" ] , [ "BG" , "🇧🇬" ] , [ "BH" , "🇧🇭" ] , [ "BI" , "🇧🇮" ] , [ "BJ" , "🇧🇯" ] , [ "BM" , "🇧🇲" ] , [ "BN" , "🇧🇳" ] , [ "BO" , "🇧🇴" ] , [ "BR" , "🇧🇷" ] , [ "BS" , "🇧🇸" ] , [ "BT" , "🇧🇹" ] , [ "BV" , "🇧🇻" ] , [ "BW" , "🇧🇼" ] , [ "BY" , "🇧🇾" ] , [ "BZ" , "🇧🇿" ] , [ "CA" , "🇨🇦" ] , [ "CF" , "🇨🇫" ] , [ "CH" , "🇨🇭" ] , [ "CK" , "🇨🇰" ] , [ "CL" , "🇨🇱" ] , [ "CM" , "🇨🇲" ] , [ "CN" , "🇨🇳" ] , [ "CO" , "🇨🇴" ] , [ "CP" , "🇨🇵" ] , [ "CR" , "🇨🇷" ] , [ "CU" , "🇨🇺" ] , [ "CV" , "🇨🇻" ] , [ "CW" , "🇨🇼" ] , [ "CX" , "🇨🇽" ] , [ "CY" , "🇨🇾" ] , [ "CZ" , "🇨🇿" ] , [ "DE" , "🇩🇪" ] , [ "DG" , "🇩🇬" ] , [ "DJ" , "🇩🇯" ] , [ "DK" , "🇩🇰" ] , [ "DM" , "🇩🇲" ] , [ "DO" , "🇩🇴" ] , [ "DZ" , "🇩🇿" ] , [ "EA" , "🇪🇦" ] , [ "EC" , "🇪🇨" ] , [ "EE" , "🇪🇪" ] , [ "EG" , "🇪🇬" ] , [ "EH" , "🇪🇭" ] , [ "ER" , "🇪🇷" ] , [ "ES" , "🇪🇸" ] , [ "ET" , "🇪🇹" ] , [ "EU" , "🇪🇺" ] , [ "FI" , "🇫🇮" ] , [ "FJ" , "🇫🇯" ] , [ "FK" , "🇫🇰" ] , [ "FM" , "🇫🇲" ] , [ "FO" , "🇫🇴" ] , [ "FR" , "🇫🇷" ] , [ "GA" , "🇬🇦" ] , [ "GB" , "🇬🇧" ] , [ "HK" , "🇭🇰" ] ,["HU","🇭🇺"], [ "ID" , "🇮🇩" ] , [ "IE" , "🇮🇪" ] , [ "IL" , "🇮🇱" ] , [ "IM" , "🇮🇲" ] , [ "IN" , "🇮🇳" ] , [ "IS" , "🇮🇸" ] , [ "IT" , "🇮🇹" ] , [ "JP" , "🇯🇵" ] , [ "KR" , "🇰🇷" ] , [ "LU" , "🇱🇺" ] , [ "MO" , "🇲🇴" ] , [ "MX" , "🇲🇽" ] , [ "MY" , "🇲🇾" ] , [ "NL" , "🇳🇱" ] , [ "PH" , "🇵🇭" ] , [ "RO" , "🇷🇴" ] , [ "RS" , "🇷🇸" ] , [ "RU" , "🇷🇺" ] , [ "RW" , "🇷🇼" ] , [ "SA" , "🇸🇦" ] , [ "SB" , "🇸🇧" ] , [ "SC" , "🇸🇨" ] , [ "SD" , "🇸🇩" ] , [ "SE" , "🇸🇪" ] , [ "SG" , "🇸🇬" ] , [ "TH" , "🇹🇭" ] , [ "TN" , "🇹🇳" ] , [ "TO" , "🇹🇴" ] , [ "TR" , "🇹🇷" ] , [ "TV" , "🇹🇻" ] , [ "TW" , "🇨🇳" ] , [ "UK" , "🇬🇧" ] , [ "UM" , "🇺🇲" ] , [ "US" , "🇺🇸" ] , [ "UY" , "🇺🇾" ] , [ "UZ" , "🇺🇿" ] , [ "VA" , "🇻🇦" ] , [ "VE" , "🇻🇪" ] , [ "VG" , "🇻🇬" ] , [ "VI" , "🇻🇮" ] , [ "VN" , "🇻🇳" ] , [ "ZA" , "🇿🇦"]]) 48 | -------------------------------------------------------------------------------- /Scripts/nf-ui-check.js: -------------------------------------------------------------------------------- 1 | /*** 2 | 3 | Thanks to & modified from https://gist.githubusercontent.com/Hyseen/b06e911a41036ebc36acf04ddebe7b9a/raw/nf_check.js 4 | 5 | For Quantumult-X 598+ 6 | 7 | [task-local] 8 | 9 | event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/nf-ui-check.js, tag=Netflix 查询, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/Netflix.png, enabled=true 10 | 11 | @XIAO_KOP 12 | 13 | **/ 14 | 15 | const BASE_URL = 'https://www.netflix.com/title/' 16 | 17 | const FILM_ID = 81280792 18 | const link = { "media-url": "https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/img/southpark/7.png" } 19 | const policy_name = "Netflix" //填入你的 netflix 策略组名 20 | 21 | const arrow = "➟" 22 | var output = "" 23 | var opts = { 24 | policy: $environment.params 25 | }; 26 | 27 | 28 | var flags = new Map([[ "AC" , "🇦🇨" ] ,["AE","🇦🇪"], [ "AF" , "🇦🇫" ] , [ "AI" , "🇦🇮" ] , [ "AL" , "🇦🇱" ] , [ "AM" , "🇦🇲" ] , [ "AQ" , "🇦🇶" ] , [ "AR" , "🇦🇷" ] , [ "AS" , "🇦🇸" ] , [ "AT" , "🇦🇹" ] , [ "AU" , "🇦🇺" ] , [ "AW" , "🇦🇼" ] , [ "AX" , "🇦🇽" ] , [ "AZ" , "🇦🇿" ] , ["BA", "🇧🇦"], [ "BB" , "🇧🇧" ] , [ "BD" , "🇧🇩" ] , [ "BE" , "🇧🇪" ] , [ "BF" , "🇧🇫" ] , [ "BG" , "🇧🇬" ] , [ "BH" , "🇧🇭" ] , [ "BI" , "🇧🇮" ] , [ "BJ" , "🇧🇯" ] , [ "BM" , "🇧🇲" ] , [ "BN" , "🇧🇳" ] , [ "BO" , "🇧🇴" ] , [ "BR" , "🇧🇷" ] , [ "BS" , "🇧🇸" ] , [ "BT" , "🇧🇹" ] , [ "BV" , "🇧🇻" ] , [ "BW" , "🇧🇼" ] , [ "BY" , "🇧🇾" ] , [ "BZ" , "🇧🇿" ] , [ "CA" , "🇨🇦" ] , [ "CF" , "🇨🇫" ] , [ "CH" , "🇨🇭" ] , [ "CK" , "🇨🇰" ] , [ "CL" , "🇨🇱" ] , [ "CM" , "🇨🇲" ] , [ "CN" , "🇨🇳" ] , [ "CO" , "🇨🇴" ] , [ "CP" , "🇨🇵" ] , [ "CR" , "🇨🇷" ] , [ "CU" , "🇨🇺" ] , [ "CV" , "🇨🇻" ] , [ "CW" , "🇨🇼" ] , [ "CX" , "🇨🇽" ] , [ "CY" , "🇨🇾" ] , [ "CZ" , "🇨🇿" ] , [ "DE" , "🇩🇪" ] , [ "DG" , "🇩🇬" ] , [ "DJ" , "🇩🇯" ] , [ "DK" , "🇩🇰" ] , [ "DM" , "🇩🇲" ] , [ "DO" , "🇩🇴" ] , [ "DZ" , "🇩🇿" ] , [ "EA" , "🇪🇦" ] , [ "EC" , "🇪🇨" ] , [ "EE" , "🇪🇪" ] , [ "EG" , "🇪🇬" ] , [ "EH" , "🇪🇭" ] , [ "ER" , "🇪🇷" ] , [ "ES" , "🇪🇸" ] , [ "ET" , "🇪🇹" ] , [ "EU" , "🇪🇺" ] , [ "FI" , "🇫🇮" ] , [ "FJ" , "🇫🇯" ] , [ "FK" , "🇫🇰" ] , [ "FM" , "🇫🇲" ] , [ "FO" , "🇫🇴" ] , [ "FR" , "🇫🇷" ] , [ "GA" , "🇬🇦" ] , [ "GB" , "🇬🇧" ] , [ "HK" , "🇭🇰" ] ,["HU","🇭🇺"], [ "ID" , "🇮🇩" ] , [ "IE" , "🇮🇪" ] , [ "IL" , "🇮🇱" ] , [ "IM" , "🇮🇲" ] , [ "IN" , "🇮🇳" ] , [ "IS" , "🇮🇸" ] , [ "IT" , "🇮🇹" ] , [ "JP" , "🇯🇵" ] , [ "KR" , "🇰🇷" ] , [ "LU" , "🇱🇺" ] , [ "MO" , "🇲🇴" ] , [ "MX" , "🇲🇽" ] , [ "MY" , "🇲🇾" ] , [ "NL" , "🇳🇱" ] , [ "PH" , "🇵🇭" ] , [ "RO" , "🇷🇴" ] , [ "RS" , "🇷🇸" ] , [ "RU" , "🇷🇺" ] , [ "RW" , "🇷🇼" ] , [ "SA" , "🇸🇦" ] , [ "SB" , "🇸🇧" ] , [ "SC" , "🇸🇨" ] , [ "SD" , "🇸🇩" ] , [ "SE" , "🇸🇪" ] , [ "SG" , "🇸🇬" ] , [ "TH" , "🇹🇭" ] , [ "TN" , "🇹🇳" ] , [ "TO" , "🇹🇴" ] , [ "TR" , "🇹🇷" ] , [ "TV" , "🇹🇻" ] , [ "TW" , "🇨🇳" ] , [ "UK" , "🇬🇧" ] , [ "UM" , "🇺🇲" ] , [ "US" , "🇺🇸" ] , [ "UY" , "🇺🇾" ] , [ "UZ" , "🇺🇿" ] , [ "VA" , "🇻🇦" ] , [ "VE" , "🇻🇪" ] , [ "VG" , "🇻🇬" ] , [ "VI" , "🇻🇮" ] , [ "VN" , "🇻🇳" ] , [ "ZA" , "🇿🇦"]]) 29 | 30 | 31 | !(async () => { 32 | let result = { 33 | title: ' Netflix 解锁检测', 34 | subtitle: output, 35 | content: '检测失败,请重试', 36 | } 37 | await Promise.race([test(FILM_ID),timeOut(5000)]) 38 | .then((code) => { 39 | console.log(code) 40 | 41 | if (code === 'Not Available') { 42 | result['content'] = '该节点未解锁 Netflix' 43 | //return 44 | //console.log(result) 45 | } else if (code === 'Not Found') { 46 | result['content'] = '该节点仅支持解锁 Netflix 自制剧' 47 | //return 48 | } else if (code === "timeout") { 49 | result['content'] = "测试超时" 50 | } else { 51 | result['content'] = '该节点完整解锁 Netflix ➟ ⟦'+flags.get(code.toUpperCase())+" 地区⟧" 52 | } 53 | 54 | //$notify(result["title"], output, result["content"], link) 55 | 56 | //console.log(result) 57 | let content = "------------------------------"+"

"+result["content"] 58 | content = content + "

------------------------------
"+""+"节点 ➟ " + $environment.params+ "" 59 | content =`

` + content + `

` 60 | $done({"title":"Netflix 解锁检测","htmlMessage":content}) 61 | }) 62 | })() 63 | .finally(() => $done()); 64 | 65 | function timeOut(delay) { 66 | return new Promise((resolve, reject) => { 67 | setTimeout(() => { 68 | //reject(new Error('timeout')) 69 | resolve("timeout") 70 | }, delay) 71 | }) 72 | } 73 | 74 | 75 | function test(filmId) { 76 | return new Promise((resolve, reject) => { 77 | let option = { 78 | url: BASE_URL + filmId, 79 | opts: opts, 80 | headers: { 81 | 'User-Agent': 82 | 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36', 83 | }, 84 | } 85 | $task.fetch(option).then (response => { 86 | console.log(response.statusCode) 87 | if (response.statusCode === 404) { 88 | resolve('Not Found') 89 | return 90 | } 91 | 92 | if (response.statusCode === 403) { 93 | resolve('Not Available') 94 | return 95 | } 96 | 97 | if (response.statusCode === 200) { 98 | let url = response.headers['X-Originating-URL'] 99 | let region = url.split('/')[3] 100 | region = region.split('-')[0] 101 | if (region == 'title') { 102 | region = 'us' 103 | } 104 | resolve(region) 105 | return 106 | } 107 | reject('Error') 108 | }) 109 | }) 110 | } 111 | -------------------------------------------------------------------------------- /Scripts/nf_ytb_ui-check.js: -------------------------------------------------------------------------------- 1 | /*** 2 | 3 | Thanks to & modified from https://gist.githubusercontent.com/Hyseen/b06e911a41036ebc36acf04ddebe7b9a/raw/nf_check.js 4 | 5 | For Quantumult-X 598 6 | 7 | 2022-12-16 8 | 9 | [task_local] 10 | 11 | event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/nf_ytb_ui-check.js, tag=YouTube/Netflix 解锁查询, img-url=checkmark.seal.system, enabled=true 12 | 13 | 14 | 15 | @XIAO_KOP 16 | 17 | **/ 18 | 19 | 20 | const BASE_URL = 'https://www.netflix.com/title/' 21 | const BASE_URL_YTB = "https://www.youtube.com/premium" 22 | 23 | const FILM_ID = 80062035 24 | const link = { "media-url": "https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/img/southpark/7.png" } 25 | const policy_name = "Netflix" //填入你的 netflix 策略组名 26 | 27 | const arrow = "➟" 28 | var output = "" 29 | var opts = { 30 | policy: $environment.params 31 | }; 32 | 33 | 34 | var flags = new Map([[ "AC" , "🇦🇨" ] ,["AE","🇦🇪"], [ "AF" , "🇦🇫" ] , [ "AI" , "🇦🇮" ] , [ "AL" , "🇦🇱" ] , [ "AM" , "🇦🇲" ] , [ "AQ" , "🇦🇶" ] , [ "AR" , "🇦🇷" ] , [ "AS" , "🇦🇸" ] , [ "AT" , "🇦🇹" ] , [ "AU" , "🇦🇺" ] , [ "AW" , "🇦🇼" ] , [ "AX" , "🇦🇽" ] , [ "AZ" , "🇦🇿" ] , ["BA", "🇧🇦"], [ "BB" , "🇧🇧" ] , [ "BD" , "🇧🇩" ] , [ "BE" , "🇧🇪" ] , [ "BF" , "🇧🇫" ] , [ "BG" , "🇧🇬" ] , [ "BH" , "🇧🇭" ] , [ "BI" , "🇧🇮" ] , [ "BJ" , "🇧🇯" ] , [ "BM" , "🇧🇲" ] , [ "BN" , "🇧🇳" ] , [ "BO" , "🇧🇴" ] , [ "BR" , "🇧🇷" ] , [ "BS" , "🇧🇸" ] , [ "BT" , "🇧🇹" ] , [ "BV" , "🇧🇻" ] , [ "BW" , "🇧🇼" ] , [ "BY" , "🇧🇾" ] , [ "BZ" , "🇧🇿" ] , [ "CA" , "🇨🇦" ] , [ "CF" , "🇨🇫" ] , [ "CH" , "🇨🇭" ] , [ "CK" , "🇨🇰" ] , [ "CL" , "🇨🇱" ] , [ "CM" , "🇨🇲" ] , [ "CN" , "🇨🇳" ] , [ "CO" , "🇨🇴" ] , [ "CP" , "🇨🇵" ] , [ "CR" , "🇨🇷" ] , [ "CU" , "🇨🇺" ] , [ "CV" , "🇨🇻" ] , [ "CW" , "🇨🇼" ] , [ "CX" , "🇨🇽" ] , [ "CY" , "🇨🇾" ] , [ "CZ" , "🇨🇿" ] , [ "DE" , "🇩🇪" ] , [ "DG" , "🇩🇬" ] , [ "DJ" , "🇩🇯" ] , [ "DK" , "🇩🇰" ] , [ "DM" , "🇩🇲" ] , [ "DO" , "🇩🇴" ] , [ "DZ" , "🇩🇿" ] , [ "EA" , "🇪🇦" ] , [ "EC" , "🇪🇨" ] , [ "EE" , "🇪🇪" ] , [ "EG" , "🇪🇬" ] , [ "EH" , "🇪🇭" ] , [ "ER" , "🇪🇷" ] , [ "ES" , "🇪🇸" ] , [ "ET" , "🇪🇹" ] , [ "EU" , "🇪🇺" ] , [ "FI" , "🇫🇮" ] , [ "FJ" , "🇫🇯" ] , [ "FK" , "🇫🇰" ] , [ "FM" , "🇫🇲" ] , [ "FO" , "🇫🇴" ] , [ "FR" , "🇫🇷" ] , [ "GA" , "🇬🇦" ] , [ "GB" , "🇬🇧" ] , [ "HK" , "🇭🇰" ] ,["HU","🇭🇺"], [ "ID" , "🇮🇩" ] , [ "IE" , "🇮🇪" ] , [ "IL" , "🇮🇱" ] , [ "IM" , "🇮🇲" ] , [ "IN" , "🇮🇳" ] , [ "IS" , "🇮🇸" ] , [ "IT" , "🇮🇹" ] , [ "JP" , "🇯🇵" ] , [ "KR" , "🇰🇷" ] , [ "LU" , "🇱🇺" ] , [ "MO" , "🇲🇴" ] , [ "MX" , "🇲🇽" ] , [ "MY" , "🇲🇾" ] , [ "NL" , "🇳🇱" ] , [ "PH" , "🇵🇭" ] , [ "RO" , "🇷🇴" ] , [ "RS" , "🇷🇸" ] , [ "RU" , "🇷🇺" ] , [ "RW" , "🇷🇼" ] , [ "SA" , "🇸🇦" ] , [ "SB" , "🇸🇧" ] , [ "SC" , "🇸🇨" ] , [ "SD" , "🇸🇩" ] , [ "SE" , "🇸🇪" ] , [ "SG" , "🇸🇬" ] , [ "TH" , "🇹🇭" ] , [ "TN" , "🇹🇳" ] , [ "TO" , "🇹🇴" ] , [ "TR" , "🇹🇷" ] , [ "TV" , "🇹🇻" ] , [ "TW" , "🇨🇳" ] , [ "UK" , "🇬🇧" ] , [ "UM" , "🇺🇲" ] , [ "US" , "🇺🇸" ] , [ "UY" , "🇺🇾" ] , [ "UZ" , "🇺🇿" ] , [ "VA" , "🇻🇦" ] , [ "VE" , "🇻🇪" ] , [ "VG" , "🇻🇬" ] , [ "VI" , "🇻🇮" ] , [ "VN" , "🇻🇳" ] , [ "ZA" , "🇿🇦"]]) 35 | 36 | 37 | !(async () => { 38 | let result = { 39 | title: '📺 Netflix/YouTube 解锁查询', 40 | content: '----------------------\n\n检测失败,请重试', 41 | content1: '检测失败,请重试' 42 | } 43 | 44 | await Promise.race([test(FILM_ID),timeOut(5000)]) 45 | .then((code) => { 46 | console.log(code) 47 | 48 | if (code === 'Not Available') { 49 | result['content'] = '----------------------\n\n🛑 未支持 Netflix' 50 | //return 51 | //console.log(result) 52 | } else if (code === 'Not Found') { 53 | result['content'] = '----------------------\n\n⚠️ 仅支持 Netflix 自制剧' 54 | //return 55 | } else if (code === "timeout") { 56 | result['content'] = "----------------------\n\n🛑 测试超时" 57 | } else { 58 | result['content'] = '----------------------\n\n✅ 完整支持 Netflix ➟ ⟦'+flags.get(code.toUpperCase())+code.toUpperCase()+"⟧" 59 | } 60 | 61 | return testYTB() 62 | // $notify(result["title"], output, result["content"]+"\n"+result["content1"], link) 63 | // $done({"title":result["title"],"message":result["content"]+"\n"+result["content1"]}) 64 | }) 65 | .then((code) => { 66 | 67 | console.log(code) 68 | if (code === 'Not Available') { 69 | result['content1'] = '⚠️ 未支持 YouTube Premium' 70 | //return 71 | } else if (code === "timeout") { 72 | result['content1'] = "🛑 测试超时" 73 | } else { 74 | result['content1'] = "✅ 支持 YouTube Premium ➟ ⟦"+flags.get(code.toUpperCase())+code.toUpperCase()+"⟧" 75 | } 76 | $done({"title":result["title"],"message":result["content"]+"\n\n"+result["content1"]+'\n\n----------------------\n'+$environment.params}) 77 | 78 | }) 79 | // ) 80 | })() 81 | .finally(() => $done()); 82 | 83 | function timeOut(delay) { 84 | return new Promise((resolve, reject) => { 85 | setTimeout(() => { 86 | //reject(new Error('timeout')) 87 | resolve("timeout") 88 | }, delay) 89 | }) 90 | } 91 | 92 | 93 | function test(filmId) { 94 | return new Promise((resolve, reject) => { 95 | let option = { 96 | url: BASE_URL + filmId, 97 | opts: opts, 98 | timeout: 4000, 99 | headers: { 100 | 'User-Agent': 101 | 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36', 102 | }, 103 | } 104 | $task.fetch(option).then (response => { 105 | console.log(response.statusCode) 106 | if (response.statusCode === 404) { 107 | resolve('Not Found') 108 | return 109 | } 110 | 111 | if (response.statusCode === 403) { 112 | resolve('Not Available') 113 | return 114 | } 115 | 116 | if (response.statusCode === 200) { 117 | let url = response.headers['X-Originating-URL'] 118 | let region = url.split('/')[3] 119 | region = region.split('-')[0] 120 | if (region == 'title') { 121 | region = 'us' 122 | } 123 | resolve(region) 124 | return 125 | } 126 | reject('Error') 127 | }, reason => { 128 | resolve("timeout") 129 | return 130 | } 131 | ) 132 | }) 133 | } 134 | 135 | function testYTB() { 136 | return new Promise((resolve, reject) => { 137 | let option = { 138 | url: BASE_URL_YTB, 139 | opts: opts, 140 | timeout: 4000, 141 | headers: { 142 | 'User-Agent': 143 | 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36' 144 | }, 145 | } 146 | $task.fetch(option).then(response=> { 147 | let data = response.body 148 | console.log(response.statusCode) 149 | if (response.statusCode !== 200) { 150 | reject('Error') 151 | return 152 | } 153 | 154 | if (data.indexOf('Premium is not available in your country') !== -1) { 155 | resolve('Not Available') 156 | return 157 | } 158 | //console.log(data.split("countryCode")[1]) 159 | let region = '' 160 | let re = new RegExp('"GL":"(.*?)"', 'gm') 161 | let result = re.exec(data) 162 | if (result != null && result.length === 2) { 163 | region = result[1] 164 | } else if (data.indexOf('www.google.cn') !== -1) { 165 | region = 'CN' 166 | } else { 167 | region = 'US' 168 | } 169 | resolve(region) 170 | }, reason => { 171 | resolve("timeout") 172 | }) 173 | }) 174 | } 175 | -------------------------------------------------------------------------------- /Scripts/nfcheck.js: -------------------------------------------------------------------------------- 1 | /*** 2 | 3 | Thanks to & modified from https://gist.githubusercontent.com/Hyseen/b06e911a41036ebc36acf04ddebe7b9a/raw/nf_check.js 4 | 5 | For Quantumult-X / [task-local] 6 | 7 | @XIAO_KOP 8 | 9 | **/ 10 | 11 | 12 | const BASE_URL = 'https://www.netflix.com/title/' 13 | 14 | const FILM_ID = 81280792 15 | const link = { "media-url": "https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/img/southpark/7.png" } 16 | const policy_name = "Netflix" //填入你的 netflix 策略组名 17 | 18 | const arrow = "➟" 19 | var output = "" 20 | 21 | var flags = new Map([[ "AC" , "🇦🇨" ] , [ "AF" , "🇦🇫" ] , [ "AI" , "🇦🇮" ] , [ "AL" , "🇦🇱" ] , [ "AM" , "🇦🇲" ] , [ "AQ" , "🇦🇶" ] , [ "AR" , "🇦🇷" ] , [ "AS" , "🇦🇸" ] , [ "AT" , "🇦🇹" ] , [ "AU" , "🇦🇺" ] , [ "AW" , "🇦🇼" ] , [ "AX" , "🇦🇽" ] , [ "AZ" , "🇦🇿" ] , [ "BB" , "🇧🇧" ] , [ "BD" , "🇧🇩" ] , [ "BE" , "🇧🇪" ] , [ "BF" , "🇧🇫" ] , [ "BG" , "🇧🇬" ] , [ "BH" , "🇧🇭" ] , [ "BI" , "🇧🇮" ] , [ "BJ" , "🇧🇯" ] , [ "BM" , "🇧🇲" ] , [ "BN" , "🇧🇳" ] , [ "BO" , "🇧🇴" ] , [ "BR" , "🇧🇷" ] , [ "BS" , "🇧🇸" ] , [ "BT" , "🇧🇹" ] , [ "BV" , "🇧🇻" ] , [ "BW" , "🇧🇼" ] , [ "BY" , "🇧🇾" ] , [ "BZ" , "🇧🇿" ] , [ "CA" , "🇨🇦" ] , [ "CF" , "🇨🇫" ] , [ "CH" , "🇨🇭" ] , [ "CK" , "🇨🇰" ] , [ "CL" , "🇨🇱" ] , [ "CM" , "🇨🇲" ] , [ "CN" , "🇨🇳" ] , [ "CO" , "🇨🇴" ] , [ "CP" , "🇨🇵" ] , [ "CR" , "🇨🇷" ] , [ "CU" , "🇨🇺" ] , [ "CV" , "🇨🇻" ] , [ "CW" , "🇨🇼" ] , [ "CX" , "🇨🇽" ] , [ "CY" , "🇨🇾" ] , [ "CZ" , "🇨🇿" ] , [ "DE" , "🇩🇪" ] , [ "DG" , "🇩🇬" ] , [ "DJ" , "🇩🇯" ] , [ "DK" , "🇩🇰" ] , [ "DM" , "🇩🇲" ] , [ "DO" , "🇩🇴" ] , [ "DZ" , "🇩🇿" ] , [ "EA" , "🇪🇦" ] , [ "EC" , "🇪🇨" ] , [ "EE" , "🇪🇪" ] , [ "EG" , "🇪🇬" ] , [ "EH" , "🇪🇭" ] , [ "ER" , "🇪🇷" ] , [ "ES" , "🇪🇸" ] , [ "ET" , "🇪🇹" ] , [ "EU" , "🇪🇺" ] , [ "FI" , "🇫🇮" ] , [ "FJ" , "🇫🇯" ] , [ "FK" , "🇫🇰" ] , [ "FM" , "🇫🇲" ] , [ "FO" , "🇫🇴" ] , [ "FR" , "🇫🇷" ] , [ "GA" , "🇬🇦" ] , [ "GB" , "🇬🇧" ] , [ "HK" , "🇭🇰" ] ,["HU","🇭🇺"], [ "ID" , "🇮🇩" ] , [ "IE" , "🇮🇪" ] , [ "IL" , "🇮🇱" ] , [ "IM" , "🇮🇲" ] , [ "IN" , "🇮🇳" ] , [ "IS" , "🇮🇸" ] , [ "IT" , "🇮🇹" ] , [ "JP" , "🇯🇵" ] , [ "KR" , "🇰🇷" ] , [ "LU" , "🇱🇺" ] , [ "MO" , "🇲🇴" ] , [ "MX" , "🇲🇽" ] , [ "MY" , "🇲🇾" ] , [ "NL" , "🇳🇱" ] , [ "PH" , "🇵🇭" ] , [ "RO" , "🇷🇴" ] , [ "RS" , "🇷🇸" ] , [ "RU" , "🇷🇺" ] , [ "RW" , "🇷🇼" ] , [ "SA" , "🇸🇦" ] , [ "SB" , "🇸🇧" ] , [ "SC" , "🇸🇨" ] , [ "SD" , "🇸🇩" ] , [ "SE" , "🇸🇪" ] , [ "SG" , "🇸🇬" ] , [ "TH" , "🇹🇭" ] , [ "TN" , "🇹🇳" ] , [ "TO" , "🇹🇴" ] , [ "TR" , "🇹🇷" ] , [ "TV" , "🇹🇻" ] , [ "TW" , "🇨🇳" ] , [ "UK" , "🇬🇧" ] , [ "UM" , "🇺🇲" ] , [ "US" , "🇺🇸" ] , [ "UY" , "🇺🇾" ] , [ "UZ" , "🇺🇿" ] , [ "VA" , "🇻🇦" ] , [ "VE" , "🇻🇪" ] , [ "VG" , "🇻🇬" ] , [ "VI" , "🇻🇮" ] , [ "VN" , "🇻🇳" ] , [ "ZA" , "🇿🇦"]]) 22 | 23 | 24 | function ReadPolicy(cnt) { 25 | var res = "" 26 | for (var key in cnt) { 27 | if (key == policy_name){ 28 | dd = cnt[key] 29 | res = res + dd.join(arrow) 30 | break 31 | } 32 | } 33 | return res.split(policy_name+arrow)[1] 34 | } 35 | 36 | const message = { 37 | action: "get_policy_state", 38 | //content: dict 39 | 40 | }; 41 | 42 | 43 | $configuration.sendMessage(message).then(resolve => { 44 | if (resolve.error) { 45 | console.log(resolve.error); 46 | } 47 | if (resolve.ret) { 48 | output = ReadPolicy(resolve.ret) 49 | } 50 | }) 51 | 52 | 53 | 54 | !(async () => { 55 | let result = { 56 | title: 'Netflix 解锁检测', 57 | subtitle: output, 58 | content: '检测失败,请重试', 59 | } 60 | await Promise.race([test(FILM_ID),timeOut(5000)]) 61 | .then((code) => { 62 | console.log(code) 63 | 64 | if (code === 'Not Available') { 65 | result['content'] = '该节点未解锁 Netflix' 66 | //return 67 | //console.log(result) 68 | } else if (code === 'Not Found') { 69 | result['content'] = '该节点仅支持解锁 Netflix 自制剧' 70 | //return 71 | } else if (code === "timeout") { 72 | result['content'] = "测试超时" 73 | } else { 74 | result['content'] = '该节点完整解锁 Netflix ➟ ⟦'+flags.get(code.toUpperCase())+" 地区⟧" 75 | } 76 | 77 | $notify(result["title"], output, result["content"], link) 78 | 79 | //console.log(result) 80 | $done() 81 | }) 82 | })() 83 | .finally(() => $.done()); 84 | 85 | function timeOut(delay) { 86 | return new Promise((resolve, reject) => { 87 | setTimeout(() => { 88 | //reject(new Error('timeout')) 89 | resolve("timeout") 90 | }, delay) 91 | }) 92 | } 93 | 94 | function test(filmId) { 95 | return new Promise((resolve, reject) => { 96 | let option = { 97 | url: BASE_URL + filmId, 98 | headers: { 99 | 'User-Agent': 100 | 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36', 101 | }, 102 | } 103 | $task.fetch(option).then (response => { 104 | console.log(response.statusCode) 105 | if (response.statusCode === 404) { 106 | resolve('Not Found') 107 | return 108 | } 109 | 110 | if (response.statusCode === 403) { 111 | resolve('Not Available') 112 | return 113 | } 114 | 115 | if (response.statusCode === 200) { 116 | let url = response.headers['X-Originating-URL'] 117 | let region = url.split('/')[3] 118 | region = region.split('-')[0] 119 | if (region == 'title') { 120 | region = 'us' 121 | } 122 | resolve(region) 123 | return 124 | } 125 | reject('Error') 126 | }) 127 | }) 128 | } 129 | -------------------------------------------------------------------------------- /Scripts/streaming-ui-check.js: -------------------------------------------------------------------------------- 1 | /*** 2 | 3 | Thanks to & modified from 4 | 1. https://gist.githubusercontent.com/Hyseen/b06e911a41036ebc36acf04ddebe7b9a/raw/nf_check.js 5 | 2. https://github.com/AtlantisGawrGura/Quantumult-X-Scripts/blob/main/media.js 6 | 3. https://github.com/CoiaPrant/MediaUnlock_Test/blob/main/check.sh 7 | 3. https://github.com/Netflixxp/chatGPT/blob/main/chat.sh 8 | 9 | For Quantumult-X 598+ ONLY!! 10 | 11 | 2023-02-14 12 | 13 | - 支持 ChatGPT 检测 14 | 15 | [task_local] 16 | 17 | event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/streaming-ui-check.js, tag=流媒体-解锁查询, img-url=checkmark.seal.system, enabled=true 18 | 19 | @XIAO_KOP 20 | 21 | **/ 22 | 23 | const BASE_URL = 'https://www.netflix.com/title/'; 24 | const BASE_URL_YTB = "https://www.youtube.com/premium"; 25 | const BASE_URL_DISNEY = 'https://www.disneyplus.com'; 26 | const BASE_URL_Dazn = "https://startup.core.indazn.com/misl/v5/Startup"; 27 | const BASE_URL_Param = "https://www.paramountplus.com/" 28 | const FILM_ID = 80062035 29 | const BASE_URL_Discovery_token = "https://us1-prod-direct.discoveryplus.com/token?deviceId=d1a4a5d25212400d1e6985984604d740&realm=go&shortlived=true" 30 | const BASE_URL_Discovery = "https://us1-prod-direct.discoveryplus.com/users/me" 31 | const BASE_URL_GPT = 'https://chat.openai.com/' 32 | const Region_URL_GPT = 'https://chat.openai.com/cdn-cgi/trace' 33 | 34 | const link = { "media-url": "https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/img/southpark/7.png" } 35 | const policy_name = "Netflix" //填入你的 netflix 策略组名 36 | 37 | const arrow = " ➟ " 38 | 39 | const UA = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36' 40 | 41 | // 即将登陆 42 | const STATUS_COMING = 2 43 | // 支持解锁 44 | const STATUS_AVAILABLE = 1 45 | // 不支持解锁 46 | const STATUS_NOT_AVAILABLE = 0 47 | // 检测超时 48 | const STATUS_TIMEOUT = -1 49 | // 检测异常 50 | const STATUS_ERROR = -2 51 | 52 | var opts = { 53 | policy: $environment.params 54 | }; 55 | 56 | var opts1 = { 57 | policy: $environment.params, 58 | redirection: false 59 | }; 60 | 61 | 62 | var flags = new Map([[ "AC" , "🇦🇨" ] ,["AE","🇦🇪"], [ "AF" , "🇦🇫" ] , [ "AI" , "🇦🇮" ] , [ "AL" , "🇦🇱" ] , [ "AM" , "🇦🇲" ] , [ "AQ" , "🇦🇶" ] , [ "AR" , "🇦🇷" ] , [ "AS" , "🇦🇸" ] , [ "AT" , "🇦🇹" ] , [ "AU" , "🇦🇺" ] , [ "AW" , "🇦🇼" ] , [ "AX" , "🇦🇽" ] , [ "AZ" , "🇦🇿" ] , ["BA", "🇧🇦"], [ "BB" , "🇧🇧" ] , [ "BD" , "🇧🇩" ] , [ "BE" , "🇧🇪" ] , [ "BF" , "🇧🇫" ] , [ "BG" , "🇧🇬" ] , [ "BH" , "🇧🇭" ] , [ "BI" , "🇧🇮" ] , [ "BJ" , "🇧🇯" ] , [ "BM" , "🇧🇲" ] , [ "BN" , "🇧🇳" ] , [ "BO" , "🇧🇴" ] , [ "BR" , "🇧🇷" ] , [ "BS" , "🇧🇸" ] , [ "BT" , "🇧🇹" ] , [ "BV" , "🇧🇻" ] , [ "BW" , "🇧🇼" ] , [ "BY" , "🇧🇾" ] , [ "BZ" , "🇧🇿" ] , [ "CA" , "🇨🇦" ] , [ "CF" , "🇨🇫" ] , [ "CH" , "🇨🇭" ] , [ "CK" , "🇨🇰" ] , [ "CL" , "🇨🇱" ] , [ "CM" , "🇨🇲" ] , [ "CN" , "🇨🇳" ] , [ "CO" , "🇨🇴" ] , [ "CP" , "🇨🇵" ] , [ "CR" , "🇨🇷" ] , [ "CU" , "🇨🇺" ] , [ "CV" , "🇨🇻" ] , [ "CW" , "🇨🇼" ] , [ "CX" , "🇨🇽" ] , [ "CY" , "🇨🇾" ] , [ "CZ" , "🇨🇿" ] , [ "DE" , "🇩🇪" ] , [ "DG" , "🇩🇬" ] , [ "DJ" , "🇩🇯" ] , [ "DK" , "🇩🇰" ] , [ "DM" , "🇩🇲" ] , [ "DO" , "🇩🇴" ] , [ "DZ" , "🇩🇿" ] , [ "EA" , "🇪🇦" ] , [ "EC" , "🇪🇨" ] , [ "EE" , "🇪🇪" ] , [ "EG" , "🇪🇬" ] , [ "EH" , "🇪🇭" ] , [ "ER" , "🇪🇷" ] , [ "ES" , "🇪🇸" ] , [ "ET" , "🇪🇹" ] , [ "EU" , "🇪🇺" ] , [ "FI" , "🇫🇮" ] , [ "FJ" , "🇫🇯" ] , [ "FK" , "🇫🇰" ] , [ "FM" , "🇫🇲" ] , [ "FO" , "🇫" ] , [ "FR" , "🇫🇷" ] , [ "GA" , "🇬🇦" ] , [ "GB" , "🇬🇧" ] , [ "HK" , "🇭🇰" ] ,["HU","🇭🇺"], [ "ID" , "🇮🇩" ] , [ "IE" , "🇮🇪" ] , [ "IL" , "🇮🇱" ] , [ "IM" , "🇮🇲" ] , [ "IN" , "🇮🇳" ] , [ "IS" , "🇮🇸" ] , [ "IT" , "🇮🇹" ] , [ "JP" , "🇯🇵" ] , [ "KR" , "🇰🇷" ] , [ "LU" , "🇱🇺" ] , [ "MO" , "🇲🇴" ] , [ "MX" , "🇲🇽" ] , [ "MY" , "🇲🇾" ] , [ "NL" , "🇳🇱" ] , [ "PH" , "🇵🇭" ] , [ "RO" , "🇷🇴" ] , [ "RS" , "🇷🇸" ] , [ "RU" , "🇷🇺" ] , [ "RW" , "🇷🇼" ] , [ "SA" , "🇸🇦" ] , [ "SB" , "🇧" ] , [ "SC" , "🇸🇨" ] , [ "SD" , "🇸🇩" ] , [ "SE" , "🇸🇪" ] , [ "SG" , "🇸🇬" ] , [ "TH" , "🇹🇭" ] , [ "TN" , "🇹🇳" ] , [ "TO" , "🇹🇴" ] , [ "TR" , "🇹🇷" ] , [ "TV" , "🇹🇻" ] , [ "TW" , "🇨🇳" ] , [ "UK" , "🇬🇧" ] , [ "UM" , "🇺🇲" ] , [ "US" , "🇺🇸" ] , [ "UY" , "🇺🇾" ] , [ "UZ" , "🇺🇿" ] , [ "VA" , "🇻🇦" ] , [ "VE" , "🇻🇪" ] , [ "VG" , "🇻🇬" ] , [ "VI" , "🇻🇮" ] , [ "VN" , "🇻🇳" ] , [ "ZA" , "🇿🇦"]]) 63 | 64 | let result = { 65 | "title": ' 📺 流媒体服务查询', 66 | "YouTube": 'YouTube: 检测失败,请重试 ❗️', 67 | "Netflix": 'Netflix: 检测失败,请重试 ❗️', 68 | "Dazn": "Dazn: 检测失败,请重试 ❗️", 69 | "Disney": "Disneyᐩ: 检测失败,请重试 ❗️", 70 | "Paramount" : "Paramountᐩ: 检测失败,请重试 ❗️", 71 | "Discovery" : "Discoveryᐩ: 检测失败,请重试 ❗️", 72 | "ChatGPT" : "ChatGPT: 检测失败,请重试 ❗️" 73 | //"Google": "Google 定位: 检测失败,请重试" 74 | 75 | } 76 | const message = { 77 | action: "get_policy_state", 78 | content: $environment.params 79 | }; 80 | 81 | ;(async () => { 82 | testYTB() 83 | testDazn() 84 | testParam() 85 | let [{ region, status }] = await Promise.all([testDisneyPlus(),testNf(FILM_ID),testDiscovery(),testChatGPT()]) 86 | console.log("NetFlix Result:"+result["Netflix"]) 87 | console.log(`testDisneyPlus: region=${region}, status=${status}`) 88 | if (status==STATUS_COMING) { 89 | //console.log(1) 90 | result["Disney"] = "Disneyᐩ: 即将登陆 ➟ "+'⟦'+flags.get(region.toUpperCase())+"⟧ ⚠️" 91 | } else if (status==STATUS_AVAILABLE){ 92 | //console.log(2) 93 | result["Disney"] = "Disneyᐩ: 支持 ➟ "+'⟦'+flags.get(region.toUpperCase())+"⟧ 🎉" 94 | console.log(result["Disney"]) 95 | } else if (status==STATUS_NOT_AVAILABLE) { 96 | //console.log(3) 97 | result["Disney"] = "Disneyᐩ: 未支持 🚫 " 98 | } else if (status==STATUS_TIMEOUT) { 99 | result["Disney"] = "Disneyᐩ: 检测超时 🚦 " 100 | } 101 | 102 | let content = "------------------------------"+"
"+([result["YouTube"],result["Netflix"],result["Disney"],result["Dazn"],result["Paramount"],result["Discovery"],result["ChatGPT"]]).join("

") 103 | content = content + "
------------------------------
"+""+"节点 ➟ " + $environment.params+ "" 104 | content =`

` + content + `

` 105 | // cnt = `

` +'----------------------

'+result["Disney"]+'

----------------------
'+$environment.params + `

` 106 | $configuration.sendMessage(message).then(resolve => { 107 | if (resolve.error) { 108 | console.log(resolve.error); 109 | $done() 110 | } 111 | if (resolve.ret) { 112 | let output=JSON.stringify(resolve.ret[message.content])? JSON.stringify(resolve.ret[message.content]).replace(/\"|\[|\]/g,"").replace(/\,/g," ➟ ") : $environment.params 113 | let content = "--------------------------------------
"+([result["Dazn"],result["Discovery"],result["Paramount"],result["Disney"],result["ChatGPT"],result["Netflix"],result["YouTube"]]).join("

") 114 | content = content + "
--------------------------------------
"+""+"节点 ➟ " + output+ "" 115 | content =`

` + content + `

` 116 | //$notify(typeof(output),output) 117 | console.log(output); 118 | $done({"title":result["title"],"htmlMessage":content}) 119 | 120 | } 121 | //$done();| 122 | }, reject => { 123 | // Normally will never happen. 124 | $done(); 125 | }); 126 | //$done({"title":result["title"],"htmlMessage":content}) 127 | })() 128 | .finally(() => { 129 | 130 | $configuration.sendMessage(message).then(resolve => { 131 | if (resolve.error) { 132 | console.log(resolve.error); 133 | $done() 134 | } 135 | if (resolve.ret) { 136 | let output=JSON.stringify(resolve.ret[message.content])? JSON.stringify(resolve.ret[message.content]).replace(/\"|\[|\]/g,"").replace(/\,/g," ➟ ") : $environment.params 137 | let content = "--------------------------------------
"+([result["Dazn"],result["Discovery"],result["Paramount"],result["Disney"],result["ChatGPT"],result["Netflix"],result["YouTube"]]).join("

") 138 | content = content + "
--------------------------------------
"+""+"节点 ➟ " + output+ "" 139 | content =`

` + content + `

` 140 | //$notify(typeof(output),output) 141 | console.log(output); 142 | $done({"title":result["title"],"htmlMessage":content}) 143 | 144 | } 145 | //$done();| 146 | }, reject => { 147 | // Normally will never happen. 148 | $done(); 149 | }); 150 | 151 | $done({"title":result["title"],"htmlMessage":`

`+'----------------------

'+"🚥 检测异常"+'

----------------------
'+ output + `

`}) 152 | } 153 | ); 154 | 155 | 156 | async function testDisneyPlus() { 157 | try { 158 | let { region, cnbl } = await Promise.race([testHomePage(), timeout(7000)]) 159 | console.log(`homepage: region=${region}, cnbl=${cnbl}`) 160 | // 即将登陆 161 | // if (cnbl == 2) { 162 | // return { region, status: STATUS_COMING } 163 | // } 164 | let { countryCode, inSupportedLocation, accessToken } = await Promise.race([getLocationInfo(), timeout(7000)]) 165 | console.log(`getLocationInfo: countryCode=${countryCode}, inSupportedLocation=${inSupportedLocation}`) 166 | 167 | region = countryCode ?? region 168 | console.log( "region:"+region) 169 | // 即将登陆 170 | if (inSupportedLocation === false || inSupportedLocation === 'false') { 171 | return { region, status: STATUS_COMING } 172 | } else { 173 | // 支持解锁 174 | return { region, status: STATUS_AVAILABLE } 175 | } 176 | 177 | let support = await Promise.race([testPublicGraphqlAPI(accessToken), timeout(7000)]) 178 | if (!support) { 179 | return { status: STATUS_NOT_AVAILABLE } 180 | } 181 | // 支持解锁 182 | return { region, status: STATUS_AVAILABLE } 183 | 184 | } catch (error) { 185 | console.log("error:"+error) 186 | 187 | // 不支持解锁 188 | if (error === 'Not Available') { 189 | console.log("不支持") 190 | return { status: STATUS_NOT_AVAILABLE } 191 | } 192 | 193 | // 检测超时 194 | if (error === 'Timeout') { 195 | return { status: STATUS_TIMEOUT } 196 | } 197 | 198 | return { status: STATUS_ERROR } 199 | } 200 | 201 | } 202 | 203 | function getLocationInfo() { 204 | return new Promise((resolve, reject) => { 205 | let opts0 = { 206 | url: 'https://disney.api.edge.bamgrid.com/graph/v1/device/graphql', 207 | method: "POST", 208 | opts: opts, 209 | headers: { 210 | 'Accept-Language': 'en', 211 | "Authorization": 'ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84', 212 | 'Content-Type': 'application/json', 213 | 'User-Agent': UA, 214 | }, 215 | body: JSON.stringify({ 216 | query: 'mutation registerDevice($input: RegisterDeviceInput!) { registerDevice(registerDevice: $input) { grant { grantType assertion } } }', 217 | variables: { 218 | input: { 219 | applicationRuntime: 'chrome', 220 | attributes: { 221 | browserName: 'chrome', 222 | browserVersion: '94.0.4606', 223 | manufacturer: 'apple', 224 | model: null, 225 | operatingSystem: 'macintosh', 226 | operatingSystemVersion: '10.15.7', 227 | osDeviceIds: [], 228 | }, 229 | deviceFamily: 'browser', 230 | deviceLanguage: 'en', 231 | deviceProfile: 'macosx', 232 | }, 233 | }, 234 | }), 235 | } 236 | 237 | $task.fetch(opts0).then(response => { 238 | let data = response.body 239 | console.log("locationinfo:"+response.statusCode) 240 | if (response.statusCode !== 200) { 241 | console.log('getLocationInfo: ' + data) 242 | reject('Not Available') 243 | return 244 | } else { 245 | let { 246 | token: { accessToken }, 247 | session: { 248 | inSupportedLocation, 249 | location: { countryCode }, 250 | }, 251 | } = JSON.parse(data)?.extensions?.sdk 252 | resolve({ inSupportedLocation, countryCode, accessToken }) 253 | } 254 | }, reason => { 255 | reject('Error') 256 | return 257 | }) 258 | }) 259 | } 260 | 261 | function testHomePage() { 262 | return new Promise((resolve, reject) => { 263 | let opts0 = { 264 | url: 'https://www.disneyplus.com/', 265 | opts: opts, 266 | headers: { 267 | 'Accept-Language': 'en', 268 | 'User-Agent': UA, 269 | }, 270 | } 271 | $task.fetch(opts0).then(response => { 272 | let data = response.body 273 | console.log("DisneyPlus: homepage"+response.statusCode) 274 | if (response.statusCode !== 200 || data.indexOf('not available in your region') !== -1) { 275 | reject('Not Available') 276 | return 277 | } else { 278 | let match = data.match(/Region: ([A-Za-z]{2})[\s\S]*?CNBL: ([12])/) 279 | if (!match) { 280 | resolve({ region: '', cnbl: '' }) 281 | return 282 | } else { 283 | let region = match[1] 284 | let cnbl = match[2] 285 | //console.log("homepage"+region+cnbl) 286 | resolve({ region, cnbl }) 287 | } 288 | } 289 | }, reason => { 290 | reject('Error') 291 | return 292 | }) 293 | }) 294 | } 295 | 296 | function testPublicGraphqlAPI(accessToken) { 297 | return new Promise((resolve, reject) => { 298 | let opts = { 299 | url: 'https://disney.api.edge.bamgrid.com/v1/public/graphql', 300 | headers: { 301 | 'Accept-Language': 'en', 302 | Authorization: accessToken, 303 | 'Content-Type': 'application/json', 304 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36', 305 | }, 306 | body: JSON.stringify({ 307 | query: 308 | 'query($preferredLanguages: [String!]!, $version: String) {globalization(version: $version) { uiLanguage(preferredLanguages: $preferredLanguages) }}', 309 | variables: { version: '1.5.0', preferredLanguages: ['en'] }, 310 | }), 311 | } 312 | 313 | $task.fetch(opts).then( response => { 314 | 315 | resolve(response.status === 200) 316 | }, reason => { 317 | reject('Error') 318 | return 319 | }) 320 | }) 321 | } 322 | 323 | function timeout(delay = 5000) { 324 | return new Promise((resolve, reject) => { 325 | setTimeout(() => { 326 | reject('Timeout') 327 | }, delay) 328 | }) 329 | } 330 | 331 | 332 | function testNf(filmId) { 333 | return new Promise((resolve, reject) =>{ 334 | let option = { 335 | url: BASE_URL + filmId, 336 | opts: opts, 337 | timeout: 5200, 338 | headers: { 339 | 'User-Agent': 340 | 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36', 341 | }, 342 | } 343 | $task.fetch(option).then(response => { 344 | //$notify("nf:"+response.statusCode) 345 | console.log("nf:"+response.statusCode) 346 | if (response.statusCode === 404) { 347 | 348 | result["Netflix"] = "Netflix: 支持自制剧集 ⚠️" 349 | console.log("nf:"+result["Netflix"]) 350 | resolve('Not Found') 351 | return 352 | } else if (response.statusCode === 403) { 353 | 354 | //console.log("nfnf") 355 | result["Netflix"] = "Netflix: 未支持 🚫" 356 | console.log("nf:"+result["Netflix"]) 357 | //$notify("nf:"+result["Netflix"]) 358 | resolve('Not Available') 359 | return 360 | } else if (response.statusCode === 200) { 361 | let url = response.headers['X-Originating-URL'] 362 | let region = url.split('/')[3] 363 | region = region.split('-')[0] 364 | if (region == 'title') { 365 | region = 'us' 366 | } 367 | console.log("nf:"+region) 368 | result["Netflix"] = "Netflix: 完整支持"+arrow+ "⟦"+flags.get(region.toUpperCase())+"⟧ 🎉" 369 | //$notify("nf:"+result["Netflix"]) 370 | resolve("nf:"+result["Netflix"]) 371 | return 372 | } 373 | }, reason => { 374 | result["Netflix"] = "Netflix: 检测超时 🚦" 375 | console.log(result["Netflix"]) 376 | resolve("timeout") 377 | } 378 | ) 379 | } 380 | ) 381 | } 382 | 383 | function testYTB() { 384 | let option = { 385 | url: BASE_URL_YTB, 386 | opts: opts, 387 | timeout: 2800, 388 | headers: { 389 | 'User-Agent': 390 | 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36' 391 | }, 392 | } 393 | $task.fetch(option).then(response=> { 394 | let data = response.body 395 | console.log("ytb:"+response.statusCode) 396 | if (response.statusCode !== 200) { 397 | //reject('Error') 398 | result["YouTube"] = "YouTube Premium: 检测失败 ❗️" 399 | } else if (data.indexOf('Premium is not available in your country') !== -1) { 400 | //resolve('Not Available') 401 | result["YouTube"] = "YouTube Premium: 未支持 🚫" 402 | } else if (data.indexOf('Premium is not available in your country') == -1) {//console.log(data.split("countryCode")[1]) 403 | let region = '' 404 | let re = new RegExp('"GL":"(.*?)"', 'gm') 405 | let ret = re.exec(data) 406 | if (ret != null && ret.length === 2) { 407 | region = ret[1] 408 | } else if (data.indexOf('www.google.cn') !== -1) { 409 | region = 'CN' 410 | } else { 411 | region = 'US' 412 | } 413 | //resolve(region) 414 | result["YouTube"] = "YouTube Premium: 支持 "+arrow+ "⟦"+flags.get(region.toUpperCase())+"⟧ 🎉" 415 | console.log("ytb:"+region+ result["YouTube"]) 416 | } 417 | }, reason => { 418 | result["YouTube"] = "YouTube Premium: 检测超时 🚦" 419 | //resolve("timeout") 420 | }) 421 | } 422 | 423 | function testDazn() { 424 | 425 | const extra =`{ 426 | "LandingPageKey":"generic", 427 | "Platform":"web", 428 | "PlatformAttributes":{}, 429 | "Manufacturer":"", 430 | "PromoCode":"", 431 | "Version":"2" 432 | }` 433 | let option = { 434 | url: BASE_URL_Dazn, 435 | method: "POST", 436 | opts: opts, 437 | timeout: 2800, 438 | headers: { 439 | 'User-Agent': 440 | 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36', 441 | "Content-Type": "application/json" 442 | }, 443 | body: extra 444 | } 445 | 446 | $task.fetch(option).then(response=> { 447 | let data = response.body 448 | //data = extra 449 | let header = JSON.stringify(response.headers) 450 | console.log("Dazn:"+response.statusCode) 451 | //console.log("Dazn:"+data) 452 | //$done(data) 453 | if (response.statusCode !== 200) { 454 | //reject('Error') 455 | result["Dazn"] = "Dazn: 检测失败 ❗️" 456 | } else if (response.statusCode == 200) {//console.log(data.split("countryCode")[1]) 457 | //console.log(data) 458 | let region = '' 459 | let re = new RegExp('"GeolocatedCountry":"(.*?)"', 'gm') 460 | let ret = re.exec(data) 461 | if (ret != null && ret.length === 2) { 462 | region = ret[1] 463 | result["Dazn"] = "Dazn: 支持 "+arrow+ "⟦"+flags.get(region.toUpperCase())+"⟧ 🎉" 464 | } else { 465 | result["Dazn"] = "Dazn: 未支持 🚫" 466 | 467 | } 468 | //resolve(region) 469 | console.log("Dazn:"+region+ result["Dazn"]) 470 | } 471 | }, reason => { 472 | result["Dazn"] = "Dazn: 检测超时 🚦" 473 | //resolve("timeout") 474 | }) 475 | } 476 | 477 | function testParam() { 478 | let option = { 479 | url: BASE_URL_Param, 480 | opts: opts1, 481 | timeout: 2800, 482 | headers: { 483 | 'User-Agent': 484 | 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36' 485 | }, 486 | } 487 | $task.fetch(option).then(response=> { 488 | //let data = response.body 489 | console.log("Paramountᐩ:"+response.statusCode) 490 | if (response.statusCode == 200) { 491 | //reject('Error') 492 | result["Paramount"] = "Paramountᐩ: 支持 🎉 " 493 | } else if (response.statusCode == 302) { 494 | //resolve('Not Available') 495 | result["Paramount"] = "Paramountᐩ: 未支持 🚫" 496 | } 497 | console.log("Paramountᐩ:"+ result["Paramount"]) 498 | }, reason => { 499 | result["Paramount"] = "Paramountᐩ: 检测超时 🚦" 500 | //resolve("timeout") 501 | }) 502 | } 503 | 504 | 505 | function testDiscovery() { 506 | return new Promise((resolve, reject) =>{ 507 | let option = { 508 | url: BASE_URL_Discovery_token, 509 | opts: opts1, 510 | timeout: 2800, 511 | headers: { 512 | 'User-Agent': 513 | 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36' 514 | }, 515 | verify: false 516 | } 517 | $task.fetch(option).then(response=> { 518 | console.log("GetToken:"+response.statusCode) 519 | if(response.statusCode == 200) { 520 | let data = JSON.parse(response.body) 521 | console.log(data) 522 | let token = data["data"]["attributes"]["token"] 523 | const cookievalid =`_gcl_au=1.1.858579665.1632206782; _rdt_uuid=1632206782474.6a9ad4f2-8ef7-4a49-9d60-e071bce45e88; _scid=d154b864-8b7e-4f46-90e0-8b56cff67d05; _pin_unauth=dWlkPU1qWTRNR1ZoTlRBdE1tSXdNaTAwTW1Nd0xUbGxORFV0WWpZMU0yVXdPV1l6WldFeQ; _sctr=1|1632153600000; aam_fw=aam%3D9354365%3Baam%3D9040990; aam_uuid=24382050115125439381416006538140778858; st=${token}; gi_ls=0; _uetvid=a25161a01aa711ec92d47775379d5e4d; AMCV_BC501253513148ED0A490D45%40AdobeOrg=-1124106680%7CMCIDTS%7C18894%7CMCMID%7C24223296309793747161435877577673078228%7CMCAAMLH-1633011393%7C9%7CMCAAMB-1633011393%7CRKhpRz8krg2tLO6pguXWp5olkAcUniQYPHaMWWgdJ3xzPWQmdj0y%7CMCOPTOUT-1632413793s%7CNONE%7CvVersion%7C5.2.0; ass=19ef15da-95d6-4b1d-8fa2-e9e099c9cc38.1632408400.1632406594` 524 | let option1 = { 525 | url: BASE_URL_Discovery, 526 | opts: opts1, 527 | timeout: 2800, 528 | headers: { 529 | 'User-Agent': 530 | 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36', 531 | "Cookie": cookievalid, 532 | }, 533 | ciphers: "DEFAULT@SECLEVEL=1", 534 | verify: false 535 | } 536 | $task.fetch(option1).then(response=> { 537 | console.log("Discovery+ Check:"+response.statusCode) 538 | let data = JSON.parse(response.body) 539 | let locationd = data["data"]["attributes"]["currentLocationTerritory"] 540 | if (locationd == "us") { 541 | result["Discovery"] = "Discoveryᐩ: 支持 🎉 " 542 | console.log("支持Discoveryᐩ") 543 | resolve("支持Discoveryᐩ") 544 | return 545 | } else { 546 | result["Discovery"] = "Discoveryᐩ: 未支持 🚫" 547 | console.log("不支持Discoveryᐩ") 548 | resolve("不支持Discoveryᐩ") 549 | return 550 | } 551 | }, reason => { 552 | console.log("Check-Error"+reason) 553 | resolve("discovery failed") 554 | }) 555 | } else { 556 | console.log("GetToken-Error"+reason) 557 | resolve("discovery failed") 558 | } 559 | }, reason => { 560 | console.log("GetToken-Error"+reason) 561 | resolve("discovery failed") 562 | })})} 563 | 564 | 565 | // openai test 566 | 567 | support_countryCodes=["T1","XX","AL","DZ","AD","AO","AG","AR","AM","AU","AT","AZ","BS","BD","BB","BE","BZ","BJ","BT","BA","BW","BR","BG","BF","CV","CA","CL","CO","KM","CR","HR","CY","DK","DJ","DM","DO","EC","SV","EE","FJ","FI","FR","GA","GM","GE","DE","GH","GR","GD","GT","GN","GW","GY","HT","HN","HU","IS","IN","ID","IQ","IE","IL","IT","JM","JP","JO","KZ","KE","KI","KW","KG","LV","LB","LS","LR","LI","LT","LU","MG","MW","MY","MV","ML","MT","MH","MR","MU","MX","MC","MN","ME","MA","MZ","MM","NA","NR","NP","NL","NZ","NI","NE","NG","MK","NO","OM","PK","PW","PA","PG","PE","PH","PL","PT","QA","RO","RW","KN","LC","VC","WS","SM","ST","SN","RS","SC","SL","SG","SK","SI","SB","ZA","ES","LK","SR","SE","CH","TH","TG","TO","TT","TN","TR","TV","UG","AE","US","UY","VU","ZM","BO","BN","CG","CZ","VA","FM","MD","PS","KR","TW","TZ","TL","GB"] 568 | 569 | function testChatGPT() { 570 | return new Promise((resolve, reject) =>{ 571 | let option = { 572 | url: BASE_URL_GPT, 573 | opts: opts1, 574 | timeout: 2800, 575 | } 576 | $task.fetch(option).then(response=> { 577 | let resp = JSON.stringify(response) 578 | console.log("ChatGPT Main Test") 579 | let jdg = resp.indexOf("text/plain") 580 | if(jdg == -1) { 581 | let option1 = { 582 | url: Region_URL_GPT, 583 | opts: opts1, 584 | timeout: 2800, 585 | } 586 | $task.fetch(option1).then(response=> { 587 | console.log("ChatGPT Region Test") 588 | let region = response.body.split("loc=")[1].split("\n")[0] 589 | console.log("ChatGPT Region: "+region) 590 | let res = support_countryCodes.indexOf(region) 591 | if (res != -1) { 592 | result["ChatGPT"] = "ChatGPT: 支持 "+arrow+ "⟦"+flags.get(region.toUpperCase())+"⟧ 🎉" 593 | console.log("支持 ChatGPT") 594 | resolve("支持 ChatGPT") 595 | return 596 | } else { 597 | result["ChatGPT"] = "ChatGPT: 未支持 🚫" 598 | console.log("不支持 ChatGPT") 599 | resolve("不支持 ChatGPT") 600 | return 601 | } 602 | }, reason => { 603 | console.log("Check-Error"+reason) 604 | resolve("ChatGPT failed") 605 | }) 606 | } else { 607 | result["ChatGPT"] = "ChatGPT: 未支持 🚫" 608 | console.log("不支持 ChatGPT") 609 | resolve("不支持 ChatGPT") 610 | } 611 | }, reason => { 612 | console.log("ChatGPT-Error"+reason) 613 | resolve("ChatGPT failed") 614 | })})} -------------------------------------------------------------------------------- /Scripts/switch-check-disneyplus.js: -------------------------------------------------------------------------------- 1 | /*** 2 | 3 | Thanks to & modified from 4 | 1. https://gist.githubusercontent.com/Hyseen/b06e911a41036ebc36acf04ddebe7b9a/raw/nf_check.js 5 | 6 | For Quantumult-X 598+ ONLY!! 7 | 8 | 2022-07-23 9 | 10 | [task_local] 11 | 12 | // UI 查询版本 13 | event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/switch-check-disneyplus.js, tag=Disneyᐩ 检测&切换, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/Disney.png, enabled=true 14 | 15 | //cron 版本 16 | 0 8 * * * https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/switch-check-disneyplus.js#policy=你的策略组名, tag=Disneyᐩ 定时切换, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/Disney.png, enabled=true 17 | 18 | ps. 简单粗暴的 UI-Interaction 版本。无数据持久化、粗暴延迟等待。完美主义建议使用 Helge大佬的boxjs版本 https://t.me/QuanXNews/193 19 | 20 | @XIAO_KOP 21 | 22 | **/ 23 | 24 | const BASE_URL_DISNEY = 'https://www.disneyplus.com'; 25 | const arrow = " ➟ " 26 | 27 | const UA = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36' 28 | 29 | // 即将登陆 30 | const STATUS_COMING = 2 31 | // 支持解锁 32 | const STATUS_AVAILABLE = 1 33 | // 不支持解锁 34 | const STATUS_NOT_AVAILABLE = 0 35 | // 检测超时 36 | const STATUS_TIMEOUT = -1 37 | // 检测异常 38 | const STATUS_ERROR = -2 39 | 40 | const link = { "media-url": "https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/img/southpark/7.png" } 41 | 42 | var cronsign = $environment.executeType == 0 || $environment.executeType == "0" || $environment.executeType == "-1"? "Y" : "N" 43 | var policy = $environment.executeType == 0 || $environment.executeType == "0" || $environment.executeType == "-1"? GetPolicy($environment.sourcePath) : $environment.params 44 | console.log(JSON.stringify($environment)) 45 | console.log("策略组:"+policy) 46 | 47 | function GetPolicy(cnt) { 48 | if (cnt && cnt.indexOf("#policy=") !=-1) { 49 | return decodeURIComponent(cnt.split("#policy=")[1].trim()) 50 | }else { 51 | return "" 52 | } 53 | } 54 | 55 | 56 | const message = { 57 | action: "get_customized_policy", 58 | content: policy 59 | 60 | }; 61 | 62 | var output=[] 63 | var OKList=[] 64 | var ResList=["即将登陆节点 ➟ "] 65 | var NoList=["不支持节点 ➟ "] 66 | var timeoutList=["检测超时节点 ➟ "] 67 | var pflag=1 //是否是策略,或者简单节点 68 | var sign=0 //是否停止 69 | 70 | 71 | $configuration.sendMessage(message).then(resolve => { 72 | if (resolve.error) { 73 | console.log(resolve.error); 74 | $done() 75 | } 76 | if (resolve.ret) { 77 | output=JSON.stringify(resolve.ret[message.content])? JSON.parse(JSON.stringify(resolve.ret[message.content]["candidates"])) : [policy] 78 | pflag = JSON.stringify(resolve.ret[message.content])? pflag:0 79 | console.log("Disneyᐩ 检测&切换") 80 | console.log("节点or策略组:"+pflag) 81 | console.log(JSON.stringify(resolve.ret)) 82 | if (pflag==1) { 83 | console.log("节点数量:"+resolve.ret[policy]["candidates"].length) 84 | if(resolve.ret[policy]["candidates"].length==0) { 85 | $done({"title":"Disneyᐩ 检测&切换","htmlMessage":`


😭 无有效节点`}); 86 | } 87 | } 88 | 89 | //$notify(typeof(output),output) 90 | Check() 91 | //$done({"title":"策略内容","message":output}) 92 | } 93 | //$done();| 94 | }, reject => { 95 | // Normally will never happen. 96 | $done(); 97 | }); 98 | 99 | function Len(cnt) { 100 | return cnt.length-1 101 | } 102 | 103 | function Check() { 104 | var relay = 2000; 105 | for ( var i=0;i < output.length;i++) { 106 | testDisneyPlus(output[i]) 107 | } 108 | if (output.length<=3) { 109 | relay = 3500 110 | } else if (output.length<=5) { 111 | relay = 4000 112 | } else if (output.length<10) { 113 | relay =4500 114 | } else if (output.length<15) { 115 | relay =6500 116 | } else if (output.length<20) { 117 | relay =8500 118 | } else if (output.length<50){ 119 | relay =11000 120 | } else { 121 | relay =13000 122 | } 123 | console.log(output.length+":"+relay) 124 | setTimeout(() => { 125 | console.log("⛳️ 共计 "+OKList.length+" 个:支持节点 ➟ "+ OKList) 126 | console.log("🏠 共计 "+Len(NoList)+" 个:"+NoList) 127 | console.log("🕹 共计 "+Len(timeoutList)+" 个:"+timeoutList) 128 | sign = 1 129 | if (OKList[0] && pflag==1) { //有支持节点、且为策略组才操作 130 | console.log("开始排序") 131 | ReOrder(OKList) 132 | } else if (!OKList[0]){ //不支持 133 | content = pflag==0 ? `


😭 该节点不支持Disneyᐩ

👇

-------------------------
⟦ `+policy+` ⟧
-------------------------
`: `

` + "
⟦ "+policy+ " ⟧ ⚠️ 切换失败

该策略组内未找到支持 Disneyᐩ 的节点" + "

-----------------------------
检测详情请查看JS脚本记录
-----------------------------
"+`

` 134 | $done({"title":"Disneyᐩ 检测&切换", "htmlMessage": content}) 135 | } else if (OKList[0]){ //支持, 但为节点 136 | content = `


🎉 该节点支持 Disneyᐩ ➟` + OKList[0].split(": 支持 ")[1]+`

👇

-------------------------
⟦ `+policy+` ⟧
-------------------------
` 137 | $done({"title":"Disneyᐩ 检测&切换", "htmlMessage": content}) 138 | } 139 | }, relay) 140 | 141 | } 142 | 143 | 144 | 145 | //选择最优延迟节点 146 | function ReOrder(cnt) { 147 | const array = cnt//; 148 | const messageURL = { 149 | action: "url_latency_benchmark", 150 | content: array.map(item=>item.split(": 支持 ")[0]) 151 | }; 152 | $configuration.sendMessage(messageURL).then(resolve => { 153 | if (resolve.error) { 154 | console.log(resolve.error); 155 | } 156 | if (resolve.ret) { 157 | let output=JSON.stringify(resolve.ret); 158 | //console.log("节点延迟:"+output); 159 | //排序 160 | //console.log("排序前: "+ array) 161 | if(array){ 162 | try { 163 | array.sort(function (a,b) { 164 | //console.log(a+" VS "+b) 165 | a=a.split(": 支持 ")[0] 166 | b=b.split(": 支持 ")[0] 167 | return (resolve.ret[a][1]!=-1 && resolve.ret[b][1] !=-1)? resolve.ret[a][1]-resolve.ret[b][1] : resolve.ret[b][1] 168 | }) 169 | } catch (err) { 170 | console.log(err) 171 | } 172 | } 173 | console.log("排序后: "+array) 174 | let Ping =resolve.ret[array[0].split(": 支持 ")[0]] 175 | const dict = { [policy] : array[0].split(": 支持 ")[0]}; 176 | if(array[0]) { 177 | console.log("选定支持 Disneyᐩ 节点:"+array[0].split(": 支持 ")[0]+"延迟数据为 👉"+Ping) 178 | Ping = " ⚡️ 节点延迟 ➟ 「 "+Ping + " 」 " 179 | } 180 | const mes1 = { 181 | action: "set_policy_state", 182 | content: dict 183 | }; 184 | $configuration.sendMessage(mes1).then(resolve => { 185 | if (resolve.error) { 186 | console.log(resolve.error); 187 | content =pflag==0 && array[0]? `

` + "
⟦ "+policy+ " ⟧

🎉 该节点支持 Disneyᐩ ➟" + array[0].split(": 支持 ")[1]+ `

` : `

` + "
⟦ "+policy+ " ⟧

⚠️ 该节点不支持 Disneyᐩ " + `

` 188 | 189 | content =pflag==0 && ResList[1]? `

` + "
⟦ "+policy+ " ⟧

🚦 即将登陆节点所在地区 ➟" + ResList[1].split("登陆 ")[1]+`

` : content 190 | 191 | content = pflag!=0 && !array[0]? `

` + "
⟦ "+policy+ " ⟧ ⚠️ 切换失败

该策略组内未找到支持 Disneyᐩ 的节点" + "

-----------------------------
检测详情请查看JS脚本记录
-----------------------------"+`

` : content 192 | console.log(content) 193 | $done({"title":"Disneyᐩ 检测&切换", "htmlMessage": content}) 194 | } 195 | if (resolve.ret) { 196 | console.log("已经切换至支持 Disneyᐩ"+array[0].split(": 支持 ")[1]+"的路线 ➟ "+array[0].split(": 支持 ")[0]) 197 | if (cronsign == "Y") { $notify("📺 Disneyᐩ 定时检测&切换", "🎉 已经切换至支持 Disneyᐩ 的最优延迟线路👇", array[0] +"\n 👉 "+Ping)} 198 | content = `

` + "
⟦ "+policy+ " ⟧ 已切换至支持 Disneyᐩ "+array[0].split(": 支持 ")[1]+"中延迟最优的路线

👇

⟦ "+array[0].split(": 支持 ")[0]+ " ⟧" + "

"+Ping+"
-----------------------------
检测详情请查看JS脚本记录
-----------------------------"+`

` 199 | $done({"title":"Disneyᐩ 检测&切换", "htmlMessage": content }) 200 | } 201 | }, reject => { 202 | $done(); 203 | }); 204 | } 205 | //$done(); 206 | }, reject => { 207 | // Normally will never happen. 208 | $done(); 209 | }); 210 | } 211 | 212 | 213 | async function testDisneyPlus(pname) { 214 | try { 215 | let { region, cnbl } = await Promise.race([testHomePage(pname), timeout(7000)]) 216 | //console.log(`homepage: region=${region}, cnbl=${cnbl}`) 217 | // 即将登陆 218 | // if (cnbl == 2) { 219 | // ResList.push(pname+": 即将登陆 「"+region+"」") //coming 220 | // console.log(pname+"22: 即将登陆"+region) 221 | // return { region, status: STATUS_COMING } 222 | // } 223 | let { countryCode, inSupportedLocation, accessToken } = await Promise.race([getLocationInfo(pname), timeout(7000)]) 224 | //console.log(`getLocationInfo: countryCode=${countryCode}, inSupportedLocation=${inSupportedLocation}`) 225 | 226 | region = countryCode ?? region 227 | // 即将登陆 228 | if (sign==0) { 229 | if (inSupportedLocation === false || inSupportedLocation === 'false') { 230 | ResList.push(pname+": 即将登陆 「"+region+"」") //coming 231 | console.log(pname+": 即将登陆 「"+region+"」") 232 | return { region, status: STATUS_COMING } 233 | } else { 234 | // 支持解锁 235 | 236 | OKList.push(pname+": 支持 「"+region+"」") 237 | console.log(pname+": 支持 「"+region+"」") 238 | return { region, status: STATUS_AVAILABLE } 239 | } 240 | let support = await Promise.race([testPublicGraphqlAPI(accessToken), timeout(7000)]) 241 | if (!support) { 242 | return { status: STATUS_NOT_AVAILABLE } 243 | } 244 | // 支持解锁 245 | return { region, status: STATUS_AVAILABLE } 246 | 247 | } // sign 248 | } catch (error) { 249 | //console.log(pname+": 检测错误"+error) 250 | //console.log("error:"+error) 251 | if (sign==0) { 252 | // 不支持解锁 253 | if (error === 'Not Available') { 254 | NoList.push(pname) 255 | console.log(pname+":不支持") 256 | return { status: STATUS_NOT_AVAILABLE } 257 | } 258 | 259 | // 检测超时 260 | if (error === 'Timeout') { 261 | timeoutList.push(pname) 262 | console.log(pname+":检测超时") 263 | return { status: STATUS_TIMEOUT } 264 | } 265 | 266 | return { status: STATUS_ERROR } 267 | } 268 | } 269 | 270 | } 271 | 272 | function getLocationInfo(pname) { 273 | opts = { 274 | policy:pname 275 | } 276 | return new Promise((resolve, reject) => { 277 | let opts0 = { 278 | url: 'https://disney.api.edge.bamgrid.com/graph/v1/device/graphql', 279 | method: "POST", 280 | opts: opts, 281 | headers: { 282 | 'Accept-Language': 'en', 283 | "Authorization": 'ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84', 284 | 'Content-Type': 'application/json', 285 | 'User-Agent': UA, 286 | }, 287 | body: JSON.stringify({ 288 | query: 'mutation registerDevice($input: RegisterDeviceInput!) { registerDevice(registerDevice: $input) { grant { grantType assertion } } }', 289 | variables: { 290 | input: { 291 | applicationRuntime: 'chrome', 292 | attributes: { 293 | browserName: 'chrome', 294 | browserVersion: '94.0.4606', 295 | manufacturer: 'apple', 296 | model: null, 297 | operatingSystem: 'macintosh', 298 | operatingSystemVersion: '10.15.7', 299 | osDeviceIds: [], 300 | }, 301 | deviceFamily: 'browser', 302 | deviceLanguage: 'en', 303 | deviceProfile: 'macosx', 304 | }, 305 | }, 306 | }), 307 | } 308 | 309 | $task.fetch(opts0).then(response => { 310 | let data = response.body 311 | //console.log("locationinfo:"+response.statusCode) 312 | if (response.statusCode !== 200) { 313 | //console.log('getLocationInfo: ' + data) 314 | reject('Not Available') 315 | return 316 | } else { 317 | let { 318 | token: { accessToken }, 319 | session: { 320 | inSupportedLocation, 321 | location: { countryCode }, 322 | }, 323 | } = JSON.parse(data)?.extensions?.sdk 324 | resolve({ inSupportedLocation, countryCode, accessToken }) 325 | } 326 | }, reason => { 327 | reject('Error') 328 | return 329 | }) 330 | }) 331 | } 332 | 333 | function testHomePage(pname) { 334 | opts = { 335 | policy : pname 336 | } 337 | return new Promise((resolve, reject) => { 338 | let opts0 = { 339 | url: 'https://www.disneyplus.com/', 340 | opts: opts, 341 | headers: { 342 | 'Accept-Language': 'en', 343 | 'User-Agent': UA, 344 | }, 345 | } 346 | $task.fetch(opts0).then(response => { 347 | let data = response.body 348 | //console.log("homepage"+response.statusCode) 349 | if (response.statusCode !== 200 || data.indexOf('not available in your') !== -1) { 350 | reject('Not Available') 351 | return 352 | } else { 353 | let match = data.match(/Region: ([A-Za-z]{2})[\s\S]*?CNBL: ([12])/) 354 | if (!match) { 355 | resolve({ region: '', cnbl: '' }) 356 | return 357 | } else { 358 | let region = match[1] 359 | let cnbl = match[2] 360 | //console.log("homepage"+region+cnbl) 361 | resolve({ region, cnbl }) 362 | } 363 | } 364 | }, reason => { 365 | reject('Error') 366 | return 367 | }) 368 | }) 369 | } 370 | 371 | function testPublicGraphqlAPI(accessToken) { 372 | return new Promise((resolve, reject) => { 373 | let opts = { 374 | url: 'https://disney.api.edge.bamgrid.com/v1/public/graphql', 375 | headers: { 376 | 'Accept-Language': 'en', 377 | Authorization: accessToken, 378 | 'Content-Type': 'application/json', 379 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36', 380 | }, 381 | body: JSON.stringify({ 382 | query: 383 | 'query($preferredLanguages: [String!]!, $version: String) {globalization(version: $version) { uiLanguage(preferredLanguages: $preferredLanguages) }}', 384 | variables: { version: '1.5.0', preferredLanguages: ['en'] }, 385 | }), 386 | } 387 | 388 | $task.fetch(opts).then( response => { 389 | 390 | resolve(response.status === 200) 391 | }, reason => { 392 | reject('Error') 393 | return 394 | }) 395 | }) 396 | } 397 | 398 | function timeout(delay = 5000) { 399 | return new Promise((resolve, reject) => { 400 | setTimeout(() => { 401 | reject('Timeout') 402 | }, delay) 403 | }) 404 | } 405 | 406 | -------------------------------------------------------------------------------- /Scripts/switch-check-google.js: -------------------------------------------------------------------------------- 1 | /*** 2 | 3 | For Quantumult-X 598+ ONLY!! 4 | 5 | [task_local] 6 | 7 | // UI 入口切换版本 8 | event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/switch-check-google.js, tag=Google Sifter, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/Google_Search.png, enabled=true 9 | 10 | // Cron 定时切换版本 11 | 0 8 * * * https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/switch-check-google.js#policy=你的策略组名, tag=Google 送中定时切换, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/Google_Search.png, enabled=true 12 | 13 | 14 | ps. 简单粗暴的 UI-Interaction 版本。无数据持久化、粗暴延迟等待。完美主义建议使用 Helge大佬的boxjs版本 https://t.me/QuanXNews/193 15 | 16 | @XIAO_KOP 17 | 18 | **/ 19 | 20 | //var policy = $environment.params 21 | var cronsign = $environment.executeType == 0 || $environment.executeType == "0" || $environment.executeType == "-1"? "Y" : "N" 22 | var policy = $environment.executeType == 0 || $environment.executeType == "0" || $environment.executeType == "-1"? GetPolicy($environment.sourcePath) : $environment.params 23 | console.log(JSON.stringify($environment)) 24 | console.log("策略组:"+policy) 25 | 26 | function GetPolicy(cnt) { 27 | if (cnt && cnt.indexOf("#policy=") !=-1) { 28 | return decodeURIComponent(cnt.split("#policy=")[1].trim()) 29 | }else { 30 | return "" 31 | } 32 | } 33 | 34 | const message = { 35 | action: "get_customized_policy", 36 | content: policy 37 | 38 | }; 39 | 40 | var output=[] 41 | var OKList=[] 42 | var NoList=["已被送中节点 ➟ "] 43 | var ErrorList=["检测出错节点 ➟ "] 44 | var pflag=1 //是否是策略,或者简单节点 45 | var sign=0 //是否停止 46 | 47 | $configuration.sendMessage(message).then(resolve => { 48 | if (resolve.error) { 49 | console.log(resolve.error); 50 | $done() 51 | } 52 | if (resolve.ret) { 53 | //console.log(JSON.stringify(resolve.ret)) 54 | output=JSON.stringify(resolve.ret[message.content])? JSON.parse(JSON.stringify(resolve.ret[message.content]["candidates"])) : [policy] 55 | pflag = JSON.stringify(resolve.ret[message.content])? pflag:0 56 | console.log("Google 送中检测 检测") 57 | console.log("节点or策略组:"+pflag) 58 | 59 | if (pflag==1) { 60 | console.log("节点数量:"+resolve.ret[policy]["candidates"].length) 61 | 62 | if(resolve.ret[policy]["candidates"].length==0) { 63 | $done({"title":"Google 送中检测","htmlMessage":`


😭 无有效节点`}); 64 | } 65 | } 66 | 67 | //$notify(typeof(output),output) 68 | Check() 69 | //$done({"title":"策略内容","message":output}) 70 | } 71 | }, reject => { 72 | // Normally will never happen. 73 | $done(); 74 | }); 75 | 76 | function Len(cnt) { 77 | return cnt.length-1 78 | } 79 | 80 | function Check() { 81 | var relay = 2000; 82 | for ( var i=0;i < output.length;i++) { 83 | testGoogle(output[i]) 84 | } 85 | if (output.length<=5) { 86 | relay = 2000 87 | } else if (output.length<10) { 88 | relay =4000 89 | } else if (output.length<15) { 90 | relay =6000 91 | } else if (output.length<20) { 92 | relay =8000 93 | } else { 94 | relay =10000 95 | } 96 | console.log(output.length+":"+relay) 97 | setTimeout(() => { 98 | console.log("⛳️ 共计 "+OKList.length+" 个:未送中节点 ➟ "+ OKList) 99 | console.log("🏠 共计 "+Len(NoList)+" 个:"+NoList) 100 | console.log("🕹 共计 "+Len(ErrorList)+" 个:"+ErrorList) 101 | sign=1 102 | if (OKList[0] && pflag==1) { //有支持节点、且为策略组才操作 103 | ReOrder(OKList) 104 | } else if (!OKList[0]){ //不支持 105 | content =pflag==0 ? `


😭 该节点已被 Google 送中

👇

-------------------------
⟦ `+policy+` ⟧
-------------------------
`: `

` + "
⟦ "+policy+ " ⟧ ⚠️ 切换失败

该策略组内未找到未被 Google 送中 的节点" + "

-----------------------------
检测详情请查看JS脚本记录
-----------------------------
"+`

` 106 | //为节点且检测超时/出错 107 | content = pflag==0 && Len(NoList)==0 ? content = `


⚠️ 该节点 Google 送中检测失败

👇

-------------------------
⟦ `+policy+` ⟧
-------------------------
`: content 108 | $done({"title":"Google 送中检测&切换", "htmlMessage": content}) 109 | } else if (OKList[0]){ //支持, 但为节点 110 | content = `


🎉 该节点未被 Google 送中

👇

-------------------------
⟦ `+policy+` ⟧
-------------------------
` 111 | $done({"title":"Google 送中检测&切换", "htmlMessage": content}) 112 | } 113 | }, relay) 114 | 115 | } 116 | 117 | //选择最优延迟节点 118 | function ReOrder(cnt) { 119 | const array = cnt; 120 | const messageURL = { 121 | action: "url_latency_benchmark", 122 | content: array 123 | }; 124 | $configuration.sendMessage(messageURL).then(resolve => { 125 | if (resolve.error) { 126 | console.log(resolve.error); 127 | } 128 | if (resolve.ret) { 129 | let output=JSON.stringify(resolve.ret); 130 | console.log("节点延迟:"+output); 131 | //排序 132 | console.log("排序前: "+ array) 133 | if(array){ 134 | try { 135 | array.sort(function (a,b) { 136 | //console.log(a+" VS "+b) 137 | return (resolve.ret[a][1]!=-1 && resolve.ret[b][1] !=-1)? resolve.ret[a][1]-resolve.ret[b][1] : resolve.ret[b][1] 138 | }) 139 | } catch (err) { 140 | console.log(err) 141 | } 142 | } 143 | console.log("排序后: "+array) 144 | let Ping =resolve.ret[array[0]] 145 | const dict = { [policy] : array[0]}; 146 | if(array[0]) { 147 | console.log("选定未被送中节点:"+array[0]+"延迟数据为 👉"+Ping) 148 | Ping = " ⚡️ 节点延迟 ➟ 「 "+Ping + " 」 " 149 | } 150 | const mes1 = { 151 | action: "set_policy_state", 152 | content: dict 153 | }; 154 | $configuration.sendMessage(mes1).then(resolve => { 155 | if (resolve.error) { 156 | console.log(resolve.error); 157 | content =pflag==0 && array[0]? `


🎉 该节点未被 Google 送中

👇

-------------------------
⟦ `+policy+` ⟧
-------------------------
` : `


😭 该节点已被 Google 送中

👇

-------------------------
⟦ `+policy+` ⟧
-------------------------
` 158 | content = pflag!=0 && !array[0]? `

` + "
⟦ "+policy+ " ⟧ ⚠️ 切换失败

该策略组内未找到未被 Google 送中 的节点" + "

-----------------------------
检测详情请查看JS脚本记录
-----------------------------
"+`

` : content 159 | $done({"title":"Google 送中检测&切换", "htmlMessage": content}) 160 | } 161 | if (resolve.ret) { 162 | console.log("已经切换至未被 Google 送中 的路线中延迟最优节点 ➟ "+array[0]) 163 | if (cronsign == "Y") { $notify("🐸 Google 定时送中检测&切换", "🎉 已切换至未被送中的最优延迟线路👇", array[0] +"\n 👉 "+Ping)} 164 | content = `

` + "
⟦ "+policy+ " ⟧ 已切换至未被Google 送中延迟最优路线

👇

⟦ "+array[0]+ " ⟧" + "

"+Ping+"
-----------------------------
检测详情请查看JS脚本记录
-----------------------------
"+`

` 165 | $done({"title":"Google 送中检测&切换", "htmlMessage": content }) 166 | } 167 | }, reject => { 168 | $done(); 169 | }); 170 | 171 | } 172 | //$done(); 173 | }, reject => { 174 | // Normally will never happen. 175 | $done(); 176 | }); 177 | } 178 | 179 | 180 | function testGoogle(pname) { 181 | return new Promise((resolve, reject) => { 182 | const url = `https://www.google.com/maps/timeline`; 183 | let opts = { policy : pname } 184 | const method = `GET`; 185 | const headers = { 186 | 'Accept-Encoding' : `gzip, deflate, br`, 187 | 'Connection' : `keep-alive`, 188 | 'Accept' : `text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8`, 189 | 'Host' : `www.google.com`, 190 | 'User-Agent' : `Mozilla/5.0 (iPhone; CPU iPhone OS 15_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.1 Mobile/15E148 Safari/604.1`, 191 | 'Accept-Language' : `zh-CN,zh-Hans;q=0.9` 192 | }; 193 | const body = ``; 194 | const myRequest = { 195 | url: url, 196 | method: method, 197 | headers: headers, 198 | body: body, 199 | opts: opts, 200 | //timeout: 3000 201 | }; 202 | 203 | $task.fetch(myRequest).then(response => { 204 | let sCode = response.statusCode 205 | hmessage = "该节点未被送中" 206 | //console.log(pname+sCode); 207 | if (sign==0) { 208 | if (sCode == 400) { 209 | NoList.push(pname) 210 | console.log(pname + ": 该节点已被送中 ->" +sCode) 211 | resolve("YES") 212 | return 213 | } else { 214 | OKList.push(pname)//结束前推送 215 | console.log(pname + ": 该节点未被送中 ->" +sCode) 216 | resolve("No") 217 | return 218 | } 219 | } else { 220 | return 221 | } 222 | }, reason => { 223 | if (sign==0) { 224 | ErrorList.push(pname) 225 | console.log(pname + ": 该节点检测失败") 226 | reject("Error") 227 | } 228 | return 229 | }); 230 | }) 231 | } 232 | 233 | 234 | -------------------------------------------------------------------------------- /Scripts/switch-check-nf.js: -------------------------------------------------------------------------------- 1 | /*** 2 | 3 | Thanks to & modified from 4 | 1. https://gist.githubusercontent.com/Hyseen/b06e911a41036ebc36acf04ddebe7b9a/raw/nf_check.js 5 | 6 | For Quantumult-X 598+ ONLY!! 7 | 8 | [task_local] 9 | 10 | //UI 查询版本 11 | event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/switch-check-nf.js, tag=Netflix 切换, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/Netflix_Letter.png, enabled=true 12 | 13 | //cron 版本 14 | 0 8 * * * https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/switch-check-nf.js#policy=你的策略组名, tag=Netflix 定时切换, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/Netflix_Letter.png, enabled=true 15 | 16 | ps. 简单粗暴的 UI-Interaction 版本。无数据持久化、粗暴延迟等待。完美主义建议使用 Helge大佬的boxjs版本 https://t.me/QuanXNews/193 17 | 18 | @XIAO_KOP 19 | 20 | **/ 21 | 22 | const BASE_URL = 'https://www.netflix.com/title/' 23 | 24 | const FILM_ID = 81280792 25 | const link = { "media-url": "https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/img/southpark/7.png" } 26 | const policy_name = "Netflix" //填入你的 netflix 策略组名 27 | 28 | var cronsign = $environment.executeType == 0 || $environment.executeType == "0" || $environment.executeType == "-1"? "Y" : "N" 29 | var policy = $environment.executeType == 0 || $environment.executeType == "0" || $environment.executeType == "-1"? GetPolicy($environment.sourcePath) : $environment.params 30 | console.log(JSON.stringify($environment)) 31 | console.log("策略组:"+policy) 32 | 33 | function GetPolicy(cnt) { 34 | if (cnt && cnt.indexOf("#policy=") !=-1) { 35 | return decodeURIComponent(cnt.split("#policy=")[1].trim()) 36 | }else { 37 | return "" 38 | } 39 | } 40 | 41 | const message = { 42 | action: "get_customized_policy", 43 | content: policy 44 | 45 | }; 46 | 47 | var output=[] 48 | var OKList=[] 49 | var ResList=["仅支持自制剧节点 ➟ "] 50 | var NoList=["不支持节点 ➟ "] 51 | var timeoutList=["检测超时节点 ➟ "] 52 | var pflag=1 //是否是策略,或者简单节点 53 | var sign = 0 // 是否结束标志 54 | 55 | 56 | $configuration.sendMessage(message).then(resolve => { 57 | if (resolve.error) { 58 | console.log(resolve.error); 59 | $done() 60 | } 61 | if (resolve.ret) { 62 | output=JSON.stringify(resolve.ret[message.content])? JSON.parse(JSON.stringify(resolve.ret[message.content]["candidates"])) : [policy] 63 | pflag = JSON.stringify(resolve.ret[message.content])? pflag:0 64 | console.log("Netflix 支持检测") 65 | console.log("节点or策略组:"+pflag) 66 | if (pflag==1) { 67 | console.log("节点数量:"+resolve.ret[policy]["candidates"].length) 68 | if(resolve.ret[policy]["candidates"].length==0) { 69 | $done({"title":"Netflix 检测&切换","htmlMessage":`


😭 无有效节点`}); 70 | } 71 | } 72 | //$notify(typeof(output),output) 73 | Check() 74 | //$done({"title":"策略内容","message":output}) 75 | } 76 | //$done();| 77 | }, reject => { 78 | // Normally will never happen. 79 | $done(); 80 | }); 81 | 82 | function Len(cnt) { 83 | return cnt.length-1 84 | } 85 | 86 | function Check() { 87 | var relay = 2000; 88 | for ( var i=0;i < output.length;i++) { 89 | testNF(output[i]) 90 | } 91 | if (output.length<=3) { 92 | relay = 3500 93 | } else if (output.length<=5) { 94 | relay = 4000 95 | } else if (output.length<10) { 96 | relay =4500 97 | } else if (output.length<15) { 98 | relay =6500 99 | } else if (output.length<20) { 100 | relay =8500 101 | } else if (output.length<50){ 102 | relay =11000 103 | } else { 104 | relay =13000 105 | } 106 | console.log(output.length+":"+relay) 107 | setTimeout(() => { 108 | console.log("⛳️ 共计 "+OKList.length+" 个:完整支持节点 ➟"+ OKList) 109 | console.log("🏠 共计 "+Len(NoList)+" 个:"+NoList) 110 | console.log("🕹 共计 "+Len(timeoutList)+" 个:"+timeoutList) 111 | sign=1 112 | if (OKList[0] && pflag==1) { 113 | console.log("开始排序") 114 | ReOrder(OKList) 115 | } else if (!OKList[0]){ //不支持 116 | content =pflag==0 ? `


😭 该节点未完整支持 Netflix

👇

-------------------------
⟦ `+policy+` ⟧
-------------------------
`: `

` + "
⟦ "+policy+ " ⟧ ⚠️ 切换失败

该策略组内未找到完整支持 Netflix 的节点" + "

-----------------------------
检测详情请查看JS脚本记录
-----------------------------
"+`

` 117 | $done({"title":"Netflix 检测&切换", "htmlMessage": content}) 118 | } else if (OKList[0]){ //支持, 但为节点 119 | content =`


🎉 该节点完整支持 Netflix

👇

-------------------------
⟦ `+policy+` ⟧
-------------------------
` 120 | //content = `


🎉 该节点支持 Disneyᐩ ➟` + OKList[0].split(": 支持 ")[1]+`

👇

-------------------------
⟦ `+policy+` ⟧
-------------------------
` 121 | $done({"title":"Netflix 检测&切换", "htmlMessage": content}) 122 | } 123 | }, relay) 124 | 125 | } 126 | 127 | //选择最优延迟节点 128 | function ReOrder(cnt) { 129 | const array = cnt; 130 | const messageURL = { 131 | action: "url_latency_benchmark", 132 | content: array 133 | }; 134 | $configuration.sendMessage(messageURL).then(resolve => { 135 | if (resolve.error) { 136 | console.log(resolve.error); 137 | } 138 | if (resolve.ret) { 139 | let output=JSON.stringify(resolve.ret); 140 | console.log("节点延迟:"+output); 141 | //排序 142 | console.log("排序前: "+ array) 143 | if(array){ 144 | try { 145 | array.sort(function (a,b) { 146 | //console.log(a+" VS "+b) 147 | return (resolve.ret[a][1]!=-1 && resolve.ret[b][1] !=-1)? resolve.ret[a][1]-resolve.ret[b][1] : resolve.ret[b][1] 148 | }) 149 | } catch (err) { 150 | console.log(err) 151 | } 152 | } 153 | console.log("排序后: "+array) 154 | let Ping =resolve.ret[array[0]] 155 | const dict = { [policy] : array[0]}; 156 | if(array[0]) { 157 | console.log("选定完整支持节点:"+array[0]+"延迟数据为 👉"+Ping) 158 | Ping = " ⚡️ 节点延迟 ➟ 「 "+Ping + " 」 " 159 | } 160 | const mes1 = { 161 | action: "set_policy_state", 162 | content: dict 163 | }; 164 | $configuration.sendMessage(mes1).then(resolve => { 165 | if (resolve.error) { 166 | console.log(resolve.error); 167 | content =pflag==0 && array[0]? `

` + "
⟦ "+policy+ " ⟧

🎉 该节点完整支持 Netflix" + `

` : `

` + "
⟦ "+policy+ " ⟧

⚠️ 该节点不支持 Netflix" + `

` 168 | content =pflag==0 && ResList[1]? `

` + "
⟦ "+policy+ " ⟧

🚦 该节点仅支持 Netflix 自制剧集" + `

` : content 169 | 170 | content = pflag!=0 && !array[0]? `

` + "
⟦ "+policy+ " ⟧ ⚠️ 切换失败

该策略组内未找到完整支持 Netflix 的节点" + "

-----------------------------
检测详情请查看JS脚本记录
-----------------------------"+`

` : content 171 | $done({"title":"Netflix 检测&切换", "htmlMessage": content}) 172 | } 173 | if (resolve.ret) { 174 | console.log("已经切换至完整支持的路线 ➟ "+array[0]) 175 | if (cronsign == "Y") { $notify("📺 Netflix 定时检测&切换", "🎉 已经切换至支持 Netflix 的最优延迟线路👇", array[0] +"\n 👉 "+Ping)} 176 | content = `

` + "
⟦ "+policy+ " ⟧ 已切换至完整支持的路线中延迟最优节点

👇

⟦ "+array[0]+ " ⟧" + "

"+Ping+"
-----------------------------
检测详情请查看JS脚本记录
-----------------------------"+`

` 177 | $done({"title":"Netflix 检测&切换", "htmlMessage": content }) 178 | } 179 | }, reject => { 180 | $done(); 181 | }); 182 | 183 | } 184 | //$done(); 185 | }, reject => { 186 | // Normally will never happen. 187 | $done(); 188 | }); 189 | } 190 | 191 | 192 | function testNF(pname ) { 193 | return new Promise((resolve, reject) => { 194 | //console.log(pname) 195 | let opts = { policy : pname } 196 | let option = { 197 | url: BASE_URL + FILM_ID, 198 | opts: opts, 199 | headers: { 200 | 'User-Agent': 201 | 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36', 202 | }, 203 | } 204 | $task.fetch(option).then (response => { 205 | if (sign==0) { 206 | if (response.statusCode === 404) { 207 | NoList.push(pname) 208 | console.log(pname+": "+"未支持") 209 | resolve('Not Found') 210 | return 211 | } 212 | 213 | if (response.statusCode === 403) { 214 | ResList.push(pname) 215 | console.log(pname+": "+"仅支持自制剧集") 216 | resolve('Not Available') 217 | return 218 | } 219 | 220 | if (response.statusCode === 200) { 221 | console.log(pname+": "+"完整支持") 222 | let url = response.headers['X-Originating-URL'] 223 | let region = url.split('/')[3] 224 | region = region.split('-')[0] 225 | if (region == 'title') { 226 | region = 'us' 227 | } 228 | OKList.push(pname) 229 | resolve(region) 230 | return 231 | } 232 | } else { 233 | console.log(pname+": 检测超时") 234 | timeoutList.push(pname) 235 | resolve("Erroe") 236 | return 237 | 238 | } 239 | reject('Error') 240 | }) 241 | }) 242 | } 243 | 244 | 245 | -------------------------------------------------------------------------------- /Scripts/switch-check-ytb.js: -------------------------------------------------------------------------------- 1 | /*** 2 | 3 | For Quantumult-X 598+ ONLY!! 4 | 5 | [task_local] 6 | 7 | // UI 查询版本 8 | event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/switch-check-ytb.js, tag=YouTube 切换, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/YouTube_Letter.png, enabled=true 9 | 10 | // cron task 版本 11 | 0 8 * * * https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/switch-check-ytb.js#policy=你的策略组, tag=YouTube 定时切换, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/YouTube_Letter.png, enabled=true 12 | 13 | ps. 简单粗暴的 UI-Interaction 版本。无数据持久化、粗暴延迟等待。完美主义建议使用 Helge大佬的boxjs版本 https://t.me/QuanXNews/193 14 | 15 | @XIAO_KOP 16 | 17 | 2022-07-04 18 | 19 | **/ 20 | 21 | const BASE_URL = 'https://www.youtube.com/premium' 22 | 23 | const link = { "media-url": "https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/img/southpark/7.png" } 24 | var cronsign = $environment.executeType == 0 || $environment.executeType == "0" || $environment.executeType == "-1"? "Y" : "N" 25 | var policy = $environment.executeType == 0 || $environment.executeType == "0" || $environment.executeType == "-1"? GetPolicy($environment.sourcePath) : $environment.params 26 | console.log(JSON.stringify($environment)) 27 | console.log("策略组:"+policy) 28 | 29 | function GetPolicy(cnt) { 30 | if (cnt && cnt.indexOf("#policy=") !=-1) { 31 | return decodeURIComponent(cnt.split("#policy=")[1].trim()) 32 | }else { 33 | return "" 34 | } 35 | } 36 | 37 | const message = { 38 | action: "get_customized_policy", 39 | content: policy 40 | 41 | }; 42 | 43 | var output=[] 44 | var OKList=[] 45 | var NoList=["不支持节点 ➟ "] 46 | var ErrorList=["检测出错节点 ➟ "] 47 | var pflag=1 //是否是策略,或者简单节点 48 | var sign=0 49 | 50 | $configuration.sendMessage(message).then(resolve => { 51 | if (resolve.error) { 52 | console.log(resolve.error); 53 | $done() 54 | } 55 | if (resolve.ret) { 56 | //$notify(JSON.stringify(resolve.ret)) 57 | output=JSON.stringify(resolve.ret[message.content])? JSON.parse(JSON.stringify(resolve.ret[message.content]["candidates"])) : [policy] 58 | pflag = JSON.stringify(resolve.ret[message.content])? pflag:0 59 | console.log("YouTube Premium 检测") 60 | console.log("节点or策略组:"+pflag) 61 | if (pflag==1) { 62 | console.log("节点数量:"+resolve.ret[policy]["candidates"].length) 63 | if(resolve.ret[policy]["candidates"].length==0) { 64 | $done({"title":"YouTube Premium 检测","htmlMessage":`


😭 无有效节点`}); 65 | } 66 | } 67 | 68 | //$notify(typeof(output),output) 69 | Check() 70 | //$done({"title":"策略内容","message":output}) 71 | } 72 | //$done();| 73 | }, reject => { 74 | // Normally will never happen. 75 | $done(); 76 | }); 77 | 78 | function Len(cnt) { 79 | return cnt.length-1 80 | } 81 | 82 | function Check() { 83 | var relay = 2000; 84 | for ( var i=0;i < output.length;i++) { 85 | testYTB(output[i]) 86 | } 87 | if (output.length<=5) { 88 | relay = 2000 89 | } else if (output.length<10) { 90 | relay =4000 91 | } else if (output.length<15) { 92 | relay =6000 93 | } else if (output.length<20) { 94 | relay =8000 95 | } else { 96 | relay =10000 97 | } 98 | console.log(output.length+":"+relay) 99 | setTimeout(() => { 100 | console.log("⛳️ 共计 "+OKList.length+" 个:支持节点 ➟ "+ OKList) 101 | console.log("🏠 共计 "+Len(NoList)+" 个:"+NoList) 102 | console.log("🕹 共计 "+Len(ErrorList)+" 个:"+ErrorList) 103 | sign = 1 104 | if (OKList[0] && pflag==1) { //有支持节点、且为策略组才操作 105 | console.log("开始排序") 106 | ReOrder(OKList) 107 | } else if (!OKList[0]){ //不支持 108 | content =pflag==0 ? `


😭 该节点不支持 YouTube Premium

👇

-------------------------
⟦ `+policy+` ⟧
-------------------------
`: `

` + "
⟦ "+policy+ " ⟧ ⚠️ 切换失败

该策略组内未找到支持 YouTube Premium 的节点" + "

-----------------------------
检测详情请查看JS脚本记录
-----------------------------
"+`

` 109 | $done({"title":"YouTube Premium 检测&切换", "htmlMessage": content}) 110 | } else if (OKList[0]){ //支持, 但为节点 111 | content =`


🎉 该节点支持 YouTube Premium

👇

-------------------------
⟦ `+policy+` ⟧
-------------------------
` 112 | $done({"title":"YouTube Premium 检测&切换", "htmlMessage": content}) 113 | } 114 | }, relay) 115 | 116 | } 117 | 118 | //选择最优延迟节点 119 | function ReOrder(cnt) { 120 | const array = cnt; 121 | const messageURL = { 122 | action: "url_latency_benchmark", 123 | content: array 124 | }; 125 | $configuration.sendMessage(messageURL).then(resolve => { 126 | if (resolve.error) { 127 | console.log(resolve.error); 128 | } 129 | if (resolve.ret) { 130 | let output=JSON.stringify(resolve.ret); 131 | console.log("节点延迟:"+output); 132 | //排序 133 | console.log("排序前: "+ array) 134 | if(array){ 135 | try { 136 | array.sort(function (a,b) { 137 | //console.log(a+" VS "+b) 138 | return (resolve.ret[a][1]!=-1 && resolve.ret[b][1] !=-1)? resolve.ret[a][1]-resolve.ret[b][1] : resolve.ret[b][1] 139 | }) 140 | } catch (err) { 141 | console.log(err) 142 | } 143 | } 144 | console.log("排序后: "+array) 145 | let Ping =resolve.ret[array[0]] 146 | const dict = { [policy] : array[0]}; 147 | if(array[0]) { 148 | console.log("选定支持YouTube Premium:"+array[0]+"延迟数据为 👉"+Ping) 149 | Ping = " ⚡️ 节点延迟 ➟ 「 "+Ping + " 」 " 150 | } 151 | const mes1 = { 152 | action: "set_policy_state", 153 | content: dict 154 | }; 155 | $configuration.sendMessage(mes1).then(resolve => { 156 | if (resolve.error) { 157 | console.log(resolve.error); 158 | content =pflag==0 && array[0]? `

` + "
⟦ "+policy+ " ⟧

🎉 该节点支持 YouTube Premium" + `

` : `

` + "
⟦ "+policy+ " ⟧

⚠️ 该节点不支持 YouTube Premium" + `

` 159 | content = pflag!=0 && !array[0]? `

` + "
⟦ "+policy+ " ⟧ ⚠️ 切换失败

该策略组内未找到支持 YouTube Premium 的节点" + "

-----------------------------
检测详情请查看JS脚本记录
-----------------------------"+`

` : content 160 | $done({"title":"YouTube 检测&切换", "htmlMessage": content}) 161 | } 162 | if (resolve.ret) { 163 | console.log("已经切换至支持 Premium 的路线 ➟ "+array[0]) 164 | if (cronsign == "Y") { $notify("📺 YouTube Premium 定时检测&切换", "🎉 已经切换至支持 Premium 的最优延迟线路👇", array[0] +"\n 👉 "+Ping)} 165 | content = `

` + "
⟦ "+policy+ " ⟧ 已切换至支持Premium 的路线中延迟最优节点

👇

⟦ "+array[0]+ " ⟧" + "

"+Ping+"
-----------------------------
检测详情请查看JS脚本记录
-----------------------------"+`

` 166 | $done({"title":"YouTube 检测&切换", "htmlMessage": content }) 167 | } 168 | }, reject => { 169 | $done(); 170 | }); 171 | 172 | } 173 | //$done(); 174 | }, reject => { 175 | // Normally will never happen. 176 | $done(); 177 | }); 178 | } 179 | 180 | 181 | function testYTB(pname) { 182 | return new Promise((resolve, reject) => { 183 | let opts = { policy : pname } 184 | let option = { 185 | url: BASE_URL, 186 | opts: opts, 187 | headers: { 188 | 'User-Agent': 189 | 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36', 190 | 'Accept-Language': 'en', 191 | }, 192 | } 193 | $task.fetch(option).then(response=> { 194 | let data = response.body 195 | //console.log(response.statusCode) 196 | if (sign==0) { 197 | if (response.statusCode !== 200) { 198 | console.log(pname+":检测出错") 199 | ErrorList.push(pname) 200 | reject('Error') 201 | return 202 | } 203 | 204 | if (data.indexOf('Premium is not available in your country') !== -1) { 205 | console.log(pname+":未支持") 206 | NoList.push(pname) 207 | resolve('Not Available') 208 | return 209 | } 210 | 211 | let region = '' 212 | let re = new RegExp('"GL":"(.*?)"', 'gm') 213 | let result = re.exec(data) 214 | if (result != null && result.length === 2) { 215 | region = result[1] 216 | } else if (data.indexOf('www.google.cn') !== -1) { 217 | region = 'CN' 218 | } else { 219 | region = 'US' 220 | } 221 | console.log(pname+":支持"+region) 222 | OKList.push(pname) 223 | resolve(region) 224 | } 225 | reject('Error') 226 | }) 227 | }) 228 | } 229 | 230 | 231 | -------------------------------------------------------------------------------- /Scripts/traffic-check.js: -------------------------------------------------------------------------------- 1 | /*** 2 | 3 | For Quantumult-X 631+ ONLY!! 4 | 5 | [task_local] 6 | 7 | event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/traffic-check.js, tag=策略流量查询, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/Download.png, enabled=true 8 | 9 | ps. 简单查询策略/策略组流量使用统计(仅支持一/二级策略) 10 | 11 | @XIAO_KOP 12 | 13 | **/ 14 | 15 | const messageTraffic = { 16 | action: "get_traffic_statistics" 17 | }; 18 | 19 | let version = Number($environment.version.split("build")[1]) 20 | 21 | let result = { 22 | "title" : "策略流量查詢" 23 | } 24 | 25 | var policy = $environment.params 26 | const message = { 27 | action: "get_customized_policy", 28 | content: policy 29 | 30 | }; 31 | 32 | let [datad, datau]= [0, 0] //总下载/上传流量 33 | var checked = [] // 已经检查的节点名单 34 | var checkedtraffic = [] //已检查节点的总用量 35 | 36 | var pflag=1 //是否是策略,或者简单节点 37 | 38 | //策略组 or 节点 39 | $configuration.sendMessage(message).then(resolve => { 40 | if (resolve.error) { 41 | console.log(resolve.error); 42 | $done() 43 | } 44 | if (resolve.ret) { 45 | output=JSON.stringify(resolve.ret[message.content])? JSON.parse(JSON.stringify(resolve.ret[message.content]["candidates"])) : [$environment.params] 46 | pflag = JSON.stringify(resolve.ret[message.content])? pflag:0 47 | console.log("节点or策略组:"+pflag) 48 | if (version >=631) { 49 | console.log("Build "+version) 50 | DisplayNodeTraffic(output,pflag) 51 | } else { 52 | console.log("Build "+version) 53 | $done({"title":result["title"],"message":"🚫 你的 APP 版本不支持使用此脚本\n\n💡 需要版本 1.0.28(631+)"}) 54 | } 55 | 56 | } 57 | //$done();| 58 | }, reject => { 59 | // Normally will never happen. 60 | $done(); 61 | }); 62 | 63 | function getJsonLength(jsonData){ 64 | var jsonLength = 0; 65 | for(var item in jsonData){ 66 | jsonLength++; 67 | } 68 | return jsonLength; 69 | } 70 | 71 | 72 | // 计算流量信息 73 | var [Tdatad,Tdatau,Udatad,Udatau]=[0,0,0,0] 74 | var total = 0 75 | var gdnode = 0 76 | var gdname = policy 77 | 78 | function getServerTraffic(data,nodes){ 79 | //console.log(data.name) 80 | let type = data.type 81 | let nname = data.name 82 | //console.log("下载用量:"+(data.rx_transfer/1024/1024).toFixed(1)+"MB") 83 | if (nodes.indexOf(nname) != -1) { 84 | if (type == "tcp") { 85 | //console.log(typeof(Tdatad),typeof(Tdatau)) 86 | Tdatad=(Number(Tdatad)+data.rx_transfer/1024/1024) 87 | Tdatau=(Number(Tdatau)+data.tx_transfer/1024/1024) 88 | //console.log(Tdatad,Tdatau) 89 | } else if (type == "udp") { 90 | Udatad=(Number(Udatad)+data.rx_transfer/1024/1024) 91 | Udatau=(Number(Udatau)+data.tx_transfer/1024/1024) 92 | } 93 | let total = (data.rx_transfer+data.tx_transfer)/1024/1024 94 | if (checked.indexOf(nname)==-1) { 95 | checked.push(nname) 96 | checkedtraffic.push(total) 97 | } else { 98 | checkedtraffic[checked.indexOf(nname)]=checkedtraffic[checked.indexOf(nname)]+total 99 | } 100 | } else { 101 | } 102 | } 103 | 104 | //流量排序 105 | function Rank(){ 106 | console.log(checked) 107 | console.log(checkedtraffic) 108 | checked.sort((prev,next)=> { 109 | return checkedtraffic[checked.indexOf(next)]-checkedtraffic[checked.indexOf(prev)] 110 | }) 111 | checkedtraffic.sort((prev,next)=> { 112 | return next-prev 113 | }) 114 | console.log(checkedtraffic.map(item => item.toFixed(1))) 115 | let rst = checked.map((name, i) => ([i+1,name,CUnit(checkedtraffic[i])].join(": "))) 116 | console.log(rst.join("\n")) 117 | let msg = "" 118 | if (checked.length>=3) { 119 | msg = "
🥇 "+checked[0]+" ☞ "+CUnit(checkedtraffic[0])+"

🥈 "+checked[1]+" ☞ "+CUnit(checkedtraffic[1])+"

🥉 "+checked[2]+" ☞ "+CUnit(checkedtraffic[2]) 120 | } else if (checked.length==2) { 121 | msg = "
🥇 "+checked[0]+" ☞ "+CUnit(checkedtraffic[0])+"

🥈 "+checked[1]+" ☞ "+CUnit(checkedtraffic[1]) 122 | } else if (checked.length==1) { 123 | msg = "
🥇 "+checked[0]+" ☞ "+CUnit(checkedtraffic[0]) 124 | } 125 | //msg = `

` + msg + `

` 126 | msg = msg!=""? ""+msg+"" :"

无使用节点流量记录
" 127 | return msg 128 | } 129 | 130 | //查询流量 131 | function DisplayNodeTraffic(nodes,pflag) { 132 | $configuration.sendMessage(messageTraffic).then(resolve => { 133 | if (resolve.error) { 134 | console.log(resolve.error); 135 | } 136 | if (resolve.ret) { 137 | let output=JSON.stringify(resolve.ret, null, 2); 138 | let len = getJsonLength(resolve.ret) 139 | for (var item in resolve.ret) { 140 | getServerTraffic(resolve.ret[item],nodes) 141 | } 142 | //console.log(output); 143 | content = NodeData(nodes,pflag); 144 | //console.log(content) 145 | $done({"title":result["title"],"htmlMessage":content}) 146 | } 147 | $done(); 148 | }, reject => { 149 | // Normally not gonna happen. 150 | $done(); 151 | }); 152 | } 153 | 154 | //单位展示 155 | function CUnit(cnt) { 156 | cnt = Number(cnt)>=1024? (cnt/1024).toFixed(2)+" GB " : cnt.toFixed(1)+" MB " 157 | return cnt 158 | } 159 | 160 | function NodeData(nodes,pflag){ 161 | datad = "TCP : "+" "+CUnit(Tdatad)+"⟱ | "+CUnit(Tdatau)+"⟰ " 162 | datau = "UDP : "+" "+CUnit(Udatad)+"⟱ | "+CUnit(Udatau)+"⟰ " 163 | total = CUnit(Tdatad+Tdatau+Udatad+Udatau) 164 | Ncontent = "--------------------------------------

"+[datad,datau].join("

")+ "

--------------------------------------

" 165 | Ncontent = pflag == 0? Ncontent+""+"节点 ➟ " + policy+ " ☞ "+total+" 流量
" : ""+" 策略 ➟ " + policy+ "

共 『"+checked.length+"/"+nodes.length+"』 个节点 ☞ "+total+" 流量
"+Ncontent+" 🏆 排行榜
" 166 | Ncontent = pflag == 0? Ncontent : Ncontent +Rank() 167 | Ncontent = `

` + Ncontent + `

` 168 | //console.log(Ncontent) 169 | return Ncontent 170 | } 171 | 172 | -------------------------------------------------------------------------------- /Scripts/ytb-ui-check.js: -------------------------------------------------------------------------------- 1 | /*** 2 | 3 | Thanks to & modified from https://gist.githubusercontent.com/Hyseen/b06e911a41036ebc36acf04ddebe7b9a/raw/nf_check.js 4 | 5 | For Quantumult-X 598+ 6 | 7 | [task_local] 8 | 9 | event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/ytb-ui-check.js, tag=YouTube 查询, img-url=text.magnifyingglass.system, enabled=true 10 | 11 | @XIAO_KOP 12 | 13 | **/ 14 | 15 | 16 | const BASE_URL = 'https://www.youtube.com/premium' 17 | 18 | const FILM_ID = 81215567 19 | const link = { "media-url": "https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/img/southpark/7.png" } 20 | 21 | const arrow = "➟" 22 | var output = "" 23 | var opts = { 24 | policy: $environment.params 25 | }; 26 | 27 | 28 | var flags = new Map([[ "AC" , "🇦🇨" ] ,["AE","🇦🇪"], [ "AF" , "🇦🇫" ] , [ "AI" , "🇦🇮" ] , [ "AL" , "🇦🇱" ] , [ "AM" , "🇦🇲" ] , [ "AQ" , "🇦🇶" ] , [ "AR" , "🇦🇷" ] , [ "AS" , "🇦🇸" ] , [ "AT" , "🇦🇹" ] , [ "AU" , "🇦🇺" ] , [ "AW" , "🇦🇼" ] , [ "AX" , "🇦🇽" ] , [ "AZ" , "🇦🇿" ] , ["BA", "🇧🇦"], [ "BB" , "🇧🇧" ] , [ "BD" , "🇧🇩" ] , [ "BE" , "🇧🇪" ] , [ "BF" , "🇧🇫" ] , [ "BG" , "🇧🇬" ] , [ "BH" , "🇧🇭" ] , [ "BI" , "🇧🇮" ] , [ "BJ" , "🇧🇯" ] , [ "BM" , "🇧🇲" ] , [ "BN" , "🇧🇳" ] , [ "BO" , "🇧🇴" ] , [ "BR" , "🇧🇷" ] , [ "BS" , "🇧🇸" ] , [ "BT" , "🇧🇹" ] , [ "BV" , "🇧🇻" ] , [ "BW" , "🇧🇼" ] , [ "BY" , "🇧🇾" ] , [ "BZ" , "🇧🇿" ] , [ "CA" , "🇨🇦" ] , [ "CF" , "🇨🇫" ] , [ "CH" , "🇨🇭" ] , [ "CK" , "🇨🇰" ] , [ "CL" , "🇨🇱" ] , [ "CM" , "🇨🇲" ] , [ "CN" , "🇨🇳" ] , [ "CO" , "🇨🇴" ] , [ "CP" , "🇨🇵" ] , [ "CR" , "🇨🇷" ] , [ "CU" , "🇨🇺" ] , [ "CV" , "🇨🇻" ] , [ "CW" , "🇨🇼" ] , [ "CX" , "🇨🇽" ] , [ "CY" , "🇨🇾" ] , [ "CZ" , "🇨🇿" ] , [ "DE" , "🇩🇪" ] , [ "DG" , "🇩🇬" ] , [ "DJ" , "🇩🇯" ] , [ "DK" , "🇩🇰" ] , [ "DM" , "🇩🇲" ] , [ "DO" , "🇩🇴" ] , [ "DZ" , "🇩🇿" ] , [ "EA" , "🇪🇦" ] , [ "EC" , "🇪🇨" ] , [ "EE" , "🇪🇪" ] , [ "EG" , "🇪🇬" ] , [ "EH" , "🇪🇭" ] , [ "ER" , "🇪🇷" ] , [ "ES" , "🇪🇸" ] , [ "ET" , "🇪🇹" ] , [ "EU" , "🇪🇺" ] , [ "FI" , "🇫🇮" ] , [ "FJ" , "🇫🇯" ] , [ "FK" , "🇫🇰" ] , [ "FM" , "🇫🇲" ] , [ "FO" , "🇫🇴" ] , [ "FR" , "🇫🇷" ] , [ "GA" , "🇬🇦" ] , [ "GB" , "🇬🇧" ] , [ "HK" , "🇭🇰" ] ,["HU","🇭🇺"], [ "ID" , "🇮🇩" ] , [ "IE" , "🇮🇪" ] , [ "IL" , "🇮🇱" ] , [ "IM" , "🇮🇲" ] , [ "IN" , "🇮🇳" ] , [ "IS" , "🇮🇸" ] , [ "IT" , "🇮🇹" ] , [ "JP" , "🇯🇵" ] , [ "KR" , "🇰🇷" ] , [ "LU" , "🇱🇺" ] , [ "MO" , "🇲🇴" ] , [ "MX" , "🇲🇽" ] , [ "MY" , "🇲🇾" ] , [ "NL" , "🇳🇱" ] , [ "PH" , "🇵🇭" ] , [ "RO" , "🇷🇴" ] , [ "RS" , "🇷🇸" ] , [ "RU" , "🇷🇺" ] , [ "RW" , "🇷🇼" ] , [ "SA" , "🇸🇦" ] , [ "SB" , "🇸🇧" ] , [ "SC" , "🇸🇨" ] , [ "SD" , "🇸🇩" ] , [ "SE" , "🇸🇪" ] , [ "SG" , "🇸🇬" ] , [ "TH" , "🇹🇭" ] , [ "TN" , "🇹🇳" ] , [ "TO" , "🇹🇴" ] , [ "TR" , "🇹🇷" ] , [ "TV" , "🇹🇻" ] , [ "TW" , "🇨🇳" ] , [ "UK" , "🇬🇧" ] , [ "UM" , "🇺🇲" ] , [ "US" , "🇺🇸" ] , [ "UY" , "🇺🇾" ] , [ "UZ" , "🇺🇿" ] , [ "VA" , "🇻🇦" ] , [ "VE" , "🇻🇪" ] , [ "VG" , "🇻🇬" ] , [ "VI" , "🇻🇮" ] , [ "VN" , "🇻🇳" ] , [ "ZA" , "🇿🇦"]]) 29 | 30 | 31 | !(async () => { 32 | let result = { 33 | title: '📺 YouTube Premium 检测', 34 | content: '----------------------\n\n检测失败,请重试', 35 | } 36 | await Promise.race([test(FILM_ID),timeOut(5000)]) 37 | .then((code) => { 38 | console.log(code) 39 | 40 | if (code === 'Not Available') { 41 | result['content'] = '----------------------\n\n🛑 未支持 YouTube Premium' 42 | //return 43 | } else if (code === "timeout") { 44 | result['content'] = "----------------------\n\n🚦 测试超时" 45 | } else { 46 | result['content'] = '----------------------\n\n✅ 支持 YouTube Premium ➟ ⟦'+flags.get(code.toUpperCase())+code.toUpperCase()+"⟧" 47 | } 48 | //$notify(result["title"], output, result["content"], link) 49 | 50 | //console.log(result) 51 | $done({"title":result["title"],"message":result["content"]+'\n\n----------------------\n'+$environment.params}) 52 | }) 53 | })() 54 | .finally(() => $done()); 55 | 56 | function timeOut(delay) { 57 | return new Promise((resolve, reject) => { 58 | setTimeout(() => { 59 | //reject(new Error('timeout')) 60 | resolve("timeout") 61 | }, delay) 62 | }) 63 | } 64 | 65 | 66 | function test() { 67 | return new Promise((resolve, reject) => { 68 | let option = { 69 | url: BASE_URL, 70 | opts: opts, 71 | headers: { 72 | 'User-Agent': 73 | 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36', 74 | 'Accept-Language': 'en', 75 | }, 76 | } 77 | $task.fetch(option).then(response=> { 78 | let data = response.body 79 | console.log(response.statusCode) 80 | if (response.statusCode !== 200) { 81 | reject('Error') 82 | return 83 | } 84 | 85 | if (data.indexOf('Premium is not available in your country') !== -1) { 86 | resolve('Not Available') 87 | return 88 | } 89 | console.log(data) 90 | let region = '' 91 | let re = new RegExp('"GL":"(.*?)"', 'gm') 92 | let result = re.exec(data) 93 | if (result != null && result.length === 2) { 94 | region = result[1] 95 | } else if (data.indexOf('www.google.cn') !== -1) { 96 | region = 'CN' 97 | } else { 98 | region = 'US' 99 | } 100 | resolve(region) 101 | }) 102 | }) 103 | } 104 | -------------------------------------------------------------------------------- /Scripts/ytbcheck.js: -------------------------------------------------------------------------------- 1 | /*** 2 | 3 | Thanks to & modified https://gist.githubusercontent.com/Hyseen/5ae36a6a5cb5690b1f2bff4aa19c766f/raw/youtube_premium_check.js?version=1632728073 4 | 5 | For Quantumult-X / [task-local] 6 | 7 | @XIAO_KOP 8 | 9 | **/ 10 | 11 | const BASE_URL = 'https://www.youtube.com/premium' 12 | 13 | const link = { "media-url": "https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/img/southpark/7.png" } 14 | const policy_name = "YouTube" //填入你的 youtube 策略组名 15 | 16 | const arrow = "➟" 17 | var output = "" 18 | var flags = new Map([[ "AC" , "🇦🇨" ] , [ "AF" , "🇦🇫" ] , [ "AI" , "🇦🇮" ] , [ "AL" , "🇦🇱" ] , [ "AM" , "🇦🇲" ] , [ "AQ" , "🇦🇶" ] , [ "AR" , "🇦🇷" ] , [ "AS" , "🇦🇸" ] , [ "AT" , "🇦🇹" ] , [ "AU" , "🇦🇺" ] , [ "AW" , "🇦🇼" ] , [ "AX" , "🇦🇽" ] , [ "AZ" , "🇦🇿" ] , [ "BB" , "🇧🇧" ] , [ "BD" , "🇧🇩" ] , [ "BE" , "🇧🇪" ] , [ "BF" , "🇧🇫" ] , [ "BG" , "🇧🇬" ] , [ "BH" , "🇧🇭" ] , [ "BI" , "🇧🇮" ] , [ "BJ" , "🇧🇯" ] , [ "BM" , "🇧🇲" ] , [ "BN" , "🇧🇳" ] , [ "BO" , "🇧🇴" ] , [ "BR" , "🇧🇷" ] , [ "BS" , "🇧🇸" ] , [ "BT" , "🇧🇹" ] , [ "BV" , "🇧🇻" ] , [ "BW" , "🇧🇼" ] , [ "BY" , "🇧🇾" ] , [ "BZ" , "🇧🇿" ] , [ "CA" , "🇨🇦" ] , [ "CF" , "🇨🇫" ] , [ "CH" , "🇨🇭" ] , [ "CK" , "🇨🇰" ] , [ "CL" , "🇨🇱" ] , [ "CM" , "🇨🇲" ] , [ "CN" , "🇨🇳" ] , [ "CO" , "🇨🇴" ] , [ "CP" , "🇨🇵" ] , [ "CR" , "🇨🇷" ] , [ "CU" , "🇨🇺" ] , [ "CV" , "🇨🇻" ] , [ "CW" , "🇨🇼" ] , [ "CX" , "🇨🇽" ] , [ "CY" , "🇨🇾" ] , [ "CZ" , "🇨🇿" ] , [ "DE" , "🇩🇪" ] , [ "DG" , "🇩🇬" ] , [ "DJ" , "🇩🇯" ] , [ "DK" , "🇩🇰" ] , [ "DM" , "🇩🇲" ] , [ "DO" , "🇩🇴" ] , [ "DZ" , "🇩🇿" ] , [ "EA" , "🇪🇦" ] , [ "EC" , "🇪🇨" ] , [ "EE" , "🇪🇪" ] , [ "EG" , "🇪🇬" ] , [ "EH" , "🇪🇭" ] , [ "ER" , "🇪🇷" ] , [ "ES" , "🇪🇸" ] , [ "ET" , "🇪🇹" ] , [ "EU" , "🇪🇺" ] , [ "FI" , "🇫🇮" ] , [ "FJ" , "🇫🇯" ] , [ "FK" , "🇫🇰" ] , [ "FM" , "🇫🇲" ] , [ "FO" , "🇫🇴" ] , [ "FR" , "🇫🇷" ] , [ "GA" , "🇬🇦" ] , [ "GB" , "🇬🇧" ] , [ "HK" , "🇭🇰" ] ,["HU","🇭🇺"], [ "ID" , "🇮🇩" ] , [ "IE" , "🇮🇪" ] , [ "IL" , "🇮🇱" ] , [ "IM" , "🇮🇲" ] , [ "IN" , "🇮🇳" ] , [ "IS" , "🇮🇸" ] , [ "IT" , "🇮🇹" ] , [ "JP" , "🇯🇵" ] , [ "KR" , "🇰🇷" ] , [ "LU" , "🇱🇺" ] , [ "MO" , "🇲🇴" ] , [ "MX" , "🇲🇽" ] , [ "MY" , "🇲🇾" ] , [ "NL" , "🇳🇱" ] , [ "PH" , "🇵🇭" ] , [ "RO" , "🇷🇴" ] , [ "RS" , "🇷🇸" ] , [ "RU" , "🇷🇺" ] , [ "RW" , "🇷🇼" ] , [ "SA" , "🇸🇦" ] , [ "SB" , "🇸🇧" ] , [ "SC" , "🇸🇨" ] , [ "SD" , "🇸🇩" ] , [ "SE" , "🇸🇪" ] , [ "SG" , "🇸🇬" ] , [ "TH" , "🇹🇭" ] , [ "TN" , "🇹🇳" ] , [ "TO" , "🇹🇴" ] , [ "TR" , "🇹🇷" ] , [ "TV" , "🇹🇻" ] , [ "TW" , "🇨🇳" ] , [ "UK" , "🇬🇧" ] , [ "UM" , "🇺🇲" ] , [ "US" , "🇺🇸" ] , [ "UY" , "🇺🇾" ] , [ "UZ" , "🇺🇿" ] , [ "VA" , "🇻🇦" ] , [ "VE" , "🇻🇪" ] , [ "VG" , "🇻🇬" ] , [ "VI" , "🇻🇮" ] , [ "VN" , "🇻🇳" ] , [ "ZA" , "🇿🇦"]]) 19 | 20 | 21 | function ReadPolicy(cnt) { 22 | var res = "" 23 | for (var key in cnt) { 24 | if (key == policy_name){ 25 | dd = cnt[key] 26 | res = res + dd.join(arrow) 27 | break 28 | } 29 | } 30 | return res.split(policy_name+arrow)[1] 31 | } 32 | 33 | const message = { 34 | action: "get_policy_state", 35 | //content: dict 36 | 37 | }; 38 | 39 | 40 | $configuration.sendMessage(message).then(resolve => { 41 | if (resolve.error) { 42 | console.log(resolve.error); 43 | } 44 | if (resolve.ret) { 45 | output = ReadPolicy(resolve.ret) 46 | } 47 | }) 48 | 49 | ;(async () => { 50 | let result = { 51 | title: 'YouTube Premium 检测', 52 | content: '检测失败,请重试', 53 | } 54 | 55 | await Promise.race([test(),timeOut(5000)]) 56 | .then((code) => { 57 | console.log(code) 58 | 59 | if (code === 'Not Available') { 60 | result['content'] = '该节点未解锁 YouTube Premium' 61 | //return 62 | } else if (code === "timeout") { 63 | result['content'] = "测试超时" 64 | } else { 65 | result['content'] = '该节点解锁 YouTube Premium ➟ ⟦'+flags.get(code.toUpperCase())+" 地区⟧" 66 | } 67 | $notify(result["title"], output, result["content"], link) 68 | $done() 69 | }) 70 | .finally(() => { 71 | $done(result) 72 | }) 73 | })() 74 | 75 | function timeOut(delay) { 76 | return new Promise((resolve, reject) => { 77 | setTimeout(() => { 78 | //reject(new Error('timeout')) 79 | resolve("timeout") 80 | }, delay) 81 | }) 82 | } 83 | 84 | 85 | 86 | function test() { 87 | return new Promise((resolve, reject) => { 88 | let option = { 89 | url: BASE_URL, 90 | headers: { 91 | 'User-Agent': 92 | 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36', 93 | 'Accept-Language': 'en', 94 | }, 95 | } 96 | $task.fetch(option).then(response=> { 97 | let data = response.body 98 | console.log(response.statusCode) 99 | if (response.statusCode !== 200) { 100 | reject('Error') 101 | return 102 | } 103 | 104 | if (data.indexOf('Premium is not available in your country') !== -1) { 105 | resolve('Not Available') 106 | return 107 | } 108 | 109 | let region = '' 110 | let re = new RegExp('"countryCode":"(.*?)"', 'gm') 111 | let result = re.exec(data) 112 | if (result != null && result.length === 2) { 113 | region = result[1] 114 | } else if (data.indexOf('www.google.cn') !== -1) { 115 | region = 'CN' 116 | } else { 117 | region = 'US' 118 | } 119 | resolve(region) 120 | }) 121 | }) 122 | } 123 | -------------------------------------------------------------------------------- /TikTok_Rewrite.list: -------------------------------------------------------------------------------- 1 | hostname = *.musical.ly, *.tiktokv.com,*.tiktokcdn.com, api*.amemv.com, aweme*.snssdk.com 2 | 3 | (.*video_id=\w{32})(.*watermark=)(.*) url 302 $1 4 | (?<=(carrier|account|sys)_region=)CN url 307 JP 5 | (?<=version_code=)\d{1,}.\d{1}\.\d{1} url 307 8.4.0 6 | ;(如果想解锁美区tiktok将此条注释) 7 | 8 | -------------------------------------------------------------------------------- /img/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/.DS_Store -------------------------------------------------------------------------------- /img/dragonball/1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/1.PNG -------------------------------------------------------------------------------- /img/dragonball/10.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/10.PNG -------------------------------------------------------------------------------- /img/dragonball/11.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/11.PNG -------------------------------------------------------------------------------- /img/dragonball/12.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/12.PNG -------------------------------------------------------------------------------- /img/dragonball/13.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/13.PNG -------------------------------------------------------------------------------- /img/dragonball/14.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/14.PNG -------------------------------------------------------------------------------- /img/dragonball/15.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/15.PNG -------------------------------------------------------------------------------- /img/dragonball/16.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/16.PNG -------------------------------------------------------------------------------- /img/dragonball/17.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/17.PNG -------------------------------------------------------------------------------- /img/dragonball/18.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/18.PNG -------------------------------------------------------------------------------- /img/dragonball/19.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/19.PNG -------------------------------------------------------------------------------- /img/dragonball/2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/2.PNG -------------------------------------------------------------------------------- /img/dragonball/20.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/20.PNG -------------------------------------------------------------------------------- /img/dragonball/21.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/21.PNG -------------------------------------------------------------------------------- /img/dragonball/22.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/22.PNG -------------------------------------------------------------------------------- /img/dragonball/23.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/23.PNG -------------------------------------------------------------------------------- /img/dragonball/24.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/24.PNG -------------------------------------------------------------------------------- /img/dragonball/25.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/25.PNG -------------------------------------------------------------------------------- /img/dragonball/26.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/26.PNG -------------------------------------------------------------------------------- /img/dragonball/27.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/27.PNG -------------------------------------------------------------------------------- /img/dragonball/28.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/28.PNG -------------------------------------------------------------------------------- /img/dragonball/29.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/29.PNG -------------------------------------------------------------------------------- /img/dragonball/3.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/3.PNG -------------------------------------------------------------------------------- /img/dragonball/30.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/30.PNG -------------------------------------------------------------------------------- /img/dragonball/31.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/31.PNG -------------------------------------------------------------------------------- /img/dragonball/32.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/32.PNG -------------------------------------------------------------------------------- /img/dragonball/33.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/33.PNG -------------------------------------------------------------------------------- /img/dragonball/34.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/34.PNG -------------------------------------------------------------------------------- /img/dragonball/4.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/4.PNG -------------------------------------------------------------------------------- /img/dragonball/7.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/7.PNG -------------------------------------------------------------------------------- /img/dragonball/8.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/8.PNG -------------------------------------------------------------------------------- /img/dragonball/9.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/dragonball/9.PNG -------------------------------------------------------------------------------- /img/others/lee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/others/lee.png -------------------------------------------------------------------------------- /img/policy/apple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/policy/apple.png -------------------------------------------------------------------------------- /img/policy/as.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/policy/as.PNG -------------------------------------------------------------------------------- /img/policy/cn.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/policy/cn.PNG -------------------------------------------------------------------------------- /img/policy/cn0.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/policy/cn0.PNG -------------------------------------------------------------------------------- /img/policy/downloads.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/policy/downloads.png -------------------------------------------------------------------------------- /img/policy/eu.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/policy/eu.PNG -------------------------------------------------------------------------------- /img/policy/final.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/policy/final.png -------------------------------------------------------------------------------- /img/policy/hk.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/policy/hk.PNG -------------------------------------------------------------------------------- /img/policy/jp.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/policy/jp.PNG -------------------------------------------------------------------------------- /img/policy/mine.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/policy/mine.PNG -------------------------------------------------------------------------------- /img/policy/mo.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/policy/mo.PNG -------------------------------------------------------------------------------- /img/policy/netflix.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/policy/netflix.png -------------------------------------------------------------------------------- /img/policy/proxy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/policy/proxy.png -------------------------------------------------------------------------------- /img/policy/telegram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/policy/telegram.png -------------------------------------------------------------------------------- /img/policy/us.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/policy/us.png -------------------------------------------------------------------------------- /img/policy/youtube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/policy/youtube.png -------------------------------------------------------------------------------- /img/policy/ytb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/policy/ytb.png -------------------------------------------------------------------------------- /img/southpark/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/southpark/.DS_Store -------------------------------------------------------------------------------- /img/southpark/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/southpark/1.png -------------------------------------------------------------------------------- /img/southpark/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/southpark/10.png -------------------------------------------------------------------------------- /img/southpark/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/southpark/2.png -------------------------------------------------------------------------------- /img/southpark/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/southpark/3.png -------------------------------------------------------------------------------- /img/southpark/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/southpark/4.png -------------------------------------------------------------------------------- /img/southpark/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/southpark/5.png -------------------------------------------------------------------------------- /img/southpark/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/southpark/6.png -------------------------------------------------------------------------------- /img/southpark/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/southpark/7.png -------------------------------------------------------------------------------- /img/southpark/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/southpark/8.png -------------------------------------------------------------------------------- /img/southpark/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/southpark/9.png -------------------------------------------------------------------------------- /img/sub/Dler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fyjsy/KOP-XIAO/b7b7259246036995c73a15422315110791d3eac7/img/sub/Dler.png -------------------------------------------------------------------------------- /remote-resource.json: -------------------------------------------------------------------------------- 1 | { 2 | "server_remote": [ 3 | "https://raw.githubusercontent.com/crossutility/Quantumult-X/master/server.txt, tag=Sample-01", 4 | "https://raw.githubusercontent.com/crossutility/Quantumult-X/master/server-complete.txt, tag=Sample-02" 5 | ], 6 | "filter_remote": [ 7 | "https://raw.githubusercontent.com/ConnersHua/Profiles/master/Quantumult/X/Filter/Advertising.list, tag=去广告, enabled=true", 8 | "https://raw.githubusercontent.com/ConnersHua/Profiles/master/Quantumult/X/Filter/Apple.list, tag=Apple服务, enabled=true", 9 | "https://raw.githubusercontent.com/ConnersHua/Profiles/master/Quantumult/X/Filter/China.list, tag=国内网站, enabled=true", 10 | "https://raw.githubusercontent.com/ConnersHua/Profiles/master/Quantumult/X/Filter/DomesticMedia.list, tag=国内视频, enabled=true", 11 | "http://cloudcompute.lbyczf.com/x-rule-set?url=https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Media/Netflix.list, tag=📺Netflix, force-policy=📺 Netflix, enabled=true", 12 | "http://cloudcompute.lbyczf.com/x-rule-set?url=https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Media/Youtube.list, tag=🎬Youtube, force-policy=🎬 Youtube, enabled=true", 13 | "https://raw.githubusercontent.com/ConnersHua/Profiles/master/Quantumult/X/Filter/ForeignMedia.list, tag=国外视频, enabled=true", 14 | "https://raw.githubusercontent.com/ConnersHua/Profiles/master/Quantumult/X/Filter/Global.list, tag=国外网站, enabled=true", 15 | "https://raw.githubusercontent.com/ConnersHua/Profiles/master/Quantumult/X/Filter/Hijacking.list, tag=运营商劫持, enabled=true" 16 | ], 17 | "rewrite_remote": [ 18 | " http://cloudcompute.lbyczf.com/quanx-rewrite, tag=Lhie1复写" 19 | ] 20 | } 21 | --------------------------------------------------------------------------------