星期二, 八月 06, 2024

178 mihomo (clash meta) 内核在访问 gstatic.com 和 googleapis.com 非大陆域名 / IP 走 DIRECT 直连 的问题

一直使用 openclash + mihomo (原 clash meta) 内核运行在路由器上, 最近似乎规则有些问题, 谷歌的 cdn 总是直连. 过一会又发现它在走代理, 而且基本都是这几个域名: 

ssl.gstatic.com
www.gstatic.com
*.googleapis.com

最早怀疑是 IPv6 的问题, 因为我最近把它打开了, 后面发现不是. 

然后是怀疑 geoip 出了问题, 我用的是 https://raw.githubusercontent.com/Loyalsoldier/geoip/release/geoip-only-cn-private.dat 这个只有 cn 和 private 的 dat, 关键代码如下: 

geodata-mode: true
geox-url:
   geoip: "https://raw.githubusercontent.com/Loyalsoldier/geoip/release/geoip-only-cn-private.dat"
   geosite: ~
   mmdb: ~
   asn: ~

因为它是 dat, 内容不可见, 我就换成了纯文本的 ipcidr + rule-set 的形式, 这种规则的好处是, ip 段可见, 方便排查. 代码如下: 

rule-providers:
  CN4:
    type: http
    path: cn4.txt
    url: "https://raw.githubusercontent.com/gaoyifan/china-operator-ip/ip-lists/china.txt"
    interval: 604800
    proxy: Tunnels
    behavior: ipcidr
    format: text

  CN6:
    type: http
    path: cn6.txt
    url: "https://raw.githubusercontent.com/gaoyifan/china-operator-ip/ip-lists/china6.txt"
    interval: 604800
    proxy: Tunnels
    behavior: ipcidr
    format: text
rules:
  - IP-CIDR,255.255.255.255/32,REJECT
  - IP-CIDR6,ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128,REJECT
  - GEOIP,PRIVATE,DIRECT
  - RULE-SET,CN4,DIRECT
  - RULE-SET,CN6,DIRECT
  - MATCH,Tunnels

像上面这样的配置, 跑了几天, 依旧不行, 有时候使用谷歌正常, 也有时候浏览器在转, 一转我就知道这二币又去直连了:

然而我的 ipv4 段里面, 根本没有 172.217.31.10: 

172.81.192.0/18 = 172.81.192.0 - 172.81.255.255

那特码的就怪了, 没有规则你凭什么匹配成 DIRECT 直连? 排查过 openclash 的运行配置, 和我写的 rules 一样, 就那么几条, 没有加别的.

后来被折腾得烦了, 直接上 rule-set 看看吧, 于是就多加了一段,  代码如下: 

rule-providers:
  GOOGLE:
    type: http
    path: google.yaml
    url: "https://******/google.yaml"  #配置在下面, 自己简单写的, 本地加载的话上面改成 type:file 具体看配置手册
    interval: 604800
    proxy: Tunnels
    behavior: classical
    format: yaml
rules:
  - IP-CIDR,255.255.255.255/32,REJECT
  - IP-CIDR6,ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128,REJECT
  - GEOIP,PRIVATE,DIRECT
  - RULE-SET,GOOGLE,Tunnels
  - RULE-SET,CN4,DIRECT
  - RULE-SET,CN6,DIRECT
  - MATCH,Tunnels

写在了 cn4 和 cn6 (或者是 geoip,cn) 的上面, 观察了几天, 问题解决了, 那几个撒币域名解析的香港地址也不直连了... 注意, 不要加 no-resolve, 因为这些 IP 大部分是由域名解析过来的, 哪怕是拦截用的 255 和 fffff 也是一样. 

以下是谷歌配置 google.yaml: 

payload:
  - DOMAIN-SUFFIX,ytimg.com
  - DOMAIN-SUFFIX,amp.dev
  - DOMAIN-SUFFIX,android.com
  - DOMAIN-SUFFIX,api.ai
  - DOMAIN-SUFFIX,app-measurement.com
  - DOMAIN-SUFFIX,app-measurement.net
  - DOMAIN-SUFFIX,appspot.com
  - DOMAIN-SUFFIX,material.io
  - DOMAIN-SUFFIX,recaptcha.net
  - DOMAIN-SUFFIX,gstatic.com
  - DOMAIN-SUFFIX,google.com
  - DOMAIN-SUFFIX,googleapis.com
  - DOMAIN-SUFFIX,g.co
  - DOMAIN-SUFFIX,flutter.dev
  - DOMAIN-SUFFIX,flutterapp.com
  - DOMAIN-SUFFIX,firebaseapp.com
  - DOMAIN-SUFFIX,firebaseio.com
  - DOMAIN-SUFFIX,blogspot.com
  - DOMAIN-SUFFIX,youtube.com
  - DOMAIN-SUFFIX,youtu.be
  - DOMAIN-SUFFIX,g.co
  - DOMAIN-SUFFIX,withgoogle.com
  - DOMAIN-SUFFIX,googleusercontent.com
  - DOMAIN-SUFFIX,ggpht.com
  - DOMAIN-SUFFIX,googlevideo.com
  - DOMAIN-KEYWORD,gvt
  - DOMAIN-KEYWORD,ampproject
  - DOMAIN-REGEX,^gvt\d\.com
  - DOMAIN-REGEX,^.*\.goog

以上是我根据自己的使用习惯和需求写的, 参考了 https://github.com/blackmatrix7/ios_rule_script/blob/master/rule/Clash/Google/Google_No_Resolve.yaml 但没有完全使用, blackmatrix 作者的这个版本算是懒人配置, 里面还有 cn 域名. 我为了防止自己的服务器送中, 把所有谷歌大陆域名都屏蔽掉了, 还有一些广告域名也是. 规则这个东西, 千人千面, 根据自己的需求来我觉得最好不过了. 

对了, 上面的规则里有正则 DOMAIN-REGEX, ≤1.18.1 的版本是用不了的. 发布博文时, 使用的版本是 1.18.7

星期六, 四月 20, 2024

177 解决 安卓电视盒子 开机后无法联网 的问题

早先买了一个 HK1RBOX R2 安卓电视盒子, 这种外贸盒子的优点是, 任意安卓软件都可以装, 相对电视板载芯片而言, 配置较高, 可以单独换, 电视只当显示器即可. 系统版本还是 a11 的 armv8. 


(不得不提一嘴, 有的安卓盒子芯片是 armv8 的, 但系统不是, 这就 tm 的很草丹了, 比如 魔百盒九联UNT413A 这一款, 一定一定要避雷. 你想想你的电脑, win10 装个 32 位, 肯定不利于以后扩展, 国内应用商店这几年都强制 64 位应用了, 过两年你买这么个破 armv7 系统的盒子就没法装软件了... 系统倒是有 root 但刷机不好刷, 且懒得折腾)


前几天折腾 AdguardHome, 精简掉了一些自己写的规则, 晚上就发现我的电视盒子就连不上网了... 有域名请求, 但就是连不上, 试过: 

1, 卸载重装 adguardhome luci-app, 不行

2, 卸载重装 openclash, 不行

3, 重置路由器设置重新配置, 不行

4, 重置安卓盒子的系统, 不行

5, fakeip 或 redirhost 外加 udp-tun (混合模式), 不行

起初以为是 mihomo (meta) 内核的 fakeip 问题, 最后排查了也不是... 特码的, 局域网里其它设备都能正常联网, 就这破玩意不行...


这时候已经折腾了五个小时, 突然在 metacubex 面板中发现, 家里的一台傻逼苹果设备, 一直在连接 time.apple.com, 几乎是每分钟都有一条新连接, 于是按照这个方向去查了查, 然后才想起来, 之前在精简规则的时候, 把常用 ntp 重定向到阿里云 ntp 的规则删了, 就是这条: 

/(\S*pool\.ntp\.org)|(ntp\.ubuntu\.com)|(\S*nist\.gov)|(time\.cloudflare\.com)|(time[0-9]*\.apple\.com)|(time[0-9]*\.google\.\S*)|(time[0-9]*\.android\.com)|(\S*\.stdtime\.gov\.tw)|(time\.windows\.com)/$dnsrewrite=NOERROR;CNAME;ntp1.aliyun.com

但是我 udp 特码的没有问题啊, discord 网页版, 还有 webrtc 测试, 都是好的... 


也不知道为什么, 总之加上重定向了之后, 就稀里糊涂地把问题解决了.

那为什么时间校准服务影响了盒子联网? 我觉得这类 sb 盒子都是一个德性, 时间校准后, 系统才能 "激活", 一位博主也碰到了同样的问题: 

https://www.monoko.jp/androidtv-activate-online/

感谢这篇文章

星期五, 十二月 29, 2023

176 CCTV 央视视频 获取 m3u8

截至发文之日, 一年之后的 2024年12月21号, 依旧是没有绿屏现象的.

JavaScript: jQuery.getJSON("https://vdn.apps.cntv.cn/api/getHttpVideoInfo.do?pid=" + guid,

function(result) {

    var content = result.hls_url.link(result.hls_url);

    var match = content.match(/<a href="(.*?)">.*?<\/a>/);

    if (match && match.length === 2) {

        var fullUrl = match[1];

        var modifiedUrl = fullUrl.replace(/maxbr=\d+/, 'maxbr=2000');

        var textarea = document.createElement("textarea");

        textarea.value = modifiedUrl;

        document.body.appendChild(textarea);

        textarea.select();

        var successful = document.execCommand("copy");

        document.body.removeChild(textarea);

        if (successful) {

            console.log("文本已成功复制到剪贴板")

        } else {

            console.error("无法复制文本到剪贴板")

        }

        console.log(modifiedUrl)

    } else {

        console.log('error')

    }

});


在 console 里粘贴此代码回车. m3u8 地址会自动粘贴至剪贴板, 感谢 google bard 的帮助. 
根据 网上的方法 修改而来

星期二, 十二月 05, 2023

175 使用 php 提取 clash 订阅中的 proxies (代理节点)

使用时, 传入base64加密的订阅即可, 如

订阅地址: https://123.xyz/api/v1/client/subscribe?token=ffffffffffffffffffffffffff&flag=clash

则获取链接为: 

https://example.com/this.php?url=aHR0cHM6Ly8xMjMueHl6L2FwaS92MS9jbGllbnQvc3Vic2NyaWJlP3Rva2VuPWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmJmZsYWc9Y2xhc2g= 

*注意 php 要 php-yaml 模块

 

<?php

$url = base64_decode($_GET['url']);


$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_HEADER, true);

curl_setopt($ch, CURLOPT_USERAGENT, 'clash.meta');

$response = curl_exec($ch);

$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);

$header = substr($response, 0, $header_size);

$body = substr($response, $header_size);

curl_close($ch);


if (preg_match('/^subscription-userinfo: (.*)$/mi', $header, $matches)) {

    $user_info = trim($matches[1]);

    header("Subscription-Userinfo: $user_info");

    //header("Content-Type: text/html; charset=UTF-8");  //如果显示有乱码就把这行打开

}


$yaml = yaml_parse($body);

$proxies = $yaml['proxies'];

echo yaml_emit(['proxies' => $proxies]);

?>  

中间那段 subscription-userinfo 的作用是, 如果订阅中 (v2board) 有这个请求头, 会一并获取回来, 可以获取剩余流量信息, 最终效果是能在客户端中展示, 如我用 metacubexd 面板, 就会展示在其中. 

使用脚本获取订阅的原因是, 有些机场写了大量规则, 好几兆, 自己有写rules所以根本用不到, 所以用php做一个过滤, 感谢老友帮忙写php

星期二, 十月 24, 2023

174 clash meta (mihomo) filter 正则表达式 必须出现某节点名, 且不区分大小写. 另外, 不得出现某节点名, 且不区分大小写

因为自己在使用 clash meta (mihomo) 的时候, 有一个需求, 就是必须筛选美国节点, 并排除带有 群组、订阅、通知 字样的节点. 

直接上正则: 

    filter: (?i)^(?!.*(?:群组|直连|官网|群组|通知|套餐|剩余|更新订阅|direct))(?=.*(?:美国|usa)).*$

正则加了i以不区分大小写. 写得像屎山但确实能用. 写在 proxy-groups 中使用, 举例: 

proxy-groups:

  - name: load_balance

    type: load-balance

    use:

      - 1

      #- 2

      - 3

      - 4

    url: https://www.gstatic.com/generate_204

    interval: 300

    filter: (?i)^(?!.*(?:群组|直连|官网|群组|通知|套餐|剩余|更新订阅|direct))(?=.*(?:美国|usa)).*$

    disable-udp: false

    lazy: true

    strategy: consistent-hashing  #round-robin|sticky-sessions


再举例: 

  - name: all_us

    type: url-test

    use:

      - 1

      #- 2

      - 3

      - 4

    url: https://www.gstatic.com/generate_204

    interval: 300

    filter: (?i)^(?!.*(?:群组|直连|官网|群组|通知|套餐|剩余|更新订阅|direct))(?=.*(?:美国|usa)).*$

    disable-udp: false

    tolerance: 0

    lazy: true


用 use + filter + 开lazy 的好处是, 不会对所有节点检测延迟, 减少一些服务器压力, 毕竟这个东西我设置的是每5分钟遍历一次的. 

星期六, 十月 21, 2023

173 小米Max高配版 Mi Max Prime (代号Helium) 刷安卓10 类原生 crDroid 或安卓7.1 类原生 lineage

流程参考了我这篇: 

162 红米k20pro 刷 crDroid 安卓13 取消data分区加密

以及主要参考了 小米MAX(标准版/高配版)免解锁Bootloader刷入LineageOS

mimax没有vendor, 所以只需要刷firmware. 以下是完整流程: 

0, 备份自己的应用数据, 可以使用 neo-backup 来获得几乎等同于以前 titanium backup 钛备份 的备份体验. 并使用多系统工具箱备份字库/基带文件. 侧边栏 - 字库备份和还原 - 备份完整字库(包含完整基带). 为什么要备份完整的字库/基带? 

1, 进入 fastboot, 用 miflash pro 刷入底包:  helium_global_images_V9.2.1.0.NBDMIEK_20171219.0000.00_7.0_global_18678acae5.tgz 如果http的链接速度过慢可以尝试https. 这个服务器好像限速了, 我下载的时候一直是1MB/s的速度. 截至发帖之日, 可以把下载链接中的 bigota.d.miui.com 域名替换为 hugeota.d.miui.com 来实现加速的效果 (如果你在路由器或本地电脑上使用adguardhome, 可以添加规则 bigota.d.miui.com^$dnsrewrite=NOERROR;A;123.6.13.6 来达到hosts重定向的效果, 这比每次下载时改链接省事得多).  加速教程详见 https://magiskcn.com/mi-hosts

2, 进入 fastboot, 用 bat 刷入twrp recovery, 可以用官方的twrp-3.7.0_9-0-helium.img, 也可以用nijel8的twrp_v323-4_hydrogen-helium_nijel8-MOD.img, 我用了官方的 (本来想去找wzsx150的, 但是他的表格里面没有helium...).

3, 在 recovery 中刷入 firmware, 可以用xiaomifirmwareupdater的10.2.2.0.NBDMIXM, 也可以用nijel8的MIUI Global-9.2.1.0, 我用了9.2.1.0这个, 使用起来没什么问题, wifi/热点/国内运营商/国外运营商/蓝牙/信号/流量... 

4, 在 recovery 中刷入刷机包, 有安卓10的 crdroid 和安卓7.1的 lineage: 

crDroid-6.27-20220217-UNOFFICIAL-Android10.0-helium-XDA-_firewall_.zip

lineage-14.1-20180915-FINAL-UNOFFICIAL-Android7.1-helium-XDA-nijel8.zip

crdroid的安卓10还有gapps的版本, 不太喜欢毒瘤在后台运行, 喜欢谷歌应用的可以去下载带有gapps的zip刷机包. 

crdroid的安卓10刷机包无加密(刷完机进入系统再进入recovery会发现data分区已加密), 所以无需修改 fstab, lineage的不清楚, 应该也没有加密, 但还是建议在第4步和第5步的中间, 在 recovery 中挂载 system 分区, 并检查 /system/system/vendor/etc/fstab.qcom 文件有无加密, 参见我的 162 号文章: 162 红米k20pro 刷 crDroid 安卓13 取消data分区加密. 

5, 下载 magisk 最新版, 并改后缀为 zip 并用 recovery 刷入. (注意: 进入系统后, magisk还会提示 下载启动器/修复 之类的, 照着提示操作就好, 修复选直接安装即可. 对了, 后续如果更新 magisk 建议进入 recovery 刷入, 我的 redmi k20 pro 选的直接安装, 然后无限重启, 又进入 recovery 重新装入 zip 包之后才正常)

magisk 两个常用模块推荐: shamiko 基于 zygisk 的 magisk hide, 能绕过一部分国内sb应用的root检测. lsposed 一个支持高版本安卓的 xposed 框架. 剩下的玩法自己研究吧. 

6, 折腾完测试运行正常后, 记得再次使用多系统工具箱备份基带文件. 侧边栏 - 字库备份和还原 - 备份完整字库(包含完整基带). 


* 如果后面再没有其它大佬接手的话, 安卓10是我目前能找到的、最高能刷到的、最为稳定的安卓版本. 


星期二, 九月 19, 2023

172 关闭 Google Chrome 右键以图搜图在侧边栏打开(Lens), 关闭右键搜索在侧边栏打开, 关闭强制显示的其它书签按钮

chrome://flags/#enable-lens-standalone

chrome://flags/#side-search

chrome://flags/#power-bookmarks-side-panel

三个全关. 

截至发布之日前有效. 当前版本: 117.0.5938.89 (有时候chrome不依赖版本, 有可能是灰度更新. 我中午睡觉起来之后就发现多了个"其他书签"关不掉...)

星期四, 八月 10, 2023

171 Thanox 使用 情景模式, 打开 youtube revanced 自动解冻 microg, 关闭时自动冻结

反感谷歌全家桶, 又大又蠢, 但又想用登录账号的YouTube, 找到了个PureTuber, 发现被骗了, 除了登录账号之外没有一点用处, 个性化推荐没有, 收藏没有, 订阅列表也没有. 

想捡起来revanced重新玩一下, 但这个货需要搭配microg使用, 而且microg必须在后台. 这就太草丹了, 于是我又想起了我的付费"手机管家":thanox, 它的功能有很多, 我主要用来压制毒瘤(划掉卡片即冻结), 它还有个情景模式(英文名profile), 类似tasker, 实现很多触发型任务. 

直接上json代码: 

[

{

"name": "启动YouTube",

"description": "如果开启了YouTube,则关联启动microG. 触发条件: 当revanced切至前台+microg为冻结状态",

"priority": 1,

"condition": "frontPkgChanged == true && to == \"app.revanced.android.youtube\" &&  pkg.isApplicationEnabled(\"com.mgoogle.android.gms\") == false ",

"actions": [

"pkg.enableApplication(\"com.mgoogle.android.gms\")"

]

}

]


还有一段是关闭youtube后冻结microg的:

[

{

"name": "关闭YouTube",

"description": "如果关闭了YouTube,则关联冻结microG. 触发条件: 当revanced卡片划掉",

"priority": 2,

"condition": "taskRemoved == true && pkgName == \"app.revanced.android.youtube\"",

"actions": [

"pkg.disableApplication(\"com.mgoogle.android.gms\")"

]

}

]


感谢: 

https://github.com/Tornaco/Thanox/issues/85

https://tornaco.github.io/Thanox/docs/profile

星期五, 七月 21, 2023

170 上古卷轴online 使用 legendary 启动器启动时提示 启动器接收到令牌错误信息 或者 elder scrolls launcher has received a token error 的解决方法



运行这一行命令: 

netsh winhttp reset proxy

只要显示下面的内容就表示重置成功了↓

当前的 WinHTTP 代理服务器设置: 直接访问(没有代理服务器)。


昨天epic商城上古卷轴网游周免, 就是和GTA5一样的付费网游, 没有时长卡之类的说法. 

epic game launcher epic启动器就是一坨大小为900MB的electron屎山, 所以我用了开源命令行版的legendary第三方客户端. 用法见 github 说明 或者我的 reddit 帖子. 


原神, 启动!

*.exe launch 4d0ff75b922447649057c237c0bd1545

但是他嘛的加载之后提示 启动器接收到令牌错误信息, 然后卸载重装英文版, 还是一样的报错 elder scrolls launcher has received a token error. 

起初怀疑是 legendary 的 auth 授权问题, 结果发现装了 epic game launcher 那坨屎山之后也是一样, 启动了一会出现黄色小感叹号... 

网上搜索得知是代理或者winhttp的问题. 知乎链接 CSDN链接 感谢他们. 

星期三, 七月 19, 2023

169 clash meta 使用 url-test 进行节点择优, 并使用此节点组成隧道

此前我在博文中写了 167 clash内核/clash meta内核, 机场tunnels隧道 实现绕过机场审计 这篇文章, 利用 clash 的 tunnels 功能, 实现了 自己的宽带网络 <-> 机场 <-> 自己搭的服务器 这种类似简单 tor 网络的功能. 

自己手上有几个机场, 来回选节点有点麻烦, 于是就用 proxy-groups.type: url-test 这个功能来进行择优, url-test组其实机场订阅里经常会看到, "自动选择"就是 url-test, 这个组的选择结果必定是延迟最低的节点, 再用这个延迟最低的节点去和"自己搭的服务器"对接, 形成隧道. 

写法如下: 

proxy-providers:

  1:

  #第一个机场

    type: http

    url: "https://订阅链接"

    path: 1.yaml

    interval: 21600


  2:

  #第二个机场

    type: http

    url: "https://订阅链接"

    path: 2.yaml

    interval: 21600


proxy-groups:

  - name: Tunnels

    type: select

    proxies:

      - 出口1

      - 出口2

      - Proxy


  - name: Proxy

    type: select

    proxies:

      - 机场1-自动选择

      - 机场2-自动选择

      - 机场1

      - 机场2


  - name: 机场1-自动选择

    type: url-test

    use:

      - 1

    tolerance: 0 #这是一个差值, 如果设置成50, 举个例子: 现在内核自动选择的节点延迟100ms, 新一轮测速中有一个节点是50ms, 那将会切换到50ms的节点. 再举个例子, 现在内核自动选择的节点延迟100ms, 新一轮测速中有一个节点是52ms, 那将不会切换到52ms的那个节点. 这个值设置为0和不写这项 其实是没有区别的, 我习惯写上. 

    lazy: true #只测选择相关的, 不会整个机场节点都测速. 比如你在下面用filter筛选出了美国节点, 那url-test就只测这些select相关的, 以及美国节点. 

    url: https://www.gstatic.com/generate_204

    interval: 300

    disable-udp: false

    #这个正则是排除这些节点名的意思, 留作备用 ^((?!(群组|直连|官网|群组|套餐|剩余|更新订阅)).)*$

    filter: 美国 #这里重点提一下, 有时候择优的节点是日本, 延迟很低, 但我的落地服务器在美国, 按照 家宽-国内中转日本的机场-美国落地服务器 的链路来走, 最高速度没变, 但doh这种dns请求, 延迟会高出好多, 所以我filter选出了美国节点, 延迟会少一点. 


  - name: 机场2-自动选择

    type: url-test

    use:

      - 2

    tolerance: 0

    lazy: true

    url: https://www.gstatic.com/generate_204

    interval: 300

    disable-udp: false

    filter: 美国


  - name: 机场1

    type: select

    use:

      - 1

    filter: ^((?!(群组|直连|官网|群组|套餐|剩余|更新订阅)).)*$


  - name: 机场2

    type: select

    use:

      - 2

    filter: ^((?!(群组|直连|官网|群组|套餐|剩余|更新订阅)).)*$


rules:
  #- PROCESS-NAME,com.kiwibrowser.browser,DIRECT
  - IP-CIDR,255.255.255.255/32,REJECT
  - IP-CIDR6,ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128,REJECT
  - GEOIP,PRIVATE,DIRECT
  - GEOIP,CN,DIRECT
  - MATCH,Tunnels #注意这里是最终的select