├── .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 ├── network-direct.js ├── nf-ui-check.js ├── nf_ytb_ui-check.js ├── nfcheck.js ├── resource-parser.js ├── server-info-plus.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/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/.DS_Store -------------------------------------------------------------------------------- /HotKids-JS/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/HotKids-JS/.DS_Store -------------------------------------------------------------------------------- /HotKids-JS/scripts.conf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/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 | ;2023-02-24: 部分修改 2 | ;2022-09-26: 增加对各个模块的说明(部分内容只适用于 1.1.0 以上版本) 3 | ;⚠️注意⚠️: 以下内容中,带“;” “#”的都是注释符号,去掉前面的符号,该行才有效 4 | 5 | ;general 模块内为一些通用的设置参数项 6 | [general] 7 | 8 | ;Quantumult X 会对 server_check_url 指定的网址进行相应测试,以确认节点的可用性 9 | ;你同样可以在 server_local/remote 中,为节点、订阅单独指定server_check_url参数 10 | ;如您为节点单独指定了 url,则所有相关延迟测试中,均会采用此 url 地址 11 | server_check_url= http://www.qualcomm.cn/generate_204 12 | ;节点延迟测试超时参数,需小于 5000 毫秒才生效 13 | server_check_timeout=2000 14 | 15 | ;👍👍👍资源解析器,可用于自定义各类远程资源的转换,如节点,规则 filter,复写 rewrite 等,url 地址可远程,可 本地/iCloud(Quantumult X/Scripts目录); 16 | ;下面是我写的一个解析器,具体内容直接参照链接里的使用说明 17 | resource_parser_url= https://fastly.jsdelivr.net/gh/KOP-XIAO/QuantumultX@master/Scripts/resource-parser.js 18 | 19 | ;👍👍geo_location_checker用于节点页面的节点信息展示,可完整自定义展示内容与方式 20 | ; extreme-ip-lookup为Quantumult X 作者提供的示范 api 21 | ;geo_location_checker=http://extreme-ip-lookup.com/json/, https://raw.githubusercontent.com/crossutility/Quantumult-X/master/sample-location-with-script.js 22 | ;下面是我所使用的 api 及获取、展示节点信息的 js 23 | geo_location_checker=http://ip-api.com/json/?lang=zh-CN, https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/IP_API.js 24 | 25 | 26 | ;👍👍👍运行模式模块,running_mode_trigger 设置,即根据网络自动切换 分流/直连/全局代理 等模式。 27 | ;running-mode-trigger 模式下,跟手动切换直连/全局代理 等效,rewrite/task 模块始终会生效,比 ssid 策略组设置简单,比 ssid-suspend 更灵活。 28 | 29 | ;running_mode_trigger=filter, filter, asus-5g:all_direct, asus:all_proxy 30 | ; 上述写法,前两个 filter 先后表示 在 [数据蜂窝网络] 跟 [一般 Wi-Fi] 下,走 filter(分流)模式,后面则表示在 asus-5g 下切换为全局直连[all_direct],asus 切换为全局代理[all_proxy] 31 | ; 如需使用,相应 SSID 换成你自己 Wi-Fi 名即可 32 | 33 | ;ssid_suspended_list,让 Quantumult X 在特定 Wi-Fi 网络下暂停工作(仅 task 模块会继续工作),多个Wi-Fi用“,”连接 34 | ;ssid_suspended_list=Asus, Shawn-Wifi 35 | 36 | ;dns exclusion list中的域名将不使用fake-ip方式. 其它域名则全部采用 fake-ip 及远程解析的模式 37 | ;dns_exclusion_list=*.qq.com 38 | 39 | ;UDP 白名单,留空则默认所有为端口。不在udp白名单列表中的端口,将被丢弃处理(返回 ICMP “端口不可达” 信息)。 40 | ;udp_whitelist=53, 80-427, 444-65535 41 | 42 | ; UDP Drop名单,同白名单类似,但不会返回 ICMP “端口不可达” 信息 43 | ; drop 名单仅处理 whitelist名单中的端口 44 | ;udp_drop_list = 1900, 80 45 | 46 | # 参数 fallback_udp_policy 仅支持 v1.0.19 以及之后的版本。 47 | # 参数 fallback_udp_policy 的值仅支持末端策略(末端策略为经由规则模块和策略模块后所命中的策略,例如:direct、reject 以及节点;不支持内置策略 proxy 以及其它自定义策略)。 48 | fallback_udp_policy=direct 49 | 50 | ;下列表中的内容将不经过 QuantumultX的处理,设置后建议重启设备 51 | ;excluded_routes= 192.168.0.0/16, 172.16.0.0/12, 100.64.0.0/10, 10.0.0.0/8 52 | ;icmp_auto_reply=true 53 | 54 | ;指定 DoH 请求所使用的 User-Agent 55 | ;doh_user_agent=Agent/1.0 56 | 57 | ;指定服务器测试时所使用的 User-Agent 58 | ;server_check_user_agent = Agent/1.0 59 | 60 | // 默认当 DNS 层面某domain 被reject时,将返回loopback IP。你可以通过下面的参数 61 | // 修改成为 “no-error-no-answer”,或者 “nxdomain” 62 | ;dns_reject_domain_behavior = loopback 63 | 64 | 65 | 66 | [dns] 67 | ; 禁用系统 DNS(no-system) 以及 ipv6 68 | ;no-system 69 | ;no-ipv6 70 | ;支持参数 excluded_ssids , included_ssids(1.0.29+) 指定在特定 Wi-Fi下失效/生效 71 | 72 | // circumvent-ipv4-answer, circumvent-ipv6-answer 参数 73 | //1、当并发向多个上游 DNS 进行查询时,如响应最快的上游 DNS 抢答的结果命中了该条目,则 Quantumult X Tunnel DNS 模块会等待其他 DNS 服务器的响应结果(如抢答的结果中至少有一个不属于该条目,则不会等待其他 DNS 的响应,此时有效结果采用不属于该条目的所有记录) 74 | //2、如所有上游 DNS 返回的所有结果均命中该条目,则判定为 DNS 查询失败 75 | //3、如配置的上游 DNS 包含有去广告功能的 DNS 服务器,请勿使用该参数 76 | ;circumvent-ipv4-answer = 127.0.0.1, 0.0.0.0 77 | ;circumvent-ipv6-answer = :: 78 | 79 | //如需使用 DoH3,DNS over HTTP/3,请开启下面👇参数 80 | ;prefer-doh3 81 | 82 | ;指定 dns 服务器,并发响应选取最优结果 83 | server=114.114.114.114 84 | server=202.141.176.93 85 | server=202.141.178.13 86 | server=117.50.10.10 87 | server=223.5.5.5 88 | server=119.29.29.29:53 89 | server=119.28.28.28 90 | 91 | ;如指定 doh 服务,则👆️上面的一般 dns 解析均失效 额外参数,在特定网络下禁用该 doh 92 | ;doh-server=xxx.com, excluded_ssids=SSID1, SSID2 93 | ; 1.0.29 版本后支持多个 doh 并发,👇 94 | ;doh-server=xx1.com,xx2.com,excluded_ssids=SSID1, SSID2 95 | ; 1.0.29 版本后支持 alias 映射类型 96 | ;alias=/example.com/another-example.com 97 | 98 | 99 | ;如指定了 DoQ 服务,则 DoH 以及其它 dns解析均失效 100 | ;doq-server = quic://dns.adguard.com 101 | ;doq-server = quic://dns1.example.com, quic://dns2.example.com 102 | ;doq-server = quic://dns.adguard.com, excluded_ssids=SSID1 103 | ;doq-server = quic://dns.adguard.com, included_ssids=SSID2 104 | 105 | 106 | 107 | ;指定域名解析dns, 下面为示范,按需启用, 同样支持 excluded_ssids/included_ssids 参数 108 | ;server=/*.taobao.com/223.5.5.5, excluded_ssids=My-Wifi, Your-Wifi 109 | ;server=/*.tmall.com/223.5.5.5, included_ssids=His-Wifi 110 | ;server=/example1.com/8.8.4.4 111 | ;server=/*.example2.com/223.5.5.5 112 | ;server=/example4.com/[2001:4860:4860::8888]:53 113 | ;address=/example5.com/192.168.16.18 114 | ;address=/example6.com/[2001:8d3:8d3:8d3:8d3:8d3:8d3:8d3] 115 | //映射域名到其它域名的类型 116 | ;alias = /example7.com/another-example.com 117 | 118 | 119 | [task_local] 120 | ;包含3⃣️种类型: cron 定时任务,UI交互脚本,网络切换脚本 121 | 122 | ; 1⃣️ 任务模块,可用于签到,天气话费查询等 123 | ;js文件放于iCloud或者本机的Quantumult X/Scripts 路径下。TF版本可直接使用远程js链接 124 | ;从 “分” 开始的5位cron 写法,具体 cron 表达式可自行 Google 125 | ;比如上述语句 代表每天 12 点 2 分,自动执行一次; 126 | ;tag参数为 task 命名标识; 127 | ;img-url参数用于指定 task 的图标(108*108) 128 | 129 | 2 12 * * * sample.js, tag=本地示范(左滑编辑,右滑执行), enabled=false, img-url=https://raw.githubusercontent.com/crossutility/Quantumult-X/master/quantumult-x.png 130 | 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 131 | 132 | # 2⃣️ UI交互查询脚本示范,在首页长按 节点/策略组 唤出 133 | event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/streaming-ui-check.js, tag = 流媒体 - 解锁查询, img-url=checkmark.seal.system, enabled=true 134 | 135 | # 3⃣️ 网络切换/变化时 触发的脚本类型 136 | ;event-network sample-taks.js 137 | 138 | 139 | #以下为策略组[policy]部分 140 | # static 策略组中,你需要手动选择想要的节点/策略组。 141 | # available 策略组将按顺序选择你列表中第一个可用的节点。 142 | # round-robin 策略组,将按列表的顺序轮流使用其中的节点。 143 | # url-latency-benchmark 延迟策略组,选取延迟最优节点。 144 | # dest-hash 策略组,随机负载均衡,但相同域名走固定节点。 145 | # ssid 策略组,将根据你所设定的网络来自动切换节点/策略组 146 | ;img-url 参数用于指定策略组图标,可远程,也可本地/iCloud(Quantumult X/Images路径下) (108*108 大小) 147 | ;direct/proxy/reject 则只能用本地图标,名字分别为 direct.png, proxy.png,reject.png 放置于 Images 文件夹下即可生效 (108*108 大小) 148 | 149 | [policy] 150 | static=🍎 苹果服务, direct, proxy, img-url= https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Apple.png 151 | static=💻 国外影视, proxy, direct, img-url= https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/ForeignMedia.png 152 | static=📽 国内视频, direct, proxy, img-url= https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/DomesticMedia.png 153 | static=🎬 YouTube, proxy, direct, img-url= https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/YouTube.png 154 | static=📺 Netflix, proxy, direct, img-url= https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Netflix_Letter.png 155 | static=🌏 国外网站, proxy,direct,🇭🇰️ 香港(正则示范), img-url= https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Global.png 156 | static=🕹 终极清单,direct, proxy, img-url= https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Final.png 157 | static= 🇭🇰️ 香港(正则示范), server-tag-regex= 香港|🇭🇰️|HK|Hong, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/HK.png 158 | 159 | #server-tag-regex 以及 resource-tag-regex 参数用于正则筛选来建立策略组 160 | #具体可参见教程部分: https://shrtm.nu/DAFP 161 | 162 | #以下是quantumultX的3普通种策略组类型写法,也可以用正则参数 server-tag-regex 或者 resource-tag-regex 来筛选 163 | ;static=policy-name-1, Sample-A, Sample-B, Sample-C 164 | ;available=policy-name-2, Sample-A, Sample-B, Sample-C 165 | ;round-robin=policy-name-3, Sample-A, Sample-B, Sample-C 166 | ;url-latency-benchmark=policy-name-4, Sample-A, Sample-B, Sample-C 167 | ;dest-hash=policy-name-5, Sample-A, Sample-B, Sample-C 168 | #下面是ssid策略组示范 169 | ;ssid=policy-name-4, Sample-A, Sample-B, LINK_22E171:Sample-B, LINK_22E172:Sample-C 170 | 171 | 172 | # "tag" 跟 "enabled" 为可选参数,分别表示 “标签”及“开启状态”, true 为开启,false 关闭. 173 | # update-interval 为更新时间参数,单位 秒, 默认更新时间为 24*60*60=86400 秒,也就是24小时. 174 | # opt-parser=true/false 用于控制是否对本订阅 开启资源解析器,不写或者 false 表示不启用解析器; 175 | 176 | #服务器远程订阅 177 | [server_remote] 178 | #远程服务器订阅模块,可直接订阅SSR,SS链接,以及Quantumult X格式的vmess/trojan/https订阅 179 | #其它格式可用 opt-parser 参数开启解析器导入使用 180 | #img-url参数用于指定图标,格式要求同样为 108*108 的 png 图片,可远程,可本地 181 | 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 182 | 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 183 | 184 | #支持本地/iCloud的节点文件/片段,位于Quantumult X/Profiles路径下 185 | ;servers.snippet, tag=本地服务器, img-url=https://raw.githubusercontent.com/crossutility/Quantumult-X/master/quantumult-x.png, enabled=false 186 | 187 | #规则分流远程订阅 188 | [filter_remote] 189 | #远程分流模块,可使用force-policy来强制使用策略偏好, 替换远程规则内所指定的策略组 190 | ;同样的 191 | # update-interval 为更新时间参数,单位 秒, 默认更新时间为 24*60*60=86400 秒,也就是24小时. 192 | # opt-parser=true/false 用于控制是否对本订阅 开启资源解析器,不写或者 false 表示不启用解析器; 193 | 194 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/Guard/Advertising.list, tag=🚦去广告, update-interval=86400, opt-parser=true, enabled=true 195 | 196 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/Guard/Hijacking.list, tag=🚫 运营商劫持, enabled=true 197 | 198 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/StreamingMedia/StreamingCN.list, force-policy=📽 国内视频, tag=📽 国内视频, enabled=true 199 | 200 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/StreamingMedia/Video/Netflix.list, tag=📺 Netflix, force-policy=📺 Netflix, enabled=true 201 | 202 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/StreamingMedia/Video/YouTube.list, tag=🎬 YouTube, force-policy=🎬 YouTube, enabled=true 203 | 204 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/StreamingMedia/Streaming.list, tag=💻 国外影视,force-policy= 💻 国外影视, enabled=true 205 | 206 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/Global.list, tag=🌍 国外网站, force-policy= 🌏 国外网站, enabled=true 207 | 208 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/Extra/Apple/Apple.list, tag= Apple服务, force-policy=🍎 苹果服务,enabled=true 209 | 210 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/Extra/Apple/BlockiOSUpdate.list, tag= 屏蔽更新,enabled=true 211 | 212 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/China.list, tag=🐼 国内网站, enabled=true 213 | 214 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/Extra/ChinaIP.list, tag=🇨🇳️ 国内IP池, enabled=true 215 | 216 | #支持本地/iCloud规则文件,位于Quantumult X/Profiles路径下 217 | ;filter.txt, tag=本地分流, enabled=false 218 | 219 | #rewrite 复写远程订阅 220 | [rewrite_remote] 221 | #远程复写模块,内包含主机名hostname以及复写rewrite规则 222 | # update-interval 为更新时间参数,单位 秒, 默认更新时间为 24*60*60=86400 秒,也就是24小时. 223 | # opt-parser=true/false 用于控制是否对本订阅 开启资源解析器,不写或者 false 表示不启用解析器; 224 | 225 | 226 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Rewrite/Block/Advertising.conf, tag=神机复写(⛔️去广告), update-interval=86400, opt-parser=false, enabled=true 227 | 228 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Rewrite/General.conf, tag=神机复写(😄️通用), update-interval=86400, opt-parser=false, enabled=true 229 | 230 | ;Youtube premium 会员请勿开启此条 231 | https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Rewrite/Block/YouTubeAds.conf, tag=神机复写(🈲YouTube-AD) , update-interval=86400, opt-parser=false, enabled=false 232 | 233 | #支持本地/iCloud的复写规则文件,位于Quantumult X/Profiles路径下 234 | ;rewrite.txt, tag=本地复写, opt-parser=false, enabled=false 235 | 236 | # 本地服务器部分 237 | [server_local] 238 | # 以下示范都是 ip(域名):端口, 239 | # 比如 vmess-a.203.167.55.4:777 ,实际是 203.167.55.4:777 240 | # 前面的 ss-a,ws-tls这些,只是为了让你快速找到自己节点的类型 241 | # 实际使用时,请不要真的 傻乎乎的 写 vmess-a.203.167.55.4:777 这种。 242 | # 目前支持 shadowsocks/shadowsocksR/Vmess/Trojan/http(s)/Socks5 等类型 243 | # 支持 tls-cert-sha256 以及 tls-pubkey-sha256 参数等自定义TLS验证 244 | 245 | #shadowsocks以及shadowsocksR类型, 支持 V2-Plugin 246 | #支持UDP,支持UDP-OVER-TCP(版本1.0.29 665+) 247 | ;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 248 | ;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 249 | ;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 250 | ;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 251 | ;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 252 | ;shadowsocks=ws-b.example.com:80, method=aes-128-gcm, password=pwd, obfs=ws, fast-open=false, udp-relay=false, tag=Sample-F 253 | ;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 254 | ;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 255 | 256 | # vmess 类型,ws,wss(ws+tls),over-tls,tcp,支持 UDP 257 | # vmess 类型节点默认开启 aead,关闭请用 aead=false 258 | ; ws 类型 259 | ;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 260 | ; wss(ws+tls) 类型 261 | ;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 262 | ; http 类型 263 | ;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 264 | ; tcp 类型 265 | ;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 266 | ;vmess=vmess-b.example.com:80, method=none, password=23ad6b10-8d1a-40f7-8ad0-e3e35cd32291, fast-open=false, udp-relay=false, tag=Sample-K 267 | ; over-tls 类型 268 | ;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 269 | 270 | ; http(s) 类型 271 | ;http=http.example.com:80, username=name, password=pwd, fast-open=false, udp-relay=false, tag=http 272 | ;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 273 | 274 | # socks5 类型节点 275 | ;socks5=example.com:80,fast-open=false, udp-relay=false, tag=socks5-01 276 | ;socks5=example.com:80, username=name, password=pwd, fast-open=false, udp-relay=false, tag=socks5-02 277 | ;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 278 | ;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 279 | 280 | ; trojan 类型, 支持 over-tls 以及 websockets,支持 UDP 281 | ;trojan=example.com:443, password=pwd, over-tls=true, tls-verification=true, fast-open=false, udp-relay=true, tag=trojan-tls-01 282 | ;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 283 | ;trojan=192.168.1.1:443, password=pwd, obfs=wss, obfs-host=example.com, obfs-uri=/path, udp-relay=true, tag=trojan-wss-05 284 | 285 | 286 | #本地分流规则(对于完全相同的某条规则,本地的将优先生效) 287 | [filter_local] 288 | // 如开启其他设置中的 “分流匹配优化” 选项,则匹配优先级为👇 289 | 290 | // host > host-suffix > host-keyword(wildcard) > geoip = ip-cidr > user-agennt 291 | 292 | // 完整域名匹配 293 | ;host, www.google.com, proxy 294 | // 域名关键词匹配 295 | ;host-keyword, adsite, reject 296 | // 域名后缀匹配 297 | ;host-suffix, googleapis.com, proxy 298 | // 域名通配符匹配 299 | ;host-wildcard, *abc.com, proxy 300 | 301 | // User-Agent 匹配 302 | ;user-agent, ?abc*, proxy 303 | 304 | 305 | //强制分流走蜂窝网络 306 | ;host-suffix, googleapis.com, proxy, force-cellular 307 | //让分流走蜂窝网络跟 Wi-Fi 中的优选结果 308 | ;host-suffix, googleapis.com, proxy, multi-interface 309 | //让分流走蜂窝网络跟 Wi-Fi 中的负载均衡,提供更大带宽出入接口 310 | ;host-suffix, googleapis.com, proxy, multi-interface-balance 311 | //指定分流走特定网络接口 312 | ;host-suffix, googleapis.com, proxy, via-interface=pdp_ip0 313 | 314 | // %TUN% 参数,回传给 Quantumult X 接口,可用于曲线实现代理链功能 315 | ;host-suffix, example.com, ServerA, via-interface=%TUN% 316 | ;ip-cidr, ServerA's IP Range, ServerB 317 | 318 | // ip 规则 319 | ip-cidr, 10.0.0.0/8, direct 320 | ip-cidr, 127.0.0.0/8, direct 321 | ip-cidr, 172.16.0.0/12, direct 322 | ip-cidr, 192.168.0.0/16, direct 323 | ip-cidr, 224.0.0.0/24, direct 324 | //ipv6 规则 325 | ;ip6-cidr, 2001:4860:4860::8888/32, direct 326 | # 已采用 ip 池数据,因此注释掉 geoip cn 327 | ;geoip, cn, direct 328 | 329 | # 1.0.28 build628 后支持如下的geoip库写法(需 GEO-IP 库支持) 330 | ;geoip, netflix, proxy 331 | 332 | #不在上述规则中(远程以及本地)的剩余请求,将走final 指定的节点/策略,这里即是 → 🕹 终极清单, 请根据自己的需求来选择直连或节点、策略 333 | #此为必需规则,仅可修改对应策略组,请勿删除 final 334 | final, 🕹 终极清单 335 | 336 | 337 | #本地复写规则 338 | [rewrite_local] 339 | 340 | #以下为证书&主机名部分 341 | [mitm] 342 | ;以下模块去掉;才生效 343 | ;请自行在 APP 的UI中 生成证书 并安装&信任(💡请按确保照文字提示操作💡) 344 | ;skip_validating_cert = false 345 | ;force_sni_domain_name = false 346 | 347 | //当使用 Quantumult X 在 M 芯片的 Mac 设备上作为局域网网关时,使用下面的参数来 跳过某些特定设备的 mitm 需求 348 | ;skip_src_ip = 192.168.4.50, 92.168.4.51 349 | 350 | // 当多个不同的 TCP 连接(非域名类请求)的目标 IP 不同,但这些连接的 TSL 握手 SNI 字段相同时,如需跳过其中某些连接的 MitM hostname 匹配过程,可使用👇参数。 351 | ;skip_dst_ip = 123.44.55.4 352 | 353 | ;hostname 为主机名,用,分隔多个 354 | ;hostname = *.example.com, *.sample.com 355 | 356 | //以下为证书参数,可去UI界面自行生成并安装证书,会在此生成对应信息 357 | ;passphrase = 358 | ;p12 = 359 | -------------------------------------------------------------------------------- /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/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/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 | "🆘", 7 | "🈲", 8 | "⚠️", 9 | "🔞", 10 | "📵", 11 | "🚦", 12 | "🏖", 13 | "🖥", 14 | "📺", 15 | "🐧", 16 | "🐬", 17 | "🦉", 18 | "🍄", 19 | "⛳️", 20 | "🚴", 21 | "🤑", 22 | "👽", 23 | "🤖", 24 | "🎃", 25 | "👺", 26 | "👁", 27 | "🐶", 28 | "🐼", 29 | "🐌", 30 | "👥", 31 | ]; 32 | var city0 = "高谭市"; 33 | var isp0 = "Cross-GFW.org"; 34 | function getRandomInt(max) { 35 | return Math.floor(Math.random() * Math.floor(max)); 36 | } 37 | 38 | function City_ValidCheck(para) { 39 | if (para) { 40 | return para; 41 | } else { 42 | return city0; 43 | //emojis[getRandomInt(emojis.length)] 44 | } 45 | } 46 | 47 | function ISP_ValidCheck(para) { 48 | if (para) { 49 | return para; 50 | } else { 51 | return isp0; 52 | //emojis[getRandomInt(emojis.length)] 53 | } 54 | } 55 | 56 | function Area_check(para) { 57 | if (para == "中华民国") { 58 | return "台湾"; 59 | } else { 60 | return para; 61 | } 62 | } 63 | 64 | var flags = new Map([ 65 | ["AC", "🇦🇨"], 66 | ["AE", "🇦🇪"], 67 | ["AF", "🇦🇫"], 68 | ["AI", "🇦🇮"], 69 | ["AL", "🇦🇱"], 70 | ["AQ", "🇦🇶"], 71 | ["AR", "🇦🇷"], 72 | ["AS", "🇦🇸"], 73 | ["AT", "🇦🇹"], 74 | ["AU", "🇦🇺"], 75 | ["AW", "🇦🇼"], 76 | ["AX", "🇦🇽"], 77 | ["AZ", "🇦🇿"], 78 | ["BA", "🇧🇦"], 79 | ["BB", "🇧🇧"], 80 | ["BD", "🇧🇩"], 81 | ["BE", "🇧🇪"], 82 | ["BF", "🇧🇫"], 83 | ["BG", "🇧🇬"], 84 | ["BH", "🇧🇭"], 85 | ["BI", "🇧🇮"], 86 | ["BJ", "🇧🇯"], 87 | ["BM", "🇧🇲"], 88 | ["BN", "🇧🇳"], 89 | ["BO", "🇧🇴"], 90 | ["BR", "🇧🇷"], 91 | ["BS", "🇧🇸"], 92 | ["BT", "🇧🇹"], 93 | ["BV", "🇧🇻"], 94 | ["BW", "🇧🇼"], 95 | ["BY", "🇧🇾"], 96 | ["BZ", "🇧🇿"], 97 | ["CA", "🇨🇦"], 98 | ["CF", "🇨🇫"], 99 | ["CH", "🇨🇭"], 100 | ["CK", "🇨🇰"], 101 | ["CL", "🇨🇱"], 102 | ["CM", "🇨🇲"], 103 | ["CN", "🇨🇳"], 104 | ["CO", "🇨🇴"], 105 | ["CP", "🇨🇵"], 106 | ["CR", "🇨🇷"], 107 | ["CU", "🇨🇺"], 108 | ["CV", "🇨🇻"], 109 | ["CW", "🇨🇼"], 110 | ["CX", "🇨🇽"], 111 | ["CY", "🇨🇾"], 112 | ["CZ", "🇨🇿"], 113 | ["DE", "🇩🇪"], 114 | ["DG", "🇩🇬"], 115 | ["DJ", "🇩🇯"], 116 | ["DK", "🇩🇰"], 117 | ["DM", "🇩🇲"], 118 | ["DO", "🇩🇴"], 119 | ["DZ", "🇩🇿"], 120 | ["EA", "🇪🇦"], 121 | ["EC", "🇪🇨"], 122 | ["EE", "🇪🇪"], 123 | ["EG", "🇪🇬"], 124 | ["EH", "🇪🇭"], 125 | ["ER", "🇪🇷"], 126 | ["ES", "🇪🇸"], 127 | ["ET", "🇪🇹"], 128 | ["EU", "🇪🇺"], 129 | ["FI", "🇫🇮"], 130 | ["FJ", "🇫🇯"], 131 | ["FK", "🇫🇰"], 132 | ["FM", "🇫🇲"], 133 | ["FO", "🇫🇴"], 134 | ["FR", "🇫🇷"], 135 | ["GA", "🇬🇦"], 136 | ["GB", "🇬🇧"], 137 | ["HK", "🇭🇰"], 138 | ["HU", "🇭🇺"], 139 | ["ID", "🇮🇩"], 140 | ["IE", "🇮🇪"], 141 | ["IL", "🇮🇱"], 142 | ["IM", "🇮🇲"], 143 | ["IN", "🇮🇳"], 144 | ["IS", "🇮🇸"], 145 | ["IT", "🇮🇹"], 146 | ["JP", "🇯🇵"], 147 | ["KR", "🇰🇷"], 148 | ["LU", "🇱🇺"], 149 | ["MO", "🇲🇴"], 150 | ["MX", "🇲🇽"], 151 | ["MY", "🇲🇾"], 152 | ["NL", "🇳🇱"], 153 | ["PH", "🇵🇭"], 154 | ["RO", "🇷🇴"], 155 | ["RS", "🇷🇸"], 156 | ["RU", "🇷🇺"], 157 | ["RW", "🇷🇼"], 158 | ["SA", "🇸🇦"], 159 | ["SB", "🇸🇧"], 160 | ["SC", "🇸🇨"], 161 | ["SD", "🇸🇩"], 162 | ["SE", "🇸🇪"], 163 | ["SG", "🇸🇬"], 164 | ["TH", "🇹🇭"], 165 | ["TN", "🇹🇳"], 166 | ["TO", "🇹🇴"], 167 | ["TR", "🇹🇷"], 168 | ["TV", "🇹🇻"], 169 | ["TW", "🇨🇳"], 170 | ["UK", "🇬🇧"], 171 | ["UM", "🇺🇲"], 172 | ["US", "🇺🇸"], 173 | ["UY", "🇺🇾"], 174 | ["UZ", "🇺🇿"], 175 | ["VA", "🇻🇦"], 176 | ["VE", "🇻🇪"], 177 | ["VG", "🇻🇬"], 178 | ["VI", "🇻🇮"], 179 | ["VN", "🇻🇳"], 180 | ["ZA", "🇿🇦"], 181 | ["UA", "🇺🇦"], 182 | ["MD", "🇲🇩"], 183 | ["AD", "🇦🇩"], 184 | ["AM", "🇦🇲"], 185 | ["AO", "🇦🇴"], 186 | ["KP", "🇰🇵"], 187 | ["KY", "🇰🇾"], 188 | ["KZ", "🇰🇿"], 189 | ["🇱🇦", "LA"], 190 | ["NZ", "🇳🇿"], 191 | ["PK", "🇵🇰"], 192 | ["NO", "🇳🇴"], 193 | ["PT", "🇵🇹"], 194 | ["PL", "🇵🇱"], 195 | ["GR", "🇬🇷"], 196 | ["NG", "🇳🇬"], 197 | ["MV", "🇲🇻"], 198 | ["KH", "🇰🇭"], 199 | ["LA", "🇱🇦"], 200 | ["GU", "🇬🇺"], 201 | ["MN", "🇲🇳"], 202 | ["JO", "🇯🇴"], 203 | ["IR", "🇮🇷"], 204 | ["OM", "🇴🇲"], 205 | ["PS", "🇵🇸"], 206 | ["NP", "🇳🇵"], 207 | ["LB", "🇱🇧"], 208 | ["IQ", "🇮🇶"], 209 | ["SY", "🇸🇾"], 210 | ["QA", "🇶🇦"], 211 | ["GE", "🇬🇪"], 212 | ["LK", "🇱🇰"], 213 | ["KG", "🇰🇬"], 214 | ["ME", "🇲🇪"], 215 | ["LT", "🇱🇹"], 216 | ["MT", "🇲🇹"], 217 | ["MC", "🇲🇨"], 218 | ["HR", "🇭🇷"], 219 | ["MK", "🇲🇰"], 220 | ["LV", "🇱🇻"], 221 | ["SK", "🇸🇰"], 222 | ["GI", "🇬🇮"], 223 | ["SM", "🇸🇲"], 224 | ["LI", "🇱🇮"], 225 | ["RE", "🇷🇪"], 226 | ["PA", "🇵🇦"], 227 | ["GL", "🇬🇱"], 228 | ["PE", "🇵🇪"], 229 | ["PY", "🇵🇾"], 230 | ["JM", "🇯🇲"], 231 | ["SR", "🇸🇷"], 232 | ["GT", "🇬🇹"], 233 | ["PR", "🇵🇷"], 234 | ["HN", "🇭🇳"], 235 | ["NI", "🇳🇮"], 236 | ["GH", "🇬🇭"], 237 | ["MA", "🇲🇦"], 238 | ["LY", "🇱🇾"], 239 | ["KE", "🇰🇪"], 240 | ["MU", "🇲🇺"], 241 | ["TL", "🇹🇱"], 242 | ["SI", "🇸🇮"], 243 | ["GF", "🇬🇫"], 244 | ["TG", "🇹🇬"], 245 | ]); 246 | 247 | var body = $response.body; 248 | var obj = JSON.parse(body); 249 | var title = flags.get(obj["countryCode"]) + " " + City_ValidCheck(obj["city"]); //+Area_check(obj['country']); 250 | var subtitle = ISP_ValidCheck(obj["org"] || obj.as); 251 | var ip = obj["query"]; 252 | var description = 253 | "服务商:" + 254 | obj["isp"] + 255 | "\n" + 256 | "地区:" + 257 | City_ValidCheck(obj["regionName"]) + 258 | "\n" + 259 | "IP:" + 260 | obj["query"] + 261 | "\n" + 262 | "时区:" + 263 | obj["timezone"]; 264 | $done({ title, subtitle, ip, description }); 265 | -------------------------------------------------------------------------------- /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 | "event-network network-direct.js, tag=Direct 策略切换, img-url=switch.2.system", 16 | "event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/server-info-plus.js, tag=节点信息Plus, img-url=info.bubble.system.system" 17 | ] 18 | } -------------------------------------------------------------------------------- /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", "Reset", "Until", "traffic"], 3 | "🇦🇩": ["安道尔", "AD", "AND", "Andorra"], 4 | "🇦🇿": ["阿塞拜疆", "AZ", "AZE", "Azerbaijan"], 5 | "🇦🇹": ["奥地利", "AT", "AUT", "Austria", "维也纳"], 6 | "🇦🇺": ["澳大利亚", "AU", "AUS", "Australia", "Sydney", "澳洲", "墨尔本", "悉尼" ,"土澳", "京澳", "廣澳", "滬澳", "沪澳", "广澳"], 7 | "🇧🇪": ["比利时", "BE", "BEL", "比利時", "Belgium"], 8 | "🇧🇬": ["保加利亚", "BGL", "保加利亞", "Bulgaria"], 9 | "🇵🇰": ["巴基斯坦", "PAK", "PK", "Pakistan", "PAKISTAN"], 10 | "🇧🇭": ["巴林", "BHR", "BH", "Bahrain"], 11 | "🇵🇾": ["巴拉圭", "PRY", "PY", "Paraguay"], 12 | "🇰🇭": ["柬埔寨", "KHM", "KH", "Cambodia"], 13 | "🇺🇦": ["烏克蘭","乌克兰", "UKR", "UA", "Ukraine"], 14 | "🇺🇿": ["乌兹别克斯坦", "烏茲別克斯坦", "UZB", "UZ", "Uzbekistan"], 15 | "🇭🇷": ["克罗地亚", "HR", "HRV", "克羅地亞", "Croatia"], 16 | "🇨🇦": ["加拿大", "CA", "Canada", "CANADA", "CAN", "Waterloo", "蒙特利尔", "温哥华", "楓葉", "枫叶", "滑铁卢", "多伦多"], 17 | "🇨🇭": ["瑞士", "苏黎世", "CHE", "CH", "Switzerland"], 18 | "🇳🇬": ["尼日利亚", "NG", "NGA", "尼日利亞","拉各斯", "Nigeria"], 19 | "🇨🇿": ["捷克", "CZE", "CZ", "Czechia"], 20 | "🇸🇰": ["斯洛伐克", "SK", "SVK", "Slovakia"], 21 | "🇸🇮": ["斯洛文尼亚", "斯洛文尼亞", "SVN", "SI", "Slovenia"], 22 | "🇦🇲": ["亚美尼亚", "亞美尼亞", "ARM", "AM", "Armenia"], 23 | "🇷🇸": ["塞尔维亚", "RS", "SRB", "RS_", "塞爾維亞", "Seville", "Sevilla"], 24 | "🇲🇩": ["摩尔多瓦", "MDA", "MD", "摩爾多瓦", "Moldova"], 25 | "🇩🇪": ["德国", "DEU", "DE", "DE-", "DE_", "German", "GERMAN", "德國", "法兰克福","京德","滬德","廣德","沪德","广德"], 26 | "🇩🇰": ["丹麦", "DNK", "DK", "丹麥", "Denmark"], 27 | "🇪🇸": ["西班牙", "ESP", "ES", "Spain"], 28 | "🇪🇺": ["欧洲", "EU", "欧盟", "欧罗巴", "European"], 29 | "🇫🇮": ["芬兰", "FIN", "FI", "Finland", "芬蘭", "赫尔辛基"], 30 | "🇫🇷": ["法国", "FRA", "FR", "France", "法國", "巴黎"], 31 | "🇷🇪": ["留尼汪", "REU", "RE", "留尼旺", "Réunion", "Reunion"], 32 | "🇨🇼": ["库拉索", "庫拉索", "Curaçao"], 33 | "🇬🇧": ["英国", "GBR", "UK", "England", "United Kingdom", "伦敦", "英"], 34 | "🇲🇴": ["澳门", "MAC", "MO", "Macao","Macau", "澳門", "CTM"], 35 | "🇰🇿": ["哈萨克斯坦", "KAZ", "KZ", "哈薩克斯坦", "Kazakhstan"], 36 | "🇱🇦": ["老挝", "LAO", "LA", "Laos"], 37 | "🇭🇺": ["匈牙利", "HUN", "HU", "Hungary"], 38 | "🇱🇹": ["立陶宛", "LTU", "LT", "Lithuania"], 39 | "🇱🇰": ["斯里兰卡", "LKA", "LK", "斯里蘭卡", "Sri Lanka"], 40 | "🇧🇾": ["白俄罗斯", "BLR", "BY", "白俄羅斯", "White Russia", "Republic of Belarus", "Belarus"], 41 | "🇷🇺": ["俄罗斯", "RUS", "RU", "RU-", "RU_", "RUS", "Russia", "毛子", "俄国", "俄羅斯", "伯力", "莫斯科", "圣彼得堡", "西伯利亚", "新西伯利亚", "京俄", "杭俄","廣俄","滬俄","广俄","沪俄"], 42 | "🇸🇬": ["新加坡", "SGP", "SG", "Singapore","SINGAPORE", "狮城", "沪新", "京新", "泉新", "穗新", "深新", "杭新", "广新","廣新","滬新"], 43 | "🇺🇸": ["美国", "USA", "US", "America", "United States", "美", "京美", "波特兰", "达拉斯", "俄勒冈", "凤凰城", "费利蒙", "硅谷", "矽谷", "拉斯维加斯", "洛杉矶", "圣何塞", "圣荷西", "圣克拉拉", "西雅图", "芝加哥", "沪美", "哥伦布", "纽约"], 44 | "🇹🇼": ["台湾", "TWN", "TW", "Taiwan","TAIWAN", "台北", "台中", "新北", "彰化", "CHT", "台", "HINET"], 45 | "🇮🇩": ["印度尼西亚", "IDN", "ID", "Indonesia", "印尼", "雅加达"], 46 | "🇮🇪": ["爱尔兰", "IRL", "IE", "Ireland", "IRELAND", "愛爾蘭", "都柏林"], 47 | "🇮🇱": ["以色列", "ISR", "IL", "Israel"], 48 | "🇮🇳": ["印度", "IND", "IN", "India", "INDIA", "孟买", "Mumbai"], 49 | "🇮🇸": ["冰岛", "ISL", "IS", "冰島", "Iceland"], 50 | "🇰🇵": ["朝鲜", "PRK", "KP", "North Korea"], 51 | "🇰🇷": ["韩国", "KOR", "KR", "Korea", "首尔", "韩", "韓","春川"], 52 | "🇬🇭": ["加纳", "GHA", "GH", "Ghana"], 53 | "🇱🇺": ["卢森堡", "LUX", "LU", "Luxembourg"], 54 | "🇱🇻": ["拉脱维亚", "LVA", "LA", "Latvia", "Latvija"], 55 | "🇧🇩": ["孟加拉", "BGD", "BD", "Bengal"], 56 | "🇲🇽️": ["墨西哥", "MEX", "MX", "Mexico", "MEXICO"], 57 | "🇲🇾": ["马来西亚", "MYS", "MY", "Malaysia","MALAYSIA", "马来", "馬來", "大马", "大馬", "馬來西亞", "吉隆坡"], 58 | "🇳🇱": ["荷兰", "NLD", "NL", "Netherlands", "荷蘭", "尼德蘭", "阿姆斯特丹"], 59 | "🇵🇭": ["菲律宾", "PHL", "PH", "Philippines", "菲律賓"], 60 | "🇷🇴": ["罗马尼亚", "ROU", "RO", "Rumania"], 61 | "🇸🇦": ["沙特", "SAU", "SA", "利雅得", "Saudi Arabia", "Saudi"], 62 | "🇸🇪": ["瑞典", "SWE", "SE", "Sweden"], 63 | "🇹🇭": ["泰国", "THA", "TH", "Thailand", "泰國", "曼谷"], 64 | "🇹🇷": ["土耳其", "TUR", "TR", "TR-", "TR_", "Turkey", "伊斯坦布尔"], 65 | "🇻🇳": ["越南", "VNM", "VN", "胡志明市", "Vietnam"], 66 | "🇮🇹": ["意大利", "ITA", "IT", "Italy", "Nachash", "米兰", "義大利"], 67 | "🇿🇦": ["南非", "ZAF", "ZA", "South Africa", "Johannesburg"], 68 | "🇦🇪": ["阿联酋", "ARE", "AE", "United Arab Emirates", "迪拜", "Dubai"], 69 | "🇧🇷": ["巴西", "BRA", "BR", "Brazil", "圣保罗"], 70 | "🇯🇵": ["日本", "JPN", "JP", "Japan","JAPAN", "东京", "大阪", "埼玉", "京日", "苏日", "沪日", "穗日", "川日", "中日", "泉日", "杭日", "深日", "辽日", "广日", "Tokyo"], 71 | "🇦🇷": ["阿根廷", "ARG", "AR", "Argentina"], 72 | "🇳🇴": ["挪威", "NOR", "Norway", "NO"], 73 | "🇵🇱": ["波兰", "PL", "POL", "波蘭", "Poland"], 74 | "🇨🇱": ["智利", "CHL", "CL", "Chile", "CHILE"], 75 | "🇳🇿": ["新西兰", "新西蘭", "NZL", "NZ", "New Zealand"], 76 | "🇬🇷": ["希腊", "GRC", "GR", "希臘", "Greece"], 77 | "🇪🇬": ["埃及", "EGY", "EG", "Egypt"], 78 | "🇮🇲": ["马恩岛", "IMN", "IM", "馬恩島", "Isle of Man", "Mannin"], 79 | "🇵🇹": ["葡萄牙", "PRT", "PT", "Portugal"], 80 | "🇲🇳": ["蒙古", "MNG", "MN", "Mongolia"], 81 | "🇵🇪": ["秘鲁", "PER", "PE", "祕魯", "Peru"], 82 | "🇨🇴": ["哥伦比亚", "COL", "CO", "Colombia"], 83 | "🇪🇪": ["爱沙尼亚", "EST", "EE", "Estonia"], 84 | "🇱🇾": ["利比亚", "LBY", "LY", "Libya"], 85 | "🇲🇰": ["马其顿", "MKD", "MK", "馬其頓", "Macedonia"], 86 | "🇲🇹": ["马耳他", "MLT", "MT", "Malta"], 87 | "🇻🇪": ["委内瑞拉", "VEN", "VE", "Venezuela"], 88 | "🇧🇦": ["波黑共和国", "BIH", "BA", "波黑", "Bosnia and Herzegovina"], 89 | "🇬🇪": ["格魯吉亞", "GEO", "GE", "格鲁吉亚", "Georgia"], 90 | "🇦🇱": ["阿爾巴尼亞", "ALB", "AL", "阿尔巴尼亚", "Albania"], 91 | "🇨🇾": ["塞浦路斯", "CYP", "CY", "Cyprus"], 92 | "🇨🇷": ["哥斯达黎加", "CRI", "CR", "Costa Rica"], 93 | "🇹🇳": ["突尼斯", "TUN", "TN", "Tunisia"], 94 | "🇵🇦": ["巴拿马", "PAN", "PA", "巴拿馬", "Panama"], 95 | "🇮🇷": ["伊朗", "IRN", "IR", "Iran"], 96 | "🇯🇴": ["约旦", "JOR", "JO", "約旦", "Jordan"], 97 | "🇺🇾": ["乌拉圭", "URY", "UY", "烏拉圭", "Uruguay"], 98 | "🇰🇪": ["肯尼亚", "KEN", "KE", "肯尼亞", "Kenya"], 99 | "🇰🇬": ["吉尔吉斯坦", "KGZ", "KG", "吉尔吉斯斯坦", "Kyrghyzstan"], 100 | "🇳🇵": ["尼泊尔", "NPL", "NP", "Nepal"], 101 | "🇽🇰": ["科索沃", "XKS", "XK", "Kosovo"], 102 | "🇲🇦": ["摩洛哥", "MAR", "MA", "Morocco"], 103 | "🇪🇨": ["厄瓜多尔", "ECU", "EC", "Ecuador"], 104 | "🇲🇺": ["毛里求斯", "MUS", "MU", "Mauritius"], 105 | "🇵🇷": ["波多黎各", "PRI", "PR", "Puerto Rico"], 106 | "🇭🇰": ["香港", "HKG", "HK", "Hongkong", "Hong Kong", "HongKong", "HONG KONG", "深港", "沪港", "呼港", "HKT", "HKBN", "HGC", "WTT", "CMI", "穗港", "京港", "港"], 107 | "🇨🇳": ["CN", "China", "回国", "中国","中國", "江苏", "北京", "上海", "广州", "深圳", "杭州", "徐州", "青岛", "宁波", "镇江", "back"], 108 | "🇱🇧": ["黎巴嫩", "LBN", "LB", "Lebanon"], 109 | "🇧🇳": ["文莱", "BRN", "BN", "Negara Brunei Darussalam"], 110 | "🌏": ["亚洲","Asia"] 111 | } 112 | -------------------------------------------------------------------------------- /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/network-direct.js: -------------------------------------------------------------------------------- 1 | /** 2 | 根据 Wi-Fi 或数据网络,将特定策略组(reject除外)切换成 direct 3 | 不影响 reject 去广告以及部分特殊需求 4 | js文件放置在Quantumultx/Scripts 目录下,并自行修改 Dlist/Dpolicy/Cpolicy 5 | 2023-03-24 by Shawn 6 | 7 | [task_local] 8 | event-network network-direct.js, tag = Direct 策略切换, img-url = switch.2.system 9 | 10 | //$notify("当前网络",$environment.ssid? $environment.ssid : String($environment.cellular.carrierName)) 11 | // The $prefs is for persistent store: $prefs.valueForKey(key), $prefs.setValueForKey(value, key), $prefs.removeValueForKey(key), $prefs.removeAllValues(). 12 | 13 | **/ 14 | 15 | 16 | console.log(JSON.stringify($environment)) 17 | var cname = $environment.ssid? $environment.ssid : String($environment.cellular.carrierName) 18 | var icon= $environment.ssid? "🛜": "📶" 19 | 20 | // 直连名单,Wi-Fi SSID 或 cellular.carrierName 移动运营商名 21 | let Dlist = ["CMHK", "3hk", "Alumni","GFW-wifi2"] 22 | // 直连 ssid 下需要切换 direct 的 策略组,请自行设定(仅限 static 类型,且需其子策略组内已包含 direct) 23 | let dt = "direct" 24 | let Dpolicy = {"Pr0xy": dt, "Final": dt, "Apple": dt, "YouTube" : dt} 25 | // 其它非直连 ssid 下默认的策略组,需自行设定 26 | let Cpolicy = {"Pr0xy": "香港", "Final": "Pr0xy", "Apple": "香港", "YouTube" : "香港"} 27 | 28 | // 需要重置时设置为1,并手动执行一次 29 | let Preset = 0 30 | 31 | var date = new Date(); // 创建一个Date对象 32 | var year = date.getFullYear(); // 获取年份 33 | var month = date.getMonth() + 1; // 获取月份(注意:月份从0开始,需要加1) 34 | var day = date.getDate(); // 获取日期 35 | var hours = date.getHours(); // 获取小时 36 | var minutes = date.getMinutes(); // 获取分钟 37 | var seconds = date.getSeconds(); // 获取秒钟 38 | 39 | // 格式化日期字符串,例如:2023-02-22 14:34:16 40 | var formattedDate = year + '-' + addZero(month) + '-' + addZero(day) + ' ' + addZero(hours) + ':' + addZero(minutes) + ':' + addZero(seconds); 41 | 42 | // 补零函数,用于将单个数字补零,例如:将2转换为02 43 | function addZero(num) { 44 | if (num < 10) { 45 | return '0' + num; 46 | } else { 47 | return num; 48 | } 49 | } 50 | 51 | // get policy state 52 | const message_Get = { 53 | action: "get_policy_state" 54 | }; 55 | 56 | //pssid="" 57 | let pname= $prefs.valueForKey("pssid") || "NULL-SSID" 58 | pname = Preset==1? "RESET-SSID":pname 59 | // read ssids 持久化 60 | if (pname=="NULL-SSID") { 61 | console.log("\n初次使用记录") 62 | $prefs.setValueForKey(cname, "pssid") 63 | } else if(pname == "RESET-SSID") { 64 | console.log("\n重置网络记录") 65 | $prefs.setValueForKey(cname, "pssid") 66 | } else { 67 | //console.log("上次记录ssid: ➟ " + $prefs.valueForKey("pssid")) 68 | $prefs.setValueForKey(cname, "pssid") //更新 ssid 69 | } 70 | 71 | function Display(JsonList) { 72 | let rt = JSON.stringify(JsonList).replace(/{|}|"/g,"").replace(/:/g," ➟ ").replace(/,/g,"\n") 73 | return rt 74 | } 75 | 76 | console.log("--------------------------------\n\n🚦 已设定在以下 ⟱ 网络中切换成直连 \n"+Dlist.join(" ⇔ ")+"\n--------------------------------\n") 77 | console.log("🤖 时间:"+formattedDate+"\n👥 本次网络变化: "+pname+ " ➟ "+cname+"\n--------------------------------\n") 78 | 79 | const message_Set = { 80 | action: "set_policy_state", 81 | content: Dpolicy 82 | }; 83 | 84 | // restore 策略组设置 85 | const message_Set1 = { 86 | action: "set_policy_state", 87 | content: Cpolicy 88 | }; 89 | 90 | if(Dlist.indexOf(cname)!=-1 && Dlist.indexOf(pname)==-1) { //需要切换成 direct的场景 91 | $configuration.sendMessage(message_Get).then(resolve => { 92 | if (resolve.error) { 93 | console.log(resolve.error); 94 | } 95 | if (resolve.ret) { 96 | let output=JSON.stringify(resolve.ret); 97 | //$notify("🎉 当前网络在直连名单中",cname, output) 98 | } 99 | $configuration.sendMessage(message_Set).then(resolve => { 100 | if (resolve.error) { 101 | console.log(resolve.error); 102 | } 103 | if (resolve.ret) { 104 | let output=JSON.stringify(resolve.ret); 105 | console.log("\n\n🎉 以下策略组已切换到直连\n\n"+Display(Dpolicy)) 106 | $notify(icon+" 当前网络 [ "+ pmame+" ➟ "+cname +" ]", "☑️ 以下策略组已切换到直连", Display(Dpolicy)) 107 | } 108 | $done(); 109 | } 110 | ) 111 | }, reject => { 112 | // Normally will never happen. 113 | $done(); 114 | }); 115 | } else if(Dlist.indexOf(cname)== -1 && Dlist.indexOf(pname)!=-1){ // 需要切换成 默认的场景 116 | $configuration.sendMessage(message_Set1).then(resolve => { 117 | if (resolve.error) { 118 | console.log(resolve.error); 119 | } 120 | if (resolve.ret) { 121 | let output=JSON.stringify(resolve.ret); 122 | console.log("\n\n🔙 已切换回默认策略\n\n"+Display(Cpolicy)) 123 | $notify(icon+" 当前网络 [ " +pname+" ➟ "+ cname+" ]", "🔙 已切换回默认策略",Display(Cpolicy)) 124 | } 125 | $done(); 126 | }, reject => { 127 | // Normally will never happen. 128 | $done(); 129 | }); 130 | } else if(Dlist.indexOf(cname)!= -1 && Dlist.indexOf(pname)!=-1) { 131 | console.log("🎉 无需进行切换,保持直连\n" + "\n🎯 两者均在直连列表中") 132 | console.log("🔘 当前策略:\n"+Display(Dpolicy)) 133 | $done() 134 | } else if(Dlist.indexOf(cname)== -1 && Dlist.indexOf(pname)==-1) { 135 | console.log("⚠️ 无需进行切换,保持默认策略\n" + "\n⚠️ 两者均不在直连列表中\n") 136 | console.log("🔘 当前策略:\n"+Display(Cpolicy)) 137 | $done() 138 | } 139 | 140 | 141 | -------------------------------------------------------------------------------- /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 | code: 14 | 0 成功 15 | 100 error 未知错误 16 | 101 timeout 测试超时 17 | 102 Not Found 该节点仅支持解锁 Netflix 自制剧 18 | 103 Not Available 该节点未解锁 Netflix 19 | **/ 20 | 21 | const BASE_URL = 'https://www.netflix.com/title/' 22 | 23 | const FILM_ID = 81280792 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 解锁检测', 40 | subtitle: output, 41 | content: '检测失败,请重试', 42 | } 43 | await Promise.race([test(FILM_ID),timeOut(5000)]) 44 | .then((resp) => { 45 | console.log(JSON.stringify(resp, null, 2)); 46 | let code = resp.code; 47 | let region = resp.region; 48 | if(resp.code == 0) { 49 | result['content'] = '该节点完整解锁 Netflix ➟ ⟦'+flags.get(region.toUpperCase())+" 地区⟧"; 50 | } else if (code == 102) { //该节点仅支持解锁 Netflix 自制剧 51 | result['content'] = '该节点仅支持解锁 Netflix 自制剧 ➟ ⟦'+flags.get(region.toUpperCase())+" 地区⟧"; 52 | } else if (code == 103) { //该节点未解锁 Netflix 53 | result['content'] = '该节点未解锁 Netflix'; 54 | } else if (code == 101) { 55 | result['content'] = "测试超时"; 56 | } else { 57 | result['content'] = "未知问题:" +resp.content; 58 | } 59 | 60 | //$notify(result["title"], output, result["content"], link) 61 | 62 | let content = "------------------------------"+"

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

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

` + content + `

` 65 | $done({"title":"Netflix 解锁检测","htmlMessage":content}) 66 | }) 67 | })() 68 | .finally(() => $done()); 69 | 70 | function timeOut(delay) { 71 | return new Promise((resolve, reject) => { 72 | setTimeout(() => { 73 | //reject(new Error('timeout')) 74 | resolve({code: 101, content: "timeout"}) 75 | }, delay) 76 | }) 77 | } 78 | 79 | 80 | function test(filmId) { 81 | return new Promise((resolve, reject) => { 82 | let option = { 83 | url: BASE_URL + filmId, 84 | opts: opts, 85 | headers: { 86 | 'User-Agent': 87 | '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', 88 | }, 89 | } 90 | $task.fetch(option).then (response => { 91 | const region = response.body.match(/"requestCountry":{"id":"(\w\w)/)[1]; 92 | console.log('region -> ' + region) 93 | if (response.statusCode === 404) { 94 | resolve({code: 102, content: "Not Found", region: region}) 95 | return 96 | } 97 | 98 | if (response.statusCode === 403) { 99 | resolve({code: 103, content: "Not Available"}) 100 | return 101 | } 102 | 103 | if (response.statusCode === 200) { 104 | const isPlayable = response.body.match(/"isPlayable":(true|false)/)[1]; 105 | if(isPlayable === 'false') { 106 | resolve({code: 102, content: "Playable is false", region: region}) 107 | } else if (!isPlayable) { 108 | // 为空 109 | resolve({code: 103, content: "Playable is null"}) 110 | } else if (isPlayable === 'true') { 111 | resolve({code: 0, content: "Netflix is Ok", region: region}) 112 | } else { 113 | resolve({code: 100, content: "unkown error", region: region}) 114 | } 115 | return 116 | } 117 | reject({code: 100, content: "Error, http code " + response.statusCode}) 118 | }) 119 | }) 120 | } 121 | -------------------------------------------------------------------------------- /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/server-info-plus.js: -------------------------------------------------------------------------------- 1 | /*** 2 | [task_local] 3 | event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/server-info-plus.js, tag=节点信息Plus, img-url=info.bubble.system.system 4 | @XIAO_KOP 5 | 2023-04-14 6 | **/ 7 | 8 | // var content= `

` + response.body + `

`; 9 | 10 | let base_url = "https://scamalytics.com/ip/" 11 | 12 | var url = "https://api.ip.sb/geoip" 13 | var opts = { 14 | policy: $environment.params 15 | }; 16 | var myRequest = { 17 | url: url, 18 | opts: opts, 19 | timeout: 4000 20 | }; 21 | 22 | var message = "" 23 | const paras = ["ip","isp","country_code","city"] 24 | const paran = ["IP","ISP","地区","城市"] 25 | $task.fetch(myRequest).then(response => { 26 | message = response? json2info(response.body,paras) : "" 27 | let ip = JSON.parse(response.body)["ip"] 28 | var myRequest1 = { 29 | url: base_url+ip, 30 | opts: opts, 31 | timeout: 4000 32 | }; 33 | $task.fetch(myRequest1).then(response => { 34 | message = message + Display(response.body) 35 | console.log("url: "+ base_url+ip+"\n\n"+message) 36 | message = message+ "------------------------------"+"
"+""+"节点 ➟ " + $environment.params+ "" 37 | message = `

` + message + `

` 38 | $done({"title": " 🔎 IP.SB 查询结果", "htmlMessage": message}); 39 | }, reason => { 40 | message = "

🛑 查询超时" 41 | message = `

` + message + `

` 42 | $done({"title": "🔎 IP.SB 查询结果", "htmlMessage": message}); 43 | }) 44 | }, reason => { 45 | message = "

🛑 查询超时" 46 | message = `

` + message + `

` 47 | $done({"title": "🔎 IP.SB 查询结果", "htmlMessage": message}); 48 | }) 49 | 50 | function json2info(cnt,paras) { 51 | var res = "------------------------------" 52 | cnt =JSON.parse(cnt) 53 | for (i=0;i"+ "" +paran[i] + " : " + ""+ ""+cnt[paras[i]] +"
" : res 56 | } 57 | // res =res+ "------------------------------"+"
"+""+"节点 ➟ " + $environment.params+ "" 58 | // res = `

` + res + `

` 59 | return res 60 | } 61 | 62 | function Display(cnt) { 63 | let score = cnt.indexOf(`"score":`)!=-1 ? cnt.split(`"score":`)[1].split("\n")[0]: "NA" 64 | score = "
"+ "" +"欺诈指数 " + " : " + ""+ ""+ score.replace(/"|,/g,"") +"
" 65 | let risk = cnt.indexOf(`"risk":`)!=-1 ? cnt.split(`"risk":`)[1].split("\n")[0] : "NA" 66 | risk = "
"+ "" +"风险等级 " + " : " + ""+ ""+ E2C(risk.replace(/"|,/g,"")) +"
" 67 | return (score+risk) 68 | } 69 | 70 | //极高风险‼️、高风险⚠️ 和 中风险🟡 低风险✅ 71 | function E2C(cnt){ 72 | res = "NA" 73 | if (cnt.indexOf("very high")!=-1) { 74 | res = "极高风险 ‼️" 75 | } else if(cnt.indexOf("high")!=-1) { 76 | res = "高风险 ⚠️" 77 | } else if(cnt.indexOf("medium")!=-1) { 78 | res = "中风险 🟡" 79 | } else if(nt.indexOf("low")!=-1) { 80 | res = "低风险 ✅" 81 | } 82 | return res 83 | } 84 | 85 | 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" , "🇿🇦"]]) 86 | -------------------------------------------------------------------------------- /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 = 81280792 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 | resolve("Netflix Test Error") 374 | }, reason => { 375 | result["Netflix"] = "Netflix: 检测超时 🚦" 376 | console.log(result["Netflix"]) 377 | resolve("timeout") 378 | } 379 | ) 380 | } 381 | ) 382 | } 383 | 384 | function testYTB() { 385 | let option = { 386 | url: BASE_URL_YTB, 387 | opts: opts, 388 | timeout: 2800, 389 | headers: { 390 | 'User-Agent': 391 | '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' 392 | }, 393 | } 394 | $task.fetch(option).then(response=> { 395 | let data = response.body 396 | console.log("ytb:"+response.statusCode) 397 | if (response.statusCode !== 200) { 398 | //reject('Error') 399 | result["YouTube"] = "YouTube Premium: 检测失败 ❗️" 400 | } else if (data.indexOf('Premium is not available in your country') !== -1) { 401 | //resolve('Not Available') 402 | result["YouTube"] = "YouTube Premium: 未支持 🚫" 403 | } else if (data.indexOf('Premium is not available in your country') == -1) {//console.log(data.split("countryCode")[1]) 404 | let region = '' 405 | let re = new RegExp('"GL":"(.*?)"', 'gm') 406 | let ret = re.exec(data) 407 | if (ret != null && ret.length === 2) { 408 | region = ret[1] 409 | } else if (data.indexOf('www.google.cn') !== -1) { 410 | region = 'CN' 411 | } else { 412 | region = 'US' 413 | } 414 | //resolve(region) 415 | result["YouTube"] = "YouTube Premium: 支持 "+arrow+ "⟦"+flags.get(region.toUpperCase())+"⟧ 🎉" 416 | console.log("ytb:"+region+ result["YouTube"]) 417 | } 418 | }, reason => { 419 | result["YouTube"] = "YouTube Premium: 检测超时 🚦" 420 | //resolve("timeout") 421 | }) 422 | } 423 | 424 | function testDazn() { 425 | 426 | const extra =`{ 427 | "LandingPageKey":"generic", 428 | "Platform":"web", 429 | "PlatformAttributes":{}, 430 | "Manufacturer":"", 431 | "PromoCode":"", 432 | "Version":"2" 433 | }` 434 | let option = { 435 | url: BASE_URL_Dazn, 436 | method: "POST", 437 | opts: opts, 438 | timeout: 2800, 439 | headers: { 440 | 'User-Agent': 441 | 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36', 442 | "Content-Type": "application/json" 443 | }, 444 | body: extra 445 | } 446 | 447 | $task.fetch(option).then(response=> { 448 | let data = response.body 449 | //data = extra 450 | let header = JSON.stringify(response.headers) 451 | console.log("Dazn:"+response.statusCode) 452 | //console.log("Dazn:"+data) 453 | //$done(data) 454 | if (response.statusCode !== 200) { 455 | //reject('Error') 456 | result["Dazn"] = "Dazn: 检测失败 ❗️" 457 | } else if (response.statusCode == 200) {//console.log(data.split("countryCode")[1]) 458 | //console.log(data) 459 | let region = '' 460 | let re = new RegExp('"GeolocatedCountry":"(.*?)"', 'gm') 461 | let ret = re.exec(data) 462 | if (ret != null && ret.length === 2) { 463 | region = ret[1] 464 | result["Dazn"] = "Dazn: 支持 "+arrow+ "⟦"+flags.get(region.toUpperCase())+"⟧ 🎉" 465 | } else { 466 | result["Dazn"] = "Dazn: 未支持 🚫" 467 | 468 | } 469 | //resolve(region) 470 | console.log("Dazn:"+region+ result["Dazn"]) 471 | } 472 | }, reason => { 473 | result["Dazn"] = "Dazn: 检测超时 🚦" 474 | //resolve("timeout") 475 | }) 476 | } 477 | 478 | function testParam() { 479 | let option = { 480 | url: BASE_URL_Param, 481 | opts: opts1, 482 | timeout: 2800, 483 | headers: { 484 | 'User-Agent': 485 | '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' 486 | }, 487 | } 488 | $task.fetch(option).then(response=> { 489 | //let data = response.body 490 | console.log("Paramountᐩ:"+response.statusCode) 491 | if (response.statusCode == 200) { 492 | //reject('Error') 493 | result["Paramount"] = "Paramountᐩ: 支持 🎉 " 494 | } else if (response.statusCode == 302) { 495 | //resolve('Not Available') 496 | result["Paramount"] = "Paramountᐩ: 未支持 🚫" 497 | } 498 | console.log("Paramountᐩ:"+ result["Paramount"]) 499 | }, reason => { 500 | result["Paramount"] = "Paramountᐩ: 检测超时 🚦" 501 | //resolve("timeout") 502 | }) 503 | } 504 | 505 | 506 | function testDiscovery() { 507 | return new Promise((resolve, reject) =>{ 508 | let option = { 509 | url: BASE_URL_Discovery_token, 510 | opts: opts1, 511 | timeout: 2800, 512 | headers: { 513 | 'User-Agent': 514 | 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36' 515 | }, 516 | verify: false 517 | } 518 | $task.fetch(option).then(response=> { 519 | console.log("GetToken:"+response.statusCode) 520 | if(response.statusCode == 200) { 521 | let data = JSON.parse(response.body) 522 | console.log(data) 523 | let token = data["data"]["attributes"]["token"] 524 | 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` 525 | let option1 = { 526 | url: BASE_URL_Discovery, 527 | opts: opts1, 528 | timeout: 2800, 529 | headers: { 530 | 'User-Agent': 531 | 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36', 532 | "Cookie": cookievalid, 533 | }, 534 | ciphers: "DEFAULT@SECLEVEL=1", 535 | verify: false 536 | } 537 | $task.fetch(option1).then(response=> { 538 | console.log("Discovery+ Check:"+response.statusCode) 539 | let data = JSON.parse(response.body) 540 | let locationd = data["data"]["attributes"]["currentLocationTerritory"] 541 | if (locationd == "us") { 542 | result["Discovery"] = "Discoveryᐩ: 支持 🎉 " 543 | console.log("支持Discoveryᐩ") 544 | resolve("支持Discoveryᐩ") 545 | return 546 | } else { 547 | result["Discovery"] = "Discoveryᐩ: 未支持 🚫" 548 | console.log("不支持Discoveryᐩ") 549 | resolve("不支持Discoveryᐩ") 550 | return 551 | } 552 | }, reason => { 553 | console.log("Check-Error"+reason) 554 | resolve("discovery failed") 555 | }) 556 | } else { 557 | console.log("GetToken-Error"+reason) 558 | resolve("discovery failed") 559 | } 560 | }, reason => { 561 | console.log("GetToken-Error"+reason) 562 | resolve("discovery failed") 563 | })})} 564 | 565 | 566 | // openai test 567 | 568 | 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"] 569 | 570 | function testChatGPT() { 571 | return new Promise((resolve, reject) =>{ 572 | let option = { 573 | url: BASE_URL_GPT, 574 | opts: opts1, 575 | timeout: 2800, 576 | } 577 | $task.fetch(option).then(response=> { 578 | let resp = JSON.stringify(response) 579 | console.log("ChatGPT Main Test") 580 | let jdg = resp.indexOf("text/plain") 581 | if(jdg == -1) { 582 | let option1 = { 583 | url: Region_URL_GPT, 584 | opts: opts1, 585 | timeout: 2800, 586 | } 587 | $task.fetch(option1).then(response=> { 588 | console.log("ChatGPT Region Test") 589 | let region = response.body.split("loc=")[1].split("\n")[0] 590 | console.log("ChatGPT Region: "+region) 591 | let res = support_countryCodes.indexOf(region) 592 | if (res != -1) { 593 | result["ChatGPT"] = "ChatGPT: 支持 "+arrow+ "⟦"+flags.get(region.toUpperCase())+"⟧ 🎉" 594 | console.log("支持 ChatGPT") 595 | resolve("支持 ChatGPT") 596 | return 597 | } else { 598 | result["ChatGPT"] = "ChatGPT: 未支持 🚫" 599 | console.log("不支持 ChatGPT") 600 | resolve("不支持 ChatGPT") 601 | return 602 | } 603 | }, reason => { 604 | console.log("Check-Error"+reason) 605 | resolve("ChatGPT failed") 606 | }) 607 | } else { 608 | result["ChatGPT"] = "ChatGPT: 未支持 🚫" 609 | console.log("不支持 ChatGPT") 610 | resolve("不支持 ChatGPT") 611 | } 612 | }, reason => { 613 | console.log("ChatGPT-Error"+reason) 614 | resolve("ChatGPT failed") 615 | })})} -------------------------------------------------------------------------------- /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/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/.DS_Store -------------------------------------------------------------------------------- /img/dragonball/1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/1.PNG -------------------------------------------------------------------------------- /img/dragonball/10.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/10.PNG -------------------------------------------------------------------------------- /img/dragonball/11.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/11.PNG -------------------------------------------------------------------------------- /img/dragonball/12.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/12.PNG -------------------------------------------------------------------------------- /img/dragonball/13.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/13.PNG -------------------------------------------------------------------------------- /img/dragonball/14.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/14.PNG -------------------------------------------------------------------------------- /img/dragonball/15.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/15.PNG -------------------------------------------------------------------------------- /img/dragonball/16.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/16.PNG -------------------------------------------------------------------------------- /img/dragonball/17.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/17.PNG -------------------------------------------------------------------------------- /img/dragonball/18.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/18.PNG -------------------------------------------------------------------------------- /img/dragonball/19.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/19.PNG -------------------------------------------------------------------------------- /img/dragonball/2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/2.PNG -------------------------------------------------------------------------------- /img/dragonball/20.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/20.PNG -------------------------------------------------------------------------------- /img/dragonball/21.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/21.PNG -------------------------------------------------------------------------------- /img/dragonball/22.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/22.PNG -------------------------------------------------------------------------------- /img/dragonball/23.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/23.PNG -------------------------------------------------------------------------------- /img/dragonball/24.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/24.PNG -------------------------------------------------------------------------------- /img/dragonball/25.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/25.PNG -------------------------------------------------------------------------------- /img/dragonball/26.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/26.PNG -------------------------------------------------------------------------------- /img/dragonball/27.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/27.PNG -------------------------------------------------------------------------------- /img/dragonball/28.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/28.PNG -------------------------------------------------------------------------------- /img/dragonball/29.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/29.PNG -------------------------------------------------------------------------------- /img/dragonball/3.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/3.PNG -------------------------------------------------------------------------------- /img/dragonball/30.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/30.PNG -------------------------------------------------------------------------------- /img/dragonball/31.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/31.PNG -------------------------------------------------------------------------------- /img/dragonball/32.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/32.PNG -------------------------------------------------------------------------------- /img/dragonball/33.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/33.PNG -------------------------------------------------------------------------------- /img/dragonball/34.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/34.PNG -------------------------------------------------------------------------------- /img/dragonball/4.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/4.PNG -------------------------------------------------------------------------------- /img/dragonball/7.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/7.PNG -------------------------------------------------------------------------------- /img/dragonball/8.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/8.PNG -------------------------------------------------------------------------------- /img/dragonball/9.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/dragonball/9.PNG -------------------------------------------------------------------------------- /img/others/lee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/others/lee.png -------------------------------------------------------------------------------- /img/policy/apple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/policy/apple.png -------------------------------------------------------------------------------- /img/policy/as.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/policy/as.PNG -------------------------------------------------------------------------------- /img/policy/cn.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/policy/cn.PNG -------------------------------------------------------------------------------- /img/policy/cn0.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/policy/cn0.PNG -------------------------------------------------------------------------------- /img/policy/downloads.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/policy/downloads.png -------------------------------------------------------------------------------- /img/policy/eu.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/policy/eu.PNG -------------------------------------------------------------------------------- /img/policy/final.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/policy/final.png -------------------------------------------------------------------------------- /img/policy/hk.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/policy/hk.PNG -------------------------------------------------------------------------------- /img/policy/jp.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/policy/jp.PNG -------------------------------------------------------------------------------- /img/policy/mine.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/policy/mine.PNG -------------------------------------------------------------------------------- /img/policy/mo.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/policy/mo.PNG -------------------------------------------------------------------------------- /img/policy/netflix.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/policy/netflix.png -------------------------------------------------------------------------------- /img/policy/proxy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/policy/proxy.png -------------------------------------------------------------------------------- /img/policy/telegram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/policy/telegram.png -------------------------------------------------------------------------------- /img/policy/us.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/policy/us.png -------------------------------------------------------------------------------- /img/policy/youtube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/policy/youtube.png -------------------------------------------------------------------------------- /img/policy/ytb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/policy/ytb.png -------------------------------------------------------------------------------- /img/southpark/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/southpark/.DS_Store -------------------------------------------------------------------------------- /img/southpark/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/southpark/1.png -------------------------------------------------------------------------------- /img/southpark/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/southpark/10.png -------------------------------------------------------------------------------- /img/southpark/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/southpark/2.png -------------------------------------------------------------------------------- /img/southpark/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/southpark/3.png -------------------------------------------------------------------------------- /img/southpark/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/southpark/4.png -------------------------------------------------------------------------------- /img/southpark/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/southpark/5.png -------------------------------------------------------------------------------- /img/southpark/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/southpark/6.png -------------------------------------------------------------------------------- /img/southpark/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/southpark/7.png -------------------------------------------------------------------------------- /img/southpark/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/southpark/8.png -------------------------------------------------------------------------------- /img/southpark/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/img/southpark/9.png -------------------------------------------------------------------------------- /img/sub/Dler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/2c2a1732a58c37ecb940b8ae02d1178e68bec518/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 | --------------------------------------------------------------------------------