確認過眼神,你想要的微信機器人

大志若魚吐吐泡泡發表於2018-07-06

這個機器人已經寫了很久,一直也沒時間記錄下開發過程(知道是懶癌發作了ORZ)。以下用我給機器人取的名字Chowcool來作為主體。好了,開擼。

首先呢,簡單介紹Chowcool的誕生歷程,本著為廣大女同胞淘寶省錢服務的原則(自己也賺點毛票),寫一個自動識別淘寶物品是不是有返利,併傳送返利連結。然後以社交屬性為基本大法的微信機器人應運而生了。

但是Too young too naive,人的需(yu)求(wang)是無休止的,期間又加上了看圖識別車型,看圖檢測顏值等一系列生活必備小工具。總之Chowcool現在也算穩定執行了。

下面來剖析下整個機器人的生產過程:

  1. 工欲善其事,所以先準備工具,我選的開發環境:
編譯環境:Python3
編輯器:sublime
os:MacOX
Python第三方lib:requests,wxpy
內建的lib::os,base64,hashlib
WebAPI:網上搜人臉檢測,車輛識別之類的就行,這裡就不打廣告了
複製程式碼

  1. 接下來,談談Chowcool的設計思路,先說說這個功能的應用場景是
使用者已經確認了自己有購買意向的物品,然後查詢這個物品是否有返利的連結
那麼先我們對輸入做個整理,可能的輸入情況有下面幾種
複製程式碼
1. 輸入淘寶分享連結,這裡有兩種連結,一種是短連結,一種原始連結。然而短連結又有不同,需要做不同的處理
2. 輸入物品名稱或者關鍵字,這裡需要注意的就是要加入非法字元的校驗,以及失敗後的提示,比較簡單
複製程式碼

接下來就確認下輸出給使用者的資訊包括哪些,這裡我直接給出來,可以根據個人需要自己調整:

五號少兒童?籃球?正品軟皮小學生室內外訓練練習超耐磨藍球特價包郵
月售:19
原價:198.0¥
折後價:85.0¥
可獲得返利:42.5¥
連結:http://item.taobao.com/item.htm?id=10722793500
複製程式碼

最後需求明確了,可以開始寫處理邏輯了,邊放程式碼邊填坑。


  1. 填坑之路開始,首先,我們要先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

相關文章