這個機器人已經寫了很久,一直也沒時間記錄下開發過程(知道是懶癌發作了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這裡~~~ 效果圖:
寫的這些文章是給剛入門的噴油做些參考,歡迎點星狂贊,順便打個廣告,顏值計算器小程式,原始碼看這裡