ios-hooks/AppRunMan/server/MyAdTask2.m
2025-11-03 09:30:59 +08:00

592 lines
17 KiB
Objective-C

//
// MyAdTask2.m
// nochange
//
// Created by mac on 2024/11/6.
//
#import <Foundation/Foundation.h>
#import "IPhoneHertbeat.h"
#import "XSHackIos.h"
#import "XSHelper.h"
#import "XSPhoneInfo.h"
#import "XSPhoneConfig.h"
#import "MyAdServer.h"
#import "MyAdTask2.h"
#import "MyEventBus.h"
BOOL myadTaskManualStop = NO;
@interface MyAdTask2Mangger()
{
@private
BOOL running;
// NSTimer *timer;
dispatch_source_t _timer; // 使用GCD timer替代NSTimer
NSDate *lastRun;
NSDate *lastGetCountry;
NSString *_lastIdfa;
NSString *taskId;
NSString *taskAppId;
int workType;
int screen_w;
int screen_h;
int adAfter;
NSString *linkId;
NSString *dataId;
NSString *remoteIp;
NSString *country;
}
@end
@implementation MyAdTask2Mangger
+(instancetype)sharedInstance {
static MyAdTask2Mangger* _sharedInstance = nil;
static dispatch_once_t oncePredicate;
dispatch_once (&oncePredicate, ^{
_sharedInstance = [[MyAdTask2Mangger alloc] init];
});
return _sharedInstance;
}
-(instancetype)init {
if (self = [super init]) {
self->running = NO;
self->_lastIdfa = @"";
self.manQueue = dispatch_queue_create("com.xyzshell.myadtask", DISPATCH_QUEUE_SERIAL);
CGFloat screen_scale = [[UIScreen mainScreen] scale];
CGFloat device_screen_width = [UIScreen mainScreen].bounds.size.width * screen_scale;
CGFloat device_screen_height = [UIScreen mainScreen].bounds.size.height * screen_scale;
self->screen_w = device_screen_width;
self->screen_h = device_screen_height;
self->adAfter = 1000;
return self;
}
return nil;
}
- (int) onShow: (NSDictionary *)dic {
if(dic == nil || [dic isEqual:[NSNull null]] || [dic count] <= 0) {
return 4000;
}
NSString *t_appid = [self getStr:@"appid" dic:dic];
NSString *t_idfa = [self getStr:@"idfa" dic:dic];
NSString *t_adId = [self getStr:@"id" dic:dic];
NSNumber *t_ecpm = [self getNum:@"ecpm" dic:dic];
BOOL ad = dic[@"ad"];
NSString *iphoneId = [[XSPhoneConfig sharedInstance] IPhoneName];
// NSString *ipAddr = [[XSPhoneInfo sharedInstance] IPAddress];
/*
saveAdTaskLog(@{
@"title": @"广告展示",
@"message": [XSHelper dic2Json:dic],
@"level": @(1),
@"appid": t_appid,
@"idfa":t_idfa,
@"adid": t_adId,
@"ecpm": [NSString stringWithFormat:@"%@", t_ecpm],
@"taskId": self->taskId,
@"iphoneId":iphoneId,
@"ipAddr":ipAddr
});
*/
/* --
if (self->current > -1 && self->current < (NSInteger)self->tasks.count) {
cur = self->tasks[self->current];
}
*/
if(!ad) {
NSLog(@"XS- no ad show");
return 0;
}
int close = 4000;
//--new
AdLoadInfo adloadInfo = getAdLoadInfo(@{
@"idfa": t_idfa ?: @"",
@"adId": t_adId ?: @"",
@"ecpm": [NSString stringWithFormat:@"%@", t_ecpm],
@"appId": t_appid ?: @"",
@"deviceId":iphoneId ?: @""
});
// cur.loads = adloadInfo.loads;
//cur.adTouchBeforeMs = adloadInfo.adTouchBeforeMs;
// cur.adTime= adloadInfo.adTime;
close = [adloadInfo.adTime intValue];
int before = [adloadInfo.adTouchBeforeMs intValue];
if (before >= close) {
before = 1000;
}
int after = [adloadInfo.adTouchAfterMs intValue];
if(after > 1000) {
self->adAfter = after;
} else {
self->adAfter = 1000;
}
NSInteger random1 = arc4random_uniform(101); // 0-100
NSInteger tr = [adloadInfo.touchRate intValue];
if (tr > random1) {
[self touchAppTask: before / 1000];
}
return close;
}
- (void) showStatus: (NSString *)data {
[[MyEventBus sharedInstance] postEvent:@"UpdateStatus" withObject:data];
}
- (void) setRemoteInfo {
NSString *url = @"https://ipapi.co/json/";
XSHttpHelper *http = [[XSHttpHelper alloc] init];
__weak typeof(self) weakSelf = self;
[http doGET:url withCallback:^(NSData *data) {
if(!data) {
NSLog(@"!setRemoteInfo 1data");
[weakSelf showStatus:@"!setRemoteInfo 1data"];
return;
}
NSDictionary *dic = [XSHelper jsonData2Dictionary:data];
if (!dic) {
NSLog(@"!setRemoteInfo dic");
[weakSelf showStatus:@"!setRemoteInfo dic"];
return;
}
NSString *isoCode = dic[@"country_code"];
NSString *ip = dic[@"ip"];
// callback(ip, isoCode);
__strong typeof(weakSelf) strongSelf = weakSelf;
strongSelf->remoteIp = [ip copy];
strongSelf->country = [isoCode copy];
[XSPhoneInfo sharedInstance].remoteIp = [NSString stringWithFormat:@"%@:%@", isoCode, ip];
[weakSelf showStatus:[XSPhoneInfo sharedInstance].remoteIp];
} withError:^(NSError *err) {
NSLog(@"!setRemoteInfo err:%@",err);
[weakSelf showStatus:[NSString stringWithFormat:@"%@", err.description]];
}];
}
- (void) setRemoteInfo1 {
NSString *url = [[XSPhoneConfig sharedInstance] GetRemoteIPURL];
[self showStatus:url];
if (!url) {
NSLog(@"!setRemoteInfo url");
return;
}
__weak typeof(self) weakSelf = self;
XSHttpHelper *http = [[XSHttpHelper alloc] init];
[http doGET:url withCallback:^(NSData *data) {
if(!data) {
NSLog(@"!setRemoteInfo 1data");
[weakSelf showStatus:@"!setRemoteInfo 1data"];
return;
}
NSDictionary *dic = [XSHelper jsonData2Dictionary:data];
if (!dic) {
NSLog(@"!setRemoteInfo dic");
[weakSelf showStatus:@"!setRemoteInfo dic"];
return;
}
NSDictionary *_data = dic[@"data"];
if(!_data) {
NSLog(@"!setRemoteInfo data");
[weakSelf showStatus:@"!setRemoteInfo data"];
return;
}
NSString *isoCode = _data[@"isoCode"];
NSString *ip = _data[@"ip"];
NSLog(@"setRemoteInfo:%@", _data);
__strong typeof(weakSelf) strongSelf = weakSelf;
strongSelf->remoteIp = [ip copy];
strongSelf->country = [isoCode copy];
[XSPhoneInfo sharedInstance].remoteIp = [NSString stringWithFormat:@"%@:%@", isoCode, ip];
[weakSelf showStatus:[XSPhoneInfo sharedInstance].remoteIp];
} withError:^(NSError *err) {
NSLog(@"!setRemoteInfo err:%@",err);
[weakSelf showStatus:[NSString stringWithFormat:@"%@", err.description]];
}];
}
- (BOOL) onEnd: (NSDictionary *)dic {
NSNumber *maxEcpm = dic[@"max_ecpm"];
int sec = self->adAfter / 1000;
__weak typeof(self) weakSelf = self;
if([maxEcpm doubleValue] <= 0.0) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, sec * NSEC_PER_SEC), self.manQueue, ^{
@autoreleasepool {
[weakSelf startApp];
}
});
return NO;
}
BOOL res = needAdContinue(self->taskAppId, self->_lastIdfa, maxEcpm);
if(res) {
return YES;
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, sec * NSEC_PER_SEC), self.manQueue, ^{
@autoreleasepool {
[weakSelf startApp];
}
});
return NO;
}
- (void) startApp {
@autoreleasepool {
if(!self->running){
return;
}
self->lastRun = [NSDate date];
if (self->country == nil || [self->country isEqual:NULL] || [self->country isEqual:@""]) {
[self setRemoteInfo];
self->lastGetCountry = [NSDate date];
} else {
NSDate *curRunTime = [NSDate date];
NSTimeInterval elapsed = [curRunTime timeIntervalSinceDate:self->lastGetCountry];
if (elapsed >= 300) {
[self setRemoteInfo];
self->lastGetCountry = [NSDate date];
}
}
/*
if(![@"US" isEqual:self->country]) {
[self showStatus:[NSString stringWithFormat:@"%@:%@, Not US", self->country, self->remoteIp]];
return;
}
*/
__weak typeof(self) weakSelf = self;
getChangeInfo(self->_lastIdfa, ^(NSDictionary *dic) {
dispatch_async(weakSelf.manQueue, ^{
// 耗时操作
[weakSelf onChangeInfo: dic];
});
}, ^(NSError *err) {
NSLog(@"XS- startTask NSError is null, %@", err);
});
}
}
- (void) start {
self->running = YES;
myadTaskManualStop = NO;
[[IPhoneHertbeat sharedInstance] setStatus: @"运行中"];
[self startApp];
__weak typeof(self) weakSelf = self;
// 使用 dispatch_source 创建timer
if (!_timer) {
_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, self.manQueue);
dispatch_source_set_timer(_timer, dispatch_time(DISPATCH_TIME_NOW, 0), 10 * NSEC_PER_SEC, 1 * NSEC_PER_SEC);
dispatch_source_set_event_handler(_timer, ^{
@autoreleasepool {
[weakSelf proc];
}
});
dispatch_resume(_timer);
}
[[MyEventBus sharedInstance] postEvent:@"UpdateRunStatus" withObject:@(YES)];
}
- (void) proc {
if (!self->running) {
return;
}
NSLog(@"XS- MyAdTaskManager proc");
NSDate* curRunTime = [NSDate date];
NSTimeInterval elapsed = [curRunTime timeIntervalSinceDate:self->lastRun];
if (elapsed >= 30) {
//[self onStop];
[self start];
} else {
NSString* appId = [ self frontMostAppId];
if (![appId isEqual: self->taskAppId]) {
[self appKill:appId];
sleep(1);
[self appRun:self->taskAppId];
}
}
}
- (NSString *)toggle {
if(self->running) {
[self stop];
} else {
[self start];
}
return [IPhoneHertbeat sharedInstance].status;
}
- (void) stop {
myadTaskManualStop = YES;
self->running = NO;
[IPhoneHertbeat sharedInstance].status = @"已停止";
if (_timer) {
dispatch_source_cancel(_timer);
_timer = nil;
}
[[MyEventBus sharedInstance] postEvent:@"UpdateRunStatus" withObject:@(NO)];
}
- (void) onChangeInfo: (NSDictionary *)dic {
NSString* t_idfa = [self getStr: @"idfa" dic:dic];
if (![XSHelper strIsEmpty:t_idfa]) {
self->_lastIdfa = [t_idfa copy];
} else {
NSLog(@"XS- startTask t_idfa is null");
return;
}
NSString *_linkId = [self getStr:@"linkId" dic:dic];
if (![XSHelper strIsEmpty:_linkId]) {
self->linkId = [_linkId copy];
}
NSString *_dataId = [self getStr:@"dataId" dic:dic];
if (![XSHelper strIsEmpty:_dataId]) {
self->dataId = [_dataId copy];
}
NSString* t_taskId = [self getStr:@"id" dic:dic];
if (![XSHelper strIsEmpty:t_taskId]) {
self->taskId = [t_taskId copy];
} else {
NSLog(@"XS- startTask t_taskId is null");
return;
}
NSString* t_taskAppId = [self getStr:@"appId" dic:dic];
if (![XSHelper strIsEmpty:t_taskAppId]) {
self->taskAppId = [t_taskAppId copy];
[IPhoneHertbeat sharedInstance].appId = self->taskAppId;
} else {
NSLog(@"XS- startTask t_taskAppId is null");
return;
}
NSDictionary *workerInfo = dic[@"workerInfo"];
if(workerInfo && ![workerInfo isEqual:[NSNull null]]) {
} else {
NSLog(@"XS- startTask workerInfo is null");
return;
}
int t_workType = [self getInt:@"workType" dic:workerInfo];
if (t_workType > -99) {
self->workType = t_workType;
} else {
NSLog(@"XS- startTask workType is null");
}
[self restart:^{
saveChangeDataFile(dic);
self->running = YES;
sleep(1);
[self appRun:self->taskAppId];
}];
//sleep(1);
}
- (void) appKill: (NSString*) app {
NSLog(@"XS- appKill");
XSKillAppByName(app);
}
- (void) unlock {
NSLog(@"XS- unlock");
dispatch_async(dispatch_get_main_queue(), ^{
XSRemoteUnlock();
});
}
- (void) resetApp: (NSString*) appId callback:(OnEndCallback) callback {
NSLog(@"XS- JSApi resetApp");
NSString *appInfoPath = XSGetAppInfoPath(appId);
NSDictionary *appInfo = XSGetAppInfo(appInfoPath);
id bfaceDictKey = appInfo[@"bfaceDictKey"];
NSMutableDictionary *tempBfaceDictKey = nil;
if(bfaceDictKey) {
tempBfaceDictKey = [NSMutableDictionary dictionaryWithDictionary:bfaceDictKey];
} else {
tempBfaceDictKey = [[NSMutableDictionary alloc] init];
}
NSString *serverUrl = [[XSPhoneConfig sharedInstance] ServerURL];
[tempBfaceDictKey setValue:@"http://127.0.0.1:6000" forKey:@"adbrush_local_url"];
[tempBfaceDictKey setValue:serverUrl forKey:@"adbrush_base_url"];
__weak typeof(self) weakSelf = self;
getLowEcpm(^(NSNumber *lowEcpm) {
__strong typeof(weakSelf) strongSelf = weakSelf;
BOOL washParam = strongSelf->workType == 0 ? YES : NO;
[tempBfaceDictKey setValue:@(washParam) forKey:@"washParam"];
[tempBfaceDictKey setValue:lowEcpm forKey:@"adbrush_ecpm"];
if(strongSelf->linkId) {
[tempBfaceDictKey setValue:strongSelf->linkId forKey:@"linkId"];
} else {
NSString *linkId = [[NSUUID UUID] UUIDString];
[tempBfaceDictKey setValue:linkId forKey:@"linkId"];
}
if(strongSelf->dataId) {
[tempBfaceDictKey setValue:strongSelf->dataId forKey:@"dataId"];
} else {
NSString *dataId = @"0";
[tempBfaceDictKey setValue:dataId forKey:@"dataId"];
}
if(strongSelf->remoteIp) {
[tempBfaceDictKey setValue:strongSelf->remoteIp forKey:@"remouteIP"];
}
NSLog(@"XS- resetApp 1");
NSMutableDictionary *tempAppInfo = [[NSMutableDictionary alloc] init];
[tempAppInfo setValue:tempBfaceDictKey forKey:@"bfaceDictKey"];
XSClearAll(appId);
XSSaveAppInfo(tempAppInfo, appInfoPath);
callback();
});
}
- (NSString *) frontMostAppId {
return XSFrontMostAppId();
}
- (void) appRun:(NSString *)appId {
if ([XSHelper strIsEmpty:appId]) return;
dispatch_async(dispatch_get_main_queue(), ^{
@try {
bringAppToForeground(appId);
} @catch (NSException *exception) {
NSLog(@"Error bringing app to foreground: %@", exception);
}
});
}
- (void) tap: (int) i x:(int)x y:(int)y {
}
- (void) restart: (OnEndCallback) callback {
__weak typeof(self) weakSelf = self;
dispatch_async(self.manQueue, ^{
@try {
__strong typeof(weakSelf) strongSelf = weakSelf;
[weakSelf appKill:@"com.apple.AppStore"];
[weakSelf appKill:@"com.apple.mobilesafari"];
if (strongSelf->taskAppId && ![strongSelf->taskAppId isEqual:[NSNull null]] && [strongSelf->taskAppId length] > 0) {
[weakSelf appKill:strongSelf->taskAppId];
[weakSelf unlock];
sleep(1);
[weakSelf unlock];
[weakSelf resetApp:strongSelf->taskAppId callback:callback];
}
} @catch (NSException *exception) {
NSLog(@"Error in restart: %@", exception);
}
});
}
- (void) rndTouchApp {
int times = [XSHelper random:2 and:4];
for (int i = 1; i <= times; i++) {
int x = [XSHelper random:40 and:screen_w - 20];
int y = [XSHelper random:50 and:screen_h - 240];
NSString* appId = [self frontMostAppId];
if ([appId isEqual:self->taskAppId]) {
[self tap:1 x:x y:y];
usleep(2000);
} else {
break;
}
}
}
- (void) touchAppTask: (int) beforeTouch {
if (beforeTouch > 0) {
sleep(beforeTouch);
}
[self rndTouchApp];
sleep(2);
int x = [XSHelper random:40 and:screen_w - 20];
int y = [XSHelper random:50 and:screen_h - 240];
[self tap:1 x:x y:y];
NSString* appId = [ self frontMostAppId];
if (![appId isEqual: self->taskAppId]) {
// [self appKill:appId];
sleep(1);
}
[self appRun:self->taskAppId];
}
- (NSString*) getStr: (NSString *) key dic: (NSDictionary*) dic {
NSLog(@"getStr: %@", key);
id t_idfa = dic[key];
if (t_idfa && ![t_idfa isEqual:[NSNull null]] && ![t_idfa isEqual:@""]) {
return [NSString stringWithFormat:@"%@", t_idfa];
} else {
NSLog(@"XS- dic %@ is null", key);
return @"";
}
}
- (NSNumber*) getNum: (NSString *) key dic: (NSDictionary*) dic {
NSLog(@"getNum: %@", key);
id t_idfa = dic[key];
NSString *ecpm_str = [NSString stringWithFormat:@"%@" , t_idfa];
NSNumber *ecpm = @0.0;
if (ecpm_str && ![ecpm_str isEqual:[NSNull null]] && ![ecpm_str isEqual:@""]) {
ecpm = [XSHelper str2num: ecpm_str];
}
return ecpm;
}
- (int) getInt: (NSString *) key dic: (NSDictionary*) dic {
NSLog(@"getInt: %@", key);
id t_idfa = dic[key];
NSString *ecpm_str = [NSString stringWithFormat:@"%@" , t_idfa];
NSNumber *ecpm = @(-99);
if (ecpm_str && ![ecpm_str isEqual:[NSNull null]] && ![ecpm_str isEqual:@""]) {
ecpm = [XSHelper str2num: ecpm_str];
}
return [ecpm intValue];
}
- (void)dealloc {
[self stop];
}
@end