python自动化赚钱-薅羊毛

2023-10-26

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.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 在当前页面进行元素查找,如果没有找到,就滑到下一个元素;否则,就拿到匹配商品的坐标。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:

"""

# 切换到详情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步,购买商品。

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

结 果 结 论

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python自动化赚钱-薅羊毛 的相关文章

  • python 读取txt文件

    在 Python 中读取 txt 文件可以使用内置的 open 函数 例如 假设你有一个文件叫做 test txt 你可以这样读取它 打开文件 f open test txt r 读取文件内容 content f read 关闭文件 f c
  • required a bean of type 'xxx' that could not be found.

    文章目录 解决办法 required 属性 解决办法 新增 application properties 配置 或者 application yml 配置 注意检查下配置完成后 是否有警告 application properties ma
  • baidu地图API叠加自定义图层(一)

    百度地图API提供了叠加自定义图层的方法 地址如下 官网例子 清华校园微观图地图 http developer baidu com map jsdemo htm g0 2 API说明 http developer baidu com map
  • 学习笔记python+opencv利用拉普拉斯算子锐化与sobel算子锐化

    应数字图像处理实验要求对图像进行锐化处理 使用opencv中的函数进行锐化操作 拉普拉斯算子运算后彩色图像效果比较明显 sobel算子与原图像堆叠之后在彩色图像锐化相当明显 但是与原图像色彩区别过大 在原图转换为灰度图像之后细节较多 导入库
  • Go使用gos7实现西门子PLC通讯

    Go简介 以下摘自百度百科 Go 又称 Golang 是 Google 的 Robert Griesemer Rob Pike 及 Ken Thompson 开发的一种静态强类型 编译型语言 Go 语言语法与 C 相近 但功能上有 内存安全
  • routeros 配置一个DMZ站点

    公司最近要上套业务系统 需要一个外网ip给它 于是就要在路由上给它个映射 我在网上看到一个资料很适合 RouterOS 网络中配置一台DMZ站点 下面将说明怎么样在网络中配置一台DMZ站点 DMZ是英文 demilitarized zone
  • 计算机网络输入一个URL全过程

    1 输入url时候 当我们开始在浏览器中输入网址的时候 浏览器他会从历史记录 书签等地方 找到已经输入的字符串可能对应的 url 然后给出智能提示 让你可以补全url地址 2 请求发起之后 解析这个域名 解析域名分为下面几个步骤 1 首先
  • CSS磨砂玻璃穿透效果 filter: blur(4px);

    文章目录 一 参考 二 问题描述 三 原理说明 四 项目代码说明 一 参考 纯CSS教你实现磨砂玻璃背景效果 附代码 二 问题描述 工作中 UCD 设计了一个 磨砂穿透 的效果 本想着画一个磨砂效果 然后在通过透明度穿透 实现 磨砂穿透 的
  • Xshell 常用命令大全 自用

    1 命令ls 列出文件 ls la 给出当前目录下所有文件的一个长列表 包括以句点开头的 隐藏 文件 ls a 列出当前目录下以字母a开头的所有文件 ls l doc 给出当前目录下以 doc结尾的所有文件 2 命令cp 复制文件 cp a
  • 特征选择(Feature Selection)

    主要内容 为什么要进行特征选择 什么是特征选择 怎么进行特征选择 特征选择 在现实生活中 一个对象往往具有很多属性 以下称为特征 这些特征大致可以被分成三种主要的类型 相关特征 对于学习任务 例如分类问题 有帮助 可以提升学习算法的效果 无
  • 【Spring源码】createBean()

    目录 1 resolveBeanClass 2 prepareMethodOverrides 3 resolveBeforeInstantiation 1 applyBeanPostProcessorsBeforeInstantiation
  • whisper模型 环境搭建与使用

    1 创建conda环境 conda create n whisper python 3 9 激活环境 conda activate whisper 2 安装whisper pip install openai whisper conda i
  • 计算机系统基础课程实验课bomb--phase_3

    首先栈指针减去24 应该是为了存储数组所需要 rcx存储栈指针加12的地址 rdx存储栈指针加8的地址分别作为第四第三参数 并且把0放入了返回值 eax中 然后可以看到输入函数的第二个参数地址为0x4025cf 通过x s查看内存的值为 即
  • java.lang.IllegalStateException: Found multiple @SpringBootConfiguration annotated classes [Generic

    该错误表示有重复的spring boot启动类 去掉重复的就行 项目是service工程里的测试部分加了一个springboot启动类 用于测试 但是该工程模块依赖于其他模块 如model模块和base模块的pojo类 因此注释掉base和
  • 搭建Vulhub漏洞测试靶场+成功环境

    可点击目录分类快捷浏览 官方地址 环境安装成功后做好快照 环境是否正常运行 检查docker是否运行 没运行则运行 进入对应漏洞文件夹 搭建及运行漏洞环境 官方地址 https vulhub org docs 环境安装成功后做好快照 我个人
  • 怎么可以有颜色的将matlab的代码复制到word中不产生乱码。

    我们直接将matlab中的代码复制粘贴到word中 就会产生如图的乱码 如果选择选择只保留文本 也能解决乱码问题 但是会将matlab原带的代码颜色消失 显得不美观 其实只要改正一下字体就可以解决这种问题 在matlab中设置一下字体就可以
  • Tomcat控制台中文乱码问题

    解决方案 第一 只修改java util logging ConsoleHandler encoding UTF 8下的编码格式 修改成GBK 不成功看第二 我用第一个配置就成功了 第二 在Tomcat根目录下 conf 子目录下的 log
  • Daily Scrum: 2012/11/7

    成员 角色 今天工作 明天计划 王安然 PM Dev 进行Craft类的供给Craft子类的编写 186 继续进行Craft CraftFactory类的编写 186 黄杨 PM Dev Art 完成粒子爆炸效果测试 199 基本样式的星空
  • 前端JavaScript面试技巧

    前端JavaScript面试技巧 第一章 课程简介 1 1课程简介 前端基础 1 2前言 网站前端程序开发分析 1 3几个面试题 typeof操作符 require命令加载ES6模块 SpringLoaded 1 4如何搞定所有面试题 获取
  • 【力扣练习题】加一

    package sim import java math BigDecimal import java util Arrays public class Add1 给定一个由 整数 组成的 非空 数组所表示的非负整数 在该数的基础上加一 最

随机推荐

  • eclipse环境搭建C++环境

    eclipse搭建C 编译环境使用eclipse CDT msys gcc gdb共4个软件 其中几个软件简单理解为 eclipse CDT 用于编辑软件文本 msys 管理使用的软件下载 gcc 用于编译 链接文件 gdb 用于调试 一
  • graphpad7.04多组比较p值_同是折线图为何你却这么优秀,这才是多组数据作图应该有的样子...

    相信大家对Excel做折线图应该不陌生 在展示数据的时候 图表是一种最好的展示方法 但是经常会碰到一种尴尬的事情就是 当数据维多比较多的时候 做出的图表就会显得非常难看 今天我们就来学习一下 多组数据怎么做折线图才好看 平民手中的折线图 当
  • 读书笔记-oo项目生存法则

    1 建立一个成功的项目的简单四步 1 采用增量式进度安排和阶段划分 2 拥有发现和改正错误的机制 3 建立一个良好的产品发布习惯 4 拥有优秀的项目负责人 项目经理和技术主管 2 相关概念 1 类是一组子程序和相关数据的集合 常用类图表示
  • springboot+flowable+mybatisplus初始化建表时如何指定数据源

    springboot flowable mybatisplus初始化表单如何指定数据源 问题描述 解决过程 直接上代码 问题描述 之前在自己的springboot当中集成了flowable 在集成flowable之前 springboot当
  • 直方图均衡化

    https www zhihu com question 37204742 answer 221844779 https zhuanlan zhihu com p 32857009
  • 明文传输漏洞

    业务系统对用户口令等机密信息的保护不足 攻击者可以利用攻击工具 从网络上窃取合法用户的口令数据 从而登录系统执行非法操作 攻击者可以利用监听工具在网络中窃取合法用户的口令数据 从而非法获取系统的访问权限 检测方法 通过burpsuite工具
  • OD-数列还原(python)

    数列还原 题目描述 有一个数列A n 从A 0 开始每一项都是一个数字 数列中A n 1 都是A n 的描述 其中A 0 1 规则如下A 0 1A 1 11 含义其中A 0 1是1个1 即11 表示A 0 从左到右连续出现了1次1A 2 2
  • C语言/C++基础之跨年烟花程序代码(附源码)

    C语言 C 基础之跨年烟花程序代码 程序之美 前言 主体 运行效果 代码实例 结束语 程序之美 前言 元旦将至 新年将至 转眼间2022年即将过去 崭新的一年正向我们缓缓走来 风花雪夜新年临近 入冬寒意随风吹进 繁星点点缀满天际 黎明晨阳元
  • 修改jar包中的class文件

    需求及准备 需求 现在有一个 jar文件 要修改其中某个文件的代码 准备 确保JRE已安装且环境变量已配置 安装Java Decompiler 官方地址为 http java decompiler github io 选择其中的JD GUI
  • Spring循环依赖源码debug详解

    1 什么是循环依赖 在Spring里 指两个或多个bean互相依赖 比如有两个Bean A B A中注入B B中注入A 这样就形成了循环依赖 Spring默认是支持循环依赖的 本文我们就从Spring源码层面对循环依赖进行分析 2 环境构建
  • Node.js学习四(文件流stream)

    文章目录 前言 一 Node处理缓存的方式 二 什么是Node js Stream 流 三 stream 流 的类型 四 创建可读流 五 拷贝文件 六 链式流 1 压缩文件 2 解压文件 前言 在我们学过fs模块后 可以知道读取文件时采用r
  • 12 shell命令之打包

    昨晚写的awk 说实话 对我而言 那是一个最复杂的命令 写得不是很好 可能在结构组织上面有很大的问题 后续有心得会再调整修改 本文将介绍linux的一组打包命令 这其中有我们最常用的tar 也有我们几乎没有见过的mksquansh 接下来就
  • 简明SQL截断和偏移指南:掌握LIMIT实现数据筛选

    以下是用到的表 截断 LIMIT 用于限制查询结果返回的行数 即最多返回多少行数据 例如 返回前两行数据 例如 从第二个数据开始返回两条数据 从0开始计算 偏移 OFFSET 用于指定查询结果的起始位置 即从结果集中的第几行开始返回数据 例
  • Spring使用——通过配置类注入Bean

    配置类 Configuration 告诉spring这是一个配置类 ComponentScan value指定要扫描的包 Filter excludeFilters default 扫描的时候按照规则排除哪些 ComponentScan v
  • App自动化测试 —— Appium的使用

    目录 简介 安装 配置 Run 问题 解决方案 优点 缺点 总结 简介 Appium是一个开源测试自动化框架 用于原生 混合和移动 Web 应用程序 安装 Appium安装方式有两种 一种是通过npm命令行安装 另一种是通过安装可视化工具
  • 华为OD机试真题 Java 实现【查找单入口空闲区域】【2022 Q4 100分】,附详细解题思路

    目录 一 题目描述 二 输入描述 三 输出描述 四 解题思路 五 Java算法源码 六 效果展示 1 输入 2 输出 3 说明 一 题目描述 给定一个 m x n 的矩阵 由若干字符 X 和 O 构成 X 表示该处已被占据 O 表示该处空闲
  • c3p0 mysql 自动重连_C3P0官方对于MySQL8小时问题的解决方案

    前一段时间在做一个发邮件的程序 程序是用定时器 每晚凌晨定时发邮件 邮件内容需要从数据库中获取 运行了一天就出问题了 问题信息如下 com mysql jdbc exceptions jdbc4 CommunicationsExceptio
  • 计算机系统基础课程实验课bomb--phase_1

    首先呢 栈顶减8个字节 然后将 0x402400放入第二个参数以调用
  • 如何打造一个高效的研发团队

    互联网公司的成功很大一部分归结为人才储备 如何打造有活力 持续创新的研发团队 相信很多管理者都比较关心 下面我们从业务支撑 技术架构 团队建设这几个方面做简单剖析 业务支撑 快速发展已经成为互联网公司的一种常态 那么在这么快的节奏下 如何快
  • python自动化赚钱-薅羊毛

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