python蚂蚁森林偷能量

一、配置环境

1.下载Android Studio 

1.1  下载链接1:官网(需要能访问YouTuBe的网络)

  下载链接2:百度云(较慢)   提取码:0622

1.2  下载后正常安装即可,安装后打开Android Studio ,如下图安装几个版本(我的手机是安卓9)

 1.3  系统变量的配置

  • 复制上图的Android SDK locatiom后面的地址
  • win+E,打开文件资源管理器 → 此电脑 → 右键→属性→高级系统设置→高级→环境变量→在下面的系统变量点击新建→变量名:ANDROID_HOME→变量值:上一步复制到的地址→确定
  • 在系统变量中找到变量Path→编辑→新建→输入:%ANDROID_HOME%platform-tools,再新建→输入:%ANDROID_HOME% ools

1.4  退出Android Studio

2. 配置jdk_home环境

参考链接:https://www.cnblogs.com/liuhongfeng/p/4177568.html

3. 配置Appium

3.1  打开手机开发者模式(我的是小米6X)

  • 设置→我的设备→全部参数→快速点击MIUI版本后面的文字10次左右,可打开开发者模式
  • 设置→更多设置→开发者选项→开启开发者选项,开启USB调试,开启USB安装

3.2  安装

  下载链接:http://appium.io/(下载.exe)

  之后操作参照Python+appium自动化实例(一):使用Python3+appium实现自动收取支付宝蚂蚁森林能量

 下面的  列了可能出现的错误的解决方法


 注1:打开appium之前先配置文件

Edit Configurations-->填写两个环境

注2:对其中一步进行详解  打开命令行,输入以下信息:aapt.exe dump badging D:alipay_wap_main.apk(支付宝apk路径)

 首先找到aapt.exe的路径,我的是:C:UsersxddAppDataLocalAndroidSdkuild-tools30.0.1

然后:win+r,输入cmd,回车

输入 cd C:UsersxddAppDataLocalAndroidSdkuild-tools30.0.1 ,回车

输入  aapt.exe dump badging "D:alialipay_2088131876115982_246.apk" ,回车

或者将apk文件放入aapt.exe目录下,采用 aapt dump badging Coolapk-10.5.3-2009271_sign.apk 

 注3:如果系统找不到appium模块

pip install Appium-Python-Client


# edit by xdd
# Before running this script, open appium.exe,and start server
# Reference site:https://www.cnblogs.com/deliaries/archive/2020/03/18/12410835.html

import time
from tkinter.messagebox import *
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction

start = time.perf_counter()         # 计算程序运行时间
''' 打开支付宝 '''
desired_caps = {
                "platformName": "Android",
                "deviceName": "MI 6X",
                "appPackage": "com.eg.android.AlipayGphone",
                "appActivity": "com.eg.android.AlipayGphone.AlipayLogin",
                "noReset": "true",
                "fullReset": "false",
                "automationName": "UiAutomator1"
}
server = 'http://localhost:4723/wd/hub'
driver = webdriver.Remote(server, desired_caps)
time.sleep(5)
TouchAction(driver).press(x=544, y=706).release().perform()     # 蚂蚁森林的图标位置,我的在首页,不在的话,要先打开更多
print('正在打开蚂蚁森林')
# 点击蚂蚁森林(以id打开,这种较好,但是appium有些故障,刷新不出来
# driver.find_element_by_id('com.alipay.android.phone.wallet.homemarket:id/app_group_item_icon').click()
time.sleep(5)




''' 向下滑,找到更多好友,点击 '''
n = 0
while n <= 5:
    start_x = 500
    start_y = 1500
    distance = 1000
    driver.swipe(start_x, start_y, start_x, start_y - distance)
    n = n + 1
driver.find_element_by_xpath("//*[@text='查看更多好友']").click()  # 点击查看更多好友
time.sleep(1)
''' ----------- 进入偷能量界面 ---------- '''
while True:
    TouchAction(driver).press(x=345, y=668).release().perform() # 第一个蚂蚁好友框框的坐标,随着滑动,每一个好友都会出现在这个坐标点
   # time.sleep(0.5)

    name = driver.find_element_by_id('com.alipay.mobile.nebula:id/h5_tv_title').text
    print(name)
    if name=='陈欣的蚂蚁森林':      # 填写最后一个好友昵称,程序不会遍历到最后一个,因为到最后的时候,界面不能滑动;可先填最后一个,看能遍历到哪一个好友,再修改即可.
        end = time.perf_counter()
        tim = end - start
        txtshow = '偷能量完成,运行这段代码用时:{:.6f}秒'.format(tim)
        print(txtshow)
        showinfo(title='提示', message=txtshow)
        break
    print('正在查看{0}'.format(name))
    items = driver.find_elements_by_class_name("android.widget.Button")
    if len(items) > 5:
        for i in items:
            #if '能量' in i.text:
            if ('能量' in i.text) | ('消失' in i.text):
                print('收取{0}的{1}'.format(name,i.text.replace('收集','')))
                i.click()

        time.sleep(0.1)
        driver.tap([(50, 130), (70, 150)], 100)
        time.sleep(0.1)

    start_x = 500
    start_y = 1910
    distance = 195  # 一个框的高度
    driver.swipe(start_x, start_y, start_x, start_y - distance)    # 向上滑动一个框的高度   # driver.swipe(分别表示滑动的起始和终点位置的 x/y 坐标)
    time.sleep(0.5)     # 系统反应也需要时间,此处sleep()不可省略

1. 关于环境配置有更简单的方法,可以不要安装 Android Studio

2.更新了程序 2021-07-22 愿晴日朗照,人间皆安!

import time
import winsound
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction


desired_caps = {
                "platformName": "Android",
                "platformVersion": "11.0",
                "deviceName": "b75d23ef",
                "appPackage": "com.eg.android.AlipayGphone",
                "appActivity": "com.eg.android.AlipayGphone.AlipayLogin",
                "noReset": "true",
                "fullReset": "false",
                "automationName": "UiAutomator2"
}

server = 'http://127.0.0.1:4723/wd/hub'
driver = webdriver.Remote(server, desired_caps)
time.sleep(5)
driver.find_element_by_xpath("//*[@text='蚂蚁森林']").click()  # 点击蚂蚁森林按钮
time.sleep(2)
def Get_some_coord():
    phone_X = driver.get_window_size()['width']   # 手机宽
    phone_Y = driver.get_window_size()['height']  # 手机高
    clickBlockXmin = int((108/1080) * phone_X)      # 模拟点击矩形区域的xmin
    clickBlockXmax = int((900/1080) * phone_X)      # 模拟点击矩形区域的xmax
    clickBlockYmin = int((700/2400) * phone_Y)
    clickBlockYmax = int((800/2400) * phone_Y)
    SouYiSou_X = int((1000/1080) * phone_X)       # "搜一搜"图标的X坐标
    SouYiSou_Y = int((1600 / 2400) * phone_Y)
    coord_List = [clickBlockXmin,clickBlockXmax,clickBlockYmin,clickBlockYmax,SouYiSou_X,SouYiSou_Y]

    return coord_List

# python函数先定义后调用
def Click_click_click(coord_List):
    for ii in range(coord_List[0],coord_List[1],80):
        for jj in range(coord_List[2],coord_List[3],80):
            time.sleep(0.001)
            TouchAction(driver).press(x=ii, y=jj).release().perform()  # 点击
            try:
                driver.find_element_by_xpath("//*[@text='关闭']").click()  # 关闭可能出现的弹窗
            except:
                pass

print('正在收取自己的能量')
coord_List = Get_some_coord()
Click_click_click(coord_List)  # 收自己的能量

TouchAction(driver).press(x=coord_List[4], y=coord_List[5]).release().perform()  # 点击"搜一搜"

while 1:
    try:
        name = driver.find_element_by_id('com.alipay.mobile.nebula:id/h5_tv_title').text
        print('正在收取{0}的能量'.format(name))
        Click_click_click(coord_List)
        TouchAction(driver).press(x=coord_List[4], y=coord_List[5]).release().perform()  # 点击"搜一搜"
        flag = 0
    except:
        flag = flag + 1
        print('第{0}次没有收到能量'.format(flag))

    if flag == 2:
        winsound.Beep(1000, 1000)
        print('收取完成')
        break




转载仅为学习,不会商用。
欢迎转载原创,附文链接。
原文地址:https://www.cnblogs.com/xdd1997/p/13492884.html