文章目录

前言

由于博主的贫穷,加入了很多淘宝群:

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

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

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

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

暂且命名为BWBBOT~

一、需要用到的工具

首先,你需要这些东西:

(1)花一个月混熟淘宝群。

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

(2)一个小号QQ。

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

(3)一个群。

把大号和小号都拉进来。

(4)一台服务器。

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

二、开始实现

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

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

2、python环境配置

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

一般的环境都是自带的python2.7,建议再装一个python3:

安装完python3后不要删除python2.7,因为可能系统有的包还依赖于python2.7。QQ聊天机器人作者建议使用python2.7以上版本、python3.4以上版本。

(2)安装pip

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

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

安装结果:

注意这里的pip一定要是安装到python3的路径下哦。

3、安装QQ聊天机器人

pip install qqbot

一键就完成了。然后输入

qqbot

就可以运行qqbot了:

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

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

4、配置qqbot登录

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

qqbot提供了四种登录方法:

【GUI模式】 在 GUI 界面中自动弹出二维码图片 

【邮箱模式】 将二维码图片发送到指定的邮箱 

【服务器模式】在一个 HTTP 服务器中显示二维码图片 

【文本模式】在 Term 中以文本形式展示二维码(需要自行安装 pillow 和 wcwidth 库)

GUI和文本模式就不用考虑了,邮箱模式和服务器模式是可以共存的。当只设置邮箱的时候,会不断地往你邮箱里发送二维码,每次二维码失效就重发一封邮件:

万一我没在有网的环境,邮箱就爆炸了……所以可以设置邮箱+服务器共存,会只发送一封邮件:

每次重新打开这封邮件,里面的二维码会更新,或者访问服务器的地址刷新一下,二维码也会更新,这就科学多了。

(1)获取邮箱授权码

打开大号QQ邮箱→设置:

点击生成授权码:

就得到了邮箱授权码。

(2)修改配置

我们来修改配置文件~/.qqbot-tmp/v2.3.conf

把somebody替换成你喜欢的名字,比如bwb;qq里面填的是小号的QQ,mailAccount填的是大号QQ邮箱,mailAuthCode填的是刚刚得到的授权码。

5、Hello qqbot

来编写一个helloworld。

(1)修改备注名

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

(2)在/root/.qqbot-tmp/plugins目录下建立一个taobaobargains.py文件,你可以试着参考sampleslots.py来填入以下内容:

# -*- 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

(3)把编写的插件加入配置里面

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

(4)启动qqbot

qqbot -u bwb

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

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

6、实现过滤

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

# -*- 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就只会在群里收到符合需求的信息啦,节省了大量精力,开心:

7、一些收尾工作

(1)后台运行

当你退出命令行界面的时候,所有相关进程都会退出。所以我们需要开启daemon模式来后台运行qqbot,在退出以后仍然能运行,修改配置文件:

这里还开启了掉线重启、读取后才启动两个选项。

当你重新运行的时候,就会提示:

所有的输出会被重定向到~/.qqbot-tmp/daemon-[qq号].log这个文件里去。

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

(2)定时重启

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

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

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

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

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

# 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',
        },

这样它到时间就会出现:

不断地重新发送二维码直至登录成功:

三、缺点分析

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

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

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

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

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

(1)持续长期登录

(2)利用QQ机器人,测试自己的AI算法


转载请注明出处http://www.bewindoweb.com/215.html | 三颗豆子
分享许可方式知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
重大发现:转载注明原文网址的同学刚买了彩票就中奖,刚写完代码就跑通,刚转身就遇到了真爱。
你可能还会喜欢
具体问题具体杠