使用 Python 全栈打造淘宝客微信机器人

向作者提问
百度阅读《Python网络爬虫实战与机器学习应用》、GitChat达人课《Django Web开发极简实战》作者,微信公众号:州的先生,博客:http://zmister.com
查看本场Chat

本篇 Chat 将会涉及:

  • Python 环境下淘宝客 API 的使用;
  • 使用 Python 第三方模块 itchat 实现微信的登录的自动回复操作;
  • PyQt5 的布局管理与多线程应用

1 、前言

1.1、什么是淘宝客

相信很多人都听过或者接触过各类导购 APP、QQ 群、微信群分享一些淘宝商品的优惠券或是其他的优惠信息。

某淘宝商品导购APP

某淘宝天猫优惠券QQ群

用户可以在这些渠道上获取到相较于从淘宝平台搜索出来的商品更加优惠的价格或者是领取到面额较大的优惠券。

这些渠道,都是属于淘宝客的渠道。淘宝客是淘宝平台推出的一种按成交计费的推广模式,通常也指通过这种模式赚钱的人。

前几年淘宝客红火的时候,各类导购网站、导购 APP 以及优惠券 QQ 群、微信群层出不穷,如今倒是稍显平淡了。虽说淘宝客在蜂拥的互联网上平淡了起来,但是丝毫影响不了新加入的人群的心态,在淘宝网在搜索 “微信人导购机器”,还可以看到很多商家在售卖淘宝客的微信机器人:

enter image description here

这些微信机器人的功能其实主要也是自动回复群内的人的消息,以及定时推送一些优惠商品信息等。

今天,我们就使用哪哪都会出现,哪哪都行的大蟒蛇——Python,来打造一个淘宝客微信机器人,实现在群聊中自动回复搜索并返回商品这一淘宝客导购微信机器人最基本的功能。

1.2、 注册成为淘宝客

要写一个淘宝客的微信机器人,我们首先需要成为一个淘宝客,才能获取到淘宝客相关的优惠资源。方法很简单,在淘宝客的推广平台——阿里妈妈淘宝联盟(http://pub.alimama.com/)上注册一个一个帐号即可,我们可以使用淘宝的账号进行登录。

enter image description here

在登录之后,我们可以在 “我的联盟” 中的 “推广管理” 中进行推广媒体的设置:

enter image description here

在其中,我们可以添加网站、APP、导购、软件的推广等。在此,我已经添加了一个网站的媒体,并且已经提交验证成功了。推广媒体是淘宝客中一个基本的推广商品渠道,用于归属不同的推广位,如果没有推广媒体,就没有办法创建推广位,进而无法进行淘宝客的推广。大家可以按照自己的情况创建推广媒体,推荐使用网站推广媒体。

在创建好推广媒体之后,我们还需要创建一个推广位,推广位用于归属具体的淘宝客推广商品,在此我已经创建了网站的推广位,其中的 PID 在我们后面调用 API 接口的时候会使用到,大家注意一下:

enter image description here

如果没有推广位,那么我们可以在 “联盟产品” 中点击 “精选清单” 的立即下载按钮:

enter image description here

其会让我们选择推广位,这时候可以新建一个推广位:

enter image description here

这样我们就获得了一个推广网站的推广位。

再回到推广媒体管理上,在我们添加的网站媒体通过了阿里妈妈的验证成功后,我们会得到一个联盟合作网站的 API:

点击 “查看” 链接,会跳转到阿里开放平台上我们创建的网站推广位(推广位为在阿里开放平台上显示为一个应用)的概览中,其中显示了我们的应用接口信息,接口数据和我们获得的权限 API 等:

enter image description here

APP 证书中的 App Key 和 App Secret 会在调用 api 接口时作为凭证来认证,下方的功能场景中显示我们获取的 API 接口:在这里我的应用有:

  • 淘宝客基础 API
  • 淘宝客 - 媒体 - 内容消息
  • 淘口令基础包
  • 淘宝客 - 工具 - 超级搜索

其中淘宝客基础 API 中包含了其他的一些接口的,我们主要使用这个 API 包。

这样,我们就可以开始通过 API 接口获取到淘宝客的推广信息。

2、Python 环境下使用淘宝客 API

在注册成为淘宝客,添加推广位获取到淘宝客的基础 API 之后,我们就可以通过调用淘宝客的 API 来获取淘宝客推广信息了。

2.1 、了解淘宝客接口

在调用淘宝客的 API 之前,我们先来看一下,在提交网站推广位之后获得的淘宝客基础 API 中都有些什么接口:

enter image description here

其中一共有 23 个接口,虽然是一个基础 API 包,但还是包含了淘宝客推广商品中的大多数信息的获取。在本篇 Chat 介绍创建的淘宝客微信机器人中,我们主要使用以下两个接口:

  • 好券清单 API【导购】taobao.tbk.dg.item.coupon.get
  • 淘宝客淘口令 taobao.tbk.tpwd.create

其他的 api 接口大家可以根据自己的需要添加在程序中。

好券清单 API 用于返回淘宝客商品的优惠券信息,我们可以通过其来搜索特定关键词下的商品的优惠券,以作为结果返回给用户。其接受的参数如下:

enter image description here

淘宝客淘口令 API,用于将淘宝客推广链接转换为淘口令,以实现复制优惠券信息后,打开淘宝就能跳转到推广链接的效果。其接受的参数如下:

enter image description here

可以发现,我们主要使用 adzoneid、淘口令弹框内容和淘口令跳转的目标链接三个参数,其中 adzoneid 可以从推广位的 PID 中获取,淘口令弹框内容可以设置为商品的标题,淘口令跳转的目标链接则是优惠券的链接地址,这两个参数都可以从好券清单 API 中获取到。下面我们来看看如何调用这两个接口。

2.2、调用淘宝客 API 接口

在 API 接口的介绍中,我们可以看到其中有多种语言的请求实例,如下所示:

enter image description here

最幸运的是,其提供了 Python 的请求示例,这样我们可以稍微修改一下示例代码(示例中为 Python2 版本的代码)就能对淘宝客的 API 进行调用了,是不是很美好?

虽然看起来很美好,但是我们还是需要额外做一些工作。

下载阿里提供的 SDK

看到示例代码中的第 2 行引入了一个 top.api 的模块,这个模块属于阿里开放平台提供的 SDK,使用 pip 等 Python 包管理工具并不能下载安装。在阿里开发平台的每个应用中,都提供了相应的 SDK 的下载链接,我们选择 “Python 版本”,在点击下载即可。

enter image description here

下载完成的 SDK 是一个名为 “sdk-python-*” 的压缩包,其中还有一个压缩包和一个空的文件夹:

enter image description here

我们需要的 top 模块就在 taobao-sdk-PYTHON-auto 那个压缩包中,继续解压,得到以下文件:

enter image description here

面对一个陌生的包,好的习惯当然是查看 readme 之类的文件来知晓使用方法,我们打开 READ_ME.TXT 文件,里面的内容不多,但说明了 top 模块如何使用:复制 top 文件夹到自己的 Python 项目路径下,让 Python 执行器能够引入这个 top 包即可。

enter image description here

得到了淘宝客的 SDK 模块以及模块的使用方法后,我们似乎可以开干了。如果你和我一样,使用的是 Python 3 的话,那么可以还需要再等等。

因为阿里开放平台提供的这个 SDK 是 Python 2 版本的,直接在 Python 3 环境下调用会报错,而报错的主要位置都位于 top 文件夹的 api 文件夹下的 base.py 这个文件:

enter image description here

我们需要对其进行代码风格和规范的转换,可以使用 Python 官方提供的 2to3.py 这个工具。在这里,我已经将其转换修改好并上传到百度网盘上,有需要的同学可以下载进行替换,链接为:https://pan.baidu.com/s/1PHV2gUVv1hunyyX4B2KeQQ

这一步完成之后,我们的准备工作就已经结束了。下面使用 Python 来调用一下淘宝客的接口。

调用淘宝客 API

当前,我们的项目目录如下所示:

enter image description here

在项目主文件夹下,只有一个淘宝客的 top 包,我们新建一个 Python 文件,用于调试调用淘宝客的 API:

enter image description here

首先在 usetbkapi.py 文件中引入淘宝客的包——top,并且定义好公共参数(App Key 和 App Secret,两者从阿里开放平台 - 应用的概览中获取)和好券清单需要的 adzoneid(淘宝联盟 - 推广位管理 - 推广位的 PID 中 mmxxxxxxxxx 的第三位):

import top.api

appkey = '你自己的appkey'
secret = '你自己的appsecret'
adzone_id = 推广位的adzone_id

首先是好券清单的 API,在阿里开放平台的 API 文档中,其请求示例如下所示:

# -*- coding: utf-8 -*-
import top.api

req=top.api.TbkDgItemCouponGetRequest(url,port)
req.set_app_info(top.appinfo(appkey,secret))

req.adzone_id=123
req.platform=1
req.cat="16,18"
req.page_size=1
req.q="女装"
req.page_no=1
try:
    resp= req.getResponse()
    print(resp)
except Exception,e:
    print(e)

我们将其修改一下,变成了如下形式:

# 获取淘宝客商品优惠券
def get_tbk_coupon(keyword):
    req = top.api.TbkDgItemCouponGetRequest()
    req.set_app_info(top.appinfo(appkey, secret))

    req.adzone_id = adzone_id
    # 商品的平台:1为PC端,2为无线端,默认为1
    req.platform = 2
    # 商品的类目ID
    req.cat = "16,18"
    # 每页返回的商品数量
    req.page_size = 5
    # 商品的搜索词
    req.q = keyword
    # 返回商品的页数
    req.page_no = 1
    try:
        resp = req.getResponse()
        print(resp)
    except Exception as e:
        print(e)

函数 gettbkcoupon() 接受一个参数作为淘宝客商品优惠券的搜索词,我们运行一下这个函数,以 “Python” 作为搜索词看看返回的结果:

if __name__ == '__main__':
    get_tbk_coupon('python')

请求成功,最后得到一个包含 5 个商品信息的 json:

enter image description here

整理一下这个 json,其结果中商品信息如下如下所示:

{'seller_id': 2986712394, 'nick': 'ash官方旗舰店', 'title': 'ASH女装2018春季新款PYTHON系列时尚桑蚕丝流苏系带休闲长裤', 'item_url': 'http://detail.tmall.com/item.htm?id=564660034925', 'num_iid': 564660034925, 'coupon_click_url': 'https://uland.taobao.com/coupon/edetail?e=q48FgUJOzkEGQASttHIRqXXp%2FuJl8%2Bq4zt8H5SH4UobB76UlhXoJ9yIedI0x%2F%2Bc%2BybjT5jgFVwFNRNfT%2FolHl%2B4tM%2BX9QQwt819cieM8MLbxkVtSX4VxL71PCn8gJl5TQqhWEgLxGimRzzicfAm7p1hAmztsbMhPVcPqzC25aNxIH07HK3v5wHikzNXyo71Icu6djhR%2BLpQ%3D&traceId=0bba60d215239195072098617e', 'coupon_remain_count': 7910, 'category': 16, 'commission_rate': '10.00', 'shop_title': 'ash官方旗舰店', 'coupon_info': '满1400元减200元', 'user_type': 1, 'pict_url': 'http://img.alicdn.com/tfscom/i2/2986712394/TB13ygTlL9TBuNjy0FcXXbeiFXa_!!0-item_pic.jpg', 'item_description': '桑蚕丝', 'coupon_end_time': '2018-04-20', 'coupon_start_time': '2018-04-16', 'small_images': {'string': ['http://img.alicdn.com/tfscom/i4/2986712394/TB21pubaOOYBuNjSsD4XXbSkFXa_!!2986712394.jpg']}, 'coupon_total_count': 10000, 'zk_final_price': '2297.00', 'volume': 0}
{'seller_id': 3126607078, 'nick': '尚斯美丽旗舰店', 'title': '人生苦短我用PYTHON  程序员源代码极客geek语言短袖T恤上衣衣服', 'item_url': 'http://detail.tmall.com/item.htm?id=557116340483', 'num_iid': 557116340483, 'coupon_click_url': 'https://uland.taobao.com/coupon/edetail?e=uvBu32XC6ScGQASttHIRqZS0LX9LKeP4%2F%2BhNcy%2FKOAPl43M3mIB1t9VU8DHamaG1OypG%2BG0aTLQ0F0zg%2Fses2Svsgj6gOf8L819cieM8MLbxkVtSX4VxL71PCn8gJl5TQqhWEgLxGimRzzicfAm7p1hAmztsbMhPVcPqzC25aNxIH07HK3v5wHikzNXyo71Icu6djhR%2BLpQ%3D&traceId=0bba60d215239195072098617e', 'coupon_remain_count': 9711, 'category': 16, 'commission_rate': '5.50', 'shop_title': '尚斯美丽旗舰店', 'coupon_info': '满5元减3元', 'user_type': 1, 'pict_url': 'http://img.alicdn.com/tfscom/i3/3126607078/TB1BqiMSVXXXXbXXXXXXXXXXXXX_!!0-item_pic.jpg', 'item_description': '', 'coupon_end_time': '2018-09-30', 'coupon_start_time': '2018-04-03', 'small_images': {'string': ['http://img.alicdn.com/tfscom/i2/3126607078/TB243pGacqGJuJjSZFyXXXFvpXa_!!3126607078.jpg', 'http://img.alicdn.com/tfscom/i1/3126607078/TB22q64XzjmJKJjy0FjXXcLnFXa_!!3126607078.jpg', 'http://img.alicdn.com/tfscom/i3/3126607078/TB2jLKxXMOFJuJjSspaXXb.mXXa_!!3126607078.jpg', 'http://img.alicdn.com/tfscom/i1/3126607078/TB2Yv4CaiaGJuJjSZFOXXbWjVXa_!!3126607078.jpg']}, 'coupon_total_count': 10000, 'zk_final_price': '59.00', 'volume': 13}
{'seller_id': 3126607078, 'nick': '尚斯美丽旗舰店', 'title': '人生苦短PYTHON当歌 短袖T恤衫 程序员源代码极客geek语言', 'item_url': 'http://detail.tmall.com/item.htm?id=557251066538', 'num_iid': 557251066538, 'coupon_click_url': 'https://uland.taobao.com/coupon/edetail?e=ntKy08HcshwGQASttHIRqX7JS835xJ9MYpAE%2F40qTYHl43M3mIB1t9VU8DHamaG1OypG%2BG0aTLQ0F0zg%2Fses2Svsgj6gOf8L819cieM8MLbxkVtSX4VxL71PCn8gJl5TQqhWEgLxGimRzzicfAm7p1hAmztsbMhPVcPqzC25aNxIH07HK3v5wHikzNXyo71Icu6djhR%2BLpQ%3D&traceId=0bba60d215239195072098617e', 'coupon_remain_count': 9711, 'category': 16, 'commission_rate': '5.50', 'shop_title': '尚斯美丽旗舰店', 'coupon_info': '满5元减3元', 'user_type': 1, 'pict_url': 'http://img.alicdn.com/tfscom/i2/3126607078/TB1.myFQpXXXXbdXVXXXXXXXXXX_!!0-item_pic.jpg', 'item_description': '', 'coupon_end_time': '2018-09-30', 'coupon_start_time': '2018-04-03', 'small_images': {'string': ['http://img.alicdn.com/tfscom/i1/3126607078/TB2oQWuXMSFJuJjSszdXXbVgXXa_!!3126607078.jpg', 'http://img.alicdn.com/tfscom/i1/3126607078/TB21PH6XA2kJKJjSspcXXbS1pXa_!!3126607078.jpg', 'http://img.alicdn.com/tfscom/i2/3126607078/TB23zY1XyHmJKJjy0FfXXb9aVXa_!!3126607078.jpg', 'http://img.alicdn.com/tfscom/i4/3126607078/TB2vEqvXROBJuJjy1XdXXXIXVXa_!!3126607078.jpg']}, 'coupon_total_count': 10000, 'zk_final_price': '59.00', 'volume': 0}
{'seller_id': 3126607078, 'nick': '尚斯美丽旗舰店', 'title': '人生苦短我用python程序员印花男女圆领geek纯棉短袖T恤上衣衣服', 'item_url': 'http://detail.tmall.com/item.htm?id=558077802593', 'num_iid': 558077802593, 'coupon_click_url': 'https://uland.taobao.com/coupon/edetail?e=juGQGSsPBJ0GQASttHIRqT2olWwoa5nHNSJRwfE7%2FEbl43M3mIB1t9VU8DHamaG1OypG%2BG0aTLQ0F0zg%2Fses2Svsgj6gOf8L819cieM8MLbxkVtSX4VxL71PCn8gJl5TQqhWEgLxGimRzzicfAm7p1hAmztsbMhPVcPqzC25aNxIH07HK3v5wHikzNXyo71Icu6djhR%2BLpQ%3D&traceId=0bba60d215239195072098617e', 'coupon_remain_count': 9711, 'category': 16, 'commission_rate': '5.50', 'shop_title': '尚斯美丽旗舰店', 'coupon_info': '满5元减3元', 'user_type': 1, 'pict_url': 'http://img.alicdn.com/tfscom/i2/3126607078/TB1uhsvcOAKL1JjSZFoXXagCFXa_!!0-item_pic.jpg', 'item_description': '', 'coupon_end_time': '2018-09-30', 'coupon_start_time': '2018-04-03', 'small_images': {'string': ['http://img.alicdn.com/tfscom/i3/3126607078/TB2HowocKEJL1JjSZFGXXa6OXXa_!!3126607078.jpg', 'http://img.alicdn.com/tfscom/i3/3126607078/TB28oMocKEJL1JjSZFGXXa6OXXa_!!3126607078.jpg', 'http://img.alicdn.com/tfscom/i2/3126607078/TB2vgYOciFTMKJjSZFAXXckJpXa_!!3126607078.jpg', 'http://img.alicdn.com/tfscom/i4/3126607078/TB232EscOwIL1JjSZFsXXcXFFXa_!!3126607078.jpg']}, 'coupon_total_count': 10000, 'zk_final_price': '58.00', 'volume': 2}
{'seller_id': 3126607078, 'nick': '尚斯美丽旗舰店', 'title': '人生苦短PYTHON当歌 程序员源代码极客geek语言卫衣', 'item_url': 'http://detail.tmall.com/item.htm?id=557367483076', 'num_iid': 557367483076, 'coupon_click_url': 'https://uland.taobao.com/coupon/edetail?e=Al70aB%2Bs3ogGQASttHIRqV3ogvGhwDOLULyxS8nhatHl43M3mIB1t9VU8DHamaG1OypG%2BG0aTLQ0F0zg%2Fses2Svsgj6gOf8L819cieM8MLbxkVtSX4VxL71PCn8gJl5TQqhWEgLxGimRzzicfAm7p1hAmztsbMhPVcPqzC25aNxIH07HK3v5wHikzNXyo71Icu6djhR%2BLpQ%3D&traceId=0bba60d215239195072098617e', 'coupon_remain_count': 9711, 'category': 16, 'commission_rate': '5.50', 'shop_title': '尚斯美丽旗舰店', 'coupon_info': '满5元减3元', 'user_type': 1, 'pict_url': 'http://img.alicdn.com/tfscom/i4/3126607078/TB1eY9vSVXXXXcoaXXXXXXXXXXX_!!0-item_pic.jpg', 'item_description': '', 'coupon_end_time': '2018-09-30', 'coupon_start_time': '2018-04-03', 'small_images': {'string': ['http://img.alicdn.com/tfscom/i2/3126607078/TB2GoPNXPTlJKJjSszbXXXS1FXa_!!3126607078.jpg', 'http://img.alicdn.com/tfscom/i1/3126607078/TB2k0IgaCGFJuJjSZFuXXcAyFXa_!!3126607078.jpg', 'http://img.alicdn.com/tfscom/i3/3126607078/TB2vUvNXPvmJKJjy0FlXXXGdFXa_!!3126607078.jpg', 'http://img.alicdn.com/tfscom/i3/3126607078/TB24VnQXPLlJKJjSsppXXXqgFXa_!!3126607078.jpg']}, 'coupon_total_count': 10000, 'zk_final_price': '88.00', 'volume': 0}

因为我们查询的是默认的服装类目下的商品,所以返回了 5 个商品标题中含有 “Python” 的服装负责商品,我们注意一下商品信息中的字段, 好券清单 API 的文档为:http://open.taobao.com/docs/api.htm?spm=a219a.7395905.0.0.VmMbH7&apiId=29821

cuoguoshop官网唯一客服
值得学习,完整代码有吗?
伊洛: 老师写的真精彩,赞赞赞!!
走空者
叹服ヘ(_ _ヘ)
伊洛
老师写的真棒,绝逼五星好评。希望以后类似的项目可以继续出台!!!
入间
赞!
获取不了用户发过来的微信消息
是的,获取不了返回的信息
打包到最后的时候,解码出错,没有解码成功
修川地藏
设置网站推广那里,是不是没有自己的网站就不行
Joe
创建推广位那个地方是不是一定要先自己搭个网站才能拿到淘宝的API
钟南
又遇到被封号的情况吗? 如何应对机器人被封的风险?
李福斌
66666
如果当时丶
写得很详细,很受用
Panda
建议把完整代码放到GitHub上
微信扫描登录