全自动苹果手机试玩
- 初步需求
- 思路
- 获取手机图像
- 平台脚本
- 页面识别
- 操作处理
- 结果报告
- 后记
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之类的脚本,看看还能蹦出什么火花。
另:本文纯属自娱自乐。如果有【图像识别+脚本】方面的需求,欢迎来撩。