项目-UI自动化-自动领取闲鱼币
1.项目介绍
1.1 项目背景
1. 每天可以通过做任务去获取闲鱼币,并且每天的任务基本都是一样的
2. 因此可以通过自动化的方式去做任务领取闲鱼币
1.2 需要优化的地方
1. 缺少详细的执行日志,目前只有大概的执行日志
2. 没有考虑执行异常的情况
2.第三方库或辅助工具
# 第三方库
pip install weditor
pip install uiautomator2
# 给手机安装插件
python -m uiautomator2 init
# 启动元素定位工具
python -m weditor
# uiautomator2 官方文档
https://github.com/openatx/uiautomator2#connect-to-a-device
3.元素定位方式
# 通过一个条件去定位元素,然后点击
self.driver(description="领取奖励").click()
# 通过两个或多个条件去定位元素,然后点击
self.driver(description="领取奖励", index=3).click()
# 返回一个dict类型,可以查看该元素有哪些信息
self.driver(description="领取奖励").info
4.代码
# -*-coding:utf-8-*-
import os
import time
import uiautomator2
keyword_list = ["逛一逛淘金币小镇", "去饿了么果园领水果", "去菜鸟抽手机", "去高德免费领水果", "去淘特领好礼", "去天猫拿红包","去高德"]
class XianYuUi(object):
def __init__(self):
self.driver = uiautomator2.connect("2NSDU20730008083")
def driver_click_timeout(self, key, value, timeout=2):
if key == "text":
self.driver(text=value).click()
time.sleep(timeout)
elif key == "description":
self.driver(description=value).click()
time.sleep(timeout)
else:
raise ValueError("输入的值有误")
def receive_reward(self):
"""领取奖励"""
self.driver_click_timeout("description", "领闲鱼币")
self.driver(description="待领取", index=23).click()
time.sleep(2)
self.driver(description="领取奖励", index=3).click()
time.sleep(3)
def clear_apk_and_receive_reward(self):
"""清理后台,然后重新领取奖励"""
self.clear_apk()
os.system("adb shell am start -n com.taobao.idlefish/com.taobao.idlefish.maincontainer.activity.MainActivity")
for _ in range(10):
if self.driver(resourceId="com.taobao.idlefish:id/tab_title").exists:
time.sleep(3)
break
else:
time.sleep(1)
self.driver_click_timeout("text", "我的")
# 滑动页面
self.driver.swipe(463, 1598, 459, 537)
time.sleep(1)
self.receive_reward()
def check_task_deduction(self):
"""闲鱼抵扣"""
if self.driver(text="闲鱼币抵扣").exists:
print("实际任务是:闲鱼币抵扣")
time.sleep(2)
self.driver_click_timeout("text", "立即开启")
for _ in range(3):
self.driver_click_timeout("text", "已开启抵扣宝贝", timeout=3)
self.driver_click_timeout("text", "不抵扣")
self.driver_click_timeout("text", "确定")
print("已关闭抵扣的商品")
self.driver.press("back")
time.sleep(2)
# 领取奖励
self.driver(description="待领取", index=23).click()
time.sleep(2)
self.driver(description="领取奖励", index=3).click()
time.sleep(3)
# 点击 “浏览指定频道好物”
if self.driver(textContains="浏览指定频道好物").exists:
self.driver(description="去完成", index=3).click()
def task_view_channel(self):
"""浏览指定频道好物"""
print("任务:浏览指定频道好物")
self.driver(description="去完成", index=3).click()
time.sleep(2)
# 检查任务是不是 闲鱼抵扣
self.check_task_deduction()
# 滑动屏幕
for _ in range(15):
self.driver.swipe(470, 1662, 470, 815)
time.sleep(1)
if self.driver(description="去领取").exists:
break
# 退出去,然后去领取奖励
self.driver.press("back")
time.sleep(2)
if self.driver(description="领闲鱼币").exists:
self.receive_reward()
elif self.driver(description="攻略", packageName="com.taobao.idlefish").exists:
self.driver(description="待领取", index=23).click()
time.sleep(2)
self.driver(description="领取奖励", index=3).click()
time.sleep(3)
else:
self.clear_apk_and_receive_reward()
print("任务:浏览指定频道好物-已完成")
def exec_task(self):
"""执行任务"""
current_name = ""
flag = False
# 点击"去完成"按钮
try:
for i in range(6):
if flag:
break
info = self.driver(packageName="com.taobao.idlefish", index=4)[i].info["contentDescription"]
for word in keyword_list:
if word in info:
current_name = word
print("当前任务是:%s" % word)
self.driver(description="去完成", index=3)[4].click()
if current_name == "去高德免费领水果":
time.sleep(20)
else:
time.sleep(15)
# 删除已经点击过的任务
keyword_list.remove(word)
flag = True
break
except Exception as e:
print(e)
# 返回闲鱼币页面
for _ in range(2):
self.driver.press("back")
time.sleep(2)
# 领取奖励
if self.driver(description="领闲鱼币").exists:
self.receive_reward()
elif self.driver(description="攻略", packageName="com.taobao.idlefish").exists:
self.driver(description="待领取", index=23).click()
time.sleep(2)
self.driver(description="领取奖励", index=3).click()
time.sleep(3)
else:
self.clear_apk_and_receive_reward()
print("任务:%s-已完成" % current_name)
def upgrade_shop(self):
"""升级小店"""
print("关闭领奖页面")
self.driver.click(92, 173)
time.sleep(1)
print("获取升级小店的次数")
num = int(self.driver(index=15, packageName="com.taobao.idlefish").info["contentDescription"])
print("可以升级%s次" % num)
print("点击升级按钮")
for _ in range(num):
self.driver(index=20).click()
time.sleep(1)
def clear_apk(self):
"""清理后台应用"""
print("清理后台")
for _ in range(2):
self.driver.keyevent("3")
time.sleep(1)
# 点击menu菜单
os.system("adb shell input tap 738 2258")
time.sleep(1)
# 点击清理按钮
if self.driver(resourceId="com.huawei.android.launcher:id/title").exists:
os.system("adb shell input tap 502 2125")
time.sleep(3)
def start_apk(self):
"""启动应用"""
print("启动'闲鱼'APP")
os.system("adb shell am start -n com.taobao.idlefish/com.taobao.idlefish.maincontainer.activity.MainActivity")
for _ in range(10):
if self.driver(resourceId="com.taobao.idlefish:id/tab_title").exists:
break
else:
time.sleep(1)
self.driver_click_timeout("text", "我的")
# 滑到页面
self.driver.swipe(463, 1598, 459, 537)
time.sleep(1)
self.driver_click_timeout("description", "领闲鱼币")
def done_task(self):
"""完成任务"""
print("领取昨日奖励和签到")
if self.driver(description="点击领取").exists:
self.driver_click_timeout("description", "点击领取")
for _ in range(5):
if self.driver(description="知道了").exists:
self.driver(description="知道了").click()
break
time.sleep(1)
# 签到页面
if self.driver(description="签到").exists:
self.driver_click_timeout("description", "签到")
for _ in range(1):
if self.driver(text="明日再来").exists:
print("今日已经领取过了")
break
self.driver_click_timeout("description", "签到")
else:
self.driver(index=23, packageName="com.taobao.idlefish").click()
time.sleep(2)
for _ in range(1):
if self.driver(description="明日再来").exists:
print("今日已经领取过了")
break
self.driver_click_timeout("description", "签到")
# # 任务:浏览指定频道好物
if self.driver(descriptionContains="浏览指定频道好物\n+100\n+200\n").exists:
self.task_view_channel()
if self.driver(descriptionContains="开启一件抵扣商品\n+60\n+200\n").exists:
self.driver.click(889, 1230)
self.check_task_deduction()
# 执行任务
for _ in range(6):
time.sleep(4)
self.exec_task()
time.sleep(2)
# 升级小店
self.upgrade_shop()
def run(self):
# 清理后台
self.clear_apk()
time.sleep(3)
# 启动应用
self.start_apk()
time.sleep(3)
# 执行任务
self.done_task()
time.sleep(2)
# 清理后台
self.clear_apk()
time.sleep(3)
if __name__ == '__main__':
user = XianYuUi()
user.run()
"""
python -m uiautomator2 init
python -m weditor
"""
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。
文章标题:项目-UI自动化-自动领取闲鱼币
本文作者:伟生
发布时间:2022-09-04, 22:17:00
最后更新:2022-10-04, 19:00:36
原始链接:http://yoursite.com/2022/09/04/ceshi_16_idle_fish/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。