前言
在某些 App 中, 需要根据用户的实时位置来完成某些事件
例如跑步打卡软件 (步道乐跑), 考勤打卡软件 (叮叮), 某些基于实时位置的游戏 (Pokemon Go, 一起来捉妖)
一般解决办法是通过使用安卓模拟器, 通过改变模拟器的位置属性来实现模拟位置
但是某些软件会通过比对常用设备的 uuid, 设备序列号等
一旦出现不匹配或者无法识别就可能会被列为怀疑对象, 且安卓模拟器较难实现连续的拟人化的路径
因此, 为了减少被判定作弊的可能, 只能通过在常用设备上连续的改变实时位置来模拟跑步行为
硬件环境:
- MacBook Pro (15-inch, 2017)
- iPhone 8 Plus
软件环境:
- macOS Mojave 10.14.5
- iOS 12.4
- Xcode 10.2.1
- Python 3.7.0
- Sublime text 3.1.1
具体步骤
1. 使用 Xcode 创建一个 iOS 项目
打开 Xcode -> Preferences 添加 Apple ID
在 Xcode 上创建新项目
打开 Xcode -> create a new Xcode project
选择 iOS 菜单 -> Single View App
填写项目名 推荐非中文
在事先准备好的文件夹内存放 文件夹推荐非中文
此时将 iPhone 连接 Mac 左上角显示连接设备
出现如下结果即为成功:
2. 使用 Xcode 创建一个含有 gpx 的文件
GPX(GPS eXchange Format,GPS 交换格式) 是一个 xml 格式, 为应用软件设计的通用 GPS 数据格式, 专门用来存储地理信息
一个 GPX 文件内包含一些经纬度点组成的轨迹, 包含了时间, 名字等信息
回到 Xcode 打开 Xcode -> File -> New -> File...
在 iOS 菜单下选择 GPX File
选择一个位置并命名 GPX 文件 例: fake_loc.gpx
自动生成如下 gpx 文件即为成功
分析该 gpx 文件, 格式类似标签语言风格
在 < wpt > 标签内包含经纬度 (lat,lon), 该点名称以及时间
第一段注释内容大意为:
" 提供一个或多个包含纬度 / 经度对的点
如果提供一个点, Xcode 将模拟那个特定的点
如果提供多个点, Xcode 将依次模拟每一个点 "第二段注释内容大意为:" 可以选择为每一个坐标点添加一个时间标签可, Xcode 可以根据时间标签的顺序依次移动到每一个坐标点, 并根据时间点来插入速度 X
如果不提供一个时间标签, 那么 Xcode 将使用一个固定的速度
航路点必须按时间升序排序 "
因此, 可以通过输入一系列点来模拟位置, 让 Xcode 来依次定为每一个点来模拟人的跑动行为
3. 使用 Python 来自动生成一系列轨迹点
Mac 下 python 与 Sublime text3 的环境配置在第一篇随笔中有记录
分析 gpx 文件结构可以得到目标 gpx 文件结构应该为:
- <?xml version="1.0"?>
- <gpx version="1.1" creator="Xcode">
- <wpt lat="坐标点经度 1" lon="坐标点纬度 1">
- </wpt>
- <wpt lat="坐标点经度 2" lon="坐标点纬度 2">
- </wpt>
- <wpt lat="坐标点经度 3" lon="坐标点纬度 3">
- </wpt>
- #......
- #以此类推
- </gpx>
在地图经纬度查询网站可以得到指定地点的经纬度信息: http://www.gpsspg.com/maps.htm
我们选择西安市某 211 高校作为实验地点:
该网站提供多个公司的定位标准下的经纬度信息
由于每一家公司的定位标准不同, 经纬度就会存在偏差, 这时候就要看用来模拟的 App 使用哪家的地图了
我们以某跑步打卡 App 步道乐跑 作为实验对象
在该高校实现水平移动与竖直移动
经过验证该 App 使用的是 谷歌地球标准
通过该网站首先得到一段直线的首尾经纬度点:
开始点:
- lat:34.3752989239
- lon:108.9080291565
中间点:
- lat:34.3740193255
- lon:108.9085977848
结束点:
- lat:34.3733728774
- lon:108.9064091023
在该网站可以通过经纬度获得距离信息: http://www.hhlink.com / 经纬度 /
计算得到距离约为 78 米
后续可根据需求, 通过测距来得到相应距离 从而计算得到水平与竖直移动速度
可以得出结论:
在该高校相对从北到南 经度减少, 纬度增加
在该高校相对从东到西 经度减小, 纬度减小
在符合跑步打卡 App 步道乐跑的配速要求: 3~9 min/km
例如从北到南生成 100 个点
经度依次减少 纬度依次增加, 并使得这 100 个点散布在路径上
每个点之间减少或者增加的距离可以通过乘以指定范围内的随机数, 使得点之间呈现左右略为摇摆的路径
在点数量较多的情况下近似为人的跑动轨迹
根据该高校的位置情况编写相应的 python 程序:
- import random
- # 初始点信息
- a1 = 34.3752989239;
- b1 = 108.9080291565;
- # 中间点信息
- a2 = 34.3740193255;
- b2 = 108.9085977848;
- for i in range( 1,1000 ):
- while( a1>= a2 ): # 循环条件 经度未到达中间点时执行
- xa = round( random.uniform(0.2, 7) ) # 随机数, 用于模拟人跑动
- xb = round( random.uniform(12, 15) )
- # 竖直移动
- a1 = round( a1 - 0.0000072 * xa , 10 )
- b1 = round( b1 + 0.0000008 * xb , 10 )
- # 输出信息
- print( '<wpt lat="' + str( a1 ) + '"'+' '+'lon="'+ str( b1 ) +'">' )
- print( '</wpt>' )
- for i in range( 1,1000 ):
- xa = round( random.uniform(2, 8) )
- xb = round( random.uniform(1, 3) )
- # 水平移动
- a2 = round( a2 - 0.000003 * xa, 10 )
- b2 = round( b2 - 0.000025 * xb, 10 )
- print( '<wpt lat="' + str( a2 ) + '"'+' '+'lon="'+ str( b2 ) +'">' )
- print( '</wpt>' )
得到输出 (节选):
将该输出复制并粘贴在 gpx 文件里
并 command + s 保存
可以在 xcode 项目目录内找到并打开该文件:
4. 开始位置模拟
确保手机连接上电脑, 并解锁保持屏幕常亮
点击 Xcode 右上角开始图标:
第一次会提示 iPhone 未信任开发者
在设置 -> 通用 -> 设备管理 点击该开发者并选择信任
再次在 Xcode 上点击右上角图标
一分钟左右手机上会多出一个灰色的 App 图标
点击后按 home 键退出, 进入步道乐跑
在 Xcode 下方多出一栏功能, 点击位置图标并选择你的 fake_loc
此时 App 就已经按照 gpx 文件内的路径开始移动了
5. 总结
在模拟时没有考虑速度的因素, 按照默认的 Xcode 对 gpx 的点的更新速度来实现的
在控制整体的移动速度时完全是按照点的密集程度, 即点的位置变化程度来实现的
后期可以根据时间标签 < time > 来改进获得更精确的速度
根据步道乐跑后台数据, 检测作弊主要依靠平均配速, 每公里的步数, 设备 uuid, 设备序列号来检测的
文章的方法可以解决平均配速, uudi, 序列号等问题 (因为就是使用真机来实现的)
但是对于步数只能依靠在模拟时通过摇晃手机来实现
来源: https://www.cnblogs.com/Joeric07/p/11173651.html