欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python教你迅速成为“蚂蚁森林排行榜”第一名

程序员文章站 2022-05-09 20:53:20
...

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者:作者锅g头/Crossin的编程教室

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http://t.cn/A6Zvjdun

最近在家远程工作,结果作息更混乱了,早上起不来,导致我蚂蚁森林能量天天被偷,严重影响我沙漠造树“大业”。

于是我决定用python写个自动偷能量的程序,每天早上定时偷取好友能量,“称霸”蚂蚁森林。
(本文仅为自动化测试技术研究,请勿滥用)

环境配置

首先需要安装配置好appium自动化测试工具。appium是一个开源、跨平台的测试框架,可以用来测试原生及混合的移动端应用,支持IOS、Android及FirefoxOS平台。

大致流程:先在官网(appium.io)下载安装appium,然后安装Android SDK(我的方法是安装Android Studio,在它里面可以安装Android SDK),最后再安装JAVA,并配置JAVA_HOME和CLASSPATH两个参数的环境变量,然后就可以使用appium啦!

使用介绍

安装appium有两个目的,一是使用python的appium模块需要先打开appium客户端,否则无法使用;二是便于我们查找某个app某个界面的元素,初次打开时如图所示:
Python教你迅速成为“蚂蚁森林排行榜”第一名
<点击Start Server v1.8.1>
Python教你迅速成为“蚂蚁森林排行榜”第一名
<点击搜索图标>
Python教你迅速成为“蚂蚁森林排行榜”第一名
配置好4个参数,第一个参数是手机操作系统,第二个参数是手机型号,在设置中可以找到,第三、四参数是app的两个特定值,点击start session就可以操控手机了。
Python教你迅速成为“蚂蚁森林排行榜”第一名

开发步骤

第一步:appium自动化测试app首先需要找到 ‘appPackage’ 和 ‘appActivity’ 两个参数

这里给大家介绍一种通用的找手机app这两个参数的方法:

  1. 先找到获取apk信息工具(android SDK的aapt工具)所在的位置;
  2. 下载支付宝app,记住存放位置;
  3. 打开命令行,输入以下信息
    Python教你迅速成为“蚂蚁森林排行榜”第一名
    <打码部分是支付宝app所在的位置>

在输出信息中可以找到

appPackageappActivity的值:

Python教你迅速成为“蚂蚁森林排行榜”第一名
Python教你迅速成为“蚂蚁森林排行榜”第一名
第二步:打开支付宝,模拟点击,进入蚂蚁森林界面

正常情况下,appium操控打开app时,需要配置一下参数:
Python教你迅速成为“蚂蚁森林排行榜”第一名
但是这种配置方式会默认从头打开app,需要验证各种信息,而且需要重新登录,今天教大家如何避免重新登录,只需添加2个参数就ok:
Python教你迅速成为“蚂蚁森林排行榜”第一名
这样就会避免重新登录了。

下面就是模拟点击元素操作了,找app元素的方法如下:
Python教你迅速成为“蚂蚁森林排行榜”第一名
只需用客户端appium打开手机APP,然后将鼠标放在需要点击的部位,在右侧就能找到该部位的元素了。然后依次点击下图按钮:

代码如下:
Python教你迅速成为“蚂蚁森林排行榜”第一名
第三步:依次点击进入好友蚂蚁森林主页
Python教你迅速成为“蚂蚁森林排行榜”第一名
如图所示,我需要点击一次点击进入每个好友的主页,我采取的方式是只点击进入第一个框所在的坐标,然后模拟向上滑动1个框的高度,这样依次就可以点击到每个好友了,代码如下:
Python教你迅速成为“蚂蚁森林排行榜”第一名
需要注意的是,个人的主页是点不开的,但是不用做相应处理,因为点不进去就会在当前界面进行检测,判作无能量球,继续滑动到下一个。

第四步:检测有无可收取得能量
Python教你迅速成为“蚂蚁森林排行榜”第一名
经过分析元素,蚂蚁森林主页可以分为2类情况,第一种是没有能量球,第二种是有能量球,判断方法是比较上图中classname的数量,若大于5则代表有能量球,反之则没有,代码如下:
Python教你迅速成为“蚂蚁森林排行榜”第一名
然后再进一步分析能力球能否能收取,很简单,只需要判断每个classname的text是否含有“能量”这2个字就ok了,因为不可收取的能量球不含这两个字,代码如下:
Python教你迅速成为“蚂蚁森林排行榜”第一名

完整代码

from appium import webdriver
import time
from selenium.webdriver.support.ui import WebDriverWait
from appium.webdriver.common.touch_action import TouchAction

desired_caps = {
                "platformName": "Android",
                "deviceName": "MHA_AL00",
                "appPackage": "com.eg.android.AlipayGphone",
                "appActivity": "AlipayLogin",
                "noReset": "true",
                "fullReset": "false"
}

server = 'http://localhost:4723/wd/hub'
driver = webdriver.Remote(server, desired_caps)
time.sleep(1)
driver.find_element_by_id('com.alipay.android.phone.openplatform:id/more_app_icon').click() #点击更多
time.sleep(1)
driver.find_element_by_id('com.alipay.android.phone.wallet.homemarket:id/app_group_item_icon').click() #点击蚂蚁森林
time.sleep(1)

def Swipe(driver):
    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)

def run(driver):
    Swipe(driver)
    while True:
        TouchAction(driver).press(x=150, y=700).release().perform() #按压第一个框的坐标
        time.sleep(0.5)
        #if is_element_exist('android.widget.Button'):
        name = driver.find_element_by_id('com.alipay.mobile.nebula:id/h5_tv_title').text
        if name=='': #填写最后一个好友昵称
            driver.tap([(50, 130), (70, 150)], 100) #返回周排行榜主页
            time.sleep(1)
            driver.tap([(50, 130), (70, 150)], 100) #返回蚂蚁森林主页
            Swipe(driver)
            continue
        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:
                    print('收取{0}的{1}'.format(name,i.text.replace('收集','')))
                    i.click()
            #driver.find_elements_by_class_name('android.widget.Image')[1].click()
            time.sleep(0.5)
            driver.tap([(50, 130), (70, 150)], 100)
        start_x = 500  # 向上滑动一个框的高度
        start_y = 2100
        distance = 200
        driver.swipe(start_x, start_y, start_x,
                     start_y - distance)
        time.sleep(0.5)

if __name__ == '__main__':
    run(driver)
相关标签: Python python