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

1、目 标 场 景

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

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

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

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

2、准 备 工 作

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

1、配置好 Android ADB 开发环境

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

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

3、编 写 代 码

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

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

# 目标应用
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 步操作了。

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

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

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 库进行裁剪,得到商品主图。

def crop_main_img(img_path):"""获取商品主图:return:"""img = cv2.imread(img_path)# 图片大小(高、宽、the pixels value is made up of three primary colors)size = img.shapeimg_height = size[0]img_width = size[1]channels = size[2]# 1080*458print(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():passelse:is_black = Falsearr_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():passelse:is_black = Falsearr_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 在当前页面进行元素查找,如果没有找到,就滑到下一个元素;否则,就拿到匹配商品的坐标。

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 步,商品收藏和浏览。

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

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

def __browser_good_detail(self):"""浏览商品:return:"""# 切换到详情Tabself.poco('com.**:id/taodetail_nav_bar_tab_text', text='详情').click()# 滑动时长为: self.browser_detail_timebrowser_start = datetime.datetime.now()browser_end = browser_startwhile (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 步,购买商品。

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

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拿到剪切板中的内容。

def __get_order_no(self):"""获取订单编号:return:"""global copy_elementwhile 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 端,即完成了全部操作。

def get_order_pic(self):"""拿到订单截图界面:return:"""screenshot_pic_result = './order_screenshot.png'# 截取手机当前屏幕exec_cmd('adb shell /system/bin/screencap -p /sdcard/screenshot.png')# 保存到PC端exec_cmd('adb pull /sdcard/screenshot.png %s' % screenshot_pic_result)return screenshot_pic_result

4、结 果 结 论

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

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

本文首发于公众号「 AirPython 」,我已经将全部源码,包含文中使用的 APK 上传到公众号后台上,关注公众号后回复「 羊毛 」即可获得下载链接。

如果你觉得文章还不错,可以关注公众号,获取其他干货。

薅羊毛 | Python 自动化带你轻松赚钱(完结版)相关推荐

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

    作者:星安果 来源:AirPython 阅读文本大概需要 10 分钟. 1 目 标 场 景 最近,有一个朋友告诉我,她在某平台上购买了一部手机,收到货之后发现商品质量挺好的,价格也不贵. 临了随手给了 ...

  2. python自动化赚钱-薅羊毛 | Python 自动化带你轻松赚钱(完结版)

    1 目 标 场 景 最近,有一个朋友告诉我,她在某平台上购买了一部手机,收到货之后发现商品质量挺好的,价格也不贵. 临了随手给了个好评,商家最后还给她发一个 小红包,她把这个商品分享给了我. 本篇文章 ...

  3. Python 自动化带你轻松赚钱

    目 标 场 景 最近,有一个朋友告诉我,她在某平台上购买了一部手机,收到货之后发现商品质量挺好的,价格也不贵. 临了随手给了个好评,商家最后还给她发一个 小红包,她把这个商品分享给了我. 本篇文章的目 ...

  4. Python 自动化办公应用大全(ChatGPT 版)

    以下内容来自公众号逆锋起笔,关注每日干货及时送达 你被降维打击过吗? 在刘慈欣的科幻小说<三体>中,高级文明掌握了一种维度武器,可以将攻击目标所处的空间维度降低,使其无法生存. 二向箔飞出 ...

  5. 【哈士奇赠书活动 - 25期】-〖Python自动化办公应用大全(ChatGPT版) 〗

    文章目录 ⭐️ 赠书 - <Python自动化办公应用大全(ChatGPT版)> ⭐️ 内容简介 ⭐️ 作者简介 ⭐️ 编辑推荐 ⭐️ 赠书活动 → 获奖名单 ⭐️ 赠书 - <Py ...

  6. 【可乐荐书】Python自动化办公应用大全(ChatGPT版):从零开始教编程小白一键搞定烦琐工作

    本栏目将推荐一些经典的.有趣的.有启发性的书籍,这些书籍涵盖了各个领域,包括文学.历史.哲学.科学.技术等等.相信这些书籍不仅可以让你获得知识,还可以让你感受到阅读的乐趣和魅力. 今天给大家推荐的书籍 ...

  7. python自动化广告收益_薅羊毛? 月入10万? | 这是自动化测试老司机的特长--Python自动化带你薅视频红包,一个都不放过!...

    一.目标场景 如今短视频横行的时代,以某短视频为首的,背后依靠着强大的资金后盾,疯狂地对平台用户进行红包轰炸. ​ 与传统的红包不一样,视频红包包含位置的不确定性.大小不确定性.元素 ID 的不确定性 ...

  8. 薅羊毛 | Python 带你抢视频红包,不放过一个红包!

    阅读文本大概需要 15 分钟. 1 目 标 场 景 如今短视频横行的时代,以某短视频为首的,背后依靠着强大的资金后盾,疯狂地对平台用户进行红包轰炸. 与传统的红包不一样,视频红包包含位置的不确定性.大 ...

  9. 【软件测试】自动化测试战零基础教程——Python自动化从入门到实战(完结)

    整理不易,希望对各位学习软件测试能带来帮助 软件测试知识持续更新 第十章 行为驱动开发 BDD 框架 lettuce 入门 第一节.安装与例子 安装 例子(阶乘) 第二节.lettuce 解析 第三节 ...

最新文章

  1. python的数组和元组区别_python中数组,列表,元组的区别、定义、功能
  2. VMware中安装CentOS Linux release 7.4.1708 (Core)
  3. @Autowired自动装配对象和new对象的区别
  4. GTK+ VS MFC
  5. knn实战:如何对手写数字进行识别?
  6. 将文件保存到数据库中
  7. java文件处理:文件流、上传、下载
  8. 基于SSM的社区消毒防疫物资系统
  9. 51nod1185威佐夫博弈+大数乘法模拟
  10. FLAG_ACTIVITY_CLEAR_TOP和singleTask的区别
  11. 高德 设置marker zoom_ZOOM云会议下载安装-ZOOM云视频会议最新版v5.3.53292
  12. MyScript基础功能
  13. VMware ESXi/ESX 的内部版本号和版本 (2143832)
  14. Offset commit failed with a retriable exception. You should retry committing the latest consumed off
  15. 【蓝桥杯备赛笔记 02】费解的开关
  16. 数据分析真题日刷 | 招商银行信用卡中心2019秋招IT笔试(数据挖掘方向第二批)
  17. (doc, docx)文档合并的三种方法
  18. 【收藏】如何优雅的在 Python设置报警通知(邮件、短信、电脑外放声音)
  19. js控制div内部滚动内容横向滑动位置
  20. 洗地机口碑榜,洗地机哪个品牌好用性价比高

热门文章

  1. win7在哪看计算机配置,Win7系统中在哪里看电脑配置好坏以及查看方法步骤
  2. 2019年,SEO关键词KPI考核指标有哪些?
  3. 多麦克风做拾音的波束_语音交互:先从麦克风阵列聊起
  4. HiPER月光网吧宽带安全网关接入解决方案(转)
  5. 计算机音乐制作手册,计算机音乐制作手册
  6. 《互联网时代》第四集 再构
  7. ReadEveryDay From LuoJiLab
  8. NPL系列之分词和分词框架(二)
  9. 计算机学院请假管理系统,《计算机学院在校学生离校请销假管理暂行规定》
  10. 兰迪·波许教授的最后一课