Ubuntu下Mojo::WebQQ以及Mojo::Weixin配合GcmForMojo实现信息推送

本教程中的Mojo::WebQQ部分已过时。建议换用efb-qq-slave:https://milkice.me/2018/09/17/efb-how-to-send-and-receive-messages-from-qq-on-telegram/。微信问问度娘也就会了,原理类似。


本文将以GCM推送方式、Ubuntu 16.04 x86_64、海外VPS为例,简单描述Mojo::WebQQ、Mojo::Weixin以及GcmForMojo的手动安装及配置过程。如有疏漏,敬请指出。

Mojo::WebQQ项目地址:GitHub metacpan

Mojo::Weixin项目地址:GitHub metacpan

GcmForMojo项目地址:酷安

备注:如仅需使用QQ的GCM推送,可使用FCM-For-Mojo应用,可获得比GcmForMojo更好的体验。使用本软件时如果采用不恰当的姿势,可能会导致手机耗电比不使用推送更快,详细原因不便描述。GCM推送在国内VPS上可用性较差,故国内VPS不推荐使用本方法。GCM推送需手机端保持Google Play 服务能够正常连接GCM推送服务器。如果您的服务端或者接收端不满足此条件,请采用其他推送方式。

1、GcmForMojo的初步配置

首先确保GcmForMojo能够顺利访问外网(如果之前不能访问外网时打开过GcmForMojo,请清除应用数据重试),然后点击右上角菜单获取设备码。

设置项需要注意以下内容:

选择推送通道:此处选择“谷歌推送”,默认即为该选项。

回复功能:根据是否启用openqq/openwx来选择是否开启,如果开启,需配置下面的“输入服务端地址”。注意服务端地址有http与https之分,如启用TLS则为https,否则为http。

2、cpanm、perl等的安装

sudo apt-get update
sudo apt-get install libssl-dev cpanminus perl

3、Mojo的安装

sudo apt-get install libcrypt-openssl-bignum-perl libcrypt-openssl-rsa-perl
# Mojo::Webqq
# Webqq::Encryption为启用扩展信息获取所需组件,如果不需要该功能,可以不安装
cpanm Mojo::Webqq
cpanm Webqq::Encryption

# Mojo::Weixin
cpanm Mojo::Weixin

4、配置文件编辑

下面的配置为启用扩展信息获取、启用openqq/openwx并开启TLS(前提是已经有证书,证书可购买/免费获取/自签名)。如有需要调整的模块,调整模块相关代码即可。提醒:openqq/openwx需公网IP或者要求服务器与接收端处于同一内网,否则开启后不能发挥作用。

WebQQ配置:

# 不建议在SSH内直接编辑QQ配置文件,推荐在自己电脑上编辑完成后直接上传至服务器并设置好相应权限
# 除非必要不推荐在pl文件中出现中文,包括注释内容,建议各位配置完毕后把中文注释去掉
vim /root/webqq.pl
# Mojo::WebQQ initiation
# by Alex Wang
# Date: 20180123

use Mojo::Webqq;
use Webqq::Encryption;
use Digest::MD5;


# Define QRCode Login and others
my $client=Mojo::Webqq->new(
    http_debug  =>  0,
    log_level   =>  "info",
    login_type  =>  "qrlogin",
    log_encoding=>"utf-8",
    pwd         =>Digest::MD5::md5_hex('填入你的QQ密码'), #用于获取扩展信息
);

# Use GCM Push
$client->load("GCM",data=>{
    api_url         => '//gcm-http.cat.net/gcm/send',
    api_key         =>'AIzaSyB18io0hduB_3uHxKD3XaebPCecug27ht8', 
    registration_ids=>["填入在GcmForMojo中获取到的设备码"],
    allow_group     =>["ID1","ID2","Name1","Name2"], #可填入需要接受群消息的群号码/群名称,要加双引号,两个群之间用逗号隔开
    ban_group       =>["ID1"], #填入需要完全屏蔽消息的群号码/名称,格式同上
    allow_dicuss    =>[""], #填入需要接受消息的讨论组名称
    ban_discuss     =>[""], #填入需要屏蔽消息的讨论组名称
});

$client->load("ShowMsg");

# 下面为使用openqq插件启用TLS的示例
$client=>load("Openqq",data=>{
    listen => [
        {
            host    =>"0.0.0.0",
            port    =>5000,
            tls     =>1, #启用TLS,如果需要使用普通http连接请设置为0
            tls_cert=>"/path/to/cert.crt", #此处填入证书路径
            tls_key =>"/path/to/priv.key", #此处填入私钥路径
        },
    ],
});

$client=>on(ready=>sub{
    my $client = shift; 
 # 如有其他需要执行的代码填在此处
});

# Any changes below this will take NO effect
$client->run();

微信配置:

vim /root/wechat.pl
# Login code for WeChat
# by Alex Wang
# Date: 20180123

use Mojo::Weixin;

# Define QRCode Login and others
my $client = Mojo::Weixin->new(
    http_debug  => 0,
    log_level => "info",
    log_encoding=>"utf-8",
);

# Use GCM Push
$client->load("GCM",data=>{
    api_url         => '//gcm-http.cat.net/gcm/send',
    api_key         =>'AIzaSyB18io0hduB_3uHxKD3XaebPCecug27ht8', 
    registration_ids=>["此处填入设备码"],
    allow_group     =>[""],  #填入接收消息微信群的群名称,每个群名称加双引号,两个双引号之间的内容用英文(半角)逗号隔开
    ban_group       =>[""], #填入需要屏蔽消息的微信群名称,格式同上
    is_ban_official=>1,
});

$client->load("ShowMsg");

# Enable Openwx
$client->load("Openwx",data=>{
    listen => [
        {
            host    =>"0.0.0.0", #需要监听的IP,0.0.0.0为监听来自所有IP的请求
            port    =>5001, #启用TLS,如果需要使用普通http连接请设置为0
            tls     =>1, #1为启用TLS
            tls_cert=>"/path/to/cert.crt", #此处填入证书路径
            tls_key =>"/path/to/priv.key", #此处填入私钥路径
        },
    ],
});

$client->on(ready=>sub{
    my $client = shift; 
 
});

# Any changes below this will take NO effect
$client->run();

5、执行

# Mojo::Webqq
perl webqq.pl

# Mojo::Weixin
perl wechat.pl

正常情况下,您的设备应该会收到一条扫描二维码通知。QQ可直接扫描图片,而微信必须在另一个设备上显示再扫描。如需保持后台运行,可以使用screen或者采用其他方法。具体步骤请移步搜索引擎。

经过数天使用,发现QQ平均2天就要重新登录一次,而微信可保持登录一周以上。

缺陷:不能显示图片;微信公众号推送内容显示异常;信息推送可能会因个人设备及网络原因略有延时。

添加启动项

#注意,使用本方法时须确保代码以unix格式保存。例如使用vim编辑文件时可以使用下面的命令更改格式。
:set ff=unix

在上述webqq.pl和wechat.pl的最顶端,添加下列语句并保存。

#!/usr/bin/perl

然后试着直接执行代码,不要加perl,注意要通过完整路径。

/path/to/webqq.pl

如果可以正常执行,则可继续执行启动脚本的添加。下面以QQ的启动脚本为例。

在/etc/init.d下创建、编辑启动脚本(名称自定)。

vim /etc/init.d/mojoqq

填入以下内容(微信启动脚本的Providers、NAME、DAEMONCTL、PIDFILE等关键信息记得修改):

#!/bin/sh
### BEGIN INIT INFO
# Provides:          mojoqq
# Required-Start:    $local_fs $remote_fs $network $syslog $named
# Required-Stop:     $local_fs $remote_fs $network $syslog $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# X-Interactive:     true
# Short-Description: Start/stop Mojo::Webqq
# Description:       Start the Mojo::Webqq
### END INIT INFO

# Using LSB funtions:
. /lib/lsb/init-functions

# Run QQ GCM Push automatically
DESC="Mojolicious Webqq"
NAME=mojoqq
DAEMON=/usr/bin/perl
DAEMONCTL=/root/webqq.pl
PIDFILE=/tmp/mojo_webqq_pid_default.pid
SCRIPTNAME=/etc/init.d/$NAME

#Function that starts the daemon/service.
do_start() {
    # Gracefully exit if the package has been removed.
    test -x $DAEMON || exit 5
    
    if [ -e $PIDFILE ]; then
        pid=$(cat $PIDFILE)
        if kill -0 "$pid" > /dev/null; then
            log_success_msg "$DESC already running"
            return
        else
            log_success_msg "Removing stale PID file $PIDFILE."
            rm -f $PIDFILE
        fi
    fi
    log_daemon_msg "Starting $DESC" "$NAME"
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --startas $DAEMONCTL >/dev/null
    log_end_msg $?
}

#Function that stops the daemon/service.
do_stop() {
    if [ -e $PIDFILE ]; then
        pid=$(cat $PIDFILE)
        if kill -0 "$pid" > /dev/null; then
            log_daemon_msg "Stopping $DESC" "$NAME"
            start-stop-daemon --stop --quiet --pidfile $PIDFILE
            log_end_msg $?
        else
            log_failure_msg "I can't stop $DESC" "Maybe it's NOT running?"
            rm -f $PIDFILE
        fi
    fi
}

# Function that sends a SIGHUP to the daemon/service.
case "$1" in
  start)
        do_start
    ;;
  stop)
        do_stop
    ;;
  restart)
    do_stop || /bin/true
    sleep 1
    do_start
    ;;
  status)
    status_of_proc -p $PIDFILE $DAEMON $NAME
    ;;
  *)
    log_daemon_msg "Usage: $SCRIPTNAME {start|stop|restart|status}" >&2
    exit 3
    ;;
esac

exit 0

然后保存,使用下面的命令添加启动项。

update-rc.d mojoqq enable

输入下面的命令启动服务。

service mojoqq start

如果手机端能收到扫描二维码/登录成功通知,那么恭喜,设置成功了。

label, ,

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据