diff --git a/base/config/GeneralClashConfig.yml b/base/base/GeneralClashConfig.yml similarity index 100% rename from base/config/GeneralClashConfig.yml rename to base/base/GeneralClashConfig.yml diff --git a/base/config/forcerule.yml b/base/base/forcerule.yml similarity index 100% rename from base/config/forcerule.yml rename to base/base/forcerule.yml diff --git a/base/mellow.conf b/base/base/mellow.conf similarity index 100% rename from base/mellow.conf rename to base/base/mellow.conf diff --git a/base/quan.conf b/base/base/quan.conf similarity index 100% rename from base/quan.conf rename to base/base/quan.conf diff --git a/base/quanx.conf b/base/base/quanx.conf similarity index 100% rename from base/quanx.conf rename to base/base/quanx.conf diff --git a/base/simple_base.yml b/base/base/simple_base.yml similarity index 100% rename from base/simple_base.yml rename to base/base/simple_base.yml diff --git a/base/surfboard.conf b/base/base/surfboard.conf similarity index 100% rename from base/surfboard.conf rename to base/base/surfboard.conf diff --git a/base/surge.conf b/base/base/surge.conf similarity index 100% rename from base/surge.conf rename to base/base/surge.conf diff --git a/base/config/example_external_config.ini b/base/config/example_external_config.ini index d929f01..84ce0e0 100644 --- a/base/config/example_external_config.ini +++ b/base/config/example_external_config.ini @@ -3,20 +3,21 @@ ;All possible customization settings are shown below ;Options for custom groups -custom_proxy_group=Proxy`select`.*`[]AUTO`[]DIRECT`.* -custom_proxy_group=AUTO`url-test`.*`http://www.gstatic.com/generate_204`300 -custom_proxy_group=google`select`.* -custom_proxy_group=netflix`select`.* -custom_proxy_group=动画疯`select`(深台|彰化|新北|台) -custom_proxy_group=fox+`select`(HGC|HKBN|PCCW|HKT|深台|彰化|新北|台|新加坡|sg|hk|tw) -custom_proxy_group=美区影视`select`(美|美国) -custom_proxy_group=Global_media`select`.* -custom_proxy_group=Domestic`select`[]DIRECT`[]Proxy -custom_proxy_group=Apple`select`[]DIRECT`[]Proxy -custom_proxy_group=Final`select`[]Proxy`[]DIRECT -custom_proxy_group=屏蔽广告`select`[]REJECT`[]DIRECT -custom_proxy_group=UnblockNeteaseMusic`select`云音乐解锁`[]DIRECT -custom_proxy_group=Telegram`select`新加坡`[]Proxy +;custom_proxy_group=Proxy`select`.*`[]AUTO`[]DIRECT`.* +;custom_proxy_group=AUTO`url-test`.*`http://www.gstatic.com/generate_204`300 +;custom_proxy_group=google`select`.* +;custom_proxy_group=netflix`select`.* +;custom_proxy_group=动画疯`select`(深台|彰化|新北|台) +;custom_proxy_group=fox+`select`(HGC|HKBN|PCCW|HKT|深台|彰化|新北|台|新加坡|sg|hk|tw) +;custom_proxy_group=美区影视`select`(美|美国) +;custom_proxy_group=Global_media`select`.* +;custom_proxy_group=Domestic`select`[]DIRECT`[]Proxy +;custom_proxy_group=Apple`select`[]DIRECT`[]Proxy +;custom_proxy_group=Final`select`[]Proxy`[]DIRECT +;custom_proxy_group=屏蔽广告`select`[]REJECT`[]DIRECT +;custom_proxy_group=UnblockNeteaseMusic`select`云音乐解锁`[]DIRECT +;custom_proxy_group=Telegram`select`新加坡`[]Proxy +custom_proxy_group=!!import:snippets/groups_forcerule.txt ;Options for custom rulesets enable_rule_generator=false @@ -36,12 +37,12 @@ overwrite_original_rules=false ;surge_ruleset=DIRECT,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/China.list ;Options for custom base configuration file -clash_rule_base=config/forcerule.yml -;surge_rule_base=surge.conf -;surfboard_rule_base=surfboard.conf -;mellow_rule_base=mellow.conf -;quan_rule_base=quan.conf -;quanx_rule_base=quanx.conf +clash_rule_base=base/forcerule.yml +;surge_rule_base=base/surge.conf +;surfboard_rule_base=base/surfboard.conf +;mellow_rule_base=base/mellow.conf +;quan_rule_base=base/quan.conf +;quanx_rule_base=base/quanx.conf ;Options for renaming nodes ;rename=Test-(.*?)-(.*?)-(.*?)\((.*?)\)@\1\4x测试线路_自\2到\3 diff --git a/base/pref.ini b/base/pref.ini index 9cfca37..de640ff 100644 --- a/base/pref.ini +++ b/base/pref.ini @@ -16,22 +16,22 @@ exclude_remarks=(到期|剩余流量|时间|官网|产品) ;include_remarks=V3.*港 ;Clash config base used by the generator, supports local files/URL -clash_rule_base=simple_base.yml +clash_rule_base=base/simple_base.yml ;Surge config base used by the generator, supports local files/URL -surge_rule_base=surge.conf +surge_rule_base=base/surge.conf ;Surfboard config base used by the generator, supports local files/URL -surfboard_rule_base=surfboard.conf +surfboard_rule_base=base/surfboard.conf ;Mellow config base used by the generator, supports local files/URL -mellow_rule_base=mellow.conf +mellow_rule_base=base/mellow.conf ;Quantumult X config base used by the generator, supports local files/URL -quan_rule_base=quan.conf +quan_rule_base=base/quan.conf ;Quantumult X config base used by the generator, supports local files/URL -quanx_rule_base=quanx.conf +quanx_rule_base=base/quanx.conf ;Proxy used to download rulesets or subscriptions, set to NONE or empty to disable it, set to SYSTEM to use system proxy. ;Accept cURL-supported proxies (http:// https:// socks4a:// socks5://) @@ -69,53 +69,7 @@ filter_deprecated_nodes=false ;rename_node=RELAY@中转 ;rename_node=BGP-@ -; short names -; rename_node=中国@中 -; rename_node=徐州@徐 -; rename_node=深圳@深 -; rename_node=上海@沪 -; rename_node=广州@穗 -; rename_node=宁波@甬 -; rename_node=贵阳@筑 -; rename_node=武汉@汉 -; rename_node=南京@宁 -; rename_node=天津@津 -; rename_node=北京@京 -; rename_node=沈阳@沈 -; rename_node=江苏@苏 -; rename_node=浙江@浙 -; rename_node=安徽@皖 -; rename_node=福建@闽 -; rename_node=湖南@湘 -; rename_node=广东@粤 -; rename_node=海南@琼 -; rename_node=四川@川 -; rename_node=贵州@贵 -; rename_node=云南@云 -; rename_node=青海@青 -; rename_node=台湾@台 -; rename_node=香港@港 -; rename_node=澳门@澳 -; rename_node=美国@美 -; rename_node=英国@英 -; rename_node=加拿大@加 -; rename_node=法国@法 -; rename_node=德国@德 -; rename_node=瑞士@瑞 -; rename_node=日本@日 -; rename_node=韩国@韩 -; rename_node=芬兰@芬 -; rename_node=印度@印 -; rename_node=泰国@泰 -; rename_node=越南@越 -; rename_node=新加坡@新 -; rename_node=意大利@意 -; rename_node=菲律宾@菲 -; rename_node=俄罗斯@俄 -; rename_node=土耳其@土 - -; times RE -rename_node=\(?((x|X)?(\d+)(\.?\d+)?)((\s?倍率?)|(x|X))\)?@$1x +rename_node=!!import:snippets/rename_node.txt [managed_config] ;Append a '#!MANAGED-CONFIG' info to Surge configurations @@ -134,45 +88,10 @@ remove_old_emoji=true ;Rule to add emojis. Supports regular expression. ;Format: Remark_Search_Pattern,emoji -rule=(流量|时间|应急|过期|Bandwidth|expire),🏳️‍🌈 -rule=AC,🇦🇨 -rule=(AR|阿根廷),🇦🇷 -rule=(奥地利|维也纳),🇦🇹 -rule=(AU|Australia|Sydney|澳大利亚|悉尼),🇦🇺 -rule=BE,🇧🇪 -rule=(BR|Brazil|巴西|圣保罗),🇧🇷 -rule=(Canada|加拿大|蒙特利尔|温哥华|楓葉|枫叶),🇨🇦 -rule=(瑞士|苏黎世),🇨🇭 -rule=(DE|Germany|德国|法兰克福|德),🇩🇪 -rule=丹麦,🇩🇰 -rule=ES,🇪🇸 -rule=EU,🇪🇺 -rule=(Finland|芬兰|赫尔辛基),🇫🇮 -rule=(FR|France|法国|巴黎),🇫🇷 -rule=(UK|England|United.*?Kingdom|英国|英|伦敦),🇬🇧 -rule=(?i)(HK|Hong.*?Kong|香港|深港|沪港|呼港|HKT|HKBN|HGC|WTT|CMI|穗港|京港|港),🇭🇰 -rule=(Indonesia|印尼|印度尼西亚|雅加达),🇮🇩 -rule=(Ireland|爱尔兰|都柏林),🇮🇪 -rule=(India|印度|孟买),🇮🇳 -rule=(Italy|意大利|米兰),🇮🇹 -rule=(JP|Japan|日本|东京|大阪|埼玉|沪日|穗日|川日|中日|泉日|杭日),🇯🇵 -rule=(KP|朝鲜),🇰🇵 -rule=(KR|Korea|KOR|韩国|首尔|韩|韓),🇰🇷 -rule=(MO|Macao|澳门|CTM),🇲🇴 -rule=(MY|Malaysia|马来西亚),🇲🇾 -rule=(NL|Netherlands|荷兰|阿姆斯特丹),🇳🇱 -rule=(PH|Philippines|菲律宾),🇵🇭 -rule=(RO|罗马尼亚),🇷🇴 -rule=(RU|Russia|俄罗斯|伯力|莫斯科|圣彼得堡|西伯利亚|新西伯利亚|京俄|杭俄),🇷🇺 -rule=(沙特|迪拜),🇸🇦 -rule=(SE|Sweden),🇸🇪 -rule=(SG|Singapore|新加坡|狮城|沪新|京新|泉新|穗新|深新|杭新),🇸🇬 -rule=(TH|Thailand|泰国|曼谷),🇹🇭 -rule=(TR|Turkey|土耳其|伊斯坦布尔),🇹🇷 -rule=(US|America|UnitedStates|美国|美|京美|波特兰|达拉斯|俄勒冈|凤凰城|费利蒙|硅谷|拉斯维加斯|洛杉矶|圣何塞|圣克拉拉|西雅图|芝加哥|沪美),🇺🇲 -rule=(VN|越南),🇻🇳 -rule=(ZA|南非),🇿🇦 -rule=(CN|China|回国|中国|江苏|北京|上海|广州|深圳|杭州|徐州|青岛|宁波|镇江|back|TW|Taiwan|台湾|台北|台中|新北|彰化|CHT|新北|台|HINET),🇨🇳 +;rule=(流量|时间|应急|过期|Bandwidth|expire),🏳️‍🌈 +;rule=AC,🇦🇨 + +rule=!!import:snippets/emoji.txt [ruleset] ;Enable generating rules with rulesets @@ -189,34 +108,11 @@ update_ruleset_on_request=false ; Group name,[]Rule ;surge_ruleset=DIRECT,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Unbreak.list -;surge_ruleset=⛔️ 广告拦截,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Advertising.list -;surge_ruleset=🚫 运营劫持,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Hijacking.list -;surge_ruleset=🌌 YouTube,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Media/YouTube.list -;surge_ruleset=🎥 NETFLIX,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Media/Netflix.list -;surge_ruleset=HBO,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Media/HBO.list -;surge_ruleset=Fox,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Media/Fox.list -;surge_ruleset=🌍 国外媒体,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/GlobalMedia.list -;surge_ruleset=🌏 港台媒体,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/HKMTMedia.list -;surge_ruleset=📲 电报信息,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Telegram.list -;surge_ruleset=🔰 节点选择,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Global.list -;surge_ruleset=🍎 苹果服务,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Apple.list -;surge_ruleset=DIRECT,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/China.list +;surge_ruleset=🎯 全球直连,rules/LocalAreaNetwork.list +;surge_ruleset=🎯 全球直连,[]GEOIP,CN +;surge_ruleset=🐟 漏网之鱼,[]FINAL -surge_ruleset=🎯 全球直连,rules/LocalAreaNetwork.list -surge_ruleset=Ⓜ️ 微软服务,rules/MSServices.list -surge_ruleset=🎯 全球直连,rules/ConnersHua/Surge/Ruleset/Unbreak.list -surge_ruleset=🛑 全球拦截,rules/NobyDa/Surge/AdRule.list -surge_ruleset=🛑 全球拦截,rules/ConnersHua/Surge/Ruleset/Hijacking.list -;surge_ruleset=🎥 NETFLIX,rules/ConnersHua/Surge/Ruleset/Media/Netflix.list -surge_ruleset=🌍 国外媒体,rules/ConnersHua/Surge/Ruleset/GlobalMedia.list -surge_ruleset=🌏 国内媒体,rules/lhie1/Surge/Surge 3/Provider/AsianTV.list -surge_ruleset=📲 电报信息,rules/ConnersHua/Surge/Ruleset/Telegram.list -surge_ruleset=🔰 节点选择,rules/ConnersHua/Surge/Ruleset/Global.list -surge_ruleset=🍎 苹果服务,rules/ConnersHua/Surge/Ruleset/Apple.list -surge_ruleset=🎯 全球直连,rules/ConnersHua/Surge/Ruleset/China.list -surge_ruleset=🎯 全球直连,rules/NobyDa/Surge/Download.list -surge_ruleset=🎯 全球直连,[]GEOIP,CN -surge_ruleset=🐟 漏网之鱼,[]FINAL +surge_ruleset=!!import:snippets/rulesets.txt [clash_proxy_group] ;Generate Clash Proxy Group with the following patterns. Node filterting rule supports regular expression. @@ -224,6 +120,7 @@ surge_ruleset=🐟 漏网之鱼,[]FINAL ; Group_Name`url-test|fallback|load-balance`Rule_1`Rule_2`...`test_url`interval ;Rule with "[]" prefix will be added directly. +;custom_proxy_group=Proxy`select`.*`[]AUTO`[]DIRECT`.* ;custom_proxy_group=UrlTest`url-test`.*`http://www.gstatic.com/generate_204`300 ;custom_proxy_group=FallBack`fallback`.*`http://www.gstatic.com/generate_204`300 ;custom_proxy_group=LoadBalance`load-balance`.*`http://www.gstatic.com/generate_204`300 @@ -236,35 +133,10 @@ surge_ruleset=🐟 漏网之鱼,[]FINAL ;custom_proxy_group=sstw`select`!!GROUP=V2RayProvider!!(深台|彰化|新北|台|tw) ;for forcerule.yml -;custom_proxy_group=Proxy`select`.*`[]AUTO`[]DIRECT`.* -;custom_proxy_group=AUTO`url-test`.*`http://www.gstatic.com/generate_204`300 -;custom_proxy_group=google`select`.* -;custom_proxy_group=netflix`select`.* -;custom_proxy_group=动画疯`select`(深台|彰化|新北|台) -;custom_proxy_group=fox+`select`(HGC|HKBN|PCCW|HKT|深台|彰化|新北|台|新加坡|sg|hk|tw) -;custom_proxy_group=美区影视`select`(美|美国) -;custom_proxy_group=Global_media`select`.* -;custom_proxy_group=Domestic`select`[]DIRECT`[]Proxy -;custom_proxy_group=Apple`select`[]DIRECT`[]Proxy -;custom_proxy_group=Final`select`[]Proxy`[]DIRECT -;custom_proxy_group=屏蔽广告`select`[]REJECT`[]DIRECT -;custom_proxy_group=UnblockNeteaseMusic`select`云音乐解锁`[]DIRECT -;custom_proxy_group=Telegram`select`新加坡`[]Proxy +;custom_proxy_group=!!import:snippets/groups_forcerule.txt ;for Surge rulesets -custom_proxy_group=🔰 节点选择`select`[]♻️ 自动选择`[]🎯 全球直连`.* -custom_proxy_group=♻️ 自动选择`url-test`.*`http://www.gstatic.com/generate_204`300 -;custom_proxy_group=🎥 NETFLIX`select`[]🔰 节点选择`[]♻️ 自动选择`[]🎯 全球直连`.* -;custom_proxy_group=⛔️ 广告拦截`select`[]🛑 全球拦截`[]🎯 全球直连`[]🔰 节点选择 -;custom_proxy_group=🚫 运营劫持`select`[]🛑 全球拦截`[]🎯 全球直连`[]🔰 节点选择 -custom_proxy_group=🌍 国外媒体`select`[]🔰 节点选择`[]♻️ 自动选择`[]🎯 全球直连`.* -custom_proxy_group=🌏 国内媒体`select`[]🎯 全球直连`(HGC|HKBN|PCCW|HKT|深台|彰化|新北|台|hk|港|tw)`[]🔰 节点选择 -custom_proxy_group=Ⓜ️ 微软服务`select`[]🎯 全球直连`[]🔰 节点选择`.* -custom_proxy_group=📲 电报信息`select`[]🔰 节点选择`[]🎯 全球直连`.* -custom_proxy_group=🍎 苹果服务`select`[]🔰 节点选择`[]🎯 全球直连`[]♻️ 自动选择`.* -custom_proxy_group=🎯 全球直连`select`[]DIRECT -custom_proxy_group=🛑 全球拦截`select`[]REJECT`[]DIRECT -custom_proxy_group=🐟 漏网之鱼`select`[]🔰 节点选择`[]🎯 全球直连`[]♻️ 自动选择`.* +custom_proxy_group=!!import:snippets/groups.txt [server] ;Address to bind on for Web Server diff --git a/base/snippets/emoji.txt b/base/snippets/emoji.txt new file mode 100644 index 0000000..dfca9f1 --- /dev/null +++ b/base/snippets/emoji.txt @@ -0,0 +1,39 @@ +(流量|时间|应急|过期|Bandwidth|expire),🏳️‍🌈 +AC,🇦🇨 +(AR|阿根廷),🇦🇷 +(奥地利|维也纳),🇦🇹 +(AU|Australia|Sydney|澳大利亚|悉尼),🇦🇺 +BE,🇧🇪 +(BR|Brazil|巴西|圣保罗),🇧🇷 +(Canada|加拿大|蒙特利尔|温哥华|楓葉|枫叶),🇨🇦 +(瑞士|苏黎世),🇨🇭 +(DE|Germany|德国|法兰克福|德),🇩🇪 +丹麦,🇩🇰 +ES,🇪🇸 +EU,🇪🇺 +(Finland|芬兰|赫尔辛基),🇫🇮 +(FR|France|法国|巴黎),🇫🇷 +(UK|England|United.*?Kingdom|英国|英|伦敦),🇬🇧 +(?i)(HK|Hong.*?Kong|香港|深港|沪港|呼港|HKT|HKBN|HGC|WTT|CMI|穗港|京港|港),🇭🇰 +(Indonesia|印尼|印度尼西亚|雅加达),🇮🇩 +(Ireland|爱尔兰|都柏林),🇮🇪 +(India|印度|孟买),🇮🇳 +(Italy|意大利|米兰),🇮🇹 +(JP|Japan|日本|东京|大阪|埼玉|沪日|穗日|川日|中日|泉日|杭日),🇯🇵 +(KP|朝鲜),🇰🇵 +(KR|Korea|KOR|韩国|首尔|韩|韓),🇰🇷 +(MO|Macao|澳门|CTM),🇲🇴 +(MY|Malaysia|马来西亚),🇲🇾 +(NL|Netherlands|荷兰|阿姆斯特丹),🇳🇱 +(PH|Philippines|菲律宾),🇵🇭 +(RO|罗马尼亚),🇷🇴 +(RU|Russia|俄罗斯|伯力|莫斯科|圣彼得堡|西伯利亚|新西伯利亚|京俄|杭俄),🇷🇺 +(沙特|迪拜),🇸🇦 +(SE|Sweden),🇸🇪 +(SG|Singapore|新加坡|狮城|沪新|京新|泉新|穗新|深新|杭新),🇸🇬 +(TH|Thailand|泰国|曼谷),🇹🇭 +(TR|Turkey|土耳其|伊斯坦布尔),🇹🇷 +(US|America|UnitedStates|美国|美|京美|波特兰|达拉斯|俄勒冈|凤凰城|费利蒙|硅谷|拉斯维加斯|洛杉矶|圣何塞|圣克拉拉|西雅图|芝加哥|沪美),🇺🇲 +(VN|越南),🇻🇳 +(ZA|南非),🇿🇦 +(CN|China|回国|中国|江苏|北京|上海|广州|深圳|杭州|徐州|青岛|宁波|镇江|back|TW|Taiwan|台湾|台北|台中|新北|彰化|CHT|新北|台|HINET),🇨🇳 diff --git a/base/snippets/groups.txt b/base/snippets/groups.txt new file mode 100644 index 0000000..cf101b5 --- /dev/null +++ b/base/snippets/groups.txt @@ -0,0 +1,13 @@ +🔰 节点选择`select`[]♻️ 自动选择`[]🎯 全球直连`.* +♻️ 自动选择`url-test`.*`http://www.gstatic.com/generate_204`300 +;🎥 NETFLIX`select`[]🔰 节点选择`[]♻️ 自动选择`[]🎯 全球直连`.* +;⛔️ 广告拦截`select`[]🛑 全球拦截`[]🎯 全球直连`[]🔰 节点选择 +;🚫 运营劫持`select`[]🛑 全球拦截`[]🎯 全球直连`[]🔰 节点选择 +🌍 国外媒体`select`[]🔰 节点选择`[]♻️ 自动选择`[]🎯 全球直连`.* +🌏 国内媒体`select`[]🎯 全球直连`(HGC|HKBN|PCCW|HKT|深台|彰化|新北|台|hk|港|tw)`[]🔰 节点选择 +Ⓜ️ 微软服务`select`[]🎯 全球直连`[]🔰 节点选择`.* +📲 电报信息`select`[]🔰 节点选择`[]🎯 全球直连`.* +🍎 苹果服务`select`[]🔰 节点选择`[]🎯 全球直连`[]♻️ 自动选择`.* +🎯 全球直连`select`[]DIRECT +🛑 全球拦截`select`[]REJECT`[]DIRECT +🐟 漏网之鱼`select`[]🔰 节点选择`[]🎯 全球直连`[]♻️ 自动选择`.* diff --git a/base/snippets/groups_forcerule.txt b/base/snippets/groups_forcerule.txt new file mode 100644 index 0000000..221a77b --- /dev/null +++ b/base/snippets/groups_forcerule.txt @@ -0,0 +1,15 @@ +;for forcerule.yml +Proxy`select`.*`[]AUTO`[]DIRECT`.* +AUTO`url-test`.*`http://www.gstatic.com/generate_204`300 +google`select`.* +netflix`select`.* +动画疯`select`(深台|彰化|新北|台) +fox+`select`(HGC|HKBN|PCCW|HKT|深台|彰化|新北|台|新加坡|sg|hk|tw) +美区影视`select`(美|美国) +Global_media`select`.* +Domestic`select`[]DIRECT`[]Proxy +Apple`select`[]DIRECT`[]Proxy +Final`select`[]Proxy`[]DIRECT +屏蔽广告`select`[]REJECT`[]DIRECT +UnblockNeteaseMusic`select`云音乐解锁`[]DIRECT +Telegram`select`新加坡`[]Proxy diff --git a/base/snippets/rename_node.txt b/base/snippets/rename_node.txt new file mode 100644 index 0000000..5b47690 --- /dev/null +++ b/base/snippets/rename_node.txt @@ -0,0 +1,47 @@ +;short names +;中国@中 +;徐州@徐 +;深圳@深 +;上海@沪 +;广州@穗 +;宁波@甬 +;贵阳@筑 +;武汉@汉 +;南京@宁 +;天津@津 +;北京@京 +;沈阳@沈 +;江苏@苏 +;浙江@浙 +;安徽@皖 +;福建@闽 +;湖南@湘 +;广东@粤 +;海南@琼 +;四川@川 +;贵州@贵 +;云南@云 +;青海@青 +;台湾@台 +;香港@港 +;澳门@澳 +;美国@美 +;英国@英 +;加拿大@加 +;法国@法 +;德国@德 +;瑞士@瑞 +;日本@日 +;韩国@韩 +;芬兰@芬 +;印度@印 +;泰国@泰 +;越南@越 +;新加坡@新 +;意大利@意 +;菲律宾@菲 +;俄罗斯@俄 +;土耳其@土 + +;times RE +\(?((x|X)?(\d+)(\.?\d+)?)((\s?倍率?)|(x|X))\)?@$1x diff --git a/base/snippets/rulesets.txt b/base/snippets/rulesets.txt new file mode 100644 index 0000000..98c99b8 --- /dev/null +++ b/base/snippets/rulesets.txt @@ -0,0 +1,15 @@ +🎯 全球直连,rules/LocalAreaNetwork.list +Ⓜ️ 微软服务,rules/MSServices.list +🎯 全球直连,rules/ConnersHua/Surge/Ruleset/Unbreak.list +🛑 全球拦截,rules/NobyDa/Surge/AdRule.list +🛑 全球拦截,rules/ConnersHua/Surge/Ruleset/Hijacking.list +;🎥 NETFLIX,rules/ConnersHua/Surge/Ruleset/Media/Netflix.list +🌍 国外媒体,rules/ConnersHua/Surge/Ruleset/GlobalMedia.list +🌏 国内媒体,rules/lhie1/Surge/Surge 3/Provider/AsianTV.list +📲 电报信息,rules/ConnersHua/Surge/Ruleset/Telegram.list +🔰 节点选择,rules/ConnersHua/Surge/Ruleset/Global.list +🍎 苹果服务,rules/ConnersHua/Surge/Ruleset/Apple.list +🎯 全球直连,rules/ConnersHua/Surge/Ruleset/China.list +🎯 全球直连,rules/NobyDa/Surge/Download.list +🎯 全球直连,[]GEOIP,CN +🐟 漏网之鱼,[]FINAL diff --git a/base/snippets/rulesets_remote.txt b/base/snippets/rulesets_remote.txt new file mode 100644 index 0000000..6b7be2e --- /dev/null +++ b/base/snippets/rulesets_remote.txt @@ -0,0 +1,12 @@ +⛔️ 广告拦截,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Advertising.list +🚫 运营劫持,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Hijacking.list +🌌 YouTube,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Media/YouTube.list +🎥 NETFLIX,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Media/Netflix.list +HBO,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Media/HBO.list +Fox,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Media/Fox.list +🌍 国外媒体,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/GlobalMedia.list +🌏 港台媒体,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/HKMTMedia.list +📲 电报信息,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Telegram.list +🔰 节点选择,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Global.list +🍎 苹果服务,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/Apple.list +DIRECT,https://raw.githubusercontent.com/ConnersHua/Profiles/master/Surge/Ruleset/China.list diff --git a/src/main.cpp b/src/main.cpp index 379bd77..ee84149 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,6 +16,7 @@ #include "subexport.h" #include "multithread.h" #include "version.h" +#include "logger.h" //common settings std::string pref_path = "pref.ini"; @@ -56,28 +57,63 @@ void SetConsoleTitle(std::string title) } #endif // _WIN32 -void setcd(char *argv[]) +void setcd(std::string &file) { + char szTemp[1024] = {}; std::string path; - char szTmp[1024]; -#ifndef _WIN32 - path.assign(argv[0]); - if(path[0] != '/') - { - getcwd(szTmp, 1023); - path.assign(szTmp); - path.append("/"); - path.append(argv[0]); - } - path = path.substr(0, path.rfind("/") + 1); +#ifdef _WIN32 + DWORD retVal = GetFullPathName(file.data(), 1023, szTemp, NULL); + if(!retVal) + return; #else - GetModuleFileName(NULL, szTmp, 1023); - strrchr(szTmp, '\\')[1] = '\0'; - path.assign(szTmp); + char *ret = realpath(file.data(), &szTemp); + if(ret == NULL) + return; #endif // _WIN32 + path.assign(szTemp); chdir(path.data()); } +int importItems(string_array &target) +{ + string_array result; + std::stringstream ss; + std::string path, content, strLine; + unsigned int itemCount = 0; + for(std::string &x : target) + { + if(x.find("!!import:") == x.npos) + { + result.emplace_back(x); + continue; + } + path = x.substr(x.find(":") + 1); + writeLog(0, "Trying to import items from " + path); + + if(fileExist(path)) + content = fileGet(path, false, api_mode); + else + content = webGet(path, ""); + if(!content.size()) + return -1; + + ss << content; + char delimiter = count(content.begin(), content.end(), '\n') < 1 ? '\r' : '\n'; + std::string::size_type lineSize; + while(getline(ss, strLine, delimiter)) + { + lineSize = strLine.size(); + if(!lineSize || strLine[0] == ';' || strLine[0] == '#' || (lineSize >= 2 && strLine[0] == '/' && strLine[1] == '/')) //empty lines and comments are ignored + continue; + result.emplace_back(strLine); + itemCount++; + } + } + target.swap(result); + writeLog(0, "Imported " + std::to_string(itemCount) + " item(s)."); + return 0; +} + void refreshRulesets(string_array &ruleset_list, std::vector &rca) { eraseElements(rca); @@ -206,6 +242,7 @@ void readConf() if(ini.ItemPrefixExist("rename_node")) { ini.GetAll("rename_node", tempArray); + importItems(tempArray); safe_set_renames(tempArray); eraseElements(tempArray); } @@ -217,12 +254,14 @@ void readConf() if(ini.ItemPrefixExist("stream_rule")) { ini.GetAll("stream_rule", tempArray); + importItems(tempArray); safe_set_streams(tempArray); eraseElements(tempArray); } if(ini.ItemPrefixExist("time_rule")) { ini.GetAll("time_rule", tempArray); + importItems(tempArray); safe_set_times(tempArray); eraseElements(tempArray); } @@ -242,6 +281,7 @@ void readConf() if(ini.ItemPrefixExist("rule")) { ini.GetAll("rule", tempArray); + importItems(tempArray); safe_set_emojis(tempArray); eraseElements(tempArray); } @@ -254,7 +294,11 @@ void readConf() if(ini.ItemExist("update_ruleset_on_request")) update_ruleset_on_request = ini.GetBool("update_ruleset_on_request"); if(ini.ItemPrefixExist("surge_ruleset")) + { ini.GetAll("surge_ruleset", rulesets); + importItems(rulesets); + } + } else { @@ -264,7 +308,10 @@ void readConf() ini.EnterSection("clash_proxy_group"); if(ini.ItemPrefixExist("custom_proxy_group")) + { ini.GetAll("custom_proxy_group", clash_extra_group); + importItems(clash_extra_group); + } ini.EnterSection("server"); if(ini.ItemExist("listen")) @@ -303,7 +350,7 @@ int loadExternalConfig(std::string &path, ExternalConfig &ext, std::string proxy { std::string base_content; if(fileExist(path)) - base_content = fileGet(path, false); + base_content = fileGet(path, false, api_mode); else base_content = webGet(path, proxy); @@ -318,9 +365,15 @@ int loadExternalConfig(std::string &path, ExternalConfig &ext, std::string proxy ini.EnterSection("custom"); if(ini.ItemPrefixExist("custom_proxy_group")) + { ini.GetAll("custom_proxy_group", ext.custom_proxy_group); + importItems(ext.custom_proxy_group); + } if(ini.ItemPrefixExist("surge_ruleset")) + { ini.GetAll("surge_ruleset", ext.surge_ruleset); + importItems(ext.surge_ruleset); + } if(ini.ItemExist("clash_rule_base")) ext.clash_rule_base = ini.Get("clash_rule_base"); @@ -341,9 +394,15 @@ int loadExternalConfig(std::string &path, ExternalConfig &ext, std::string proxy ext.enable_rule_generator = ini.GetBool("enable_rule_generator"); if(ini.ItemPrefixExist("rename")) + { ini.GetAll("rename", ext.rename); + importItems(ext.rename); + } if(ini.ItemPrefixExist("emoji")) + { ini.GetAll("emoji", ext.emoji); + importItems(ext.emoji); + } return 0; } @@ -818,11 +877,9 @@ int main(int argc, char *argv[]) SetConsoleOutputCP(65001); #endif // _WIN32 -#ifndef _DEBUG - setcd(argv); -#endif // _DEBUG SetConsoleTitle("subconverter " VERSION); chkArg(argc, argv); + setcd(pref_path); readConf(); if(!update_ruleset_on_request) refreshRulesets(rulesets, ruleset_content_array); @@ -955,7 +1012,7 @@ int main(int argc, char *argv[]) append_response("GET", "/getlocal", "text/plain;charset=utf-8", [](RESPONSE_CALLBACK_ARGS) -> std::string { - return fileGet(UrlDecode(getUrlArg(argument, "path"))); + return fileGet(UrlDecode(getUrlArg(argument, "path")), false); }); } diff --git a/src/misc.cpp b/src/misc.cpp index 24ed3b3..f2555bb 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -446,6 +446,7 @@ std::string getUrlArg(std::string url, std::string request) return std::string(); } */ + /* std::string::size_type spos = url.find("?"); if(spos != url.npos) url.erase(0, spos + 1); @@ -453,10 +454,6 @@ std::string getUrlArg(std::string url, std::string request) string_array vArray, arglist = split(url, "&"); for(std::string &x : arglist) { - /* - if(regex_search(x.cbegin(), x.cend(), result, std::regex("^" + request + "=(.*)$"))) - return result[1]; - */ std::string::size_type epos = x.find("="); if(epos != x.npos) { @@ -464,6 +461,14 @@ std::string getUrlArg(std::string url, std::string request) return x.substr(epos + 1); } } + */ + std::string pattern = request + "="; + std::string::size_type pos = url.rfind(pattern); + if(pos != url.npos) + { + pos += pattern.size(); + return url.substr(pos, url.find("&", pos) - pos); + } return std::string(); } @@ -659,12 +664,24 @@ std::string getMD5(std::string data) return result; } -std::string fileGet(std::string path, bool binary) +std::string fileGet(std::string path, bool binary, bool scope_limit) { std::ifstream infile; std::stringstream strstrm; std::ios::openmode mode = binary ? std::ios::binary : std::ios::in; + if(scope_limit) + { +#ifdef _WIN32 + if(path.find(":/") != path.npos || path.find("..") != path.npos) + return std::string(); +#else + if(path.find("/") == 0 || path.find("..") != path.npos) + return std::string(); +#endif // _WIN32 + } + + infile.open(path, mode); if(infile) { @@ -707,12 +724,12 @@ bool fileCopy(std::string source, std::string dest) std::string fileToBase64(std::string filepath) { - return base64_encode(fileGet(filepath)); + return base64_encode(fileGet(filepath, true)); } std::string fileGetMD5(std::string filepath) { - return getMD5(fileGet(filepath)); + return getMD5(fileGet(filepath, true)); } int fileWrite(std::string path, std::string content, bool overwrite) diff --git a/src/misc.h b/src/misc.h index c50ccad..aa5a72b 100644 --- a/src/misc.h +++ b/src/misc.h @@ -56,7 +56,7 @@ int to_int(std::string str, int def_vaule = 0); std::string UTF8ToCodePoint(std::string data); std::string GetEnv(std::string name); -std::string fileGet(std::string path, bool binary = true); +std::string fileGet(std::string path, bool binary, bool scope_limit = false); int fileWrite(std::string path, std::string content, bool overwrite); bool fileExist(std::string path); bool fileCopy(std::string source,std::string dest);