美文网首页我爱编程
确认过眼神,你想要的微信机器人

确认过眼神,你想要的微信机器人

作者: aboutlikefish | 来源:发表于2018-07-06 17:43 被阅读5次

    这个机器人已经写了很久,一直也没时间记录下开发过程(知道是懒癌发作了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

    相关文章

      网友评论

        本文标题:确认过眼神,你想要的微信机器人

        本文链接:https://www.haomeiwen.com/subject/shcbuftx.html