感谢网友WalkMan77的原创投稿
PS:需要一台服务器配合使用,国内外的服务器皆可,(服务器可用不关机的PC代替,网络满足条件即可,下方有提供Windows环境配置的地址,本人未测试,故本文不作介绍)。使用FCM/GCM通道需要一个能够访问Google,最好能7*24在线的机器;使用MiPush/HwPush/MzPush通道国内外服务器皆可,通常国内的服务器会延迟低一些。
前天偶然在酷安看到一个叫做GcmForMojo的应用,软件很小,没有多余权限,借助它可以通过系统推送服务实现在不打开QQ及微信的情况下接收消息,无需常驻后台,昨天自己试用了一下感觉很棒,把教程给大家整理分享一下附加一些使用心得。
(资料图片仅供参考)
(一) GcmForMojo在酷安的介绍
这是一个GCM/小米/华为/魅族推送消息接受程序,需要将令牌写入服务端配合Mojo-Webqq和Mojo-Weixin一起使用。
将QQ和微信的消息通过FCM/GCM/MiPush/HwPush/MzPush推送到你的手机。
建议华为手机使用华为推送(可单独安装华为移动服务共享通道)、Miui系统使用MiPush、魅族Flyme使用MzPush时,使用写轮眼禁用其他的后台推送服务。
(二)原文地址
GcmForMojo(酷安):点击这里
GcmForMojo(GitHub):点击这里
Mojo-Webqq:点击这里
Mojo-Weixin:点击这里
Windows环境:点击这里
Linux环境教程:点击这里
Linux一键安装脚本:点击这里
Openshift服务端安装教程:点击这里
盐的介绍与教程:点击这里
FCM for Mojo(GitHub):点击这里
FCM for Mojo & Mojo-WebQQ:点击这里
(三)一些说明
1、本人的服务器为Vultr日本服务器,2.5刀套餐,PC上安装Putty进行管理,系统为CentOS 7(原文为CentOS 6.8),其他Linux发行版请自行修改对应命令;手机为Android 7.1.2,已安装谷歌服务,选择使用GCM。鉴于我的实际情况,本文介绍均基于这个环境进行配置,Windows环境未测试不作介绍。
2、可以使用阿里云、腾讯云之类的国内服务器,毕竟很多都是能够免费试用一段时间的,学生套餐也足够便宜,可以拿来当一下小白鼠尝尝鲜,据说因为国内的网络环境,连接SS服务器可能会被停机,大家自行斟酌。
3、选择使用GCM/FCM获取设备码时需要科学上网,否则会导致获取失败,GcmForMojo重装或更换设备会使设备码发生变化,需要在服务器端修改为相应的设备码,配置成功后断开科学上网的连接后测试仍然可以收到相应的消息。
4、该方案按照本人的理解是在服务器端安装一个对应的软件,实现类似在PC网页版登录的效果,然后通过服务器把消息发送给手机端,因此功能受限于官方为网页版提供的功能,在GitHub的项目中有所体现,在微信端配置成功后体现的尤为明显,这时登录微信客户端会有一个微信网页版已登录的提示,因此有一个验证码确认登录也可以理解了。
5、因为昨天在配置的时候没有考虑到会写这个文章,因此没有详细的过程截图,只能尽量详细说明。代码片段由于编辑器的支持问题暂由截图代替,这些代码片段在文末有链接供下载,使用时找到对应的片段复制粘贴即可。第一次写这个,可能会略啰嗦,望见谅~下面进入正题,先介绍手动安装的方法,再介绍一键安装的方法。
(四) QQ
1、首先安装依存关系
由于我们需要Mojo::WebQQ这个Perl语言项目作为主机端接收QQ消息的平台,同时CentOS自带yum源没有Cpanm包管理,所以接下来需要安装Cpanm:
由于我们是第一次使用Cpan,程序会要求我们进行最基础的设定,一路回车即可,直到你看到:
不要惊慌,这是Cpan要求你设定一个Cpan仓库源,到这里(http://www.cpan.org/SITES.html)找一个就可以,国内的主机可以去China列寻找,选择一个镜像服务器节点离你最近的地方,墙外的服务器可以直接用主站(http://www.cpan.org/)作为镜像源。
Cpanm安装完毕后,我们就可以安装Mojo::WebQQ了,Mojo-WebQQ升级也是同样的命令,非root用户需要加上–sudo参数:
如果你是国内的主机,一般情况下下载速度会非常慢或者完全无法安装,这时候你可以这样做:
如果出现了安装错误,一般情况下是Mojolicious未成功安装造成的,这时候你需要手动安装:
成功安装Mojolicious之后再次执行:
或:
应该就可以成功安装了,
Mojo::Weixin的安装方法大致相同。
2.设定
Mojo::WebQQ安装完毕后,就可以开始进行设定了
首先我们需要新建一个Perl脚本文件来执行(要同时配置QQ及微信的建议对GCM.pl文件名称进行自定义命名方便操作,如qqGCM.pl、wxGCM.pl):
我们使用vim对文件进行操作:
点击i进入编辑模式,
可能有人还不是很熟悉vim的使用方法,这里简单介绍一下会用到的功能:
这里给出一个Perl脚本文件的模板,具体内容请根据实际情况替换更改:
保存退出,
按ESC退出编辑模式,输入:wq进行保存并退出。
安装GCMForMojo安卓客户端软件,选择对应的推送通道,打开推送开关,输入服务端地址,如http://XXX.XXX.XXX.XXX:5000,其中XXX部分为服务器地址,5000为Openqq部分自己设定的端口号,自己可做相应的修改,其它根据自己的需要进行选择,
执行:
这时候你的GCMForMojo APP应该会弹出一条检测到二维码事件的通知,点击它,使用手机端QQ扫描这个二维码,你的GCMForMojo就跑起来了。
3.注意事项
Perl进程并不会后台运行!!!同时如果你的SSH连接中断的话当前终端下运行的全部会话均会被杀死,若想保持后台运行且断掉SSH连接后依旧可正常工作,请使用screen命令:
然后请按Ctrl A,再按D键使此screen进入后台驻守,然后就可以中断SSH连接了,如果需要恢复此screen的话,请执行:
如果你有同时运行Mojo-Webqq与Mojo-Weixin的需求,在进程驻守后台后就可以按照上述方法运行另一个客户端了,恢复screen时会同时出现这两个客户端的进程,在docker前加入显示的相应数字即可,即如screen -r 1234.docker形式。
如果你没有能在/storage/emulated/0/gcmformojo/里找到下载的二维码图片或接收到GCMForMojo的二维码事件通知,那么很可能你的Mojo::WebQQ版本过旧,如果需要升级Mojo::WebQQ的话,有两种方式:
从Cpanm仓库更新:
从Git仓库源编译安装升级:
以后更新时:
Mojo::Weixin的更新方式类似,请自行替换相应字符串,
然后再执行:
应该就可以看到二维码图片或接收到通知了。
(五)微信
配置设定步骤与QQ基本相同,将Webqq字样替换为Weixin即可。需要注意的是微信二维码无法直接通过调用相册中的二维码进行识别,需要将GCMForMojo中的二维码链接发送至PC端用浏览器打开进行扫描识别。详见第九部分的第一个问题。
(六)提升安全性
由于OpenQQ组件使用HTTP请求而不是更安全的HTTPS请求,这样会很容易被他人监听,并有可能以你的身份发送消息,所以为了安全起见,强烈建议以加盐或开启HTTPS加密的方式增强安全性,供对信息安全有要求的使用,未使用的请勿在公共的开放网络发送敏感信息,避免信息的泄露。具体原因解释如下:
众所周知其实GcmForMojo的回复功能是基于Mojo::Webqq/Mojo::Weixin中的OpenQQ插件的数据传送默认通过HTTP完成,
官方示例代码如下:
如果就这样配置的话很容易就会想到问题:
1、OpenQQ插件使用的是HTTP协议,意味着可能有数据被监听的风险,
尤其像现在免费WiFi盛行通过HTTP传送极易被窃取消息(数据未被加密);
2、如果一个攻击者知道了OpenQQ的IP和所开放的端口,
那么不就可以冒充用户的身份向别人发送消息了么(未验证客户端身份);
解决办法:
针对问题一,使用HTTPS而并非HTTP传送消息,对信息进行加密。
在Mojo::WebQQ的文档中官方给出了OpenQQ在HTTPS下工作的配置代码:
由于Webqq是在Mojo的基础上开发的,因此只要是Mojo支持的HTTPS加密方式则均可使用,打开pl文件,把原来的listen一行删除再贴上如上代码,然后把tls_ca,tls_cert和tls_key的值改成自己的证书文件所在的路径。
原文作者在配置的时候只指定了tls_cert和tls_key这两个参数,tls_ca应该是不需要配置的,可以直接注释掉。
不过有两点需要注意:
1、需要注册一个自己的域名。毕竟HTTPS证书是和域名挂钩的,需要申请一个域名并绑定在你的推送服务器上,否则你是无法签发可被信任的证书的。
2、需要购买HTTPS证书,也可以使用Let's Encrypt这个免费的证书签发机构的证书,可信赖度不像之前StartSSL那么差,除了三个月需要续签一次以外没有什么大问题,签发和续期证书的步骤网上有很多,自行搜索一下就好。按理来说如果是自己生成的证书只要在客户端信任该证书也可使用,据说选择了自签发证书会更麻烦。
如果一切都配置完毕且确认没有问题,请将GcmForMojo中服务端地址里的http改成https即可。
针对问题二,服务端与客户端同时配置盐值。
OpenQQ插件中的auth参数就是用来解决接口被盗用的问题
该解决方案原理如下(参考了支付宝付款接口对于参数的验证操作):
在服务端与客户端配置好相同的盐值,当客户端向服务端发起请求时(比如客户端要给某人发送消息),客户端会将各个参数按照参数名的字母表顺序升序排列并依次把几个参数串起来,再将盐值追加其后进行md5摘要操作,把md5后得到的hash存放在新的参数sign里发往服务端(盐值不会跟着发往服务端),服务端会同样遵循客户端的步骤将各个参数与存储在服务端上的盐值连接md5,之后再将md5后得到的hash与sign进行比较,一致则表示服务端与客户端盐值相同即表示通过,服务端会继续执行客户端要求的操作,如果不一致则拒绝操作,达到防止盗用接口的目的。
通过原理不难看出该方案要求服务端和客户端都要配置好,在新版GcmForMojo已经添加了回复校验功能,现在要做的就是配置服务端。
打开pl文件,定位到OpenQQ段代码,修改auth参数(没有auth这一行就自行添加),代码如下:
可能还有人不理解盐值是什么,说通俗点吧可以算是个密码,用来验证你是不是这个QQ号主人的密码,那么如果你问这个盐值哪里来呢?盐值就像密码你可以随便编,只要保证两端盐值相同即可,但是为了安全考虑我还是推荐生成随机密码。比如在这个网站上就有随机密码生成器,随机生成一个后把服务端代码里的secret变量后面的值改成刚刚生成的密码(看注释即可),再把该密码填入GcmForMojo的“输入盐值”里即可。
此外还要在pl文件的开头加上一行代码(如果已加就不用管它):
不加这行代码运行的时候会报错。
加盐后效果如下:
以下略。
如果把HTTPS和回复校验全部配置的好的话代码大概是这个样子:
这样子基本上就已经保证消息的安全性了,大功告成~(๑•̀ㅂ•́)و✧
(七)一键安装
1、安装curl和screen工具,根据系统自行选择:
# RedHat / CentOS
# Debian / Ubuntu
2、创建一个UTF-8模式的窗口:
3、下载和运行一键安装脚本:
接下去根据提示选择需要安装的模块,Mojo-Webqq与Mojo-Weixin单独安装或一起安装皆可。你只需要提供手机的设备码,记住模块对应的端口号即可,QQ的默认端口号为5000,微信默认端口号为3000,可自行修改。
说明:
webqq_default_config.pl文件为Mojo-Webqq的配置文件,对应上文示例中的GCM.pl文件,weixin_default_config.pl文件则为Mojo-Weixin的配置文件,使用方法同上。增强安全性,进行加盐及https传输处理的方法见第六部分。
(八)附
我的Mojo-Webqq及Mojo-Weixin的配置代码(GCM传输,仅做加盐处理,未设定https传输,请自行添加设备码及盐值)。
Mojo-Webqq:点击这里
Mojo-Weixin:点击这里
(九)一些问题
1、微信二维码无法识别的问题。因为微信的限制,现在在手机端直接从相册识别验证的二维码会出现无法识别,提示升级的软件的最新版,可以通过将GCMForMojo中的二维码链接发送至电脑端,用浏览器打开,再用手机端的微信对电脑浏览器中的二维码进行识别即可,因为验证的二维码有时间限制,时间到了还未验证成功就会自动更换验证码,这时候就要重新发送至电脑端进行验证,默认二维码更换次数为10次,可以修改服务器端的配置文件提升次数的上限;
2、微信登录失败的问题。如果出现手机端二维码验证成功,服务器端登陆成功后随即注销的情况,类似于下图:
可以多尝试登录几次,或者过一段时间再尝试下看看有没有恢复,我除了在第一次登录的时候有碰到过之外,其他都登录正常,因为当时没有截图,只能在issues中找了一张近似的截图.....
3、微信多账户登录。可以通过修改cookie路径实现,避免冲突,详见:
https://github.com/sjdy521/Mojo-Webqq/issues/97
https://metacpan.org/pod/distribution/Mojo-Weixin/doc/Weixin.pod#new-初始化一个微信客户端对象;
这个问题的解决方法由于我只有一个微信账号没能测试,贴出来应该对有多个微信账号的朋友有用。
4、项目在GitHub的提问区的地址:
上面我只列举了几个我在使用过程中碰到的问题,下面附上GitHub提问区地址,里面有使用者在使用过程中碰到的一些问题及作者的解答,里面都是中文用户,大家不用担心看不懂。
Mojo-Weixin:点击这里
Mojo-Webqq:点击这里
代码片段下载链接:点击这里
更多使用方法请参考GitHub中项目的官方说明及开发文档,添加插件可以增加更多功能。
感谢每一位在国内如此特殊的Android生态下尽可能帮助我们获得更佳体验的开发者。
附上Mojo-Weixin及Mojo-Webqq作者sjdy521的GitHub地址:点击这里