用 FCM 来推送 QQ 消息

月初买了个 iPhone SE,将辣鸡软件全部转移到 iOS 上之后,Android 的使用体验瞬间上升,不用忍受辣鸡国产软件的涂毒,还省了去镇压调教的功夫,续航也大幅提升,快哉快哉。

但是日常用的国产软件还有 QQ 和微信这两大流氓。微信还好,Play Store 上的版本只要关闭了后台就可以使用 FCM 来接收通知(虽然实现方式还是有点不老实),但是 QQ 就真没什么辙。

直到我找到了这个。

FCM for Mojo,简称 FFM,由 Rikka 酱开发,借助 Mojo-Webqq 实现将 QQ 消息通过 FCM 推送至 Android 设备。 有了这个,就可以从 FCM 来接收 QQ 消息了。

2018.12.19 更新:WebQQ 停止服务。

2018.10.30 更新:增加可选工作,提供 HTTP 基本认证、HTTPS 及 Nginx 配置部分内容。

重要通知:WebQQ将在2019年1月1日停止服务,项目目前已停止维护,感谢大家四年来一路陪伴

就到此为止了,留一张做最后的纪念,感谢开发者给我们带来了一段美好时光。


配置服务端

安装相关依赖

笔者所使用的系统是 Ubuntu 16.04 LTS。

git:使用包管理器来安装。

1
apt-get install git

Node.js:版本看自己喜好选择。

1
2
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
sudo apt-get install -y nodejs

Mojo-Webqq:项目推荐使用 cpanm 在线安装或升级模块。

1
2
3
curl -kL https://cpanmin.us | perl - App::cpanminus
cpanm Mojo::Webqq
cpanm Webqq::Encryption

如要更新只需再执行 cpanm Mojo::Webqq 即可。

安装 FCM for Mojo 服务端

1
2
3
4
5
cd
git clone https://github.com/RikkaApps/FCM-for-Mojo-Server.git
cd FCM-for-Mojo-Server
cp config.example.js config.js
npm install

如要更新,关闭当前正在运行的 FFM 并进入 FCM-for-Mojo-Server 目录执行以下命令。

1
2
git pull
npm install

配置客户端

前往 Play Store 下载安装 Android 客户端

点击 服务器设置,在 服务器 URL 处填写服务端地址,默认端口 5005,写成 http://w.x.y.z:5005/ 形式即可。

点击 管理设备 点击加号将当前设备加入管理列表,再点击右侧上传云端保存。

返回主界面点击 账号设置 将自己的账号密码填入其中。账号密码登录现已失效,但是如要实现某些特性还要填写账号密码,详情请看 这里

FFM 服务端默认使用明文保存密码,如果介意上面的链接中也提及了解决办法。

最后进入 通知设置 做最后修改。获取前台应用方式 如没有 root,则选择 使用情况访问,否则可以搭配 Shizuku Manager 的 root 模式选择 Shizuku 使用。

测试使用

服务端进入 FCM-for-Mojo-Server 目录,启动服务端。

1
npm start

如设置无误,手机上会收到通知并自动从服务端下载登录二维码,打开 QQ 选择扫码,点击相册从手机中选择刚下载的二维码,确认登录即可完成。

现在就可以通过 FCM 来接收你的 QQ 消息了,顺便去系统设置中把 QQ 的后台给关闭掉。

作为服务启动

1
vim /lib/systemd/system/ffm.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=a server for FCM-for-Mojo-Server
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/root/FCM-for-Mojo-Server
ExecStart=/usr/bin/npm start
PrivateTmp=true
Restart=on-failure

[Install]
WantedBy=multi-user.target
1
2
systemctl enable ffm
systemctl start ffm

现在就可以通过服务来控制 FFM 了。

可选工作

HTTP 基本认证

HTTP 基本认证由 http-auth 实现,这里只使用最简单的方法。

生成密码文件

1
htpasswd -c -s /root/FCM-for-Mojo-Server/ffm_auth username

输入2次密码之后,文件就生成在 FFM 服务端目录。编辑 config.js,找到 basic_auth 那段去掉注释(/**/)并写上密码文件的路径:

1
2
3
"basic_auth": {
"file": "/root/FCM-for-Mojo-Server/ffm_auth"
},

HTTPS

HTTPS 通过 https 模块 实现,这里只使用最简单的方法。

编辑 config.js,找到有 https 那段去掉附近的注释(/**/):

1
2
3
4
5
"https": {
"key": fs.readFileSync("/etc/nginx/ssl/neko7ina.com.key"),
"ca": fs.readFileSync("/etc/nginx/ssl/ca.cer"),
"cert": fs.readFileSync("/etc/nginx/ssl/fullchain.cer")
}

证书可以使用 acme.sh 很方便地进行申请,现在支持泛域名证书的申请,在稍后的 Nginx 的配置中可以分配一个单独的二级域名给 FFM 使用。

配置 Nginx

/etc/nginx/conf.d 中创建一个新的文件 ffm.conf 并写上如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
server {
listen 80;
server_name ffm.neko7ina.com;
return 301 https://ffm.neko7ina.com$request_uri;
}
server {
listen 443 ssl;
root /var/www/ffm;
access_log /var/log/nginx/ffm_access.log;

ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/neko7ina.com.key;

ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
add_header Strict-Transport-Security max-age=15768000;
ssl_stapling on;
ssl_stapling_verify on;

location / {
proxy_pass https://127.0.0.1:5005/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
auth_basic "FCM for Mojo";
auth_basic_user_file /root/FCM-for-Mojo-Server/ffm_auth;
}
}
1
2
nginx -t
nginx -s reload

最后修改一下客户端上的 服务器配置,将新的 URL 以及登录信息填写进去即可。

收尾工作

最后换一个简洁版本的 QQ,比如 QQ 国际版,并关掉其后台权限及通知权限。

现在,在别的 IM 软件上能够享受的 Android 通知新特性,也可以在 QQ 上享受的到了。