微信信息转发QQ的机器人实现

概述

在用过的各类即时通讯软件IM中,微信是最不让人省心的一个:丢记录、电脑端必须扫码登陆……,但由于不少老师和长辈都习惯于使用微信,不得不下载安装并经常地打开查看,令人心烦。正值大学开学前发现同时有微信班群和QQ班群,微信群冷但辅导员在里面,重要信息可能会在上面发布,突发奇想是否可以写个机器人自动将微信信息转发到QQ(防止刷屏所以单向转发)。

依赖

经过资料查阅,锁定了 wxpyqqbot两个功能比较完善的 Python 库来实现这个机器人,地址如下:

wxpy: https://github.com/youfou/wxpy
qqbot: https://github.com/pandolia/qqbot

二者都使用了相应的网页接口Web API实现功能,使用起来还算稳定。为了实现功能,我们首先需要抓取微信群内信息,然后调用QQ发送到群。

QQ

由于 qqbot 无法在以实例形式被调用时指定参数,首先需要修改根配置适应机器人运行的 cli 环境:
编辑 dist-packages/qqbot/qconf.py,把rootConfcmdQrcode的值设置为True,然后安装pillowwcwidth两个库,从而使二维码能以文本形式在终端中输出。

from qqbot import _bot as qbot
qbot.Login(['-q', '1591075776'])

首先先登陆QQ,用参数形式指定登陆的QQ号(在一定时间内无需重新扫码)。

qq = qbot.List('group', '清华土木大类18新生群')[0]

通过QQ群名定位群聊并保存为变量,

qbot.SendTo(qq, text, resendOn1202 = True)

然后便可以使用SendTo将文本发送至指定QQ群。

微信

from wxpy import *
wbot = Bot(cache_path = True, console_qr = True)

首先先登陆微信,两个参数分别意味着缓存登陆信息(重新登陆时只需点按确认而不必重新扫码)以及在终端中输出登陆二维码(默认为弹出二维码图片,而机器人运行在 cli 中)

wx = wbot.chats().search('清华土木大类18新生群')[0]

然后通过群名称定位到需要转发消息的群聊。

文字信息

@wbot.register(wx, TEXT)
def wx2qq_text(msg):
    text = '[%s] %s' % (msg.member.name, msg.text)
    qbot.SendTo(qq, text, resendOn1202 = True)

文字类型容易处理,注册了文字类消息后将格式化字符串发送至QQ群即可;

图片信息

@wbot.register(wx, PICTURE)
def wx2qq_pic(msg):
    global pic
    msg.get_file(save_path = 'pic.jpg')
    pic = open('pic.jpg', 'rb')
    url = 'https://sm.ms/api/upload'
    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'}
    files = {'smfile': ('pic.jpg', pic, 'image/jpeg')}
    recv = requests.post(url, headers = headers, files = files).text
    recv = json.loads(recv)
    url = recv['data']['url']
    text = '[%s]: %s' % (msg.member.name, url)
    qbot.SendTo(qq, text, resendOn1202 = True)

而图片信息就相对难处理,由于 SmartQQ (qqbot 依赖的 Web API)只能发送文字,因此需要曲线救国,将图片上传至图床后发送图片链接。这里需要避免的坑在于虽然没有明说,但sm.ms图床的API需要伪装浏览器用户标识User Agent才能正常使用

embed()

阻塞线程后,机器人开始工作。

添加新评论