Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
title date tags
GCMForMojo 的部署与设置
2017-01-21 11:07:03 -0800
GCM
Android

2017年2月6日更新:完善部分内容,更新内容

2017年2月8日更新:发现自己脑抽少写了一步较为关键的步骤,赶紧补上orz,连带解决笔误

2017年2月9日更新:修正问题

2017年3月17日更新:补上现在新增的 MiPushHwPush 部分的配置

2017年3月18日更新:发现支持 FmPush 了,补上相应部分,顺便解决一下换行问题

2017年3月19日更新:增加如何增强安全性的部分

2017年3月21日更新:增加 CC 授权协议声明,为了某些令人反感的不重视他人著作权的人

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可

最近在酷安市场看见了一个名为 GCM For Mojo 的 APP,此 APP 可曲线实现 QQ 和微信的 GCM 推送,本着随便玩玩的想法自行部署了一个

看样子以后 APP 要改名为 AllPushForMojo

1.前期准备

墙外 / 可联通 GCM推送服务器的服务器一台 / 不关机的 PC

如果没有服务器还不想 24 小时开 PC 的话这里有一个 Vutlr VPS 的邀请链接 ,新注册用户赠送 $20 代金券,具体创建 VPS 步骤等请自行Google

有了用做推送的主机那么就可以进入架设阶段了

2.架设环境

本教程环境为 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的安装方法大致相同

3.设定

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 就跑起来了

4.注意事项

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 同学整理增强安全性的方法,原文链接在此
如果有问题的话锅全部丢给 Milkice 同学,这锅我不背
  1. 加盐

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),在密码学中,是指通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这种过程称之为 “加盐”。

Via Wikipedia

通俗来讲,这就是一个很简单的校验,如同一个密码,这样就可以很简单的解决之前提到的盗用问题,如果需要解决监听问题,你需要开启 HTTPS 加密

  1. 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 加密,你需要申请一个域名并绑定在你的 推送服务器 上,否则你是无法签发可被信任的证书的,除非你选择了 自签发证书 ,但这样做会更麻烦

5.所用到的项目

Mojo:WebQQ by sjdy521

Mojo::Weixin by sjdy521

GCM For Mojo by heipidage

最后感谢每一位在国内如此恶劣的 Android 生态下尽可能帮助我们获得更佳体验的开发者

6.软件反馈与交流

QQ 群:611537356

Telegram 群组

EOF.

@AlphaBrock

This comment has been minimized.

Copy link

commented Mar 26, 2017

同样vultr机子centos6.8,在安装cpanm不成功,一番下来发现yum安装perl无效,编译安装perl后安装cpanm包管理才行。
wget http://www.cpan.org/src/5.0/perl-5.24.1.tar.gz
tar -xzf perl-5.24.1.tar.gz
cd perl-5.24.1
./Configure -des -Dprefix=$HOME/localperl
make
make install
贴出编译,如果有和我遇到同样问题的可以试试这个。

@WordlessEcho

This comment has been minimized.

Copy link

commented May 6, 2017

GCM-For-Mojo 安全相关系列

2017/3/21 6:55 回复检验代码再次更新

忘了改掉最后一段总代码了…
在此时间之前配置回复检验的看客最好用新代码覆盖掉老代码防止出现奇奇怪怪的 bug

请及时更新避免发生问题

@BurgerTown

This comment has been minimized.

Copy link

commented Jun 17, 2017

已Star

@kannad

This comment has been minimized.

Copy link

commented Jul 23, 2017

部分主机没有安装Screen
CentOS系统可以执行:yum install screen
Debian/Ubuntu系统执行:apt-get install screen

@zhzjwd

This comment has been minimized.

Copy link

commented Oct 18, 2017

HTTPS加密那个地方
配置SSL证书的时候漏掉了逗号

@davidlauhn

This comment has been minimized.

Copy link

commented Nov 19, 2017

[17/11/19 02:41:27] [info] 当前正在使用 Mojo-Weixin v1.3.8
Global symbol "$client" requires explicit package name at gcm.pl line 3.
Global symbol "$client" requires explicit package name at gcm.pl line 6.
Global symbol "$client" requires explicit package name at gcm.pl line 41.
Global symbol "$client" requires explicit package name at gcm.pl line 47.
Execution of gcm.pl aborted due to compilation errors.

试了多次都是这样,也不知道怎么弄了,唉~

@HuiCukmen

This comment has been minimized.

Copy link

commented Apr 17, 2018

[18/04/17 04:29:54] [fatal] 加载插件[ Mojo::Weixin::Plugin::Gcm ]失败: Can't locate Mojo/Weixin/Plugin/Gcm.pm in @inc (@inc contains: /root/perl5/lib/perl5/x86_64-linux-thread-multi /root/perl5/lib/perl5 /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at (eval 94) line 2.
[18/04/17 04:29:54] [fatal]
[18/04/17 04:29:54] [fatal] at /root/perl5/lib/perl5/Mojo/Weixin/Util.pm line 276.
[18/04/17 04:29:54] [fatal] Mojo::Weixin::Util::die('Mojo::Weixin=HASH(0x10f23f0)', '\x{e5}\x{8a}\x{a0}\x{e8}\x{bd}\x{bd}\x{e6}\x{8f}\x{92}\x{e4}\x{bb}\x{b6}[ Mojo::Weixin::Plugin::Gcm ]\x{e5}\x{a4}\x{b1}\x{e8}\x{b4}\x{a5}: Can't locat...') called at /root/perl5/lib/perl5/Mojo/Weixin/Plugin.pm line 26
[18/04/17 04:29:54] [fatal] Mojo::Weixin::Plugin::load('Mojo::Weixin=HASH(0x10f23f0)', 'Gcm', 'data', 'HASH(0x2a416b0)') called at GCM.pl line 5

请问这个情况应该怎么办啊? @kotomei

@Flyfish233

This comment has been minimized.

Copy link

commented Apr 21, 2018

yum 安装 g++ 不应该使用 yum install gcc-c++ 吗

@Flyfish233

This comment has been minimized.

Copy link

commented Apr 21, 2018

为何不建议新手使用 nano

@diyhome

This comment has been minimized.

Copy link

commented Jul 10, 2018

emm,编译成功测试失败,环境:瓦工的29.9$的机子,Centos 7,build.log

Manifying blib/man3/Mojo::Webqq::Plugin::ProgramCode.3pm
Manifying blib/man3/Mojo::Webqq.3pm
Manifying blib/man3/Mojo::Webqq::Plugin::IPwhere.3pm
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
Connection error: IO::Socket::SSL 2.009+ required for TLS support at t/https.t line 17.
# Looks like your test exited with 255 before it could output anything.
t/https.t ........ 
Dubious, test returned 255 (wstat 65280, 0xff00)
Failed 1/1 subtests 
t/load_module.t .. ok

Test Summary Report
-------------------
t/https.t      (Wstat: 65280 Tests: 0 Failed: 0)
  Non-zero exit status: 255
  Parse errors: Bad plan.  You planned 1 tests but ran 0.
Files=2, Tests=1,  1 wallclock secs ( 0.02 usr  0.01 sys +  0.67 cusr  0.12 csys =  0.82 CPU)
Result: FAIL
Failed 1/2 test programs. 0/1 subtests failed.
make: *** [test_dynamic] 错误 255
-> FAIL Installing Mojo::Webqq failed. See /root/.cpanm/work/1531220065.26434/build.log for details. Retry with --force to force install it.
@shibeta

This comment has been minimized.

Copy link

commented Jul 23, 2018

perl GCM.pl时出现
(以上略)
[18/07/23 08:22:30] [info] ----------------------------------------
[18/07/23 08:22:30] [info] 执行插件[ Mojo::Webqq::Plugin::ShowMsg ]
[18/07/23 08:22:30] [info] 执行插件[ Mojo::Webqq::Plugin::Openqq ]
[18/07/23 08:22:30] [info] 插件[Mojo::Webqq::Plugin::Openqq]监听地址: [ http://x.x.x.x:5000 ]
[18/07/23 08:22:30] [info] Listening at "http://x.x.x.x:5000"
Server available at http://x.x.x.x:5000
[18/07/23 08:22:30] [info] 执行插件[ Mojo::Webqq::Plugin::HwPush ]
[18/07/23 08:22:30] [info] 执行插件[ Mojo::Webqq::Plugin::UploadQRcode ]
Can't call method "name" on an undefined value at /usr/local/share/perl5/Mojo/Webqq/Request.pm line 205.
(in cleanup) Can't call method "remove" on an undefined value at /usr/local/share/perl5/Mojo/Server/Daemon.pm line 24 during global destruction.
Use of uninitialized value $loop in hash element at /usr/local/share/perl5/Mojo/UserAgent.pm line 208 during global destruction.
(in cleanup) Can't call method "remove" on an undefined value at /usr/local/share/perl5/Mojo/UserAgent.pm line 264 during global destruction.
这是怎么回事?

@kmzs123

This comment has been minimized.

Copy link

commented Dec 5, 2018

[17/11/19 02:41:27] [info] 当前正在使用 Mojo-Weixin v1.3.8
Global symbol "$client" requires explicit package name at gcm.pl line 3.
Global symbol "$client" requires explicit package name at gcm.pl line 6.
Global symbol "$client" requires explicit package name at gcm.pl line 41.
Global symbol "$client" requires explicit package name at gcm.pl line 47.
Execution of gcm.pl aborted due to compilation errors.

试了多次都是这样,也不知道怎么弄了,唉~

我也有这个问题

@ieew

This comment has been minimized.

Copy link

commented May 9, 2019

--> Working on Mojo::Webqq Fetching http://www.cpan.org/authors/id/S/SJ/SJDY/Mojo-Webqq-2.2.7.tar.gz ... OK Configuring Mojo-Webqq-v2.2.7 ... OK ==> Found dependencies: Time::Piece, Time::Seconds --> Working on Time::Piece Fetching http://www.cpan.org/authors/id/E/ES/ESAYM/Time-Piece-1.33.tar.gz ... OK Configuring Time-Piece-1.33 ... OK Building and testing Time-Piece-1.33 ... FAIL ! Installing Time::Piece failed. See /root/.cpanm/work/1557369247.9227/build.log for details. Retry with --force to force install it. ! Installing the dependencies failed: Module 'Time::Piece' is not installed, Module 'Time::Seconds' is not installed ! Bailing out the installation for Mojo-Webqq-v2.2.7.
[centos]
这........前面一切正常

@ieew

This comment has been minimized.

Copy link

commented May 9, 2019

--> Working on Mojo::Webqq
Fetching http://www.cpan.org/authors/id/S/SJ/SJDY/Mojo-Webqq-2.2.7.tar.gz ... OK
Configuring Mojo-Webqq-v2.2.7 ... OK
==> Found dependencies: Time::Piece, Time::Seconds
--> Working on Time::Piece
Fetching http://www.cpan.org/authors/id/E/ES/ESAYM/Time-Piece-1.33.tar.gz ... OK
Configuring Time-Piece-1.33 ... OK
Building and testing Time-Piece-1.33 ... FAIL
! Installing Time::Piece failed. See /root/.cpanm/work/1557369247.9227/build.log for details. Retry with --force to force install it.
! Installing the dependencies failed: Module 'Time::Piece' is not installed, Module 'Time::Seconds' is not installed
! Bailing out the installation for Mojo-Webqq-v2.2.7.

[centos]
这........前面一切正常

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.