Skip to content

Instantly share code, notes, and snippets.

@kotomei
Last active February 22, 2022 11:04
Show Gist options
  • Save kotomei/5367a003cd16d05e075c21a7f360b09a to your computer and use it in GitHub Desktop.
Save kotomei/5367a003cd16d05e075c21a7f360b09a to your computer and use it in GitHub Desktop.
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 授权协议声明,为了某些令人反感的不重视他人著作权的人

最近在酷安市场看见了一个名为 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.

@davidlauhn
Copy link

[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.

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

@HuiCheukman
Copy link

[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
Copy link

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

@Flyfish233
Copy link

为何不建议新手使用 nano

@diyhome
Copy link

diyhome 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
Copy link

shibeta 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
Copy link

kmzs123 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
Copy link

ieew 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
Copy link

ieew 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