iOS微信跳一跳辅助刷分的设计思路

微信跳一跳刚出来,玩法简单粗暴,如果是真正的根据按压力度的话,那么只有iPhone的3dTouch硬件才可以使用,所以现在就是简单的按压屏幕,通过时间来弹跳距离。那么从程序猿的角度来看看刷分的思路。

一、通过伪造服务器请求的思路

当然第一步想看看网络数据有什么,通过使用Charles去抓包。

DamonScreenShot 2018-01-02 17.07.36.png

本来只是好奇心去看看,结果在网上看到了一篇文章,发现居然可以通过伪造数据来修改分数。

1.1、抓取自己的session_id

首先使用Charles通过过滤和代理,抓取mp.weixin.qq.com的数据,然后在游戏开始的时候,抓取到自己的session_id,这个就是自己在游戏中的唯一标识。

DamonScreenShot 2018-01-03 09.52.56.png

DamonScreenShot 2018-01-02 18.17.05.png

1.2、伪造分数请求

可以通过这个js:下载js源码,修改里面自己的session_id和想要的分数

var version = 5,
    score = 2018,
    // replace with your session_id here
    session_id = 'xxxxx'

之后通过运行这段js,去伪造请求

安装运行js的脚本

npm install crypto-js request-promise request

运行js

node wx_t1t_hack.js

DamonScreenShot 2018-01-03 10.00.35.png

1.3、修改数据的效果

因为是伪造的服务器请求,所以最后成功修改了数据,别人在排行榜中也是可以看到的

18FFD32BD38D5DB441176106FDC4C9B3.png

这个好处就是一键式操作,坏处就是等腾讯反应过来,直接就失效了。

二、修改前端的思路

因为iOS不像安卓那样开放性特别大,app并不能访问其他app的内容,所以只能在操作上想方案。

A0E47CFC27E813F6FC8F36C8EC728018.png

想一想这个游戏的难点在哪,就是玩的不确定需要按压多长时间松手才刚好。

那么如果通过铃声提醒和震动提示不就行了,当按压到需要松手的时候,手机震动或者响一下就行了。这样的思路设计就很简单了。

u=518178083,2934191635&fm=11&gp=0.jpg

首先设置一个输入框,输入需要跳的距离,这里一秒跳的距离我并没有测试,可以根据具体情况设置。

- (void)viewDidLoad {
    [super viewDidLoad];
    _timeDu = 0.0f;     //按屏幕时间
    _lengthDu = 2.0f;   //一秒跳距离
    _textField = [[UITextField alloc] initWithFrame:CGRectMake(100, 100, 200, 50)];
    [_textField setBackgroundColor:[UIColor greenColor]];
    [_textField setKeyboardType:UIKeyboardTypeNumberPad];
    _textField.delegate = self;
    [self.view addSubview:_textField];
}
//通过距离,算出需要松手的时间
- (void)textFieldDidEndEditing:(UITextField *)textField
{
    _timeDu = [textField.text floatValue]/_lengthDu;
}

输入完毕之后,当触屏屏幕的时候,开始运行一个计时器

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
{
    [self.view endEditing:YES];
    if (_timeDu>0) {
        if (!_timer) {
            _timer = [NSTimer scheduledTimerWithTimeInterval:_timeDu target:self selector:@selector(startJump) userInfo:nil repeats:NO];
        }
    }
}
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
{
}
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
{
    if (_timer) {
        [_timer invalidate];
        _timer = nil;
    }
}
- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
{
    NSLog(@"%s",__FUNCTION__);
    if (_timer) {
        [_timer invalidate];
        _timer = nil;
    }
}
- (void)touchesEstimatedPropertiesUpdated:(NSSet<UITouch *> *)touches NS_AVAILABLE_IOS(9_1)
{
    NSLog(@"%s",__FUNCTION__);
}

当需要松手的时候,手机发出震动和提示音

-(void)startJump{
    [self playEffect:@"click.caf"];
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    _timeDu = [textField.text floatValue]/_lengthDu;
}
///播放音效
- (void)playEffect:(NSString*)effectName {
    // 获取音频文件路径
    NSURL *url = [[NSBundle mainBundle] URLForResource:[NSString stringWithFormat:@"%@",effectName] withExtension:nil];
    
    // 加载音效文件并创建 SoundID
    SystemSoundID soundID = 0;
    AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, &soundID);
    
    // 设置播放完成回调
    //    AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, nil, NULL);
    
    // 播放音效
    // 带有震动
    AudioServicesPlayAlertSound(soundID);
    // 无振动
    AudioServicesPlaySystemSound(soundID);
    
    // 销毁 SoundID
    //    AudioServicesDisposeSystemSoundID(_soundID);
}

这样每次设置的时候,量下距离,然后开始按压的时候,自动开始计时,发生震动和铃声的时候,迅速松开就行了。这样就可以搞两台手机,一天手机专门当做点击,像盖章一样玩耍了。

难点就是iPhone的屏幕是不识别塑料的,所以不妨把指头绑上去,当然绑一根火腿肠想必也是极好的。

DamonScreenShot 2018-01-02 16.27.04.png

Last modification:January 3rd, 2018 at 10:11 am
如果看了这个文章可以让你少加会班,可以请我喝杯可乐
已打赏名单
微信公众号

Leave a Comment