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

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

'seller_id': 卖家id
'nick':  卖家昵称
'title': 商品标题
'item_url': 商品链接
'num_iid': 商品id 
'coupon_click_url': 优惠券链接
'coupon_remain_count': 优惠券剩余数量
'category': 商品分类
'commission_rate': 佣金比率 
'shop_title': 店铺名称
'coupon_info': 优惠券信息
'user_type': 1, 卖家类型
'pict_url': 商品主图链接
'item_description': 商品描述 
'coupon_end_time': 优惠券结束时间 
'coupon_start_time': 优惠券开始时间
'small_images': 商品的小图列表 
'coupon_total_count': 优惠券数量
'zk_final_price': 折扣价(也就是在售价)
'volume': 30天销量

通过返回的这些信息,我们就可以制作一个简单的商品信息,这里暂且不表。我们来看看商品优惠券链接字段 couponclickurl,这个字段返回的是一个优惠券的领券 url 链接,我们点击结果中的一个:

'coupon_click_url': 'https://uland.taobao.com/coupon/edetail?e=Al70aB%2Bs3ogGQASttHIRqV3ogvGhwDOLULyxS8nhatHl43M3mIB1t9VU8DHamaG1OypG%2BG0aTLQ0F0zg%2Fses2Svsgj6gOf8L819cieM8MLbxkVtSX4VxL71PCn8gJl5TQqhWEgLxGimRzzicfAm7p1hAmztsbMhPVcPqzC25aNxIH07HK3v5wHikzNXyo71Icu6djhR%2BLpQ%3D&traceId=0bba60d215239195072098617e'

在电脑上点击打开,显示的就是我们在淘宝软件中常见的优惠券页面了:

enter image description here

接着来看看淘口令 API。

淘口令是淘宝的一种推广方式,专门针对于无线端的商品推广。淘口令在手机上复制之后,打开淘宝软件,就会自动跳转到淘口令的目标链接。所以淘口令相当于淘宝软件的一个暗号,既避免了其他平台对淘宝客链接的封杀,也方便推广和传播。一般淘宝联盟自动生成的淘口令推广信息如下图:

enter image description here

我们现在使用淘口令 API 来生成淘宝客商品优惠券的淘口令。

淘口令 API 的文档链接为:http://open.taobao.com/docs/api.htm?spm=a219a.7395905.0.0.7WyaoZ&apiId=31127

其请求的参数接受两个必选参数和三个可选参数,参数信息如下:

enter image description here

在此我们用商品标题作为参数 text 的值,商品的优惠券链接作为参数 url 的值,可选参数中用我本人的头像作为淘口令弹框的 logo。

请求成功的话,其会返回形如下所示的 json:

{
    "tbk_tpwd_create_response":{
        "data":{
            "model":"¥AADPOKFz¥"
        }
    }
}

其中的 model 值就是生成的淘口令。

淘口令 API 的请求示例为:

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

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

req.user_id="123"
req.text="长度大于5个字符"
req.url="https://uland.taobao.com/"
req.logo="https://uland.taobao.com/"
req.ext="{}"
try:
    resp= req.getResponse()
    print(resp)
except Exception,e:
    print(e)

我们同样将其修改一下,方便传递参数和调用,修改后的淘口令请求如下所示:

# 生成淘口令
def generate_ttoken(url,text):
    req = top.api.TbkTpwdCreateRequest()
    req.set_app_info(top.appinfo(appkey, secret))

    req.text = text
    req.url = url
    req.logo = "http://ozuz7s0lj.bkt.clouddn.com/avas.webp"
    try:
        resp = req.getResponse()
        print(resp)
    except Exception as e:
        print(e)

接下来,我们将代码整理一下,在获取商品优惠券的 gettbkcoupon() 函数中调用生成商品淘口令的 generate_ttoken() 函数,完整代码如下:

# -*- coding: utf-8 -*-

import top.api

appkey = '你自己的appkey'
secret = '你自己的secret'
adzone_id = 你自己的adzone_id

# 获取淘宝客商品优惠券
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()
        for r in resp['tbk_dg_item_coupon_get_response']['results']['tbk_coupon']:
            coupon_url = r['coupon_click_url']
            coupon_text = r['title']
            print(">>>商品标题:",coupon_text)
            print(">>>优惠券链接:",coupon_url)
            generate_ttoken(coupon_url,coupon_text)
            print()
    except Exception as e:
        print(e)

# 生成淘口令
def generate_ttoken(url,text):
    req = top.api.TbkTpwdCreateRequest()
    req.set_app_info(top.appinfo(appkey, secret))

    req.text = text
    req.url = url
    req.logo = "http://ozuz7s0lj.bkt.clouddn.com/avas.webp"
    try:
        resp = req.getResponse()
        print(resp['tbk_tpwd_create_response']['data']['model'])
    except Exception as e:
        print(e)

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

最后得到每个商品的商品标题,商品优惠券链接和商品优惠券的淘口令:

>>>商品标题: ASH女装2018春季新款PYTHON系列时尚桑蚕丝流苏系带休闲长裤
>>>优惠券链接: https://uland.taobao.com/coupon/edetail?e=8PzLtaUTd6gGQASttHIRqXXp%2FuJl8%2Bq4zt8H5SH4UobB76UlhXoJ9yIedI0x%2F%2Bc%2BybjT5jgFVwFNRNfT%2FolHl%2B4tM%2BX9QQwt819cieM8MLbxkVtSX4VxL71PCn8gJl5TQqhWEgLxGimRzzicfAm7p1hAmztsbMhPVcPqzC25aNxIH07HK3v5wHikzNXyo71IiVRoyFb%2BVTQ%3D&traceId=0ab2019315239230452104699e
¥mFES0INe2ZG¥

>>>商品标题: 人生苦短我用PYTHON  程序员源代码极客geek语言短袖T恤上衣衣服
>>>优惠券链接: https://uland.taobao.com/coupon/edetail?e=%2BC2j8zvxzA8GQASttHIRqZS0LX9LKeP4%2F%2BhNcy%2FKOAPl43M3mIB1t9VU8DHamaG1OypG%2BG0aTLQ0F0zg%2Fses2Svsgj6gOf8L819cieM8MLbxkVtSX4VxL71PCn8gJl5TQqhWEgLxGimRzzicfAm7p1hAmztsbMhPVcPqzC25aNxIH07HK3v5wHikzNXyo71IiVRoyFb%2BVTQ%3D&traceId=0ab2019315239230452104699e
¥ZMnD0INeagd¥

>>>商品标题: 人生苦短PYTHON当歌 短袖T恤衫 程序员源代码极客geek语言
>>>优惠券链接: https://uland.taobao.com/coupon/edetail?e=OPzNwziJE54GQASttHIRqX7JS835xJ9MYpAE%2F40qTYHl43M3mIB1t9VU8DHamaG1OypG%2BG0aTLQ0F0zg%2Fses2Svsgj6gOf8L819cieM8MLbxkVtSX4VxL71PCn8gJl5TQqhWEgLxGimRzzicfAm7p1hAmztsbMhPVcPqzC25aNxIH07HK3v5wHikzNXyo71IiVRoyFb%2BVTQ%3D&traceId=0ab2019315239230452104699e
¥9Qbz0IN3w6S¥

>>>商品标题: 人生苦短我用python程序员印花男女圆领geek纯棉短袖T恤上衣衣服
>>>优惠券链接: https://uland.taobao.com/coupon/edetail?e=oiGwbaF8KwgGQASttHIRqT2olWwoa5nHNSJRwfE7%2FEbl43M3mIB1t9VU8DHamaG1OypG%2BG0aTLQ0F0zg%2Fses2Svsgj6gOf8L819cieM8MLbxkVtSX4VxL71PCn8gJl5TQqhWEgLxGimRzzicfAm7p1hAmztsbMhPVcPqzC25aNxIH07HK3v5wHikzNXyo71IiVRoyFb%2BVTQ%3D&traceId=0ab2019315239230452104699e
¥hQ1d0IN3Dck¥

>>>商品标题: 人生苦短PYTHON当歌 程序员源代码极客geek语言卫衣
>>>优惠券链接: https://uland.taobao.com/coupon/edetail?e=0ELzl1VPgRgGQASttHIRqV3ogvGhwDOLULyxS8nhatHl43M3mIB1t9VU8DHamaG1OypG%2BG0aTLQ0F0zg%2Fses2Svsgj6gOf8L819cieM8MLbxkVtSX4VxL71PCn8gJl5TQqhWEgLxGimRzzicfAm7p1hAmztsbMhPVcPqzC25aNxIH07HK3v5wHikzNXyo71IiVRoyFb%2BVTQ%3D&traceId=0ab2019315239230452104699e
¥osZw0IN3Emh¥

返回的结果中,每一个以人民币符号起始和结束的就是淘口令,我们将其发送到手机上,再通过手机复制淘口令,看看淘口令的效果:

将其中一个文本发送到微信的文件传输助手:

enter image description here

复制这个信息,然后打开淘宝,发现出现一个好友的淘口令分享:

enter image description here

点击打开,就出现了商品优惠券的领券页面了:

enter image description here

这样,我们就成功的通过 Python 调用淘宝客 API,实现了从淘宝客商品优惠券获取,到优惠券淘口令转换的功能。

对淘宝客 API 的使用暂且告一段落,接下来,我们来了解如何创建一个微笑机器人。

3、实现一个命令行界面下的微信淘宝客群聊机器人

3.1、初识 itchat 与实现微信的登录

如何在 Python 环境下登录和操作微信,我们可以选择使用第三方模块——itchat 来实现这一需求。

itchat 通过整理和封装微信网页版的 Web 接口,使得我们通过简短的 Python 代码就可以调用微信。

3.1.1、安装 itchat

直接通过 pip 命令即可安装 itchat:

pip install itchat

3.1.2、登录微信

安装好 itchat 之后,我们就可以借助 itchat 来实现微信的登录了。在我们的项目目录下继续新建一个 Python 文件——wechat_bot.py:

enter image description here

利用 itchat,我们通过一行代码就能够实现微信的登录:

# coding:utf-8
import itchat

itchat.auto_login()

运行上述代码,itchat 会自动下载弹出微信登录的二维码,等我们用手机扫码确认登录之后,就实现了在 Python 环境下通过代码进行微信登录,过程如下 gif 动图所示:

enter image description here
3.1.3、获取好友和群聊列表

在登录微信之后,我们就可以获取好友的信息和群聊的信息了。itchat 为好友和群聊都提供了获取所有列表和搜索的方法,下面来看一下:

获取所有好友

通过 get_friends() 方法,我们可以获取到完整的好友列表,使用示例如下:

# coding:utf-8
import itchat

itchat.auto_login()

friends = itchat.get_friends()
for friend in friends:
    print(friend)

运行代码,会将好友列表中的每一个好友的信息以字典的形式打印出来,其格式如下所示(以我自己的用户信息为例):

{
'City': '', 
'ChatRoomId': 0, 
'WebWxPluginSwitch': 0, 
'RemarkPYInitial': '', 
'AttrStatus': 0, 
'AppAccountFlag': 0, 
'OwnerUin': 0, 
'NickName': '州的先生', 
'SnsFlag': 1, 
'HideInputBarFlag': 0, 
'Signature': '觉来知是梦,不胜悲。', 
'StarFriend': 0, 
'Statues': 0, 
'RemarkPYQuanPin': '', 
'UserName': '@132a8de5d97228087bc656f29cc2c5d67bbde904cdfaaeedb7ff7db72d4bce0e', 
'Province': '', 
'KeyWord': '', 
'Uin': 401807140, 
'RemarkName': '', 
'VerifyFlag': 0, 
'PYInitial': '', 
'ContactFlag': 0, 
'MemberList': , 
'DisplayName': '', 
'Sex': 1, 
'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=1142454089&username=@132a8de5d97228087bc656f29cc2c5d67bbde904cdfaaeedb7ff7db72d4bce0e&skey=@crypt_82a3c949_8b576ebec932b4b550498cb7f3e88855', 
'Alias': '', 
'EncryChatRoomId': '', 
'HeadImgFlag': 1, 
'UniFriend': 0, 
'PYQuanPin': '', 
'MemberCount': 0
}

对于我们而言,一个好友中,最重要的是他的 NickName 字段和 UserName 字段,因为通过这两个字段的值,我们可以搜索到这个好友。

搜索好友

搜索好友的方法为 search_friends(),我们可以传入 NickName 或 UserName 的值进行搜索,如果不传入参数,则会返回自己的用户信息。所以一下三种搜索方式返回的都是我的微信号的用户信息:

# coding:utf-8
import itchat

itchat.auto_login()

user_info = itchat.search_friends()
user_info_2 = itchat.search_friends(nickName="州的先生")
user_info_3 = itchat.search_friends(userName='@132a8de5d97228087bc656f29cc2c5d67bbde904cdfaaeedb7ff7db72d4bce0e')

获取群聊列表

除了获取到好友的信息外,我们还需要获取到群聊的信息以便对群聊发送消息,通过 get_chatrooms() 方法,我们也将获取到微信号中完整的群聊列表,示例代码如下:

# coding:utf-8
import itchat

itchat.auto_login()

chatrooms = itchat.get_chatrooms()
for chatroom in chatrooms:
    print(chatroom)

运行代码,会将群聊列表中的每一个群聊的信息以字典的形式打印出来,其格式如下所示(以我的一个群聊信息为例):

{'RemarkPYQuanPin': '', 
'KeyWord': '', 
'IsAdmin': None, 
'ChatRoomId': 0, 
'VerifyFlag': 0, 
'UserName': '@@a4a7e4cd2430919cb41c2ea4f5bda7cb1c6ed7f2f4f7a649b62d4c9c1e02eead', 
'PYInitial': '', 
'Province': '', 
'NickName': '州的先生Python学习交流', 
'IsOwner': 1, 
'Self': , 'HideInputBarFlag': 0, 
'AppAccountFlag': 0, 'HeadImgFlag': 1, 'EncryChatRoomId': '', 'Province': '', 'StarFriend': 0, 'Uin': 401807140, 'UniFriend': 0, 'RemarkPYInitial': '', 'DisplayName': '', 'Signature': '觉来知是梦,不胜悲。', 'PYQuanPin': '', 'City': '', 'OwnerUin': 0, 'ContactFlag': 0, 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=67715570&username=@fb371ab870eb94642cc3c62c573b8268305e81f00ab868c15a15dd40504e5036&skey=@crypt_82a3c949_1acf9a2dae8b8a3f849e0c247f45c4c1', 'WebWxPluginSwitch': 0, 'Statues': 0, 'Sex': 1, 'Alias': '', 'AttrStatus': 0, 'SnsFlag': 1}>, 'RemarkName': '', 'Alias': '', 'HideInputBarFlag': 0, 'AppAccountFlag': 0, 'EncryChatRoomId': '', 'MemberCount': 147, 'Uin': 0, 'StarFriend': 0, 'UniFriend': 0, 'RemarkPYInitial': '', 'Statues': 1, 'Signature': '', 'PYQuanPin': '', 'City': '', 'DisplayName': '', 'OwnerUin': 0, 'ContactFlag': 0, 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgetheadimg?seq=0&username=@@a4a7e4cd2430919cb41c2ea4f5bda7cb1c6ed7f2f4f7a649b62d4c9c1e02eead&skey=@crypt_82a3c949_1acf9a2dae8b8a3f849e0c247f45c4c1', 'Sex': 0, 'MemberList': , 'AttrStatus': 0, 'SnsFlag': 0}

如同好友信息一样,在返回的群聊信息中,我们最在乎的还是群聊的 NickName 和 UserName 属性的值。通过这两个属性值,我们可以通过 search_chatrooms() 方法搜索到特定的群聊,代码如下所示:

# coding:utf-8
import itchat

itchat.auto_login()

chat_info = itchat.search_chatrooms(userName="@@a4a7e4cd2430919cb41c2ea4f5bda7cb1c6ed7f2f4f7a649b62d4c9c1e02eead")
chat_info_2 = itchat.search_chatrooms(name="州的先生Python学习交流")

3.1.4、发送消息

在 itchat 中,我们可以通过 send() 方法主动发送一条消息出去。send() 方法接受两个参数:

  • msg:消息的内容,内容为'@fil@文件地址'将会被识别为传送文件,'@img@图片地址'将会被识别为传送图片,'@vid@视频地址'将会被识别为小视频,除此之外都将作为文本消息发送;
  • toUserName:发送对象,如果为空,那么将发送给自己

所以如果我们需要给自己发送一条消息,那么代码如下所示:

# coding:utf-8
import itchat

itchat.auto_login()

itchat.send(msg="哈哈,给自己发送一条信息")

3.1.5、接收消息

除了主动发送消息,我们还需要根据接收的消息来进行处理。在微信中,能够收到的消息有很多种类型,itchat.content 中包含了所有的消息类型的参数,其内容如下所示:

enter image description here

为什么要了解消息类型呢,在 itchat 中,如果我们想要登录后的微信能够接收到某个类型的消息,必须首先使用 itchat.msg_register() 装饰器对这个类型的消息进行注册。一个简单的示例如下所示:

import itchat
from itchat.content import TEXT

@itchat.msg_register(TEXT)
def simple_reply(msg):
    print('收到了一个消息: %s' % msg['Text'])

itchat.auto_login(True)
itchat.run()

在上面的代码中,我们首先引入了 itchat 模块和 itchat 的 TEXT 文本消息类型,然后对一个函数 simplereply() 调用了消息注册方法对文本消息进行注册,simplereply() 返回接收到的消息,最后调用 auto_login() 方法登录微信和 run() 方法侦听微信消息。

运行这段代码并登录微信后,程序将会一直侦听接收消息,如果收到文本消息,那么将会将消息打印出来,效果如下 gif 动图所示:

enter image description here

如果我们需要接收其他类型的消息,同样使用 @itchat.msgregister() 对消息类型进行注册即可。除了上述的通用消息注册方法,我们还可以指定消息的发送对象,来接收特定用户对象发来的特定消息类型,其通过 @itchat.msgregister() 装饰器的 isFriendChat 参数、isGroupChat 参数和 isMpChat 来实现。例如:

# 只接收来自好友的文本消息
@itchat.msg_register(TEXT,isFriendChat=True)

# 只接收来自于群聊的文本消息
@itchat.msg_register(TEXT,isGroupChat=True)

# 接收来自好友和群聊的文本消息
@itchat.msg_register(TEXT,isGroupChat=True,isFriendChat=True)

你可能感兴趣的:(使用 Python 全栈打造淘宝客微信机器人)