diff --git a/README-cn.md b/README-cn.md index 4e66c9a..a6a1421 100644 --- a/README-cn.md +++ b/README-cn.md @@ -306,7 +306,7 @@ http://127.0.0.1:25500/sub?target=%TARGET%&url=%URL%&emoji=%EMOJI%···· #### 调用说明 (进阶) | 调用参数 | 必要性 | 示例 | 解释 | -| ------------- | :-: | :------------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ------------- | :-: |:--------------------------| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | target | 必要 | surge&ver=4 | 指想要生成的配置类型,详见上方 [支持类型](#支持类型) 中的参数 | | url | 可选 | https%3A%2F%2Fwww.xxx.com | 指机场所提供的订阅链接或代理节点的分享链接,需要经过 [URLEncode](https://www.urlencoder.org/) 处理,**可选的前提是在 `default_url` 中进行指定**。也可以使用 data URI。可使用 `tag:xxx,https%3A%2F%2Fwww.xxx.com` 指定该订阅的所有节点归属于`xxx`分组,用于配置文件中的`!!GROUP=XXX` 匹配 | | group | 可选 | MySS | 用于设置该订阅的组名,多用于 SSD/SSR | @@ -340,6 +340,7 @@ http://127.0.0.1:25500/sub?target=%TARGET%&url=%URL%&emoji=%EMOJI%···· | classic | 可选 | true / false | 用于设置是否生成 Clash classical rule-provider | | tls13 | 可选 | true / false | 用于设置是否为节点增加tls1.3开启参数 | | new_name | 可选 | true / false | 如果设置为 true,则将启用 Clash 的新组名称 (proxies, proxy-groups, rules) | +| ua | 可选 | shadowrocket%2F2.2.65 | 用于自定义User-Agent字符串,需要经过 [URLEncode](https://www.urlencoder.org/) 处理。如果不指定,将使用默认的User-Agent | 举个例子: @@ -361,6 +362,25 @@ http://127.0.0.1:25500/sub?target=surge&ver=4&tfo=true&udp=true&emoji=true&exclu 最后将该链接填写至 Surge 的订阅处就大功告成了。 ``` +**使用自定义User-Agent的例子:** + +```txt +有订阅 `https://example.com/subscribe`,想转换成 Clash 的订阅,并指定User-Agent为 `shadowrocket/2.2.65` + +首先确认需要用到的参数: +target=clash 、 ua=shadowrocket/2.2.65 +url=https://example.com/subscribe + +然后将需要 URLEncode 的部分进行处理: +ua=shadowrocket%2F2.2.65 +url=https%3A%2F%2Fexample.com%2Fsubscribe + +接着将所有元素进行拼接: +http://127.0.0.1:25500/sub?target=clash&ua=shadowrocket%2F2.2.65&url=https%3A%2F%2Fexample.com%2Fsubscribe + +这样在获取订阅时就会使用指定的User-Agent字符串。 +``` + ### 配置档案 > 当通过上述 [进阶链接](#进阶链接) 配置好订阅链接后,通常会使得链接十分冗长和难以记忆,此时可以考虑使用配置档案。 diff --git a/src/generator/config/nodemanip.cpp b/src/generator/config/nodemanip.cpp index 244797d..64c6e98 100644 --- a/src/generator/config/nodemanip.cpp +++ b/src/generator/config/nodemanip.cpp @@ -41,6 +41,7 @@ int addNodes(std::string link, std::vector &allNodes, int groupID, parse_ RegexMatchConfigs &time_rules = *parse_set.time_rules; string_icase_map *request_headers = parse_set.request_header; bool &authorized = parse_set.authorized; + string_icase_map custom_headers; ConfType linkType = ConfType::Unknow; std::vector nodes; @@ -142,7 +143,17 @@ int addNodes(std::string link, std::vector &allNodes, int groupID, parse_ writeLog(LOG_TYPE_INFO, "Downloading subscription data..."); if(startsWith(link, "surge:///install-config")) //surge config link link = urlDecode(getUrlArg(link, "url")); - strSub = webGet(link, proxy, global.cacheSubscription, &extra_headers, request_headers); + + // 处理自定义用户代理 + if(request_headers) + custom_headers = *request_headers; + + if(parse_set.custom_user_agent && !parse_set.custom_user_agent->empty()) + { + custom_headers["User-Agent"] = *parse_set.custom_user_agent; + } + + strSub = webGet(link, proxy, global.cacheSubscription, &extra_headers, &custom_headers); /* if(strSub.size() == 0) { diff --git a/src/generator/config/nodemanip.h b/src/generator/config/nodemanip.h index 5bce636..4f07f33 100644 --- a/src/generator/config/nodemanip.h +++ b/src/generator/config/nodemanip.h @@ -24,6 +24,7 @@ struct parse_settings std::string *sub_info = nullptr; bool authorized = false; string_icase_map *request_header = nullptr; + std::string *custom_user_agent = nullptr; #ifndef NO_JS_RUNTIME qjs::Runtime *js_runtime = nullptr; qjs::Context *js_context = nullptr; diff --git a/src/handler/interfaces.cpp b/src/handler/interfaces.cpp index 2239d61..0aa5023 100644 --- a/src/handler/interfaces.cpp +++ b/src/handler/interfaces.cpp @@ -334,6 +334,7 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS) std::string argCustomGroups = urlSafeBase64Decode(getUrlArg(argument, "groups")), argCustomRulesets = urlSafeBase64Decode(getUrlArg(argument, "ruleset")), argExternalConfig = getUrlArg(argument, "config"); std::string argDeviceID = getUrlArg(argument, "dev_id"), argFilename = getUrlArg(argument, "filename"), argUpdateInterval = getUrlArg(argument, "interval"), argUpdateStrict = getUrlArg(argument, "strict"); std::string argRenames = getUrlArg(argument, "rename"), argFilterScript = getUrlArg(argument, "filter_script"); + std::string argUserAgent = getUrlArg(argument, "ua"); /// switches with default value tribool argUpload = getUrlArg(argument, "upload"), argEmoji = getUrlArg(argument, "emoji"), argAddEmoji = getUrlArg(argument, "add_emoji"), argRemoveEmoji = getUrlArg(argument, "remove_emoji"); @@ -610,6 +611,7 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS) parse_set.sub_info = &subInfo; parse_set.authorized = authorized; parse_set.request_header = &request.headers; + parse_set.custom_user_agent = &argUserAgent; parse_set.js_runtime = ext.js_runtime; parse_set.js_context = ext.js_context;