前言
在某些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、序列號等問題(因為就是使用真機來實現的)
但是對於步數只能依靠在模擬時通過搖晃手機來實現