Thanox icon indicating copy to clipboard operation
Thanox copied to clipboard

关于微信FCM测试

Open countrysideboy opened this issue 3 years ago • 49 comments

一、基础环境。使用play版,国内版未测 二、FCM注册。全局科学,登录后观察com.google.android.gms.appid.xml文件是否生成,生成了就表明注册成功了 三、FCM推送条件(以下条件缺一不可) 1、在国外。 微信冷启动时,会检测你的ip,从而决定是否走fcm,这也是导致玄学的根本原因。 因此,把下列域名的请求走科学。如果不走科学,就算fcm暂时可以了,也不长久 short.weixin.qq.com extshort.weixin.qq.com dns.weixin.qq.com (测试发现非必要) 2、微信自己的通知无法送达。 这里,就是各种教程里电池优化,乖巧的根本原理了,就是让微信自己的通知服务收不到,才会走fcm。 如果微信自己的服务能接收,那么就不会通过FCM发信息了 四、如何判断此刻微信正在走FCM通道。 很简单,判断com.tencent.mm/com.tencent.mm.plugin.fcm.WCFirebaseMessagingService服务是否运行 五、具体设置 1、科学部分 用的是小飞机,在自定义规则里,设置以下规则走proxy domain:short.weixin.qq.com, domain:extshort.weixin.qq.com, 添加以下规则走直联合 domain:qq.com, 然后,勾选微信 2、后台部分 乖巧微信即可,电池优化,结束进程的根本目的,都是为了满足第四点第2小点的条件。

countrysideboy avatar Feb 08 '22 09:02 countrysideboy

希望能增加FCM是否连接、某服务是否运行、乖巧某服务等接口,用于情景模式脚本。期望实现:fcm可用时乖巧,不可用时豁免某些服务,走常规消息推送

countrysideboy avatar Feb 08 '22 09:02 countrysideboy

我这里测试了下, domain:short.weixin.qq.com, domain:extshort.weixin.qq.com, 这两个走代理不好用。 原因是我手机上微信app的dns请求是"szshort.weixin.qq.com",没有上面这两个。 修改方式是去掉“domain:”,直接写: "short.weixin.qq.com"。这样就会“匹配目标域名中任意部分”。

这里还有一点,我用的是https://github.com/Asterisk4Magisk/Xray4Magisk 这里关于纯字符串的匹配规则,xray的说明文档是错误的,而v2fly的说明文档是正确的。 Xray:https://xtls.github.io/config/dns.html#dnsobject

纯字符串:当此字符串完整匹配目标域名时,该规则生效。例如 "xray.com" 匹配 "xray.com",但不匹配 "www.xray.com"。

V2fly:https://www.v2fly.org/config/routing.html#ruleobject

纯字符串:当此字符串匹配目标域名中任意部分,该规则生效。比如 sina.com 可以匹配 sina.com、sina.com.cn、sina.company 和 www.sina.com,但不匹配 sina.cn。

在我这里,Xray4Magisk把"short.weixin.qq.com"匹配到了"szshort.weixin.qq.com"。

另外,这里szshort的sz应该对应的是深圳,我查了一下dns,A记录在深圳和香港的IP。 收到语音通话的时候,我手机上的微信还会连接sgshort/sglong.wechat.com。这是解析到新加坡的腾讯云IP。 可能根据城市不同,short/long前面还有别的缩写。所以任意匹配是最好的。麻烦一点可以写个正则表达式。 而直连的domain需要加上wechat.com,避免语音/视频连接外面的微信服务器,合起来是: 走代理: "regexp:.*short.weixin.qq.com" 直连:(写在走代理后面) "domain:qq.com", "domain:wechat.com"

simplerick-simplefun avatar Apr 03 '22 09:04 simplerick-simplefun

我这里测试了下, domain:short.weixin.qq.com, domain:extshort.weixin.qq.com, 这两个走代理不好用。 原因是我手机上微信app的dns请求是"szshort.weixin.qq.com",没有上面这两个。 修改方式是去掉“domain:”,直接写: "short.weixin.qq.com"。这样就会“匹配目标域名中任意部分”。

这里还有一点,我用的是https://github.com/Asterisk4Magisk/Xray4Magisk 这里关于纯字符串的匹配规则,xray的说明文档是错误的,而v2fly的说明文档是正确的。 Xray:https://xtls.github.io/config/dns.html#dnsobject

纯字符串:当此字符串完整匹配目标域名时,该规则生效。例如 "xray.com" 匹配 "xray.com",但不匹配 "www.xray.com"。

V2fly:https://www.v2fly.org/config/routing.html#ruleobject

纯字符串:当此字符串匹配目标域名中任意部分,该规则生效。比如 sina.com 可以匹配 sina.com、sina.com.cn、sina.company 和 www.sina.com,但不匹配 sina.cn。

在我这里,Xray4Magisk把"short.weixin.qq.com"匹配到了"szshort.weixin.qq.com"。

另外,这里szshort的sz应该对应的是深圳,我查了一下dns,A记录在深圳和香港的IP。 收到语音通话的时候,我手机上的微信还会连接sgshort/sglong.wechat.com。这是解析到新加坡的腾讯云IP。 可能根据城市不同,short/long前面还有别的缩写。所以任意匹配是最好的。麻烦一点可以写个正则表达式。 而直连的domain需要加上wechat.com,避免语音/视频连接外面的微信服务器,合起来是: 走代理: "regexp:.*short.weixin.qq.com" 直连:(写在走代理后面) "domain:qq.com", "domain:wechat.com"

好主意,这样等于一条规则匹配多个域名

countrysideboy avatar Apr 05 '22 03:04 countrysideboy

@dangelization 2022-04-06 实测成功走fcm image

yezige avatar Apr 06 '22 08:04 yezige

我之前用android11是可以收到腾讯的FCM推送的,后来我刷了一个android12的包,然后发现按答主的操作不行,fcm收不到腾讯的推送,不知道问题出在哪里

victortoby avatar May 08 '22 15:05 victortoby

我之前用android11是可以收到腾讯的FCM推送的,后来我刷了一个android12的包,然后发现按答主的操作不行,fcm收不到腾讯的推送,不知道问题出在哪里

更正一下,可能是我没有按照答主所说的冷启动一次微信。 我冷启动之后再把微信进程杀掉就能看到FCM中有腾讯的推送

victortoby avatar May 08 '22 15:05 victortoby

歪个楼,12好用吗?bug多吗,想刷,已知的有哪些软件不兼容能告知下吗

yezige avatar May 11 '22 13:05 yezige

歪个楼,12好用吗?bug多吗,想刷,已知的有哪些软件不兼容能告知下吗

搞错了,还以为你刷了13

yezige avatar May 11 '22 16:05 yezige

歪个楼,12好用吗?bug多吗,想刷,已知的有哪些软件不兼容能告知下吗

搞错了,还以为你刷了13

我觉得不太好用,我昨天已刷回11了。

victortoby avatar May 24 '22 08:05 victortoby

歪个楼,12好用吗?bug多吗,想刷,已知的有哪些软件不兼容能告知下吗

搞错了,还以为你刷了13

我觉得不太好用,我昨天已刷回11了。

pixel 4xl路过,感觉12挺好的

yezige avatar May 24 '22 08:05 yezige

正确做法是用国外DNS服务解析楼上几个所说的域名。

csy19960309 avatar Jun 16 '22 06:06 csy19960309

正确做法是用国外DNS服务解析楼上几个所说的域名。

经测试只用代理请求DNS,不用代理连接,而用直连连接,不能激活FCM。 之前的测试都是DNS请求用直连,实际连接走代理,可以激活FCM。 我最新的版本是DNS和实际连接都走代理,可以激活FCM。 由于v2ray在处理dns时不是按照用户设定顺序,而是按照规则种类排列顺序(#1855),所以我自己修改了geosite.dat(这里下载),排除掉了"qq.com"和"wechat.com" 配置是: dns和routing都要有:

代理:
"regexp:.*short.weixin.qq.com$"
"regexp:.*short.wechat.com$"
直连:
"regexp:.*qq.com$"
"regexp:.*wechat.com$"

注意: 1.直连的block写在代理的block后面 2.如果希望DNS走代理,需要用我的geosite.dat,而且必须都使用regexp,不能用full/domain/keyword

simplerick-simplefun avatar Jul 09 '22 17:07 simplerick-simplefun

正确做法是用国外DNS服务解析楼上几个所说的域名。

经测试只用代理请求DNS,不用代理连接,而用直连连接,不能激活FCM。 之前的测试都是DNS请求用直连,实际连接走代理,可以激活FCM。 我最新的版本是DNS和实际连接都走代理,可以激活FCM。 由于v2ray在处理dns时不是按照用户设定顺序,而是按照规则种类排列顺序(#1855),所以我自己修改了geosite.dat(这里下载),排除掉了"qq.com"和"wechat.com" 配置是: dns和routing都要有:

代理:
"regexp:.*short.weixin.qq.com$"
"regexp:.*short.wechat.com$"
直连:
"regexp:.*qq.com$"
"regexp:.*wechat.com$"

注意: 1.直连的block写在代理的block后面 2.如果希望DNS走代理,需要用我的geosite.dat,而且必须都使用regexp,不能用full/domain/keyword

其实不用修改geosite.dat也可以,可以设置dns,dns的匹配是优先使用匹配成功的server

"dns": {
  "disableFallbackIfMatch": true,
  "hosts": {
    "domain:googleapis.cn": "googleapis.com"
  },
  "queryStrategy": "UseIPv4",
  "servers": [
    "https+local://223.5.5.5/dns-query",
    {
      "address": "https://1.1.1.1/dns-query",
      "domains": ["regexp:.*short.weixin.qq.com$", "regexp:.*short.wechat.com$", "geosite:geolocation-!cn"],
      "skipFallback": true
    }
  ]
}

然后设置路由让1.1.1.1走代理就可以了

{
  "type": "field",
  "ip": ["1.0.0.1", "1.1.1.1"],
  "outboundTag": "proxy"
}

yezige avatar Jul 10 '22 06:07 yezige

正确做法是用国外DNS服务解析楼上几个所说的域名。

经测试只用代理请求DNS,不用代理连接,而用直连连接,不能激活FCM。 之前的测试都是DNS请求用直连,实际连接走代理,可以激活FCM。 我最新的版本是DNS和实际连接都走代理,可以激活FCM。 由于v2ray在处理dns时不是按照用户设定顺序,而是按照规则种类排列顺序(#1855),所以我自己修改了geosite.dat(这里下载),排除掉了"qq.com"和"wechat.com" 配置是: dns和routing都要有:

代理:
"regexp:.*short.weixin.qq.com$"
"regexp:.*short.wechat.com$"
直连:
"regexp:.*qq.com$"
"regexp:.*wechat.com$"

注意: 1.直连的block写在代理的block后面 2.如果希望DNS走代理,需要用我的geosite.dat,而且必须都使用regexp,不能用full/domain/keyword

其实不用修改geosite.dat也可以,可以设置dns,dns的匹配是优先使用匹配成功的server

"dns": {
  "disableFallbackIfMatch": true,
  "hosts": {
    "domain:googleapis.cn": "googleapis.com"
  },
  "queryStrategy": "UseIPv4",
  "servers": [
    "https+local://223.5.5.5/dns-query",
    {
      "address": "https://1.1.1.1/dns-query",
      "domains": ["regexp:.*short.weixin.qq.com$", "regexp:.*short.wechat.com$", "geosite:geolocation-!cn"],
      "skipFallback": true
    }
  ]
}

然后设置路由让1.1.1.1走代理就可以了

{
  "type": "field",
  "ip": ["1.0.0.1", "1.1.1.1"],
  "outboundTag": "proxy"
}

这个是因为我有设置geosite:cn走直连dns。而geosite:cn里面就有domain:qq.com 按照v2ray目前的处理方式,domain优先于regexp,那么就会走直连dns而非代理dns了。 不过你这么一说,倒是确实可以。用expectIp:geoip:cn来抓剩下没有match到的cn site,最后所有剩下的再给代理的dns。 我再研究下,搞好了把完整的规则发出来供大家讨论参考。

simplerick-simplefun avatar Jul 10 '22 06:07 simplerick-simplefun

嗯嗯,刚参考了你的regexp,你的方法也很好,条条大路

yezige avatar Jul 10 '22 06:07 yezige

可以再分享下你的方案吗

tianshitiaoshi avatar Jan 18 '23 05:01 tianshitiaoshi

我的方案就是,在路由里设置正则

{
  "domain": ["regexp:.*short.weixin.qq.com$", "regexp:.*short.wechat.com$"],
  "outboundTag": "proxy",
  "type": "field"
},
{
  "domain": ["regexp:.*qq.com$", "regexp:.*wechat.com$"],
  "outboundTag": "bypass",
  "type": "field"
},

虽然微信成功走fcm,但有个小毛病,聊天收到的视频接收起来特别慢,应该是走了代理,不知道你们遇到没,有没有解决方案

yezige avatar Jan 18 '23 06:01 yezige

我的方案就是,在路由里设置正则

{
  "domain": ["regexp:.*short.weixin.qq.com$", "regexp:.*short.wechat.com$"],
  "outboundTag": "proxy",
  "type": "field"
},
{
  "domain": ["regexp:.*qq.com$", "regexp:.*wechat.com$"],
  "outboundTag": "bypass",
  "type": "field"
},

虽然微信成功走fcm,但有个小毛病,聊天收到的视频接收起来特别慢,应该是走了代理,不知道你们遇到没,有没有解决方案

我设置后刚开始微信也能注册上fcm,过会就不行了

tianshitiaoshi avatar Jan 18 '23 07:01 tianshitiaoshi

我的方案就是,在路由里设置正则

{
  "domain": ["regexp:.*short.weixin.qq.com$", "regexp:.*short.wechat.com$"],
  "outboundTag": "proxy",
  "type": "field"
},
{
  "domain": ["regexp:.*qq.com$", "regexp:.*wechat.com$"],
  "outboundTag": "bypass",
  "type": "field"
},

虽然微信成功走fcm,但有个小毛病,聊天收到的视频接收起来特别慢,应该是走了代理,不知道你们遇到没,有没有解决方案

我设置后刚开始微信也能注册上fcm,过会就不行了

我遇到视频接收慢的问题,就抓了一下包,发现是请求的加拿大ip,就放弃微信走fcm了,不折腾了,直接加电池不限制了,所以加油

yezige avatar Jan 18 '23 07:01 yezige

我也放弃了,搞不懂

tianshitiaoshi avatar Jan 18 '23 07:01 tianshitiaoshi

转wechat,稳定走fcm,折腾没意义了

hongfa1380 avatar Jan 22 '23 16:01 hongfa1380

转wechat,稳定走fcm,折腾没意义了

哈哈,一直是wechat,没发现走fcm呀

yezige avatar Jan 24 '23 01:01 yezige

我wechat自动就走fcm了,谷歌手机,华为国际版带谷歌服务的手机

hongfa1380 avatar Jan 24 '23 01:01 hongfa1380

我wechat自动就走fcm了,谷歌手机,华为国际版带谷歌服务的手机

我 Pixel 4xl 呀,您怎么设置的,微信代理吗?fcm走代理吗?我北京联通,wechat用了好几个月了,一直没发现走fcm

yezige avatar Jan 24 '23 01:01 yezige

我微信自动就走fcm了,谷歌手机,华为国际版带谷歌服务的手机

我Pixel 4xl呀,你怎么设置的,微信代理吗?fcm走代理吗?我北京联通,微信用了好几个月了,一直没发现走fcm

什麽都没设置,北京联通宽带数据和杭州电信宽带数据

hongfa1380 avatar Jan 24 '23 01:01 hongfa1380

😂

yezige avatar Jan 24 '23 01:01 yezige

添加以下规则走直联合

啥叫走直联合?没看明白

David-plz avatar Feb 22 '23 09:02 David-plz

目前已经成功配置FCM,但有两个小问题:

  1. 当电脑端(macOS)在线时,FCM不收消息,也就是不能两端同时登录
  2. 当FCM一定时间不推送后,重启,进入微信,再关掉后台,又能重新收到消息

n374 avatar Feb 24 '23 13:02 n374

经过一些测试,总结一下: 微信走fcm,需要微信必须处于关掉后台的状态。微信在后台保活的情况下,是不会接到fcm通知的。 然后,微信每次被拉起,无论是被fcm还是其他的拉起,都需要自己处理一会数据,才能读取出来新消息,这个时间我手机大概40秒。 文字信息,由于内容本身会包括在fcm里面,所以通知里面就能看到,延迟只有fcm的处理时间,大概10秒。但是你要回复这个消息,还是要等小一分钟的时间。 语音和视频的响铃,就需要彻底等微信拉起后处理好启动,等个半分钟到一分多钟,才会开始闹铃。 微信走fcm还有一个坏处,容易造成梯子ip泄露。 这里建议,工作场景下,就让微信一直保活,手机多充电就是了。或是直接用电脑微信。 个人场景下,可以考虑手机亮屏时保留微信后台,手机息屏后杀掉微信后台。亮屏时关闭微信并不能明显节约电量,除非消息很多(注意关闭/切断其他应用的微信推送功能,或直接杀后台);息屏时杀掉微信能节约的电量相比总息屏耗电而言还是可观的。原理是cpu频率相关。 这样,亮屏时能及时接收消息,息屏时人在休息状态,不能及时接收消息,如果有紧急情况,仍可以通过传统打电话的方式接听。 如果设置成息屏杀掉微信后台,走fcm接收消息,又会有一个问题:息屏后微信被fcm拉起,不会被自动杀掉,就会一直保留息屏后台。手动设置规则杀掉后台(如fcm通知后2.5分钟,息屏状态,杀掉微信),则会把新消息的通知一并杀掉。 所以我选择,非工作场合,不去及时接收微信消息;工作场合,尽量用电脑接收。亮屏拉起微信,接收消息,息屏杀微信后台。 最后,能不用微信,少用吧。

simplerick-simplefun avatar Feb 24 '23 14:02 simplerick-simplefun

最近使用wechat竟然可以收到fcm推送了,而且在微信不走代理、微信电源管理不加白名单的情况下,Pixel 4XL,联通4g(wifi没试),特来告诉大家这个好消息

起因是前段时间关掉了微信的电源管理白名单,按理说微信应该回经常收不到消息,可是每次都消息很准时,好奇就打开fcm推送记录看了看,发现里边好多com.tencent.mm的推送,见下图

image 69af035e7e7a0cb9f504efbad3b021c

yezige avatar May 08 '23 01:05 yezige