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.

@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