全自动苹果手机试玩

news/2025/1/3 5:08:45/

全自动苹果手机试玩

  • 初步需求
  • 思路
  • 获取手机图像
  • 平台脚本
    • 页面识别
    • 操作处理
  • 结果报告
  • 后记

QQ 282397369
把脚本模块做得有点样子,总得拿什么来练下,看下效果。
趁未复工宅家之际,结合经验与需求,折腾下苹果手机试玩,目标肯定是要做全自动的效果。
花了整整20天,初步达到预期效果。

初步需求

上网查了一下,苹果手机试玩业务有点效益,东刷刷西刷刷,每天可以刷20-30元。但把人耗在上面,每个月1000元收益,确实不划算。
不过在家里放一两部手机,网络与账号都是现成的,每月有个千把元的额外收入也还是不错。
所以,开干。搞来两部二手机【非越狱机】,装上电话卡…【这里省略维修装机准备工作1000字】

思路

今天先简单说下思路,后续再详细说实现。思路说起来应该很简单:取得手机图像,然后图像分析,然后各个试玩平台配一个脚本,它说咋干就咋干。
对IOS不熟,那就在PC里编程序实现。原来工资不高的原因在这里,只会PC编程。

获取手机图像

方法很多,直接用手机的镜像功能。在同一局域网内,PC中开个镜像服务,什么iTools、大师、AirServer、AirPlay…,都可以。
在这里插入图片描述
图像到了计算机里,就象砧板上的肉,想捏圆就圆,想方就方。直接取过来,为我所用。
在这里插入图片描述

平台脚本

初看了一下,好象有上百个平台,那就一天实现一个平台脚本,看心情。
平台脚本主要任务是识别图像,算是页面识别吧,先定义几个页面类型。因业务发展,随时可补充扩展

	pptFlash = 0           		-- Flash页面pptHome = 1           		-- 起始页面pptList_ToGet = 2   	   	-- 待抢单任务列表页面pptList_Gotten = 3			-- 已接单任务列表页面pptDetail_ToDownload = 4   	-- 待下载任务详情页面pptDetail_ToRun = 5     	-- 待运行任务详情页面pptDetail_ToAward = 6    	-- 待领奖任务详情页面pptDetail_Awarded = 7    	-- 领奖完毕任务详情页面pptDetail_ToDownload2 = 8	-- 待下载任务详情页面2pptPlatform_Unknown = 9		-- 本平台内未知页面pptMainScreen = 10			-- 主屏幕pptAppStore = 11			-- AppStore页面pptUnknown = -1

页面识别

识别不外乎图像识别、文字识别两种。稍微整理一下,实现两个API函数供脚本用:
IsVisible、IsVisibleMat,分别判断目标文字与图片是否存在。
LUA确实不错,居然可以返回多个值。所以,如果存在,就顺便把目标的中心位置也返回。
在C++端,把各种条件均考虑一下,最主要是为了使用方便。文字可加上位置限制,而图像还可以加上背景处理方式。

UnicodeString subMatContent = THelper::GetLuaParamAt(params, paramIndex++);
TPoint resultPos(-1, -1);
if(subMatContent.Pos(L"<<")) {TPositionOption option;option.ReadFromString(subMatContent);CvRects allRects;if(option.Color.x < 0) {cv::Mat mat = srcMat.clone();if(mat.channels() != 1) {mat = CvHelper::ToMat_GRAY(srcMat);threshold(mat, mat, 0x7F, 0xFF, cv::THRESH_BINARY);}allRects = CvHelper::GetAllDomain(mat, option);}elseallRects = CvHelper::UIParse_GetEdit(srcMat, option);int size = allRects.size();UnicodeString indexText = THelper::GetLuaParamAt(params, paramIndex++, L"0").Trim().LowerCase();int index = indexText.ToInt();if(index < 0)index += size;if(IS_IN_RANGE(index, 0, size - 1)) {CvRect r = allRects[index];resultPos = TPoint(r.x + r.width / 2, r.y + r.height / 2);}
} else if(THelper::String::IsStartWith(subMatContent.LowerCase(), L"icon")) {UnicodeString iconName = THelper::String::GetStringAt(subMatContent, L"=", 1).Trim();cv::Mat iconMat = lua->ParseMat(iconName);cv::Mat whiteBkMat = GetWhiteBackgroundMat(srcMat);cv::Mat maskMat = CvHelper::BuildTransMaskMat(whiteBkMat, clWhite, 5);bitwise_not(maskMat, maskMat);CvRects rects = GetIconRects(maskMat, iconMat.cols, iconMat.rows);CBW_ITERATOR(CvRects, rects) {cv::Mat dstMat = CvHelper::CopySubMat(whiteBkMat, *it);if(CvHelper::IsSameIcons(dstMat, iconMat, false, true, 0.90, false, 3, false, false)) {resultPos = TPoint(it->x + it->width / 2, it->y + it->height / 2);break;}}
} else {UnicodeString fileName = lua->ParseFileName(subMatContent, !FILE_MUST_EXISTED);cv::Mat subMat;if(FileExists(fileName))subMat = CvHelper::MatFromFile(fileName);elsesubMat = lua->ParseMat(subMatContent);if(!subMat.empty())resultPos = CvHelper::GetSubMatPos(srcMat, subMat);
}
lua->AddReturnValue(resultPos, L"目标位置");

这样在写LUA脚本的时候,调用方式简单粗暴:

if    (ios:IsVisible("早起打卡")) then return ios:SetPage(pptHome)																					
elseif(ios:IsVisibleMat("Color << 0x9BE000, 5", "width << 640, 10 << height << 100, 10") and ios:IsVisible("收徒赚钱", "y << 160, 20")) then return ios:SetPage(pptHome_Invite)														
elseif(ios:IsVisible("试玩任务", "xCenter << 20 << y << 155, 20") andios:IsVisible("当前试玩", "x << 30, 20")) then return ios:SetPage(pptList_ToGet)	
end														

一句话就可以识别一种页面。
在这里插入图片描述

操作处理

既然有两种识别方式,对应也就再提供两种操作方式:
Click, ClickMat,分别点击目标文字与目标图像,类似于

if    (currentPageType == pptHome) then ios:ClickMat("Color, 0x58C6FF, 10", "width << 325, 10 << height << 220, 10")	
elseif(currentPageType == pptDetail_Awarded) then ios:Click("我知道了")	
elseif(currentPageType == pptDetail_ToAward) then ios:Click("领取", "xCenter << 10 << Color << 0x0065FF, 30") 
elseif(currentPageType == pptDetail_ToRun) then ios:Click("打开应用", "xCenter << 10 << Color << 0x0065FF, 30") 
end

这样,就把业务逻辑剥离了出来,随便最终平台界面如何变化,均可以脚本应对之。

结果报告

结合之前的工作,可以把这块形成图片报告,直接发到QQ里,这样即使在外面,收到这样一条QQ消息也是小爽的。
在这里插入图片描述
在这里插入图片描述

后记

别的环节自动化,比起脚本自动化来,都要简单一些,不外乎各个功能的整合。在此不再赘述
通过这么一个小需求,发现【图像识别+脚本】组合起来,能解决的问题确实很多。
做这样一件小事,结果把自用的通用工具也做出了初样,各种基本的图像分析处理效果可以直观展现。当然,最值得的还是把LUA集成开发环境给考验了一把。所以,还是比较值得的。并且感觉【图像识别+脚本】成为自己的一个方向。以后没钱了,也可以搞点兼职什么的。
苹果先练手,后续再做做安卓、PC之类的脚本,看看还能蹦出什么火花。

另:本文纯属自娱自乐。如果有【图像识别+脚本】方面的需求,欢迎来撩。


http://www.ppmy.cn/news/660661.html

相关文章

SpringBoot2+Vue2实战(七)springboot集成jwt

一、集成jwt JWT依赖 <!-- JWT --><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.10.3</version></dependency> UserDto import cn.hutool.core.annotation.Alias; import …

深入了解 KaiwuDB 负载行为数据采集

KAP 基于数据库系统内部反馈的各项数据指标&#xff0c;可帮助用户全面掌握 KaiwuDB 集群的整体运行情况&#xff0c;实时监测集群相关性能&#xff0c;可提供整体资源和集群状态角度的系统监控。 除此之外&#xff0c;KaiwuDB 数据库内部开发实现基于负载业务的行为数据采集功…

1、已知:1公里=2里=1000米,请编写一个程序,输入公里数,将其转换成里和米。要求程序的输入输出如下: 请输入公里数: 3.3 3.30公里=6.60里=3300米

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { float a, b, c;//定义公里&#xff0c;里&#xff0c;米的变量类型 printf("请输入公里数:"); scanf("%f", &a);//输入公里的值 b 2*a; c 1000*a; …

经度和纬度为多少米

经度1秒为31.25米&#xff08;固定&#xff09;纬度1秒为多少米不固定&#xff0c;计算公式如下&#xff1a; 纬度1″&#xff1a;31.25米 * cos(纬度/ 180 * Math.PI)

给定经纬度,计算附近多少公里范围内的地点

场景&#xff1a;当时我们项目用的是spring-data-jpa, 用hql实现的话&#xff0c;实在是不知道怎么搞&#xff0c;所以想出这么个方法。这样做的就是避免直接在数据查询语句中去计算该点附近多少公里范围内的点&#xff0c;将sql语句的实现转成了代码实现。 第一步&#xff1a;…

python公里转海里_英里和海里和公里怎么换算

长度单位的确定伴随着人类文明的进步&#xff0c;随着全球一体化的进程各种单位都更科学标准&#xff0c;有些长度单位可能使用的人更少了&#xff0c;但它在不同的时代伴演着重要的角色&#xff0c;英里这个单位现在也还有很多人使用&#xff0c;我们一起来了解下这个长度单位…

出租车计费标准为:3 公里以内 10 元,3 公里以后每 1 公里加 2 元,超过 15 公里,每公里加 3 元 分别算出2公里、8公里、20公里的钱数

/* SUM10SUM10(8-3)*2 20 SUM34(20-15)*3 49* */ import java.util.Scanner;public class Test19 {public static void main(String[] args) {// TODO Auto-generated method stubint sum10;Scanner sc new Scanner(System.in);System.out.println("请输入车行驶的…