项目-UI自动化-自动领取闲鱼币

  1. 1.项目介绍
  2. 2.第三方库或辅助工具
  3. 3.元素定位方式
  4. 4.代码

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" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏