代码如下
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`:用于操作系统相关的操作。
这个技术栈主要用于移动应用的自动化测试和操作,可以帮助实现对移动应用的自动化控制和任务执行。
注意:
本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。
1. 转载请在文内以超链形式注明出处,谢谢合作!
2. 本站除原创内容,其余所有内容均收集自互联网,仅限用于学习和研究目的,本站不对其内容的合法性承担任何责任。如有版权内容,请通知我们或作者删除,其版权均归原作者所有,本站虽力求保存原有版权信息,但因众多资源经多次转载,已无法确定其真实来源,或已将原有信息丢失,所以敬请原作者谅解!
3. 本站用户所发布的一切资源内容不代表本站立场,并不代表本站赞同其观点和对其真实性负责,若您对本站所载资源作品版权归属存有异议,请留言附说明联系邮箱,我们将在第一时间予以处理 ,同时向您表示歉意!为尊重作者版权,请购买原版作品,支持您喜欢的作者,谢谢!
4. 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客如有发现请立即向站长举报;本站资源文件大多存储在云盘,如发现链接或图片失效,请联系作者或站长及时更新。
暂无评论内容