社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python 模拟真实运动轨迹,轻松完成长跑和打卡

编程派 • 5 年前 • 2603 次点击  

文 | Joeric@cnblog 

编辑 | EarlGrey

推荐 | 编程派公众号(ID:codingpy)


前言

在某些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文件,格式类似标签语言风格

标签内包含经纬度(lat、lon)、该点名称以及时间

第一段注释内容大意为: 

  • “提供一个或多个包含纬度/经度对的点_

  • 如果提供一个点,Xcode将模拟那个特定的点_

  • 如果提供多个点,Xcode将依次模拟每一个点”_

第二段注释内容大意为: 

  • “可以选择为每一个坐标点添加一个时间标签_可,Xcode可以根据时间标签的顺序依次移动到每一个坐标点,并根据时间点来插入速度X

  • 如果不提供一个时间标签,那么Xcode将使用一个固定的速度_

  • 航路点必须按时间升序排序_”

因此,可以通过输入一系列点来模拟位置,让Xcode来依次定为每一个点来模拟人的跑动行为

3.使用Python来自动生成一系列轨迹点

mac下python与sublime text3的环境配置在第一篇随笔中有记录

分析gpx文件结构可以得到目标gpx文件结构应该为:

  1. "1.0"?>

  2. version="1.1" creator="Xcode">

  3. lat="坐标点经度1" lon="坐标点纬度1">


  4. lat="坐标点经度2" lon="坐标点纬度2">


  5. lat="坐标点经度3" lon="坐标点纬度3">

  6. #......

  7. #以此类推

在地图经纬度查询网站可以得到指定地点的经纬度信息: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程序:

  1. import random #初始点信息

  2. a1 = 34.3752989239;

  3. b1 = 108.9080291565; #中间点信息

  4. a2 = 34.3740193255;

  5. b2 = 108.9085977848; for i in range( 1,1000 ): while( a1 >= a2 ): # 循环条件 经度未到达中间点时执行

  6. xa = round( random.uniform(0.2, 7) ) # 随机数,用于模拟人跑动

  7. xb = round( random.uniform(12, 15) ) # 竖直移动

  8. a1 = round( a1 - 0.0000072 * xa , 10 )

  9. b1 = round( b1 + 0.0000008 * xb , 10 ) # 输出信息

  10. print( ' + str( a1 ) + '"' + ' ' + 'lon="' + str( b1 ) + '">' ) print( '' ) for i in range( 1,1000 ):

  11. xa = round( random.uniform(2, 8) )

  12. xb = round( random.uniform(1, 3) ) # 水平移动

  13. a2 = round( a2 - 0.000003 * xa, 10 )

  14. b2 = round( b2 - 0.000025 * xb, 10 ) print( ' + str( a2 ) + '"' + ' ' + 'lon="' + str( b2 ) + '">' ) print( '' )

得到输出(节选):

将该输出复制并粘贴在gpx文件里

并 command + s 保存

可以在xcode项目目录内找到并打开该文件:

4.开始位置模拟

确保手机连接上电脑,并解锁保持屏幕常亮

点击Xcode右上角开始图标:

第一次会提示iPhone未信任开发者

在设置 -> 通用 -> 设备管理 点击该开发者并选择信任

再次在Xcode上点击右上角图标

一分钟左右手机上会多出一个灰色的app图标

点击后按home键退出,进入步道乐跑

在Xcode下方多出一栏功能,点击位置图标并选择你的fake_loc

此时APP就已经按照gpx文件内的路径开始移动了


总结

在模拟时没有考虑速度的因素,按照默认的Xcode对gpx的点的更新速度来实现的

在控制整体的移动速度时完全是按照点的密集程度,即点的位置变化程度来实现的

后期可以根据时间标签

根据步道乐跑后台数据,检测作弊主要依靠平均配速、每公里的步数、设备uuid、设备序列号来检测的

文章的方法可以解决平均配速、uudi、序列号等问题(因为就是使用真机来实现的)

但是对于步数只能依靠在模拟时通过摇晃手机来实现

原文:https://www.cnblogs.com/Joeric07/p/11173651.html


回复下方「关键词」,获取优质资源


回复关键词「 pybook03」,立即获取主页君与小伙伴一起翻译的《Think Python 2e》电子版

回复关键词「pybooks02」,立即获取 O'Reilly 出版社推出的免费 Python 相关电子书合集

回复关键词「书单02」,立即获取主页君整理的 10 本 Python 入门书的电子版



豆瓣 9.1 分,中文版销量 30 多万,零基础也能用这本书学会 Python

你想要的 IT 电子资源,这里可能都有


Python 或将超越 C、Java,成为最受欢迎的语言

Python 容器使用的 5 个技巧和 2 个误区

如何写出优雅的 Python 函数?

题图:pexels,CC0 授权。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/36370
 
2603 次点击