制作淘宝客微信公众号(一)
制作淘宝客微信公众号(一)
这篇文章主要是记录开发淘宝客微信公众号机器人的主要准备过程。(作者研究生在读,学业繁忙,所以不考虑帮人做公众号,只提供制作思路)
1.淘宝客介绍
淘宝客目前是一个很火的推广项目,只需要在阿里妈妈的淘宝联盟下注册认证,就可以开始向客户进行推广淘宝的产品。每成功推广一个订单,都能收到一笔商户给淘宝客的返利作为回报,返利的价格也是根据商品的不同,有所浮动,一些高的返利可以达到几十元。
所以这个项目可以作为练手项目,同时做出来以后也可以向周围的朋友进行宣传,也能获得一点小的收入,甚至自己购买商品也可以得到优惠。
一般来讲,淘宝客的推广方法有很多种,可以建立一个网站、一个app来进行推广,量小的可以通过微信群,qq群,微信公众号来进行推广。由于微信群和qq群的推广市面上有大量的辅助软件,所以我选择了做一个微信公众号来进行推广。
所以这篇文章,主要是介绍开发一个微信公众号来做淘宝客,用户发送淘宝商品链接,公众号自动回复商品优惠券及返利的信息。然后用户根据我们的推广链接去下单,然后在公众号上绑定订单,用户就可以得到这笔返利了。当然我们可以自由地设置给用户的返利比例,来考虑到底是优惠客户还是让我们自己赚得更多。
2.微信公众号淘宝客开发的主要步骤:
拥有一个微信公众号
个人只能注册订阅号,并且无法认证,相对权限很低,有条件的可以注册服务号并认证。我使用的是未认证的订阅号拥有一台云服务器
目前阿里云学生认证免费送6个月的ECS云服务器,可以去阿里云上面领。配置好云服务器的运行环境
因为最近在学习python,所以服务器要搭建好python的运行环境,以及nginx服务,搭建好了环境以后同时也可以安装一个git和node.js来搭建一个hexo个人博客,只需要再购买一个域名就能拥有自己的网站。也算是充分利用了服务器资源。淘宝联盟上实名认证
必须要实名认证才能使用淘宝的接口,并且原生接口还需要有个人已备案的网站或app才能使用,所以这里我没有采用原生接口。但同样需要实名认证才可以做淘宝客。配置公众号与服务器的对接
要让公众号的消息都发送到我们的云服务器上,然后再用服务器来处理消息,并通过微信提供的接口返回消息。使用淘宝联盟的接口自动回复微信消息
这里的接口我使用的是 www.zhetaoke.com 这个网站提供的接口。也可以在网上自己查找一些其他的接口。有了接口就可以全自动的搜索淘宝商品,然后对接上面的公众号,完成对订单的自动查询。搭建mysql数据库存储客户的订单信息
客户下了订单以后,我们需要用数据库来为客户保存订单信息以及返利金额,当客户申请提现时,方便我们到数据库中进行查询。
其他功能可以自行开发,这里只是介绍思路和方法。
下面将详细介绍每一个步骤
3.注册微信公众号
微信公众号的注册地址:https://mp.weixin.qq.com/
这里要注意,微信公众号的登录注册是使用的邮箱地址,每一个邮箱只能注册一个微信号(包括公众号和个人号),也就是说你的个人微信号绑定的邮箱是不能用来注册公众号的,而一个微信公众号又只能选择一种公众号来注册,注册了订阅号就不能选择服务号了。 这一点确实很坑。
而订阅号和服务号的区别非常大,个人只能注册订阅号,服务号需要有营业执照等相关证件。但是在微信的首页,服务号是单独作为一个用户显示在列表中的,而所有订阅号都会被收纳在一起,所以服务号的引流效果是比订阅号好很多的。并且订阅号是不能认证的,没有认证有很多的功能接口都是没有开放的。但是我这里只能注册一个个人的微信号,只能选择订阅号。具体的差别可以去官网查看。
注册的界面按照个人情况进行填写就ok。
注册完以后我们需要对公众号进行简单的配置。找到最左边最下面的开发,开发设置,里面有一个AppID和Appsecret,如果没有就生成一个。这个秘钥可以自己存储到一个地方。
下面的服务器配置暂时不用开启,因为配置服务器还需要有一台云服务器。所以下一步就是去申请一台云服务器。
4.配置云服务器
学生免费领取地址 https://developer.aliyun.com/adc/student/ 如果活动没有了,也可以去阿里云上租一台,配置最低就可以了。
有了云服务器以后,先选定服务器的系统,推荐使用最新版本的centos,然后设定好服务器的账号和密码,如果没有提示设置密码,可以在下面的地方重置实例密码。
要使用服务器,还需要有一个远程连接的软件,比如XShell。这里我推荐使用FinalShell这个国人开发的软件,本地电脑和远端服务器的交互用起来非常舒服。下载地址直接百度搜索,到官网下载最新版就可以了。
打开软件,选择上面的文件夹图标,添加一台新的SSH连接
名称随便填就可以,主机填写自己服务器的公网IP,用户名和密码就填写服务器的用户名和密码,添加完以后,双击就可以连接到云服务器上了。
4.1 nginx环境
配置服务器需要使用web服务器环境,这里我使用的是nginx,安装nginx网上也有很多教程可以去网上看,但这里要说明一个坑,有很多博客修改配置文件的的地方可能因为版本原因,我并没有找到,我这台服务器上是/etc/nginx/nginx.conf 这一个文件
修改红色方框中的server_name 改为自己的域名,如果没有域名就使用服务器的公网IP,下面的root不用管,是建网站的时候才需要的。
因为http端口是80端口,但是我的网站是建立这个端口上的,而微信服务器发来的消息也是使用的是80端口,所以我们需要先从80端口监听,然后再将消息转发到其他端口上,如8000端口。添加下面这一句:
location是匹配规则,如果访问者访问的是"公网IP/zhaunfa"这个网址,那么最后消息都会转发到本地的8000端口上来。这个zhuanfa可以根据实际情况改写。
4.2 python环境
接下来就需要配置开发环境,因为我们是用python来编程,所以需要配置好python的环境,服务器里默认是有python2.7这个版本,但是现在python3更加流行,这里我是用的是python3.7来开发。具体安装的教程可以在百度上去找,这里不多说。
我安装的时候遇到了几个坑,服务器安装好了python3.7以后,但使用pip的时候,却提示缺少zlib错误。解决办法是下载一个zlib的库,然后重新在python文件夹下,编译安装。还有SSL模块错误也是同理,先下载openssl,然后重新编译安装python。
还有安装好python以后要把python和pip的软链接都链接到最新的python上,使用的时候可以使用python -V和pip -V查看当前使用的版本。一定不要pip安装库使用的是python2,但是python使用的是python3,后面会出现错误。
安装好python环境以后,还需要安装一个web开发框架。我使用的是flask框架,安装的教程在网上可以找到。
4.3 公众号配置服务器
回到刚刚公众号的配置服务器的地方
下面有一个服务器配置,我们现在有了自己的服务器,可以开始配置了。服务器地址填写自己的域名加上转发端口时所写的目录,没有域名ip地址也可以。token是云服务器与微信服务器相互识别的重要秘钥,只有验证成功,微信服务器才知道可以正常发消息。下面的消息加解密秘钥可以自动随机生成。
当时在这里token一直没能理解到底有什么用,所以提交了很多次都没有成功。后来看到一篇博客写的,公众号提交配置时,微信服务器会向我们填写的服务器发送一个验证,来验证token是否是正确的,所以需要在自己云服务器上接收微信服务器发过来的验证,并返回正确数据,这样配置服务器才能成功。所以这里要验证token,就需要使用刚刚安装的flask框架来写一个简单的接收数据并验证的程序。具体代码可以百度搜索 “flask微信公众号验证token”,有很多教程可以参考。
4.4 公众号消息回复接口
微信公众号有自己的一套消息回复接口,官方文档地址:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html
关键就是看消息回复的被动回复用户消息。用户给公众号发送的消息都是发送到微信服务器上,然后微信服务器再根据我们填写的地址,转发到我们的服务器上,处理完以后,我们把我们要发送的消息,交给微信服务器,微信服务器再发送给客户。所以我们要做的事情就只有两件,先接受微信服务器发送过来的消息,然后处理以后,再把我们要发送的消息返回过去。
# coding:utf-8
from flask import Flask, request, abort, render_template
import hashlib
import xmltodict
import requests
import time
# 用它可以访问http请求地址
import urllib3.request as urllib2
import urllib3
import urllib
import re
import json
import io
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')
# 微信的token令牌
WECHAT_TOKEN = '你的token'
app = Flask(__name__)
@app.route("/zhuanfa", methods=["GET", "POST"])
def wechat():
"""验证服务器地址的有效性"""
# 开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带四个参数:
# signature:微信加密, signature结合了开发者填写的token参数和请求中的timestamp参数 nonce参数
# timestamp:时间戳(chuo这是拼音)
# nonce: 随机数
# echostr: 随机字符串
# 接收微信服务器发送参数
signature = request.args.get("signature")
timestamp = request.args.get("timestamp")
nonce = request.args.get("nonce")
# 校验参数
# 校验流程:
# 将token、timestamp、nonce三个参数进行字典序排序
# 将三个参数字符串拼接成一个字符串进行sha1加密
# 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
if not all([signature, timestamp, nonce]):
# 抛出400错误
abort(400)
# 按照微信的流程计算签名
li = [WECHAT_TOKEN, timestamp, nonce]
# 排序
li.sort()
# 拼接字符串
tmp_str = "".join(li)
tmp_str = tmp_str.encode('utf-8')
# 进行sha1加密, 得到正确的签名值
sign = hashlib.sha1(tmp_str).hexdigest()
# 将自己计算的签名值, 与请求的签名参数进行对比, 如果相同, 则证明请求来自微信
if signature != sign:
# 代表请求不是来自微信
# 弹出报错信息, 身份有问题
abort(403)
else:
# 表示是微信发送的请求
if request.method == "GET":
# 表示第一次接入微信服务器的验证
echostr = request.args.get("echostr")
# 校验echostr
if not echostr:
abort(400)
return echostr
elif request.method == "POST":
# 表示微信服务器转发消息过来
# 拿去xml的请求数据
xml_str = request.data
# 当xml_str为空时
if not xml_str:
abort(400)
# 对xml字符串进行解析成字典
xml_dict = xmltodict.parse(xml_str)
xml_dict = xml_dict.get("xml")
# MsgType是消息类型 这里是提取消息类型
msg_type = xml_dict.get("MsgType")
if msg_type == "text":
# 表示发送文本消息
# 够造返回值, 经由微信服务器回复给用户的消息内容
# 回复消息
# ToUsername: (必须传) 接收方账号(收到的OpenID)
# FromUserName: (必须传) 开发者微信号
# CreateTime: (必须传) 消息创建时间(整形)
# MsgType: (必须传) 消息类型
# Content: (必须传) 回复消息的内容(换行:在Content中能够换行, 微信客户端就支持换行显示)
resp_dict = {
"xml": {
"ToUserName": xml_dict.get("FromUserName"),
"FromUserName": xml_dict.get("ToUserName"),
"CreateTime": int(time.time()),
"MsgType": "image",
"Content": "用户发送的是文字"
}
}
elif msg_type == "image":
resp_dict = {
"xml": {
"ToUserName": xml_dict.get("FromUserName"),
"FromUserName": xml_dict.get("ToUserName"),
"CreateTime": int(time.time()),
"MsgType": "image",
"Content": "用户发送的是图片"
}
}
elif msg_type == "voice":
resp_dict = {
"xml": {
"ToUserName": xml_dict.get("FromUserName"),
"FromUserName": xml_dict.get("ToUserName"),
"CreateTime": int(time.time()),
"MsgType": "text",
"Content": "用户发送的是语音"
}
}
elif msg_type == "link":
resp_dict = {
"xml": {
"ToUserName": xml_dict.get("FromUserName"),
"FromUserName": xml_dict.get("ToUserName"),
"CreateTime": int(time.time()),
"MsgType": "text",
"Content": "用户发送的是链接"
}
}
elif msg_type == "vedio":
resp_dict = {
"xml": {
"ToUserName": xml_dict.get("FromUserName"),
"FromUserName": xml_dict.get("ToUserName"),
"CreateTime": int(time.time()),
"MsgType": "text",
"Content": "用户发送的是视频"
}
}
elif msg_type == "event":
if xml_dict.get('Event') == 'subscribe':
msg = '用户初次关注发送消息'
resp_dict = {
"xml": {
"ToUserName": xml_dict.get("FromUserName"),
"FromUserName": xml_dict.get("ToUserName"),
"CreateTime": int(time.time()),
"MsgType": "text",
"Content": msg
}
}
# 将字典转换为xml字符串
resp_xml_str = xmltodict.unparse(resp_dict)
# 返回消息数据给微信服务器
return resp_xml_str
if __name__ == '__main__':
app.run(port=8000, debug=True)
参考网上的大佬的代码,可以做出这样一个自动回复框架,具体微信服务器发送过来的消息格式在文档上都有,可以自行查阅。
5.淘宝联盟接口
公众号现在已经可以自动回复消息了,接下来就是把淘宝联盟的接口放在我们的服务器中来进行处理。由于没有网站备案,官方的接口是用不了了,所以我使用的是 www.zhetaoke.com 这个网站的接口。
可以看到右边有很多的API可以使用。可以根据自己的需要来接入。API的使用方法其实很简单,拿第一个高佣转链API接口来说明,因为客户发给我们的是淘宝商品的分享链接,也就是淘口令,我们需要把这个口令,解析成商品,并把该商品,转链到我们的推广链接上面。所以这一个高佣转连API就是根据商品ID,把商品转换成我们的推广链接。用户从这个推广链接进行购买,则算我们推广出去的商品。
具体的使用方法,首先查看这个接口的地址
下面有一个请求实例,我们可以根据实例来更改我们的请求,里面有一些关键参数,下方其实也有说明。
所以我们必须的就是Appkey,sid,pid还有商品的ID,前面两个的获得方式都可以在这个网站的个人信息里面看到,
pid是淘宝联盟的推广位id,所以需要去联盟里面实名认证,然后申请,具体申请方法网上也有教程。
根据这个请求实例https://api.zhetaoke.com:10001/api/open_gaoyongzhuanlian.ashx?appkey=#appkey#&sid=#sid#&pid=#pid#&num_iid=#num_iid#&signurl=1,我们要把#appkey#改为我们的appkey,sid改为我们的sid,其他的都根据实际情况然后修改,最后这个signurl=1可以啊改为4,数据更全面一些,然后把这个修改后的链接放到浏览器中输入,可以得到一串json的数据。
拿这件商品ID:609658573697来举例,请求返回了一大串的json数据。
接口的下面有每个字段的具体含义,所以我们只需要找到我们所需要的字段,然后提取出来就可以了。提醒一句:这里的样例输出字段有可能在接口中发生了变化,最好是在程序中输出看一下每一个字段,否则提取可能会出错。
在浏览器可以输入请求,在python中我们可以使用requests这个库来进行网页的请求,这是一个爬虫经常使用库,使用方法很简单,先把url用字符串的形式保存下来。然后使用requests的get或者post就可以了,具体是get还是post看API文档上有说明。我们再把返回结果json化,就得到我们想要的输出。python中的json格式是用字典来存储的,可以使用get来得到具体每一个字段的具体值。
import requests
url = 'https://api.zhetaoke.com:10001/api/open_gaoyongzhuanlian.ashx?appkey=55fb9a7c9b24487ca200e49bec540d92&sid=#sid#&pid=#pid#&num_iid=#num_iid#&signurl=1'
response = requests.get(url=url)
msg = response.json()
coupon_click_url = msg.get('tbk_privilege_get_response').get('result').get('coupon_click_url')
这样我们就得到了这个商品的优惠券的链接。其他值使用同样的方法得到。一般淘客需要的几个值是优惠券链接,商品链接,优惠券金额,商品金额,返利比例,就可以了。当然也可以根据实际情况来获得。
基本上,到这里,整个开发方法就已经全部介绍完了,剩下的就是把接口处理都放在云服务器上来进行处理,并且还要设置好用户的自动回复以及根据用户发来的消息进行解析,处理。当然有了上面介绍的方法,下面的内容都可以举一反三的来开发,我也将在下一篇文章介绍后面的开发过程。