Skip to content

用QQ机器人筛选想买的淘宝群商品

由于博主的贫穷,加入了很多淘宝群: 20bf06eeba9370d508fbd6074909ee54.png 虽然QQ通过不断地迭代,已经出了最好用的“接受但不提醒”的群信息接受模式,不会被群打扰日常生活,但是并没有筛选群信息的功能。每个人都有自己不同的需求,比如我特别喜欢买一些抽纸、垃圾袋、A4纸、签字笔等生活用品,绝对不会去买零食、衣服,因为这种低价的零食和衣服一般都是劣质的并夕夕同款……然而由于每个群主都会有自己的喜好,比如我见过有的群主整天发自热火锅,恨不得凉粉也能出自热款……我实在是不感兴趣,为了筛选想要的东西我经常需要花费1个小时来爬楼。所以想着如果可以自动筛选商品就好了,就想到了使用QQ聊天机器人。

注意到群主也都是使用类似的工具来发群里的,发送的商品信息都有固定的格式:

text
原价XXX元……【券后XXX元】……[淘宝链接]……[淘口令]

那么一个想法就是,用一个QQ加入全部淘宝群,然后接受到含有指定内容的商品信息(比如9.9包邮),就把这条商品信息转发给我的大号,完成了筛选,bingo!

暂且命名为BWBBOT~

需要用到的工具

首先,你需要这些东西:

  1. 花一个月混熟淘宝群

你首先需要去混熟淘宝群,了解大概会发布哪些商品,哪些是你需要的东西,都有什么固定的文本格式等等。

  1. 一个小号QQ

注册现在都要手机号了哦,不过一个手机号每天都可以注册很多个QQ。

  1. 一个群

把大号和小号都拉进来。

  1. 一台服务器。

用的是我之前抢购的年中优惠百度云服务器,安装的操作系统是debian 8(64位)

开始实现

选择合适的QQ聊天机器人程序

我在github上随便搜索的一个python开发的基于WebQQ的聊天机器人开源代码(MIT协议,可以免费复制修改甚至商用):pandolia/qqbot9b6ef090f7d1462cbbd53df41811801f.png

python环境配置

  1. 检查服务器(debian 8,后续不再提示)上的python环境。

一般的环境都是自带的python2.7,建议再装一个python3: 69bf71b9ad953fa331d2a937996a0d1b.png 安装完python3后不要删除python2.7,因为可能系统有的包还依赖于python2.7。QQ聊天机器人作者建议使用python2.7以上版本、python3.4以上版本。

  1. 安装pip

apt-get通常都装不了pip,需要这样安装:

shell
wget https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py
pip -V  #查看pip版本

安装结果: 124ec7d164e7b7c0d3b0a2b700ac3643.png 注意这里的pip一定要是安装到python3的路径下哦。

安装QQ聊天机器人

shell
pip install qqbot

一键就完成了。然后输入

shell
qqbot

就可以运行qqbot了: cd2f9131b8c1e85b30a800c5ac8b2ae2.png qqbot默认会弹出一个图片的二维码,然而这并不是好的选择,通常服务器都是没有gnome界面的。我们接下来会进行一些配置来解决这类问题,修改的都是这个文件:

shell
vi ~/.qqbot-tmp/v2.3.conf

配置qqbot登录

用过webqq的都知道,以前的webqq都是用户名+密码登录的,后来改为账密/扫码二选一,现在改为了只能通过手机扫描二维码登录……心累,而且这个登录的cookie是有时间限制的,通常来说在1~2天的时间后就会强制下线QQ,那么我们必须每次都手动重新登一次,做这个机器人的意义就削减很多了。为了尽可能地减少麻烦,我们只有尽可能地去减少重登的步骤。

qqbot提供了四种登录方法:

  • 【GUI模式】 在 GUI 界面中自动弹出二维码图片
  • 【邮箱模式】 将二维码图片发送到指定的邮箱
  • 【服务器模式】在一个 HTTP 服务器中显示二维码图片
  • 【文本模式】在 Term 中以文本形式展示二维码(需要自行安装 pillow 和 wcwidth 库)

GUI和文本模式就不用考虑了,邮箱模式和服务器模式是可以共存的。当只设置邮箱的时候,会不断地往你邮箱里发送二维码,每次二维码失效就重发一封邮件: 954b41309854e62f4a171c88c61df85c.png765ff1097e2c350284f7fde1a31b8991.png 万一我没在有网的环境,邮箱就爆炸了……所以可以设置邮箱+服务器共存,会只发送一封邮件: 65a73d2cf02dcee9f662b250c6114b66.png 每次重新打开这封邮件,里面的二维码会更新,或者访问服务器的地址刷新一下,二维码也会更新,这就科学多了。

  1. 获取邮箱授权码

打开大号QQ邮箱→设置: 2f47b1c1fa725c6d2d1cd4a0a04a1a5f.png 点击生成授权码: 6031a8647b515c20654f35af46eaf960.png 就得到了邮箱授权码。

  1. 修改配置

我们来修改配置文件~/.qqbot-tmp/v2.3.conf6c1bbc603a251edef50a1a38d73368c3.png 把somebody替换成你喜欢的名字,比如bwb;qq里面填的是小号的QQ,mailAccount填的是大号QQ邮箱,mailAuthCode填的是刚刚得到的授权码。

Hello qqbot

来编写一个helloworld。

  1. 修改备注名

由于qqbot目前已经获取不到真实的QQ号了(腾讯关闭了相关接口),只能通过名字搜索,而这些淘宝群的名字可能随时更改,我们提前给它们设置备注名,“淘宝1”,“淘宝2”……然后把大号QQ也设置为备注名“大号”,就不怕更改啦。 bc11410c046c37f546035456202beedd.png

  1. /root/.qqbot-tmp/plugins目录下建立一个taobaobargains.py文件,你可以试着参考sampleslots.py来填入以下内容:
python
# -*- coding: utf-8 -*-
 
def onQQMessage(bot, contact, member, content):
    if contact.mark == '淘宝1':
        recver = getRecvQcontact(bot)
        bot.SendTo(recver,content)
 
def getRecvQcontact(bot):
    return bot.List('buddy','大号')[0]
  • contact是一个Qcontact对象,包含一个QQ对象的信息,比如它可能是个群、可能是个好友、可能是讨论组。
  • content是这个contact对象发送给你的消息。
  • mark的含义是“备注名”,更多信息参考qcontact-attr.md
  1. 把编写的插件加入配置里面
json
# 启动时需加载的插件
"plugins" : [
    'taobaobargains',
],
  1. 启动qqbot
shell
qqbot -u bwb

在通过之前的扫码登录之后,就可以得到信息啦: 980863be6d0db4f10daed9bf485c7bfe.png

并且你的大号QQ也会接收到相同的信息。

实现过滤

/root/.qqbot-tmp/plugins目录下编写更具体的带测试的插件taobaobargains.py

python
# -*- coding: utf-8 -*-
import re
 
def onQQMessage(bot, contact, member, content):
    if contact.mark == '淘宝1':
        recver = getRecvQcontact(bot,2)
        if isTargetKeyword(content) or isTargetPrice(content):
            bot.SendTo(recver,content)
    elif contact.mark == '淘宝2':
        recver = getRecvQcontact(bot,2)
        if isTargetKeyword(content) or isTargetPrice(content):
            bot.SendTo(recver,content)
    elif contact.mark == '淘宝3':
        recver = getRecvQcontact(bot,2)
        if isTargetKeyword(content) or isTargetPrice(content):
            bot.SendTo(recver,content)
 
def getRecvQcontact(bot,num):
    if (num == 1):
        return bot.List('buddy','大号')[0]
    elif (num == 2):
        return bot.List('group','自聊群')[0]
 
 
def isTargetKeyword(content):
    keywords = ['清风','维达','垃圾袋','A4纸']
    for kw in keywords:
        if kw in(content):
            return True
    return False
 
def isTargetPrice(content):
    prices = re.findall(u"(\d*\.*\d+)元",content)
    if len(prices) > 0:
        for price in prices:
            if float(price) < 10:
                return True
    return False
 
if __name__ == '__main__':
    str = ['券后0.9元','0.9yuan','原价19.9元','券后1元','券后9.9元','清风抽纸','维达抽纸','1元神车','苏宁红包','60个垃圾袋']
    for item in str:
        if isTargetPrice(item):
            print(item)
    print("----")
    for item in str:
        if isTargetKeyword(item):
            print(item + "yes")
        else:
            print(item)

当然在搜索价格的时候,你也可以通过re.search来搜索,这都是python相关的了,你想怎么写都可以。价格设定为10元以下。

我没有把消息发给大号QQ,因为QQ好友是不具有“接受但不提醒”功能的,所以用了很多年前自己建立的一个跟自己聊天的群……(我以前经常跟自己在线表演精分现场……),群是可以“接受但不提醒”的。

然后你重启qqbot就只会在群里收到符合需求的信息啦,节省了大量精力,开心: 0ff3d8cec236df9e69f5c034fbc75c3c.png

一些收尾工作

后台运行

当你退出命令行界面的时候,所有相关进程都会退出。所以我们需要开启daemon模式来后台运行qqbot,在退出以后仍然能运行,修改配置文件: 1232d59ee314f81aa0555133e423bb59.png 这里还开启了掉线重启、读取后才启动两个选项。

当你重新运行的时候,就会提示: e0ac744e67eef9f4f9608851314753f1.png 所有的输出会被重定向到~/.qqbot-tmp/daemon-[qq号].log这个文件里去。

如果要退出的话,kill掉就好了: a6c6b587e89240c97c791fc3dea2d29b.png

定时重启

前面提到由于腾讯的新机制,webqq的cookie在1~2天后会过期,过期就需要手动重新扫码,但是这个过期时间不固定,导致随时担心扫码。我们设定每天固定时间来强行重启qqbot即可,每天扫一次,保证稳定运行(其实还是感觉很累,不太科学,后续看能不能自己开发一下):

json
# 启动时需加载的插件
"plugins" : [
    'taobaobargains',
    'qqbot.plugins.schedrestart'
],

# 插件的配置(由用户自定义)
"pluginsConf" : {
    'qqbot.plugins.schedrestart': '23:00',
},

每天的23:00差不多该做的做完了,又没有睡觉,正好可以扫码。注意,我尝试过修改这里的默认全局配置,但是发现无效,所以还是需要在用户自定义配置那里去修改,然后把全局配置给注释掉: 8e12f6706eb3f88d76b63dabc324d075.png

后来注释掉发现每天8:00仍然重启……原因还是这个默认配置不生效,看来是v2.3版本的bug,我已经提交issue了。临时的解决方法是:

shell
# 1、找到这个文件:
find -name "*schedrestart*"
 
# 2、删除缓存并移动了这个文件,把它作为用户插件:
rm ./usr/local/lib/python3.4/dist-packages/qqbot/plugins/__pycache__/schedrestart.cpython-34.pyc
mv ./usr/local/lib/python3.4/dist-packages/qqbot/plugins/schedrestart.py /root/.qqbot-tmp/plugins/
 
# 3、修改了用户配置:
 
# 启动时需加载的插件
"plugins" : [
    'schedrestart'
],

# 插件的配置(由用户自定义)
"pluginsConf" : {
    'schedrestart': '23:00',
},

这样它到时间就会出现: 916c31a975e012f1f410a1be47b4f49d.png 不断地重新发送二维码直至登录成功: c9f70af7cd93a6c543db85ec3ba1e55d.png

缺点分析

  1. 每天扫码不方便,不是一个优雅的解决方式。为了让机器人稳定运行,每天都扫码登录,真是一个睿智的行为……

  2. 仍然可能获取到一些无用信息,比如很多群主喜欢发:

text
平均一件不到4元 → 【4元】但是总价很高好嘛!
领取红包群里购物直接抵现,可以0元撸!→【0元】但是根本撸不了好嘛!
每天领红包,搜索xxxxxx →【红包】我想要的不是花呗红包……是苏宁30-30这种红包啊

这就需要取舍权衡“丢弃部分商品,非常严格筛选,节约时间”和“保留大多数商品,放宽筛选条件”了。

值得继续深入玩一玩的地方

  • 持续长期登录
  • 利用QQ机器人,测试自己的AI算法
转载请注明出处https://bananaoven.com/articles/215.html | 香蕉微波炉
分享许可方式知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
重大发现:转载注明原文网址的同学刚买了彩票就中奖,刚写完代码就跑通,刚转身就遇到了真爱。