Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion QuantumultX/File/wnyd.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,6 @@ hostname = p.du.163.com
var body = $response.body;
var obj = JSON.parse(body);

obj.tradeEndTime = 1679685290000;
obj.tradeEndTime = 1879685290000;
body = JSON.stringify(obj);
$done({body});
2 changes: 1 addition & 1 deletion Surge/JS/BaiduCloud.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ if ($response.body) {
"buy_time": 0,
"product_id": "1",
"auto_upgrade_to_svip": 0,
"end_time": 1672502399,
"end_time": 1872502399,
"cluster": "vip",
"detail_cluster": "svip",
"status": 0
Expand Down
63 changes: 63 additions & 0 deletions Surge/JS/Google_CAPTCHA.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/*
Google搜索内容时并发使用多个策略(组),以避免可能出现的人机验证

注:该脚本仅兼容Surge(4.9.3+),使用时需要在脚本配置内的argument参数中填写筛选策略(组)的正则表达式,留空则表示同时使用所有策略(组)

Surge脚本配置:

[Script]
Google CAPTCHA = type=http-response,pattern=^https:\/\/www\.google\.com(\.[a-z]+|)\/search\?q=,requires-body=1,debug=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Google_CAPTCHA.js,max-size=0,timeout=10,ability=http-client-policy,argument=^(🇸🇬|🇭🇰)\s.*\d+$

[MITM]
hostname = www.google.com*

*/

let ret = {};

(async () => {
if ($response.status !== 200) {
const allPolicy = await new Promise((r) => {
$httpAPI("GET", "v1/policies", null, (v) => r(
[...v.proxies, ...v['policy-groups']]
))
});
const selected = allPolicy.filter((n) => {
return n && new RegExp(typeof $argument == 'string' ? $argument : "").test(n)
});
console.log(`[INFO]: Use policy ${JSON.stringify(selected, null, 2)}`);
const http = [
new Promise((r, e) => setTimeout(() => e('Timeout'), 5000)),
...selected.map(
(v) => new Promise((r, e) => {
$httpClient[$request.method.toLowerCase()]({
url: $request.url,
headers: $request.headers,
policy: v
}, (error, response, body) => {
if (response && response.status == 200) {
r({
policy: v,
body: {
headers: response.headers,
status: response.status,
body: body
}
})
} else if (response && response.status == 429) {
console.log(`[ERROR]: Policy "${v}" need to CAPTCHA`);
} else if (error) {
console.log(`[ERROR]: Policy "${v}" ${error}`);
}
})
})
)
];
await Promise.race(http).then((data) => {
ret = data.body;
console.log(`[INFO]: Use data from "${data.policy}"`);
});
}
})()
.catch((err) => console.log(`[ERROR]: ${(err && err.message) || err}`))
.finally(() => $done(ret));