title | date | tags | ||
---|---|---|---|---|
GCMForMojo 的部署与设置 |
2017-01-21 11:07:03 -0800 |
|
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
最近在酷安市场看见了一个名为 GCM For Mojo 的 APP,此 APP 可曲线实现 QQ 和微信的 GCM 推送,本着随便玩玩的想法自行部署了一个
看样子以后 APP 要改名为 AllPushForMojo
了
墙外 / 可联通 GCM推送服务器的服务器一台 / 不关机的 PC
如果没有服务器还不想 24 小时开 PC 的话这里有一个 Vutlr VPS 的邀请链接 ,新注册用户赠送 $20 代金券,具体创建 VPS 步骤等请自行Google
有了用做推送的主机那么就可以进入架设阶段了
本教程环境为 CentOS 6.8 ,其他 Linux 发行版请自行修改对应命令, Windows 平台未测试,暂不提供教程
招帮忙填坑的人员
首先安装依存关系
yum -y groupinstall "Development Tools"
yum install vim git openssl-devel perl cpan make gcc g++
也不知道依存关系到底是多了还是少了
由于我们需要 Mojo::WebQQ
这个 Perl 语言项目作为主机端接收QQ消息的平台,同时 CentOS 6.8 自带 yum 源没有 Cpanm 包管理,所以接下来需要安装 Cpanm
cpan -i App::cpanminus
由于我们是第一次使用 Cpan ,程序会要求我们进行最基础的设定,一路回车即可,直到你看到
CPAN needs access to at least one CPAN mirror.
As you did not allow me to connect to the internet
you need to supply a valid CPAN URL now.
Please enter the URL of your CPAN mirror
不要惊慌,这是 Cpan 要求你设定一个 Cpan 仓库源,到这里找一个就可以,国内的主机可以去 China
列寻找,选择一个镜像服务器节点离你最近的地方,墙外的服务器可以直接用主站作为镜像源
Cpanm 安装完毕后,我们就可以安装 Mojo::WebQQ
了
cpanm Mojo::Webqq
如果你是国内的主机,一般情况下下载速度会非常慢或者完全无法安装,这时候你可以这样做
cpanm --mirror http://mirrors.163.com/cpan/ Mojo::Webqq
如果出现了安装错误,一般情况下是 Mojolicious
未成功安装造成的,这时候你需要手动安装
curl -L https://cpanmin.us | perl - -M https://cpan.metacpan.org -n Mojolicious
成功安装 Mojolicious
之后再次执行
cpanm Mojo::Webqq
或
cpanm --mirror http://mirrors.163.com/cpan/ Mojo::Webqq
应该就可以成功安装了
Mojo::Weixin
的安装方法大致相同
Mojo::WebQQ
安装完毕后,就可以开始进行设定了
首先我们需要新建一个 Perl
脚本文件来执行
touch GCM.pl
我们使用 vim
对文件进行操作
vi GCM.pl
可能有人还不是很熟悉 vim
的使用方法,这里简单介绍一下会用到的功能
i 进入编辑模式
ESC 退出编辑模式
在非编辑模式下
:wq 存盘退出 vim
:q! 不存盘退出 vim
这里给出一个 Perl
脚本文件的模板,具体内容请根据实际情况替换更改
use Mojo::Webqq;
#微信使用 use Mojo::Weixin
my $client = Mojo::Webqq->new(log_encoding=>"utf-8");
$client->load("ShowMsg");
#请根据自己所需的推送服务进行选择并删除或注释不需要的部分,填写格式请仿照 GCM 的方式填写
#以下为 GCM 推送
$client->load("GCM",data=>{
api_url => 'https://gcm-http.googleapis.com/gcm/send',
api_key=>'AIzaSyB18io0hduB_3uHxKD3XaebPCecug27ht8',
registration_ids=>["输入你自己从 GCMForMojo APP中获取到的令牌"],
allow_group=>["接受群消息的号码,如需要推送全部群消息可删除这一行,每个群号码之间使用 "", 分隔"],
ban_group=>[],
allow_discuss=>[],
ban_discuss=>[],
#此处为讨论组,填写格式同上
});
#以下为 MiPush 推送
$client->load("MiPush",data=>{
registration_ids=>[""],
allow_group=>[""],
ban_group=>[],
allow_discuss=>[],
ban_discuss=>[],
});
#以下为 HwPush 推送
$client->load("HwPush",data=>{
registration_ids=>[""],
allow_group=>[""],
ban_group=>[],
allow_discuss=>[],
ban_discuss=>[],
});
#以下为 FmPush 推送
$client->load("FmPush",data=>{
registration_ids=>[""],
allow_group=>[""],
ban_group=>[],
allow_discuss=>[],
ban_discuss=>[],
});
$client->load("Openqq",data=>{
#如果是微信改为 Openwx
listen => [{host=>"0.0.0.0",port=>5000}, ] ,
#如果是推送微信的话需要保证端口不重复,并请保证所设定的端口已经在防火墙内放行,同时需要在 APP 内设定好推送服务器的地址和端口
});
#不需要 APP 内回复功能请删除以上三行(不包括被 # 号注释掉的几行)
$client->run();
保存退出后执行
perl GCM.pl
然后使用支持 SFTP 协议的软件(例如 Xftp )连接到你的 VPS ,到 /tmp/mojo_webqq_qrcode_default.png
找到二维码图片,使用手机 QQ 客户端扫描并允许登录即可
这时候你的 GCMForMojo
APP 应该会弹出一条检测到二维码事件
的通知,点击它,使用手机端 QQ 扫描这个二维码,你的 GCMForMojo
就跑起来了
Perl 进程并不会后台运行!!!同时如果你的 SSH 连接中断的话当前终端下运行的全部会话均会被杀死,若想保持后台运行且断掉 SSH 连接后依旧可正常工作,请使用 screen
命令
screen -S docker
perl GCM.pl
然后请按 Ctrl+A
,再按 D
键使此 screen
进入后台驻守,然后就可以中断 SSH 连接了,如果需要恢复此 screen
的话,请执行
screen -r docker
如果你没有能在 /storage/emulated/0/gcmformojo/
里找到下载的二维码图片或接收到 GCMForMojo
的二维码事件通知,那么很可能你的 Mojo::WebQQ
版本过旧,如果需要升级 Mojo::WebQQ
的话,有两种方式
Cpanm 仓库更新
cpanm Mojo::Webqq
或
cpanm --mirror http://mirrors.163.com/cpan/ Mojo::Webqq
Git 仓库源编译安装升级
yum install perl-ExtUtils-MakeMaker git
git clone https://github.com/sjdy521/Mojo-Webqq.git
cd Mojo-Webqq
perl Makefile.PL
make
make install
make clean
以后更新时
cd Mojo-Webqq
git pull
perl Makefile.PL
make
make install
make clean
Mojo::Weixin
的更新方式类似,请自行替换相应字符串
然后再执行
perl GCM.pl
应该就可以看到二维码图片或接收到通知了
如果需要回复群组消息,你需要手动修改 GCM.pm
文件,由于此文件位置不固定,你需要手动查找
找到 GCM.pm
文件位置后 (一般情况下在 /usr
的相关目录内),使用 vim
对文件进行编辑
修改完毕后保存退出,群聊回复功能即可实现
从 Mojo::Webqq
2.0.6 起, GCM.pm
文件已经添加了群聊回复所需的内容
由于 OpenQQ
组件使用 HTTP
请求而不是更安全的 HTTPS
请求,这样会很容易被他人监听,并有可能以你的身份发送消息,所以为了安全起见,强烈建议以加盐或开启 HTTPS
加密的方式增强安全性
感谢 Milkice 同学整理增强安全性的方法,原文链接在此
- 加盐
在 GCM.pl
文件内加入以下内容
use Mojo::Webqq;
use Digest::MD5 qw(md5 md5_hex md5_base64);
#请确保上一行加入在文件头行,否则会报错
#以下略
$client->load("Openqq",data=>{
listen => [{host=>"0.0.0.0",port=>5000}, ] ,
auth => sub {
my($param,$controller) = @_;
my $secret = 'salt';
#请将该行salt改为你自定义的盐值,并在 Android 端内设定好你所自定义的盐值
my $text='';
foreach $key (sort keys %$param){
if($key ne 'sign'){
$value =$param->{$key};
$text.=$value;
}
}
if($param->{sign} eq md5_hex($text.$secret) ){
return 1;
}
else{
return 0;
}
}
});
以下略
加盐有什么用呢?
盐(Salt),在密码学中,是指通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这种过程称之为 “加盐”。
通俗来讲,这就是一个很简单的校验,如同一个密码,这样就可以很简单的解决之前提到的盗用问题,如果需要解决监听问题,你需要开启 HTTPS
加密
HTTPS
加密
在 GCM.pl
文件内加入以下内容
#以上略
$client->load("Openqq",data=>{
listen => [{
host =>"0.0.0.0",
port =>443,
#请求监听端口,默认443,也可以自定义
tls =>1,
#开启https请求支持
tls_ca =>"/etc/tls/ca.crt",
#可选,ca证书路径
tls_cert=>"/etc/tls/server.crt",
#服务器证书路径
tls_key =>"/etc/tls/server.key"},],
#证书对应的key文件
});
HTTPS
证书可以使用 Let's Encrypt
这个免费的证书签发机构的证书,可信赖度不像之前 StartSSL
那么差,除了三个月需要续签一次以外没有什么大问题,签发和续期证书的步骤网上有很多,自行 Google
一下就好
服务端设定好后把 Android
端的服务器上将 http://xxxxxxxx:xxxx
改为 https://xxxxxxxx:xxxx
即可
注意,如果需要 HTTPS
加密,你需要申请一个域名并绑定在你的
推送服务器
上,否则你是无法签发可被信任的证书的,除非你选择了
自签发证书
,但这样做会更麻烦
最后感谢每一位在国内如此恶劣的 Android 生态下尽可能帮助我们获得更佳体验的开发者
QQ 群:611537356
[centos]
这........前面一切正常