这个机器人已经写了很久,一直也没时间记录下开发过程(知道是懒癌发作了ORZ)。以下用我给机器人取的名字Chowcool来作为主体。好了,开撸。
首先呢,简单介绍Chowcool的诞生历程,本着为广大女同胞淘宝省钱服务的原则(自己也赚点毛票),写一个自动识别淘宝物品是不是有返利,并发送返利链接。然后以社交属性为基本大法的微信机器人应运而生了。
但是Too young too naive,人的需(yu)求(wang)是无休止的,期间又加上了看图识别车型,看图检测颜值等一系列生活必备小工具。总之Chowcool现在也算稳定运行了。
下面来剖析下整个机器人的生产过程:
- 工欲善其事,所以先准备工具,我选的开发环境:
编译环境:Python3 编辑器:sublime os:MacOX Python第三方lib:requests,wxpy 内置的lib::os,base64,hashlib WebAPI:网上搜人脸检测,车辆识别之类的就行,这里就不打广告了
- 接下来,谈谈Chowcool的设计思路,先说说这个功能的应用场景是
用户已经确认了自己有购买意向的物品,然后查询这个物品是否有返利的链接 那么先我们对输入做个整理,可能的输入情况有下面几种
1. 输入淘宝分享链接,这里有两种链接,一种是短链接,一种原始链接。然而短链接又有不同,需要做不同的处理 2. 输入物品名称或者关键字,这里需要注意的就是要加入非法字符的校验,以及失败后的提示,比较简单
接下来就确认下输出给用户的信息包括哪些,这里我直接给出来,可以根据个人需要自己调整:
五号少儿童🎉篮球🎉正品软皮小学生室内外训练练习超耐磨蓝球特价包邮 月售:19 原价:198.0¥ 折后价:85.0¥ 可获得返利:42.5¥ 链接:http://item.taobao.com/item.htm?id=10722793500
最后需求明确了,可以开始写处理逻辑了,边放代码边填坑。
- 填坑之路开始,首先,我们要先new一个微信机器人,这个so easy,因为我们有万能的GitHub,上面选了几个封装好的lib,最后发现wxpy写起来比较爽,上代码:
from wxpy import * bot = Bot(qr_path='/Users/funny/Desktop/qr.png', cache_path=True) @bot.register(except_self=False) def reply_auto(msg):#这里是消息监听函数 print(msg.text)
机器人就这么简单建好了,然后定义一个消息监听函数,就可以获取用户发来的消息,具体情况可以看wxpy文档,地址就不贴了
接下来要花点时间去处理,我们要找到一些返利网来获取数据,只能够通过分析网页协议,才能获取想要的数据,相当于自己山寨了一个API,这里我使用的是淘宝自己的返利营销平台,然后通过分析,构建了数据获取过程:
url = 'https://pub.alimama.com/items/search.json' page = 1 size = 50 header = { 'accept': 'application/json, text/javascript, */*; q=0.01', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8', 'Host': 'pub.alimama.com', 'referer': 'http://pub.alimama.com/promo/search/index.htm?>q=%E8%B7%AF%E7%94%B1&_t=1527140719231', 'Cookie': 't=65a3f118f0d5d43c7fe117a8be08f817; cookie2=13fd1221dec3ea9763637418957b893b; v=0; _tb_token_=33be65ded35eb; cna=SS6EEzNgDwsCAd73tCd2fBcM; undefined_yxjh-filter-1=true; alimamapwag=TW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTNfNCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzY2LjAuMzM1OS4xODEgU2FmYXJpLzUzNy4zNg%3D%3D;cookie32=f3baeec7c052461cbe5eb16eee1db478;alimamapw=Rw8HDVJeAQlDDVFYXF5cV19YPQcBUVJQUQZRCQMMBw4DVVQJVwQDBlUEAQZXX1UIVFJT;cookie31=MTMyNDQwMDk1LHM4Mzg0ODE4JTQwYWxpbWFtYSwxMTczNTkwNjJAYWxpbWFtYS5jb20sVEI%3D;login=U%2BGCWk%2F75gdr5Q%3D%3D; taokeisb2c=; account-path-guide-s1=true;rurl=aHR0cDovL3B1Yi5hbGltYW1hLmNvbS8%2Fc3BtPWEyMTl0Ljc2NjQ1NTQuYTIxNHRyOC45LjJlMjAzNWQ5dFdKVE44; 132440095_yxjh-filter-1=true; apushfab5c63114239d725bd0105e1b8e4eaa=%7B%22ts%22%3A1527140884215%2C%22heir%22%3A1527140728008%2C%22parentId%22%3A1527140709470%7D;isg=BEZGCQKXYVfeTzWwL8e04rPtlzoID4tlcvwS2zBrhGlVM_BNhTZNc6eFDm__v4J5', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36', 'x-requested-with': 'XMLHttpRequest'} content = msg.text preload = {'q': content,#这里是要搜索的内容 '_t': '1527074885336', 'toPage': page, 'quseryType': '0', 'sortType': '1', 'auctionTag': '', 'perPageSize': size, 'shopTag': '', 't': '1527078218120', '_tb_token_': '33be65ded35eb', 'pvid': '10_222.240.118.0_745_1527078217613'} # print(preload) taobao = requests.get(url=url, params=preload) taobao = json.loads(taobao.text)
这一整段就是数据获取的协议,其中content就是我们定义的输入,这个输入不是直接能拿来用的,需要做以下的处理:
def shorturlRe(url):#这里是短链转长链 req = requests.get(url=url) html = etree.HTML(req.text) return html.xpath('//script')[1].xpath('text()')[0].split('var')[3].split(";")[0].split("'")[1] if msg.sender not in mp: if content.startswith('【'): # print(len(content.split(' '))) if len(content.split(' ')) > 5: content = content.split(' ')[0].split('】')[1] content = shorturlRe(content) else: content = content.split('】')[0].split('【')[1]
这段代码是常用的消息处理,基本不需要改动。要注意的是需要定义一个短链转长链的函数,这里可以根据需要自行处理。
最麻烦的一段过去了,剩下就等数据返回,处理下数据输出,返回的是json,要转成字典。
title = taobao['data']['pageList'][0]['title'].replace('<span class=H>', '🎉').replace('</span>', '🎉') # print(title) msale = taobao['data']['pageList'][0]['biz30day'] reservePrice = taobao['data']['pageList'][0]['reservePrice'] zkPrice = taobao['data']['pageList'][0]['zkPrice'] returnFee = taobao['data']['pageList'][0]['tkCommFee'] img = 'https:{}'.format(taobao['data']['pageList'][0]['pictUrl']) img = requests.get(img).content with open('/users/funny/desktop/1.jpg', 'wb') as f: f.write(img) link = taobao['data']['pageList']
最后把数据返回给用户,要注意处理数据返回异常的情况,找不到物品后的处理,分为两种情况,一种是没有找到指定物品,返回推荐物品,一种是输入异常,提示重新输入:
if not link or not content: if msg.sender == people: msg.reply_msg('无法找到对应的物品,请重新输入') else: msg.reply_msg(text) else: msg.reply('{}\n月售:{}\n原价:{}¥\n折后价:{}¥\n可获得返利:{}¥\n链接:{}'.format( title, msale, reservePrice, zkPrice, returnFee, link[0]['auctionUrl'])) if 'darwin' in sys.platform: # print(sys.platform) msg.reply_image('/users/funny/desktop/1.jpg') os.remove('/users/funny/desktop/1.jpg') # print('done') else: msg.reply_image(os.path.abspath(os.path.curdir) + '\\' + '1,jpg') os.remove(os.path.abspath(__file__) + '\\' + '1,jpg') except TypeError as e: # print(people) if msg.sender == people: msg.reply_msg('无法找到对应的物品,请重新输入') else: msg.reply_msg(text)
whatever, 都写完了,完成既定目标,本篇并没有把看图识别车型,看图检测颜值等代码放上来,其实原理是一样的,上述功能完整代码会放在GitHub这里~~~
效果图:image.png
写的这些文章是给刚入门的喷油做些参考,欢迎点星狂赞,顺便打个广告,颜值计算器小程序,源码看这里
image.png
image.png
网友评论