Python+Appium的i茅台每日自动申购脚本

代码如下

from appium import webdriver
from selenium.common.exceptions import NoSuchElementException
from appium.webdriver.common.touch_action import TouchAction
from appium.webdriver.connectiontype import ConnectionType
import time
import os

daily_subscribe = 0
daily_tour = 0
luck_day = 0
daily_check = 0
test = 0

desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformversion'] = '7.1.1'
desired_caps['deviceName'] = '192.168.0.104:5556'
# desired_caps['udid'] = '192.168.0.101:5556'
#desired_caps['appPackage'] = 'com.moutai.mall'
#desired_caps['appActivity'] = '.MainActivity'
desired_caps['noReset'] = 'True'
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True

driver = None

# print(driver.current_package)
# print(driver.current_activity)


def handleException():
    try:
        driver.find_element_by_xpath("//*[@text='登录']")
        driver.find_element_by_id("com.moutai.mall:id/etPhone").clear()
        driver.find_element_by_id("com.moutai.mall:id/etPhone").send_keys("15895919875")
        flag = driver.find_element_by_class_name('android.widget.CheckBox').get_attribute('checked')
        if flag == "false":
            driver.find_element_by_class_name('android.widget.CheckBox').click()
        driver.find_element_by_xpath("//*[@text='获取验证码']").click()

        driver.start_activity('com.tencent.mobileqq', '.activity.SplashActivity')
        driver.find_element_by_xpath("//*[contains(@content-desc, 'phil')]").click()
        driver.find_element_by_class_name('android.widget.EditText').send_keys("i茅台登录过期,请输入验证码")
        driver.find_element_by_xpath("//*[@text='发送']").click()
        time.sleep(50)
        string = ""
        eles = driver.find_elements_by_class_name('android.widget.TextView')
        for i in range(len(eles)-1, -1, -1):
            if eles[i].text.find("yzm") != -1:
                string = eles[i].text[3:]
                break
        print(string)
        driver.press_keycode(4)  # back
        driver.press_keycode(4)  # back
        driver.find_element_by_id("com.moutai.mall:id/etVerifyCode").clear()
        driver.find_element_by_id("com.moutai.mall:id/etVerifyCode").send_keys(string)
        driver.find_element_by_xpath("//*[@text='登录']").click()
    except NoSuchElementException as e:
        print(e)


def daily_subcribe():
    try:
        #driver.start_activity('com.moutai.mall', '.MainActivity')
        driver.find_element_by_xpath("//*[@content-desc='i茅台']").click()
        driver.find_element_by_xpath("//*[@text='首页']").click()
        driver.find_element_by_xpath("//*[@text='首页']").click()
        driver.find_element_by_xpath("//*[@text='首页']").click()
        driver.find_element_by_id("com.moutai.mall:id/ivLeft").click()
        driver.find_element_by_xpath("//*[@text='预约申购']").click()
        driver.find_element_by_xpath("//*[@text='申购']").click()
        driver.find_element_by_xpath("//*[@text='确定申购']").click()
        driver.find_element_by_xpath("//*[@text='继续申购']").click()
        time.sleep(2)
        driver.swipe(530, 1700, 530, 300, 200)
        driver.swipe(530, 1700, 530, 300, 200)
        driver.find_element_by_xpath("//*[@text='预约申购']").click()
        driver.find_element_by_xpath("//*[@text='申购']").click()
        driver.find_element_by_xpath("//*[@text='确定申购']").click()
        driver.find_element_by_xpath("//*[@text='继续申购']").click()

        #check
        driver.press_keycode(4)  # back
        time.sleep(1)
        driver.press_keycode(4)  # back
        driver.find_element_by_xpath("//*[@text='我的']").click()
        driver.find_element_by_xpath("//*[@text='我的申购单']").click()
        date = driver.find_elements_by_id("com.moutai.mall:id/date_time")
        status = driver.find_elements_by_id("com.moutai.mall:id/draw_status")
        time.sleep(2)
        date = driver.find_elements_by_id("com.moutai.mall:id/date_time")
        status = driver.find_elements_by_id("com.moutai.mall:id/draw_status")
        string = ""
        for i in range(0, min(2, len(date))):
            string += date[i].text + status[i].text
        print(string)
        current_date = time.strftime("%Y-%m-%d", time.localtime())
        str = current_date + "静候申购结果" + current_date + "静候申购结果"
        print(str)
        driver.press_keycode(4)  # return
        if string == str:
            print("申购成功")
            return 0
        else:
            return -1
    except NoSuchElementException as e:
        print(e)
        handleException()
        return -1


def check_daily_subcribe():
    driver.find_element_by_xpath("//*[@content-desc='i茅台']").click()
    driver.find_element_by_xpath("//*[@text='我的']").click()
    driver.find_element_by_xpath("//*[@text='我的申购单']").click()
    date = driver.find_elements_by_id("com.moutai.mall:id/date_time")
    status = driver.find_elements_by_id("com.moutai.mall:id/draw_status")
    string = ""
    for i in range(len(date)):
        string += date[i].text + ":" + status[i].text + "\n"
    print(string)
    driver.start_activity('com.tencent.mobileqq', '.activity.SplashActivity')
    driver.find_element_by_xpath("//*[contains(@content-desc, 'phil')]").click()
    driver.find_element_by_class_name('android.widget.EditText').send_keys(string)
    driver.find_element_by_xpath("//*[@text='发送']").click()
    time.sleep(2)
    driver.press_keycode(4)  # back
    driver.press_keycode(4)  # back

def xiao_mao_yun():
    driver.find_element_by_xpath("//*[@content-desc='i茅台']").click()
    try:
        driver.find_element_by_xpath("//*[@text='小茅运']").click()
        driver.find_element_by_xpath("//*[@text='旅行']").click()
        driver.find_element_by_xpath("//*[contains(@text, '100耐力去旅行')]").click()
        driver.find_element_by_xpath("//*[@text='1650539651c20999']").click()  # exit
        return 0
    except NoSuchElementException as e:
        print(e)

    try:
        driver.find_element_by_xpath("//*[@text='小茅运']").click()
        driver.find_element_by_xpath("//*[@text='旅行']").click()
        driver.find_element_by_xpath("//*[@text='领取奖励']").click()
        driver.find_element_by_xpath("//*[@text='我知道了']").click()
        # driver.find_element_by_xpath("//*[@text='我知道啦']").click()
        time.sleep(2)
        TouchAction(driver).tap(x=315, y=1704).perform()
        driver.find_element_by_xpath("//*[@text='1650539651c20999']").click()  # exit
    except NoSuchElementException as e:
        print(e)
    return 1

    # driver.find_element_by_xpath("//*[@text='60耐力 加速完成']").click()
    # driver.find_element_by_xpath("//*[@text='40耐力 加速完成']").click()
    # driver.find_element_by_xpath("//*[@text='20耐力 加速完成']").click()
    # driver.find_element_by_xpath("//*[@text='小茅累了,明日继续']").click()
    # TouchAction(driver).tap(x=544, y=1620).perform()


def unlock():
    try:
        driver.unlock()
        time.sleep(1)
        driver.swipe(530, 1700, 530, 300, 200)
        TouchAction(driver).press(x=536, y=993).move_to(x=247, y=1283).move_to(x=536, y=1283).move_to(x=828, y=1283).release().perform()
        driver.press_keycode(3)  # home
    except Exception as e:
        print(e)

def lock():
    try:
        driver.press_keycode(4)  # back
        time.sleep(2)
        driver.press_keycode(4)  # back
        driver.press_keycode(3)  # home
        time.sleep(2)
        driver.close_app()
        time.sleep(2)
        driver.lock(0)
        # driver.press_keycode(26)  # power
        # driver.quit()
    except Exception as e:
        print(e)


if __name__ == '__main__':
    driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
    driver.implicitly_wait(20)
    while 1:
        current_time = time.localtime(time.time())
        if current_time.tm_hour == 8:
            print(current_time)
            daily_subscribe = 0
            daily_tour = 0
            luck_day = 0
            daily_check = 0
        elif current_time.tm_hour == 9 and daily_subscribe is 0:
            print(current_time)
            unlock()
            if daily_subcribe() == 0:
                daily_subscribe = 1
            lock()
        elif current_time.tm_hour == 9 and daily_tour is 0:
            print(current_time)
            unlock()
            if xiao_mao_yun() == 0:
                daily_tour = 1
            lock()
        elif test:
            print(current_time)
            unlock()
            lock()
        # elif current_time.tm_hour == 18 and 20 < current_time.tm_min < 50 and daily_check is 0:
        #     print(current_time)
        #     unlock()
        #     check_daily_subcribe()
        #     lock()
        #     daily_check = 1

        time.sleep(5)

解析

1.脚本概述

这个脚本是用于自动化执行一个 Android 应用中的一系列操作,具体来说,它主要完成以下任务:

1. 自动登录:处理登录操作,当检测到需要登录时,通过获取验证码并输入验证码完成登录。

2. 每日申购:自动进行每日申购操作,执行一系列点击和滑动操作以完成申购任务,并检查申购状态。

3. 检查申购状态:检查当前的申购状态,并将结果发送到 QQ 上。

4. 小茅运任务:执行与“小茅运”相关的任务,例如参与旅行和领取奖励。

5. 设备解锁和锁定:自动解锁设备屏幕以进行操作,并在操作完成后锁定设备。

6. 定时任务:根据当前时间,定时执行上述任务,例如每天早上9点执行申购任务和“小茅运”任务。

总的来说,这个脚本用于自动化一个特定 Android 应用的日常任务,减少人工操作,实现无人值守的自动化任务执行。

2.主要功能点简述

1. 设置设备连接参数

定义了连接 Android 设备的所需参数,如平台、设备名称等。

2. 初始化 Appium 驱动

通过 Appium 服务器地址和配置参数初始化驱动。

3. 处理登录异常

函数 `handleException` 用于处理登录时可能遇到的异常,通过获取验证码进行登录。

4. 每日订购功能

函数 `daily_subcribe` 用于执行一系列操作以完成每日的申购任务,并检查申购状态。

5. 检查每日申购状态

函数 `check_daily_subcribe` 用于检查和输出每日申购的状态,并将结果发送到 QQ。

6. 小茅运功能

函数 `xiao_mao_yun` 执行与“小茅运”相关的操作,如旅行和领取奖励。

7. 解锁设备

函数 `unlock` 通过滑动解锁屏幕并返回主界面。

8. 锁定设备

函数 `lock` 关闭应用并锁定设备。

9. 主循环

主函数中包含一个无限循环,根据当前时间执行不同的任务,包括每日订购、小茅运等,并定期解锁和锁定设备。

10. 循环控制

通过条件判断和定时控制,确保在特定时间段内执行相应的任务。

3.技术栈

这个脚本使用了以下技术栈:

1. Appium:

   – 用于自动化移动应用的测试和操作。Appium 提供了一个 WebDriver 接口,使得可以通过编程方式控制移动设备。

   – `webdriver`:用于创建与移动设备的连接,执行操作。

   – `TouchAction`:用于模拟触摸操作,如点击、滑动等。

   – `ConnectionType`:用于管理设备的网络连接类型。

2. Selenium:

   – Selenium 是一个用于自动化 Web 应用测试的工具,这里与 Appium 一起使用来处理移动应用中的元素。

   – `NoSuchElementException`:用于处理在操作过程中找不到元素的异常。

3. Python:

   – 脚本本身是用 Python 编写的,利用其丰富的库和简洁的语法来实现自动化逻辑。

   – `time`:用于管理定时操作和延时。

   – `os`:用于操作系统相关的任务。

主要库和模块:

– `appium.webdriver`:用于创建和管理与 Appium 服务器的连接。

– `selenium.common.exceptions`:用于处理在自动化操作中可能出现的异常。

– `appium.webdriver.common.touch_action.TouchAction`:用于执行触摸操作。

– `appium.webdriver.connectiontype.ConnectionType`:用于设置设备的网络连接类型。

– `time`:用于延时和定时操作。

– `os`:用于操作系统相关的操作。

这个技术栈主要用于移动应用的自动化测试和操作,可以帮助实现对移动应用的自动化控制和任务执行。

注意

本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。

© 版权声明
THE END
喜欢就支持一下吧
点赞41 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容