Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >薅羊毛 | Python 自动化带你轻松赚钱

薅羊毛 | Python 自动化带你轻松赚钱

作者头像
数据森麟
发布于 2019-10-15 09:17:43
发布于 2019-10-15 09:17:43
1.1K00
代码可运行
举报
文章被收录于专栏:数据森麟数据森麟
运行总次数:0
代码可运行
作者:星安果

来源:AirPython

阅读文本大概需要 10 分钟。

1

目 标 场 景

最近,有一个朋友告诉我,她在某平台上购买了一部手机,收到货之后发现商品质量挺好的,价格也不贵。

临了随手给了个好评,商家最后还给她发一个 小红包,她把这个商品分享给了我。

本篇文章的目的是利用 Python 自动化完成商品购买的操作。

ps:本文仅限用于技术交流,请勿用于其他用途。

2

准 备 工 作

在编写代码之前,需要做如下准备工作:

1、配置好 Android ADB 开发环境

2、Python 虚拟环境内安装 pocoui 依赖库

3、操作剪切板的应用 APK,下载链接见文末

3

编 写 代 码

我们分 7 个步骤来实现这个功能,分别是:打开目标应用客户端、搜索关键字到商品列表界面、裁剪原图拿到商品主图、商品匹配、商品收藏和浏览、购买商品、获取订单号和截图。

1 步,使用 Airtest 自动化打开目标应用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 目标应用
package_name = '应用包名'
activity = 'Home Activity'

def __pre(self):
    """
    准备工作
    :return:
    """
    # 删除缓存文件
    remove_cache('./part.jpg', './screenshot.png', './uidump.xml')

    home()
    stop_app(package_name)
    start_my_app(package_name, activity)

打开应用之后,就可以进行第 2 步操作了。

通过预先得到的关键字,置入到输入框中,然后点击搜索按钮,一直等待搜过列表出现为止。

需要注意的是,有些控件元素需要点击多次才能算一次有效的点击事件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def __search_good_by_key(self):
    """
    通过关键字搜索商品
    :return:
    """
    self.poco(id_page_main_button_search).wait(5).click()

    perform_view_input(self.poco, id_page_search_edittext_search, self.key)

    # 点击搜索
    self.poco(id_page_search_button_search).wait_for_appearance()
    while self.poco(id_page_search_button_search).exists():
         print('点击一次搜索')
         perform_view_id_click(self.poco, id_page_search_button_search)

    # 等待列表加载出来
    self.poco(id_page_goods_rv).wait_for_appearance()

3 步,剪切原图,需要对原图中多余的白色区域进行删除,只保留左侧的商品主图。

通过 遍历 x 轴、y 轴,拿到每一个像素的颜色值,如果是连续的白色就做一个标识,进而拿到主图的上、下、左、右坐标值,最后利用 cv2 库进行裁剪,得到商品主图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def crop_main_img(img_path):
    """
    获取商品主图
    :return:
    """
    img = cv2.imread(img_path)
    # 图片大小(高、宽、the pixels value is made up of three primary colors)
    size = img.shape

    img_height = size[0]
    img_width = size[1]
    channels = size[2]

    # 1080*458
    print(f'图片宽度:{img_width},高度:{img_height}'

    # 标识数组,针对x轴和y轴
    arr_x = []
    arr_y = []

    # 遍历宽,得到主图的x轴坐标
    for x in range(img_width):
        is_black = True

        # 遍历高
        for y in range(img_height):
            # 获取颜色值
            color_position = img[y, x]
            if (color_position == color_white).all():
                pass
            else:
                is_black = False

        arr_x.append(is_black)

    # 遍历高,得到主图的y轴坐标
    for y in range(img_height):
        is_black = True

        # 遍历高
        for x in range(img_width):
            # 获取颜色值
            color_position = img[y, x]
            if (color_position == color_white).all():
                pass
            else:
                is_black = False

        arr_y.append(is_black)

    position_x = get_space_index(arr_x)
    position_y = get_space_index(arr_y)

    main_img_path = "./head_img.jpeg"

    # 剪切
    # 裁剪坐标为[y0:y1, x0:x1]
    cropped = img[position_y[0]:position_y[1], position_x[0]: position_x[1]]
    cv2.imwrite(main_img_path, cropped)

    return main_img_path

4 步,商品匹配。

拿到商品主图之后,利用 Airtest 在当前页面进行元素查找,如果没有找到,就滑到下一个元素;否则,就拿到匹配商品的坐标。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def __search_good_from_list(self):
    """
    从列表中匹配商品
    :return:
    """
    # 循环的图片查找
    while True:
            try:
                pos = loop_find(Template(self.main_img_path), timeout=10, threshold=0.95)
            except TargetNotFoundError:
                print('滑动一页')
                self.__swipe(True)
            else:
                print('找到了')

                # 屏幕宽度和高度
                screen_size = self.poco.get_screen_size()
                print(screen_size)

                # 点击的坐标点(宽、高)
                # (0.22407407407407406, 0.8550925925925926)
                position_click = (pos[0] / screen_size[0], pos[1] / screen_size[1])
                print(position_click)
                self.poco.click(position_click)
                break

5 步,商品收藏和浏览。

跳转到商品信息界面之后,先收藏商品,然后跳转到商品详情页面和评论页面。

在预先设置的浏览时间内,执行休眠、滑动操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def __browser_good_detail(self):
    """
    浏览商品
    :return:
    """
    # 切换到详情Tab
    self.poco('com.**:id/taodetail_nav_bar_tab_text', text='详情').click()

    # 滑动时长为: self.browser_detail_time
    browser_start = datetime.datetime.now()
    browser_end = browser_start

    while (browser_end - browser_start).seconds < self.browser_detail_time:
         # 休眠一会
         time.sleep(random.randint(2, 5))

         # 滑动一次
         self.__swipe(True)

         # 结束时间
         browser_end = datetime.datetime.now()

    print('详情页面查看完毕')

6 步,购买商品。

商品的购买操作很简单,只要点击一个购买按钮即可完成;基于安全考虑,这里选择收货地址、输入支付密码手动输入。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def __buy_good(self):
    """
    购买商品
    :return:
    """
    # 立即购买
    self.poco('**/detail_main_sys_button', text='立即购买').click()

    # 选择商品属性
    sleep(10)

    # 确定购买
    self.poco('**/confirm_text', text='确定').parent().click()

    # 提交订单
    self.poco(text='提交订单').click()

    # 手动输入密码或者指纹
    sleep(10)

7 步,获取订单 ID 及商品截图。

通过 Monitor 观察发现,订单号文本元素很难通过属性或者子、父关系拿到。

可以通过点击复制按钮,将订单号粘贴到系统的剪切板,然后利用 adb + clipper 这款 App拿到剪切板中的内容。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def __get_order_no(self):
    """
    获取订单编号
    :return:
    """
    global copy_element
    while True:
         # 由于手机屏幕的限制,【复制】按钮第一页不一定能显示出来
         try:
             copy_element = self.poco(text='复制')
         except Exception as e:
             print('没有找到元素,往下滑动一页')
             self.__swipe(True)

         break

    # 复制到剪切版本
    copy_element.click()

    # 从剪切板拿到数据
    result = exec_cmd('adb shell am broadcast -a clipper.get')[1]

    # 匹配出订单号
    result = re.findall(r'data="(.*)"', result)

    order_no = ''

    if result and len(result) > 0:
         order_no = result[0]

    print(order_no)

    return order_no

接着利用 adb 命令截取当前屏幕,然后保存到 PC 端,即完成了全部操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_order_pic(self):
     """
     拿到订单截图界面
     :return:
     """
     screenshot_pic_result = './order_screenshot.png'

     # 截取手机当前屏幕
     exec_cmd('adb shell /system/bin/screencap -p /sdcard/screenshot.png')

     # 保存到PCexec_cmd('adb pull /sdcard/screenshot.png %s' % screenshot_pic_result)

     return screenshot_pic_result

4

结 果 结 论

通过以上的步骤,即可以完成自动化挑选商品、浏览、购买等一系列操作。

需要补充的是,由于手机分辨率的不一致,导致商品主图匹配会存在一定的误差;但由于主图宽、高比是一致的,可以通过缩放图片达到 适配 的目的。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据森麟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
薅羊毛 | Python 带你抢视频红包,不放过一个红包!
如今短视频横行的时代,以某短视频为首的,背后依靠着强大的资金后盾,疯狂地对平台用户进行红包轰炸。
AirPython
2019/09/20
5830
薅羊毛 | Python 带你抢视频红包,不放过一个红包!
闲鱼上哪些商品抢手?Python 分析后告诉你
经常看到有朋友在闲鱼卖些小东西又或是自己擅长的一些技能,都能为他们带来不错的 睡后收入。
龙哥
2019/10/29
8780
闲鱼上哪些商品抢手?Python 分析后告诉你
聊聊 Airtest 自动化工具
很多读者看过之前的文章,发现我使用最多的是一款 Airtest 的自动化测试框架。
测试开发社区
2019/10/31
1.7K0
聊聊 Airtest 自动化工具
谁偷偷删了你的微信?别慌!Python 帮你都揪出来了
不知道你有没有经历过,想联系一位很长时间没有联系的朋友,发现对方很早以前已经把你删除了,而你还一无所知。
小小詹同学
2019/08/01
9680
谁偷偷删了你的微信?别慌!Python 帮你都揪出来了
带你用 Python 实现自动化群控设备
群控,相信大部分人都不会陌生!印象里是一台电脑控制多台设备完成一系列的操作,更多的人喜欢把它和 Hui 产绑定在一起!
AirPython
2020/08/15
1.2K0
自动化篇 | 你想要的闲鱼日常操作,Python 给你实现了
前篇文章讲了如何在 iOS 端使用 Airtest 实现自动化的操作,本篇将继续带大家做 iOS 端的自动化项目。
AirPython
2020/03/23
3.6K2
自动化篇 | 你想要的闲鱼日常操作,Python 给你实现了
用 Python 在朋友圈中游遍全球
十一长假,相信大部分的朋友这会应该是在全国各地浪或者是在浪的路上,朋友圈成为你们表演的场所。
小小詹同学
2019/10/10
9700
用 Python 在朋友圈中游遍全球
【愚公系列】2022年09月 微信小程序-图片裁剪功能实现
文章目录 前言 一、相关代码封装 1.组件的封装 1.1 wxml 1.2 js 1.3 wxss 2.组件的使用 2.1 wxml 2.2 js 2.3 效果 ---- 前言 1、图片裁剪相关api 属性 类型 缺省值 取值 描述 必填 imgSrc String 无 无限制 图片地址(如果是网络图片需配置安全域名) 否 disable_rotate Boolean false true/false 禁止用户旋转(为false时建议同时设置limit_move为false) 否 limit_move Bo
愚公搬代码
2022/09/28
9080
【愚公系列】2022年09月 微信小程序-图片裁剪功能实现
Python自动化办公-自动录入表单数据
图片展示的是如何用 Python 将销售交易数据填充到在线发票生成器中,可以自动生成并下载所有客户的发票。
somenzz
2021/08/19
2.6K0
selenium实操-自动化登录
今天写一下python加selenium自动化登录,包括获取邮箱验证码和普通验证码两种。
怪盗LYL
2022/06/13
2.1K0
selenium实操-自动化登录
微信跳一跳脚本重出江湖,python实现安卓&iOS自动版与手动版!
前面一段时间在GitHub上看到有人利用Python玩一款名为“跳一跳”的微信小程序,于是打算自己也来试一试,毕竟这款小游戏最近吸引了众多人的目光。
诸葛青云
2018/09/14
1.1K0
微信跳一跳脚本重出江湖,python实现安卓&iOS自动版与手动版!
Android自动化测试探索(四)uiautomator2简介和使用
项目Git地址: https://github.com/openatx/uiautomator2
周希
2019/10/15
6.2K0
airtest测试用例_Airtest 常用方法
auto_setup(__file__,devices=[“Android://127.0.0.1:5037/SJE5T17B17”])#方法二:用connect_device()方法连接设备
全栈程序员站长
2022/11/15
1.7K0
使用selenium自动秒抢淘宝商品(附详细入门指南)
selenium是一款web自动化测试工具,可以很方便地模拟真实用户对浏览器进行操作,它支持各种主流浏览器:IE、Chrome、Firefox、Safari、Opera等。
派大星的数据屋
2022/04/03
2.7K0
使用selenium自动秒抢淘宝商品(附详细入门指南)
短视频篇 | Python 带你进行短视频二次创作
无论是抖音还是快手等视频平台,一旦一个视频火了后,很多 UP 主都会争先抢后去模仿拍摄或剪辑,然后上传到平台,最后都能带来不错的流量。
AirPython
2020/03/23
1.7K0
短视频篇 | Python  带你进行短视频二次创作
Python实现自动抢红包功能
可能有人每天都忙碌于各类微信群中,专注抢红包。那是否可以利用 Python 实现自动抢红包呢?
axiomxs
2021/11/26
2.2K0
Python实现自动抢红包功能
python爬虫之验证码识别
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
云雀叫了一整天
2019/09/29
1.6K0
自动化 Web 性能分析之 Puppeteer 爬虫实践
通过上篇文章《自动化 Web 性能优化分析方案》的分享想必大家对“百策系统”有了初步的了解。本文将向大家介绍自动化性能分析使用的核心库——Puppeteer,并结合页面登录场景,介绍 Puppeteer 在百策系统中的应用。
政采云前端团队
2019/12/20
3.5K0
自动化 Web 性能分析之 Puppeteer 爬虫实践
我写了一个自动化脚本涨粉,从0阅读到接近100粉丝
在CSDN写了大概140篇文章,一直都是0阅读量,仿佛石沉大海,在掘金能能频频上热搜的文章,在CSDN一点反馈都没有,所以跟文章质量关系不大,主要是曝光量,后面调研一下,发现情况如下
linwu
2023/08/08
6100
我写了一个自动化脚本涨粉,从0阅读到接近100粉丝
python 自动化测试(5):页面基类封装
主要包括,打开浏览器、关闭浏览器、浏览器前进,后退操作、隐式等待、关闭当前窗口、保存图片、重写定位元素、输入、清除文本框内容、点击元素、获取网页标题、重写send_keys方法、重写跳转iframe方法、切回父级iframe等内容。
Mokwing
2020/09/08
9290
推荐阅读
相关推荐
薅羊毛 | Python 带你抢视频红包,不放过一个红包!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验