├── app ├── __init__.py ├── maps │ ├── __init__.py │ ├── cdutcm │ │ ├── __init__.py │ │ └── wj.py │ └── cuit │ │ ├── __init__.py │ │ ├── lqy.py │ │ └── hkg.py ├── requests │ ├── __init__.py │ ├── UserInfo.py │ ├── SchoolBound.py │ ├── VaildSignUp.py │ ├── JoinNum.py │ ├── RunStandard.py │ ├── QuitClubActivity.py │ └── NewRunRecord.py ├── images │ ├── logo.ico │ └── logo.png ├── Map.py ├── AppConfig.py ├── SaveUserData.py └── Login.py ├── utils ├── __init__.py ├── Md5Util.py ├── SignUtil.py └── TrackUtil.py ├── requirements.txt ├── files ├── login.png ├── logo.png ├── main.jpg └── manage.jpg ├── .gitignore ├── .deepsource.toml ├── LICENSE ├── README.md └── unirun.py /app/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /utils/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/maps/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/maps/cdutcm/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/maps/cuit/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/requests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | requests>=2.20.0 2 | geopy==2.4.1 -------------------------------------------------------------------------------- /files/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yanyaoli/byerun/HEAD/files/login.png -------------------------------------------------------------------------------- /files/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yanyaoli/byerun/HEAD/files/logo.png -------------------------------------------------------------------------------- /files/main.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yanyaoli/byerun/HEAD/files/main.jpg -------------------------------------------------------------------------------- /files/manage.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yanyaoli/byerun/HEAD/files/manage.jpg -------------------------------------------------------------------------------- /app/images/logo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yanyaoli/byerun/HEAD/app/images/logo.ico -------------------------------------------------------------------------------- /app/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yanyaoli/byerun/HEAD/app/images/logo.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | venv/ 2 | dist/ 3 | build/ 4 | .history/ 5 | tmp.ico 6 | unirun.spec 7 | unirun32.spec 8 | user_data.json -------------------------------------------------------------------------------- /.deepsource.toml: -------------------------------------------------------------------------------- 1 | version = 1 2 | 3 | [[analyzers]] 4 | name = "python" 5 | 6 | [analyzers.meta] 7 | runtime_version = "3.x.x" -------------------------------------------------------------------------------- /utils/Md5Util.py: -------------------------------------------------------------------------------- 1 | import hashlib 2 | 3 | def string_to_md5(plain_text: str) -> str: 4 | m = hashlib.md5() 5 | m.update(plain_text.encode('utf-8')) 6 | md5code = m.hexdigest().lower() 7 | return md5code 8 | -------------------------------------------------------------------------------- /app/Map.py: -------------------------------------------------------------------------------- 1 | def getMapData(map_choice): 2 | 3 | from app.maps.cuit.hkg import hkg 4 | from app.maps.cuit.lqy import lqy 5 | from app.maps.cdutcm.wj import wj 6 | 7 | choice = map_choice 8 | 9 | if choice == "cuit_lqy": 10 | mapdata = lqy() 11 | return mapdata 12 | elif choice == "cuit_hkg": 13 | mapdata = hkg() 14 | return mapdata 15 | elif choice == "cdutcm_wj": 16 | mapdata = wj() 17 | return mapdata -------------------------------------------------------------------------------- /app/AppConfig.py: -------------------------------------------------------------------------------- 1 | # Desc: Configuration file for the app 2 | APPKEY = "389885588s0648fa" 3 | APPSECRET = "56E39A1658455588885690425C0FD16055A21676" 4 | HOST = "https://run-lb.tanmasports.com/" 5 | 6 | # query 7 | APPVERSION = "1.8.3" 8 | BRAND = "iPhone" 9 | DEVICETOKEN = "" 10 | DEVICETYPE = "2" 11 | MOBILETYPE = "iPhone 15 Pro Max" 12 | SYSVERSION = "10" 13 | TOKEN = "1243489ade4c457702e7c9c7fe2698a0" 14 | 15 | # headers 16 | CONTENTTYPE = "application/json; charset=UTF-8" 17 | USERAGENT = "okhttp/3.12.0" -------------------------------------------------------------------------------- /app/requests/UserInfo.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from app.AppConfig import HOST, APPKEY, CONTENTTYPE, USERAGENT 3 | from app.SaveUserData import load_data 4 | from utils.SignUtil import get_sign 5 | 6 | 7 | def get_user_info(): 8 | data = load_data() 9 | token = data["token"] 10 | 11 | headers = { 12 | "token": token, 13 | "appKey": APPKEY, 14 | "sign": get_sign(None,None), 15 | "Content-Type": CONTENTTYPE, 16 | "User-Agent": USERAGENT 17 | } 18 | response = requests.get(HOST + "v1/auth/query/token", headers=headers) 19 | data = response.json() 20 | if data["code"] == 10000: 21 | return data 22 | else: 23 | msg = data["msg"] 24 | return msg -------------------------------------------------------------------------------- /app/requests/SchoolBound.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from app.AppConfig import HOST, APPKEY, CONTENTTYPE, USERAGENT 3 | from app.SaveUserData import load_data 4 | from utils.SignUtil import get_sign 5 | 6 | def query_school_bound(token): 7 | data = load_data() 8 | token = data.get('token') 9 | schoolId = data.get('studentId') 10 | query = { 11 | "schoolId": schoolId 12 | } 13 | 14 | headers = { 15 | "token": token, 16 | "appKey": APPKEY, 17 | "sign": get_sign(query,None), 18 | "Content-Type": CONTENTTYPE, 19 | "User-Agent": USERAGENT 20 | } 21 | response = requests.get(HOST + "v1/unirun/querySchoolBound", headers=headers, params=query) 22 | data = response.json() 23 | if data["code"] == 10000: 24 | return data 25 | else: 26 | raise RuntimeError(data["msg"]) -------------------------------------------------------------------------------- /app/requests/VaildSignUp.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from app.AppConfig import HOST, APPKEY, CONTENTTYPE, USERAGENT 3 | from app.SaveUserData import load_data 4 | from utils.SignUtil import get_sign 5 | 6 | 7 | def count_valid_sign_up(token): 8 | data = load_data() 9 | token = data.get('token') 10 | studentId = data.get('studentId') 11 | query = { 12 | "studentId": studentId 13 | } 14 | headers = { 15 | "token": token, 16 | "appKey": APPKEY, 17 | "sign": get_sign(query,None), 18 | "Content-Type": CONTENTTYPE, 19 | "User-Agent": USERAGENT 20 | } 21 | response = requests.get(HOST + "v1/clubactivity/countValidSignUp", headers=headers, params=query) 22 | data = response.json() 23 | if data["code"] == 10000: 24 | joinNum = data["response"]["joinNum"] 25 | validNum = data["response"]["validNum"] 26 | result = f'累计参加俱乐部活动:{joinNum}次,有效签到次数:{validNum}次' 27 | return result 28 | else: 29 | raise RuntimeError(data["msg"]) -------------------------------------------------------------------------------- /utils/SignUtil.py: -------------------------------------------------------------------------------- 1 | import hashlib 2 | import urllib.parse 3 | from app.AppConfig import APPKEY, APPSECRET 4 | from collections import OrderedDict 5 | 6 | def get_sign(query, body): 7 | sign_str = "" 8 | if query is not None: 9 | # 将 query 的值转换为字符串 10 | sorted_query = OrderedDict(sorted(query.items())) 11 | sign_str = "".join([str(k) + str(v) for k, v in sorted_query.items()]) 12 | # 追加APPKEY和APPSECRET 13 | sign_str += APPKEY 14 | sign_str += APPSECRET 15 | # 追加请求体 16 | if body is not None: 17 | sign_str += body 18 | 19 | replaced = False 20 | for ch in [" ", "~", "!", "(", ")", "'"]: 21 | if ch in sign_str: 22 | sign_str = sign_str.replace(ch, "") 23 | replaced = True 24 | 25 | if replaced: 26 | sign_str = urllib.parse.quote(sign_str) 27 | 28 | m = hashlib.md5() 29 | m.update(sign_str.encode('utf-8')) 30 | sign = m.hexdigest().upper() 31 | 32 | if replaced: 33 | sign += "encodeutf8" 34 | 35 | return sign -------------------------------------------------------------------------------- /app/requests/JoinNum.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from app.AppConfig import HOST, APPKEY, CONTENTTYPE, USERAGENT 3 | from utils.SignUtil import get_sign 4 | 5 | def get_join_num(token, schoolId, studentId): 6 | 7 | query = { 8 | "schoolId": schoolId, 9 | "studentId": studentId 10 | } 11 | headers = { 12 | "token": token, 13 | "appKey": APPKEY, 14 | "sign": get_sign(query,None), 15 | "Content-Type": CONTENTTYPE, 16 | "User-Agent": USERAGENT 17 | } 18 | response = requests.get(HOST + "v1/clubactivity/getJoinNum", headers=headers, params=query) 19 | data = response.json() 20 | if data["code"] == 10000: 21 | totalNum = data["response"]["totalNum"] 22 | joinNum = data["response"]["joinNum"] 23 | runTotalNum = data["response"]["runTotalNum"] 24 | runJoinNum = data["response"]["runJoinNum"] 25 | result = f'俱乐部完成率:{joinNum}/{totalNum}次 校园跑完成率:{runJoinNum}/{runTotalNum}次' 26 | return result 27 | else: 28 | msg = data["msg"] 29 | return msg -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 yanyaoli 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /app/requests/RunStandard.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from app.AppConfig import HOST, APPKEY, CONTENTTYPE, USERAGENT 3 | from utils.SignUtil import get_sign 4 | from app.Login import check_login_status 5 | 6 | 7 | def query_run_standard(token, schoolId): 8 | if check_login_status(token) == False: 9 | return None, None, None, None, None 10 | else: 11 | query = { 12 | "schoolId": schoolId 13 | } 14 | 15 | headers = { 16 | "token": token, 17 | "appKey": APPKEY, 18 | "sign": get_sign(query,None), 19 | "Content-Type": CONTENTTYPE, 20 | "User-Agent": USERAGENT 21 | } 22 | response = requests.get(HOST + "v1/unirun/query/runStandard", headers=headers, params=query) 23 | data = response.json() 24 | msg = data["msg"] 25 | try: 26 | if data["code"] == 10000: 27 | standardId = data["response"]["standardId"] 28 | schoolId = data["response"]["schoolId"] 29 | boyOnceTimeMin = data["response"]["boyOnceTimeMin"] 30 | boyOnceTimeMax = data["response"]["boyOnceTimeMax"] 31 | semesterYear = data["response"]["semesterYear"] 32 | return standardId, schoolId, boyOnceTimeMin, boyOnceTimeMax, semesterYear 33 | else: 34 | return msg 35 | except RuntimeError as e: 36 | print(f"发生错误:{e}") -------------------------------------------------------------------------------- /app/SaveUserData.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | from collections import OrderedDict 4 | 5 | def save_data(data): 6 | data_to_save = data.copy() 7 | data_to_save["token"] = data["oauthToken"]["token"] 8 | data_to_save["refreshToken"] = data["oauthToken"]["refreshToken"] 9 | del data_to_save["oauthToken"] 10 | 11 | # 加载已保存的用户数据 12 | saved_data = load_data() 13 | if saved_data is None: 14 | saved_data = [] 15 | 16 | # 生成新的用户序号 17 | user_id = len(saved_data) + 1 18 | 19 | # 添加新的用户数据 20 | user_data = OrderedDict() 21 | user_data["id"] = user_id 22 | user_data["data"] = data_to_save 23 | saved_data.append(user_data) 24 | 25 | # 重新排序用户数据 26 | sorted_data = sorted(saved_data, key=lambda x: x["id"]) 27 | 28 | with open('user_data.json', 'w', encoding='utf-8') as f: 29 | json.dump(sorted_data, f) 30 | 31 | def load_data(): 32 | try: 33 | if os.path.getsize('user_data.json') > 0: 34 | with open('user_data.json', 'r') as f: 35 | data = json.load(f) 36 | # 重新分配id值 37 | for i, item in enumerate(data, start=1): 38 | item["id"] = i 39 | # 将修改后的数据写回文件 40 | with open('user_data.json', 'w', encoding='utf-8') as f: 41 | json.dump(data, f) 42 | return data 43 | else: 44 | return [] 45 | except FileNotFoundError: 46 | return [] -------------------------------------------------------------------------------- /app/Login.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import json 3 | from app.AppConfig import APPKEY, HOST, APPVERSION, BRAND, DEVICETOKEN, DEVICETYPE, MOBILETYPE, SYSVERSION, CONTENTTYPE, USERAGENT 4 | from app.SaveUserData import save_data 5 | from utils.Md5Util import * 6 | from utils.SignUtil import * 7 | 8 | def login(phone, password): 9 | password = string_to_md5(password) 10 | body = { 11 | "appVersion": APPVERSION, 12 | "brand": BRAND, 13 | "deviceToken": DEVICETOKEN, 14 | "deviceType": DEVICETYPE, 15 | "mobileType": MOBILETYPE, 16 | "password": password, 17 | "sysVersion": SYSVERSION, 18 | "userPhone": phone 19 | } 20 | 21 | body = json.dumps(body) 22 | headers = { 23 | "appKey": APPKEY, 24 | "sign": get_sign(None, body), 25 | "Content-Type": CONTENTTYPE, 26 | "User-Agent": USERAGENT 27 | } 28 | 29 | response = requests.post(HOST + 'v1/auth/login/password', headers=headers, data=body) 30 | data = response.json() 31 | msg = data["msg"] 32 | 33 | if data["code"] == 10000: 34 | save_data(data["response"]) 35 | return True 36 | 37 | else: 38 | return False 39 | 40 | def check_login_status(token): 41 | logged = False 42 | 43 | headers = { 44 | "token": token, 45 | "appKey": APPKEY, 46 | "sign": get_sign(None,None), 47 | "Content-Type": CONTENTTYPE, 48 | "User-Agent": USERAGENT 49 | } 50 | response = requests.get(HOST + "v1/auth/query/token", headers=headers) 51 | data = response.json() 52 | 53 | if data["code"] == 10000: 54 | logged = True 55 | return logged 56 | else: 57 | return logged 58 | -------------------------------------------------------------------------------- /app/requests/QuitClubActivity.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from app.AppConfig import HOST, APPKEY, CONTENTTYPE, USERAGENT 3 | from app.SaveUserData import load_data 4 | from utils.SignUtil import get_sign 5 | 6 | def queryMySemesterClubActivity(token): 7 | data = load_data() 8 | token = data.get('token') 9 | 10 | headers = { 11 | "token": token, 12 | "appKey": APPKEY, 13 | "sign": get_sign(None,None), 14 | "Content-Type": CONTENTTYPE, 15 | "User-Agent": USERAGENT 16 | } 17 | response = requests.get(HOST + "v1/clubactivity/queryMySemesterClubActivity", headers=headers) 18 | data = response.json() 19 | if data["code"] == 10000: 20 | print(data) 21 | if len(data["response"]) >= 2: 22 | configurationId = data["response"][0]["configurationId"] 23 | return configurationId 24 | else: 25 | configurationId = data["response"][0]["configurationId"] 26 | return configurationId 27 | else: 28 | return data["msg"] 29 | 30 | 31 | def quit_club_activity(token): 32 | data = load_data() 33 | token = data.get('token') 34 | 35 | configurationId = queryMySemesterClubActivity(token) 36 | query = { 37 | "configurationId": configurationId, 38 | "type": "2" 39 | } 40 | headers = { 41 | "token": token, 42 | "appKey": APPKEY, 43 | "sign": get_sign(query,None), 44 | "Content-Type": CONTENTTYPE, 45 | "User-Agent": USERAGENT 46 | } 47 | print(headers) 48 | response = requests.get(HOST + "v1/clubactivity/joinOrCancelSchoolSemesterActivity", headers=headers, params=query) 49 | data = response.json() 50 | msg = data["msg"] 51 | if data["code"] == 10000: 52 | message = data["response"]["message"] 53 | return message 54 | else: 55 | return msg 56 | -------------------------------------------------------------------------------- /utils/TrackUtil.py: -------------------------------------------------------------------------------- 1 | import json 2 | import random 3 | import time 4 | from geopy.distance import geodesic 5 | 6 | class Location: 7 | def __init__(self, id, location, edge): 8 | self.id = id 9 | self.location = location 10 | self.edge = edge 11 | 12 | def gen(distance, locations): 13 | current_distance = 0 14 | start_index = random.choice(locations) 15 | current_location = start_index 16 | result = [] 17 | 18 | start_time = int(time.time() * 1000) - 30 * 60 * 1000 19 | last_index = -1 20 | 21 | current = current_location.location.split(",") 22 | result.append(f"{current[0]}-{current[1]}-{start_time}-{rand_accuracy():.1f}") 23 | 24 | while current_distance < distance: 25 | current = current_location.location.split(",") 26 | edge = current_location.edge 27 | 28 | if not edge: 29 | print("edge为空") 30 | edge_index = random.choice(edge) 31 | if edge_index == last_index: 32 | edge_index = random.choice(list(set(edge) - {last_index})) 33 | next = locations[edge_index] 34 | 35 | start = current 36 | end = next.location.split(",") 37 | start_data = list(map(float, start)) 38 | end_data = list(map(float, end)) 39 | 40 | go_distance = calculate_distance(start_data, end_data) 41 | current_distance += go_distance 42 | 43 | start_time += go_distance / random.randint(1, 5) * 1000 44 | result.append(f"{end[0]}-{end[1]}-{start_time}-{rand_accuracy():.1f}") 45 | 46 | last_index = current_location.id 47 | current_location = next 48 | 49 | start_time += random.randint(5, 10) * 1000 50 | replace = current_location.location.replace(',', '-') 51 | result.append(f"{replace}-{start_time}-{rand_accuracy():.1f}") 52 | return json.dumps(result) 53 | 54 | def calculate_distance(start, end): 55 | return geodesic((start[1], start[0]), (end[1], end[0])).meters 56 | 57 | def rand_accuracy(): 58 | return 10 * random.random() 59 | 60 | def rand_int(a, b): 61 | return random.randint(a, b) 62 | 63 | def genTrackPoints(runTime, map_choice): 64 | from app.Map import getMapData 65 | data = getMapData(map_choice) 66 | locations = [Location(d['id'], d['location'], d['edge']) for d in data] 67 | result = gen(runTime, locations) 68 | return result 69 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | Unirun Helper | 校园跑助手 3 |

4 | 5 |
6 | 请移步网页版项目,持续更新 7 |

校园跑辅助工具,为了你的健康,不提倡长期使用

8 |
9 | 10 |
11 | 12 |
13 | 14 | 15 | ## 介绍说明 16 | 17 | UNIRUN校园跑辅助工具,自动规划跑步路径,提交跑步记录,跑步里程与时长已设置阈值,安全可靠,但不排除学校存在其他检测方法,如使用本工具造成的任何问题请自行承担。 18 | 19 |
20 | 21 | 22 |
23 | 24 | | 地图支持 | 25 | | --------------------------- | 26 | | 成都信息工程大学(航空港校区) | 27 | | 成都信息工程大学(龙泉校区) | 28 | | 成都中医药大学(温江校区) | 29 | | ... | 30 | 31 | 32 | ## 地图贡献 33 | 34 | **欢迎贡献地图文件** 35 | 36 | **地图格式示例** 37 | 38 | > 坐标路径建议前后连贯 39 | 40 | > 结尾坐标值建议在开始坐标值附近或者与开始坐标值相同。 41 | 42 | > 结尾坐标的edge值需要设置为```0``` 43 | 44 | ```python 45 | def MapName(): 46 | mapdata = [ 47 | { 48 | "id": 0, #唯一标识符 49 | "location": "103.9857179,30.5809638", #地理坐标 50 | "edge": [1] #路径排序 51 | }, 52 | { 53 | "id": 1, 54 | "location": "103.985738,30.5809205", 55 | "edge": [2] 56 | }, 57 | { 58 | "id": 2, 59 | "location": "103.9857497,30.5808788", 60 | "edge": [3] 61 | }, 62 | { 63 | "id": 3, 64 | "location": "103.9857475,30.5808847", 65 | "edge": [0] #最后路径排序值需设置为0 66 | } 67 | ] 68 | ``` 69 | 70 | **坐标拾取** 71 | 72 | [高德地图](https://lbs.gaode.com/console/show/picker) 73 | 74 | [高德地图](https://lbs.amap.com/tools/picker) 75 | 76 | 77 | ## TODO 78 | 79 | - [x] 多用户管理 80 | - [x] 多用户任务 81 | - [ ] 更多地图 82 | 83 | 84 | ## 使用指南 85 | 86 | ### 直接使用打包好的程序 87 | 88 | 进入[发布页面](https://github.com/yanyaoli/byerun/releases/),下载最新发布的可执行程序 89 | 90 | 91 | ### 本地构建 92 | 93 | **项目下载** 94 | 95 | > 下载`zip` 压缩包解压至文件夹 或 通过 `git clone` 96 | 97 | ```shell 98 | cd unirun 99 | git clone https://github.com/yanyaoli/byerun.git 100 | ``` 101 | 102 | **依赖安装** 103 | 104 | ```shell 105 | pip install -r requirements.txt 106 | ``` 107 | 108 | **开始使用** 109 | 110 | ```shell 111 | python unirun.py 112 | ``` 113 | 114 | 115 | ## 特别鸣谢 116 | 117 |

118 | 119 | 120 | 121 |

122 | -------------------------------------------------------------------------------- /app/requests/NewRunRecord.py: -------------------------------------------------------------------------------- 1 | import json 2 | import requests 3 | import datetime 4 | from app.AppConfig import HOST, APPKEY, APPVERSION, BRAND, MOBILETYPE, SYSVERSION, CONTENTTYPE, USERAGENT 5 | from app.SaveUserData import load_data 6 | from utils.SignUtil import get_sign 7 | from utils.TrackUtil import genTrackPoints 8 | from app.requests.RunStandard import query_run_standard 9 | 10 | NOTICE = [ 11 | "我认为这种事情是不可能的", 12 | "太快了", 13 | "要死了", 14 | "你正在自毁", 15 | "你正在自残", 16 | "你的锻炼正造成身体上的损伤", 17 | "六分是养身", 18 | "七分是自娱", 19 | "八分是治愈" 20 | ] 21 | 22 | def getDate(): 23 | return (datetime.datetime.now() - datetime.timedelta(minutes=30)).strftime("%Y-%m-%d %H:%M:%S") 24 | 25 | def check_speed(runDistance, runTime): 26 | average = 1.0 * runTime / runDistance * 1000 27 | if average < 6: 28 | print("八分是治愈,七分是自娱,六分是养身,五分是自伤,四分是自残,三分是自毁。") 29 | print(f"你的配速是:{average:.2f} 分钟/公里, {NOTICE[int(average)]}") 30 | else: 31 | print(f"平均配速:{average:.2f} 分钟/公里") 32 | return average 33 | 34 | def new_run_record(runDistance, runTime, map_choice, token, userId, studentName, schoolId): 35 | average = check_speed(runDistance, runTime) 36 | if average < 6: 37 | notice = "速度过快,已停止执行后续请求" 38 | return notice 39 | else: 40 | semesterYear = query_run_standard(token, schoolId)[-1] 41 | 42 | body = { 43 | "againRunStatus": "0", 44 | "againRunTime": 0, 45 | "appVersions": APPVERSION, 46 | "brand": BRAND, 47 | "mobileType": MOBILETYPE, 48 | "sysVersions": SYSVERSION, 49 | "trackPoints": genTrackPoints(runDistance, map_choice), 50 | "distanceTimeStatus": "1", 51 | "innerSchool": "1", 52 | "runDistance": runDistance, 53 | "runTime": runTime, 54 | "userId": userId, 55 | "vocalStatus": "1", 56 | "yearSemester": semesterYear, 57 | "recordDate" : getDate() 58 | } 59 | 60 | body = json.dumps(body) 61 | headers = { 62 | "token": token, 63 | "appKey": APPKEY, 64 | "sign": get_sign(None, body), 65 | "Content-Type": CONTENTTYPE, 66 | "User-Agent": USERAGENT 67 | } 68 | response = requests.post(HOST + "v1/unirun/save/run/record/new", headers=headers, data=body) 69 | data = response.json() 70 | msg = data["msg"] 71 | if data["code"] == 10000: 72 | resultDesc = data["response"]["resultDesc"] 73 | result = f"{studentName}: 跑步速度:{average:.2f}分钟/公里 跑步结果:{resultDesc}\n" 74 | return result 75 | else: 76 | return msg -------------------------------------------------------------------------------- /app/maps/cdutcm/wj.py: -------------------------------------------------------------------------------- 1 | def wj(): 2 | mapdata = [ 3 | {"id": 0, "location": "103.808457,30.686278", "edge": [1]}, 4 | {"id": 1, "location": "103.808511,30.686223", "edge": [2]}, 5 | {"id": 2, "location": "103.808479,30.68595", "edge": [3]}, 6 | {"id": 3, "location": "103.808291,30.68571", "edge": [4]}, 7 | {"id": 4, "location": "103.808007,30.685563", "edge": [5]}, 8 | {"id": 5, "location": "103.807567,30.685475", "edge": [6]}, 9 | {"id": 6, "location": "103.806499,30.685415", "edge": [7]}, 10 | {"id": 7, "location": "103.806215,30.68542", "edge": [8]}, 11 | {"id": 8, "location": "103.806027,30.685351", "edge": [9]}, 12 | {"id": 9, "location": "103.805909,30.685161", "edge": [10]}, 13 | {"id": 10, "location": "103.805786,30.685074", "edge": [11]}, 14 | {"id": 11, "location": "103.805663,30.685092", "edge": [12]}, 15 | {"id": 12, "location": "103.805818,30.684788", "edge": [13]}, 16 | {"id": 13, "location": "103.805888,30.684636", "edge": [14]}, 17 | {"id": 14, "location": "103.805952,30.684363", "edge": [15]}, 18 | {"id": 15, "location": "103.806156,30.683644", "edge": [16]}, 19 | {"id": 16, "location": "103.806526,30.683164", "edge": [17]}, 20 | {"id": 17, "location": "103.806526,30.683164", "edge": [18]}, 21 | {"id": 18, "location": "103.806934,30.682942", "edge": [19]}, 22 | {"id": 19, "location": "103.806907,30.68291", "edge": [20]}, 23 | {"id": 20, "location": "103.807556,30.682716", "edge": [21]}, 24 | {"id": 21, "location": "103.807894,30.682684", "edge": [22]}, 25 | {"id": 22, "location": "103.808259,30.682716", "edge": [23]}, 26 | {"id": 23, "location": "103.808774,30.682836", "edge": [24]}, 27 | {"id": 24, "location": "103.809321,30.683132", "edge": [25]}, 28 | {"id": 25, "location": "103.80968,30.683335", "edge": [26]}, 29 | {"id": 26, "location": "103.809922,30.683496", "edge": [27]}, 30 | {"id": 27, "location": "103.810791,30.683962", "edge": [28]}, 31 | {"id": 28, "location": "103.811574,30.684391", "edge": [29]}, 32 | {"id": 29, "location": "103.811622,30.684525", "edge": [30]}, 33 | {"id": 30, "location": "103.811633,30.684626", "edge": [31]}, 34 | {"id": 31, "location": "103.811424,30.685062", "edge": [32]}, 35 | {"id": 32, "location": "103.811043,30.685666", "edge": [33]}, 36 | {"id": 33, "location": "103.810716,30.686262", "edge": [34]}, 37 | {"id": 34, "location": "103.810485,30.686635", "edge": [35]}, 38 | {"id": 35, "location": "103.81012,30.687249", "edge": [36]}, 39 | {"id": 36, "location": "103.809659,30.688125", "edge": [37]}, 40 | {"id": 37, "location": "103.809359,30.688665", "edge": [38]}, 41 | {"id": 38, "location": "103.809015,30.68926", "edge": [39]}, 42 | {"id": 39, "location": "103.808838,30.68962", "edge": [40]}, 43 | {"id": 40, "location": "103.807371,30.689541", "edge": [41]}, 44 | {"id": 41, "location": "103.806655,30.689521", "edge": [42]}, 45 | {"id": 42, "location": "103.806425,30.689498", "edge": [43]}, 46 | {"id": 43, "location": "103.806248,30.689457", "edge": [44]}, 47 | {"id": 44, "location": "103.80554,30.689199", "edge": [45]}, 48 | {"id": 45, "location": "103.804966,30.688723", "edge": [46]}, 49 | {"id": 46, "location": "103.804794,30.688539", "edge": [47]}, 50 | {"id": 47, "location": "103.804531,30.688138", "edge": [48]}, 51 | {"id": 48, "location": "103.804392,30.687685", "edge": [49]}, 52 | {"id": 49, "location": "103.804381,30.687492", "edge": [50]}, 53 | {"id": 50, "location": "103.804372,30.687198", "edge": [51]}, 54 | {"id": 51, "location": "103.804388,30.686889", "edge": [52]}, 55 | {"id": 52, "location": "103.804485,30.686672", "edge": [53]}, 56 | {"id": 53, "location": "103.804619,30.686405", "edge": [54]}, 57 | {"id": 54, "location": "103.804801,30.686073", "edge": [55]}, 58 | {"id": 55, "location": "103.805064,30.685805", "edge": [56]}, 59 | {"id": 56, "location": "103.805413,30.685487", "edge": [57]}, 60 | {"id": 57, "location": "103.805671,30.685081", "edge": [58]}, 61 | {"id": 58, "location": "103.80595,30.684379", "edge": [59]}, 62 | {"id": 59, "location": "103.807554,30.684347", "edge": [60]}, 63 | {"id": 60, "location": "103.807564,30.685505", "edge": [61]}, 64 | {"id": 61, "location": "103.80802,30.685565", "edge": [62]}, 65 | {"id": 62, "location": "103.808305,30.685694", "edge": [63]}, 66 | {"id": 63, "location": "103.808482,30.685957", "edge": [64]}, 67 | {"id": 64, "location": "103.808496,30.686218", "edge": [65]}, 68 | {"id": 65, "location": "103.808405,30.686306", "edge": [66]}, 69 | {"id": 66, "location": "103.808641,30.686421", "edge": [67]}, 70 | {"id": 67, "location": "103.809274,30.686412", "edge": [68]}, 71 | {"id": 68, "location": "103.809714,30.686449", "edge": [69]}, 72 | {"id": 69, "location": "103.809988,30.686546", "edge": [70]}, 73 | {"id": 70, "location": "103.810272,30.686638", "edge": [71]}, 74 | {"id": 71, "location": "103.810508,30.686619", "edge": [72]}, 75 | {"id": 72, "location": "103.810229,30.686619", "edge": [73]}, 76 | {"id": 73, "location": "103.809998,30.68655", "edge": [74]}, 77 | {"id": 74, "location": "103.809923,30.686776", "edge": [75]}, 78 | {"id": 75, "location": "103.809757,30.686952", "edge": [76]}, 79 | {"id": 76, "location": "103.809762,30.687062", "edge": [77]}, 80 | {"id": 77, "location": "103.809709,30.687201", "edge": [78]}, 81 | {"id": 78, "location": "103.809591,30.687256", "edge": [79]}, 82 | {"id": 79, "location": "103.809451,30.68727", "edge": [80]}, 83 | {"id": 80, "location": "103.809398,30.687597", "edge": [81]}, 84 | {"id": 81, "location": "103.809392,30.687745", "edge": [82]}, 85 | {"id": 82, "location": "103.809102,30.687731", "edge": [83]}, 86 | {"id": 83, "location": "103.809113,30.687736", "edge": [84]}, 87 | {"id": 84, "location": "103.80862,30.687408", "edge": [85]}, 88 | {"id": 85, "location": "103.808486,30.687367", "edge": [86]}, 89 | {"id": 86, "location": "103.808486,30.687367", "edge": [87]}, 90 | {"id": 87, "location": "103.808475,30.687099", "edge": [88]}, 91 | {"id": 88, "location": "103.808384,30.686924", "edge": [89]}, 92 | {"id": 89, "location": "103.808159,30.686809", "edge": [90]}, 93 | {"id": 90, "location": "103.80802,30.686786", "edge": [91]}, 94 | {"id": 91, "location": "103.807928,30.686661", "edge": [92]}, 95 | {"id": 92, "location": "103.808427,30.686297", "edge": [0]} 96 | ] 97 | return mapdata -------------------------------------------------------------------------------- /app/maps/cuit/lqy.py: -------------------------------------------------------------------------------- 1 | def lqy(): 2 | mapdata = [ 3 | {"id": 0, "location": "104.30599,30.607908", "edge": [1]}, 4 | {"id": 1, "location": "104.306607,30.607608", "edge": [2]}, 5 | {"id": 2, "location": "104.307213,30.607165", "edge": [3]}, 6 | {"id": 3, "location": "104.307588,30.606643", "edge": [4]}, 7 | {"id": 4, "location": "104.308356,30.607031", "edge": [5]}, 8 | {"id": 5, "location": "104.307905,30.607705", "edge": [6]}, 9 | {"id": 6, "location": "104.307165,30.608305", "edge": [7]}, 10 | {"id": 7, "location": "104.306237,30.608634", "edge": [8]}, 11 | {"id": 8, "location": "104.305228,30.60875", "edge": [9]}, 12 | {"id": 9, "location": "104.304343,30.60857", "edge": [10]}, 13 | {"id": 10, "location": "104.304434,30.608122", "edge": [11]}, 14 | {"id": 11, "location": "104.304029,30.608203", "edge": [12]}, 15 | {"id": 12, "location": "104.303292,30.606967", "edge": [13]}, 16 | {"id": 13, "location": "104.302626,30.60597", "edge": [14]}, 17 | {"id": 14, "location": "104.302342,30.605402", "edge": [15]}, 18 | {"id": 15, "location": "104.303517,30.604945", "edge": [16]}, 19 | {"id": 16, "location": "104.303447,30.60477", "edge": [17]}, 20 | {"id": 17, "location": "104.303892,30.604567", "edge": [18]}, 21 | {"id": 18, "location": "104.304273,30.604608", "edge": [19]}, 22 | {"id": 19, "location": "104.304429,30.604423", "edge": [20]}, 23 | {"id": 20, "location": "104.304724,30.604382", "edge": [21]}, 24 | {"id": 21, "location": "104.304863,30.604202", "edge": [22]}, 25 | {"id": 22, "location": "104.305432,30.603943", "edge": [23]}, 26 | {"id": 23, "location": "104.305561,30.604169", "edge": [24]}, 27 | {"id": 24, "location": "104.306661,30.60368", "edge": [25]}, 28 | {"id": 25, "location": "104.306961,30.604285", "edge": [26]}, 29 | {"id": 26, "location": "104.307117,30.60452", "edge": [27]}, 30 | {"id": 27, "location": "104.307299,30.604968", "edge": [28]}, 31 | {"id": 28, "location": "104.307483,30.60514", "edge": [29]}, 32 | {"id": 29, "location": "104.307467,30.60514", "edge": [30]}, 33 | {"id": 30, "location": "104.307853,30.605818", "edge": [31]}, 34 | {"id": 31, "location": "104.308148,30.60634", "edge": [32]}, 35 | {"id": 32, "location": "104.30811,30.606456", "edge": [33]}, 36 | {"id": 33, "location": "104.307799,30.606686", "edge": [34]}, 37 | {"id": 34, "location": "104.307579,30.60664", "edge": [35]}, 38 | {"id": 35, "location": "104.307295,30.606215", "edge": [36]}, 39 | {"id": 36, "location": "104.306984,30.605754", "edge": [37]}, 40 | {"id": 37, "location": "104.307021,30.605624", "edge": [38]}, 41 | {"id": 38, "location": "104.306952,30.605347", "edge": [39]}, 42 | {"id": 39, "location": "104.306957,30.605329", "edge": [40]}, 43 | {"id": 40, "location": "104.30685,30.605177", "edge": [41]}, 44 | {"id": 41, "location": "104.306238,30.605403", "edge": [42]}, 45 | {"id": 42, "location": "104.305793,30.60465", "edge": [43]}, 46 | {"id": 43, "location": "104.305557,30.60417", "edge": [44]}, 47 | {"id": 44, "location": "104.305391,30.603935", "edge": [45]}, 48 | {"id": 45, "location": "104.304881,30.604184", "edge": [46]}, 49 | {"id": 46, "location": "104.304726,30.604378", "edge": [47]}, 50 | {"id": 47, "location": "104.304904,30.604523", "edge": [48]}, 51 | {"id": 48, "location": "104.304996,30.604712", "edge": [49]}, 52 | {"id": 49, "location": "104.304974,30.604846", "edge": [50]}, 53 | {"id": 50, "location": "104.304829,30.604984", "edge": [51]}, 54 | {"id": 51, "location": "104.304615,30.605058", "edge": [52]}, 55 | {"id": 52, "location": "104.30447,30.605021", "edge": [53]}, 56 | {"id": 53, "location": "104.304384,30.605141", "edge": [54]}, 57 | {"id": 54, "location": "104.304284,30.605351", "edge": [55]}, 58 | {"id": 55, "location": "104.303812,30.605374", "edge": [56]}, 59 | {"id": 56, "location": "104.303935,30.605707", "edge": [57]}, 60 | {"id": 57, "location": "104.304096,30.605993", "edge": [58]}, 61 | {"id": 58, "location": "104.304109,30.606148", "edge": [59]}, 62 | {"id": 59, "location": "104.304463,30.606195", "edge": [60]}, 63 | {"id": 60, "location": "104.304699,30.606365", "edge": [61]}, 64 | {"id": 61, "location": "104.304984,30.606059", "edge": [62]}, 65 | {"id": 62, "location": "104.304861,30.605925", "edge": [63]}, 66 | {"id": 63, "location": "104.304887,30.605699", "edge": [64]}, 67 | {"id": 64, "location": "104.304941,30.605593", "edge": [65]}, 68 | {"id": 65, "location": "104.305048,30.605519", "edge": [66]}, 69 | {"id": 66, "location": "104.305199,30.605486", "edge": [67]}, 70 | {"id": 67, "location": "104.305386,30.605496", "edge": [68]}, 71 | {"id": 68, "location": "104.305558,30.605634", "edge": [69]}, 72 | {"id": 69, "location": "104.305606,30.605796", "edge": [70]}, 73 | {"id": 70, "location": "104.305596,30.60593", "edge": [71]}, 74 | {"id": 71, "location": "104.30552,30.606027", "edge": [72]}, 75 | {"id": 72, "location": "104.305333,30.606133", "edge": [73]}, 76 | {"id": 73, "location": "104.305145,30.606142", "edge": [74]}, 77 | {"id": 74, "location": "104.305005,30.606064", "edge": [75]}, 78 | {"id": 75, "location": "104.304973,30.606059", "edge": [76]}, 79 | {"id": 76, "location": "104.304802,30.606271", "edge": [77]}, 80 | {"id": 77, "location": "104.304592,30.606502", "edge": [78]}, 81 | {"id": 78, "location": "104.304501,30.606654", "edge": [79]}, 82 | {"id": 79, "location": "104.304244,30.606959", "edge": [80]}, 83 | {"id": 80, "location": "104.304169,30.607038", "edge": [81]}, 84 | {"id": 81, "location": "104.304179,30.607088", "edge": [82]}, 85 | {"id": 82, "location": "104.304222,30.607195", "edge": [83]}, 86 | {"id": 83, "location": "104.304287,30.607301", "edge": [84]}, 87 | {"id": 84, "location": "104.304405,30.607583", "edge": [85]}, 88 | {"id": 85, "location": "104.304571,30.607878", "edge": [86]}, 89 | {"id": 86, "location": "104.304909,30.607984", "edge": [87]}, 90 | {"id": 87, "location": "104.305193,30.607984", "edge": [88]}, 91 | {"id": 88, "location": "104.305692,30.607961", "edge": [89]}, 92 | {"id": 89, "location": "104.305976,30.607892", "edge": [90]}, 93 | {"id": 90, "location": "104.306127,30.60834", "edge": [91]}, 94 | {"id": 91, "location": "104.306261,30.608649", "edge": [92]}, 95 | {"id": 92, "location": "104.306695,30.608534", "edge": [93]}, 96 | {"id": 93, "location": "104.307146,30.608307", "edge": [94]}, 97 | {"id": 94, "location": "104.307055,30.608155", "edge": [95]}, 98 | {"id": 95, "location": "104.306856,30.60791", "edge": [96]}, 99 | {"id": 96, "location": "104.306631,30.607615", "edge": [97]}, 100 | {"id": 97, "location": "104.307194,30.607167", "edge": [98]}, 101 | {"id": 98, "location": "104.30757,30.606641", "edge": [99]}, 102 | {"id": 99, "location": "104.307334,30.606281", "edge": [100]}, 103 | {"id": 100, "location": "104.307001,30.605768", "edge": [101]}, 104 | {"id": 101, "location": "104.306266,30.605814", "edge": [102]}, 105 | {"id": 102, "location": "104.305633,30.6058", "edge": [103]}, 106 | {"id": 103, "location": "104.305553,30.605644", "edge": [104]}, 107 | {"id": 104, "location": "104.305413,30.605514", "edge": [105]}, 108 | {"id": 105, "location": "104.30541,30.60544", "edge": [106]}, 109 | {"id": 106, "location": "104.305517,30.605385", "edge": [107]}, 110 | {"id": 107, "location": "104.306048,30.605154", "edge": [108]}, 111 | {"id": 108, "location": "104.305979,30.604992", "edge": [109]}, 112 | {"id": 109, "location": "104.307089,30.604517", "edge": [110]}, 113 | {"id": 110, "location": "104.307336,30.604978", "edge": [111]}, 114 | {"id": 111, "location": "104.306212,30.605415", "edge": [112]}, 115 | {"id": 112, "location": "104.306094,30.605507", "edge": [113]}, 116 | {"id": 113, "location": "104.306244,30.605816", "edge": [114]}, 117 | {"id": 114, "location": "104.306727,30.605826", "edge": [115]}, 118 | {"id": 115, "location": "104.307001,30.60577", "edge": [116]}, 119 | {"id": 116, "location": "104.307001,30.605659", "edge": [117]}, 120 | {"id": 117, "location": "104.307049,30.605609", "edge": [118]}, 121 | {"id": 118, "location": "104.306958,30.605327", "edge": [119]}, 122 | {"id": 119, "location": "104.307441,30.605147", "edge": [120]}, 123 | {"id": 120, "location": "104.307274,30.604981", "edge": [121]}, 124 | {"id": 121, "location": "104.306867,30.605165", "edge": [122]}, 125 | {"id": 122, "location": "104.306963,30.605332", "edge": [123]}, 126 | {"id": 123, "location": "104.307446,30.605147", "edge": [124]}, 127 | {"id": 124, "location": "104.308154,30.606366", "edge": [125]}, 128 | {"id": 125, "location": "104.308111,30.606449", "edge": [126]}, 129 | {"id": 126, "location": "104.308063,30.606481", "edge": [127]}, 130 | {"id": 127, "location": "104.307827,30.606698", "edge": [128]}, 131 | {"id": 128, "location": "104.30834,30.607017", "edge": [129]}, 132 | {"id": 129, "location": "104.307906,30.607691", "edge": [130]}, 133 | {"id": 130, "location": "104.307214,30.607169", "edge": [131]}, 134 | {"id": 131, "location": "104.307594,30.606641", "edge": [132]}, 135 | {"id": 132, "location": "104.306983,30.605769", "edge": [133]}, 136 | {"id": 133, "location": "104.306725,30.605833", "edge": [134]}, 137 | {"id": 134, "location": "104.306232,30.605829", "edge": [135]}, 138 | {"id": 135, "location": "104.30613,30.605478", "edge": [136]}, 139 | {"id": 136, "location": "104.306216,30.605409", "edge": [137]}, 140 | {"id": 137, "location": "104.305803,30.604638", "edge": [138]}, 141 | {"id": 138, "location": "104.305448,30.604827", "edge": [139]}, 142 | {"id": 139, "location": "104.305368,30.605172", "edge": [140]}, 143 | {"id": 140, "location": "104.305186,30.605477", "edge": [141]}, 144 | {"id": 141, "location": "104.304918,30.605583", "edge": [142]}, 145 | {"id": 142, "location": "104.304644,30.605514", "edge": [143]}, 146 | {"id": 143, "location": "104.304354,30.605444", "edge": [144]}, 147 | {"id": 144, "location": "104.304252,30.605357", "edge": [145]}, 148 | {"id": 145, "location": "104.304459,30.605032", "edge": [146]}, 149 | {"id": 146, "location": "104.304459,30.605032", "edge": [147]}, 150 | {"id": 147, "location": "104.3041,30.605309", "edge": [148]}, 151 | {"id": 148, "location": "104.303783,30.605373", "edge": [149]}, 152 | {"id": 149, "location": "104.303512,30.604932", "edge": [150]}, 153 | {"id": 150, "location": "104.30238,30.605375", "edge": [151]}, 154 | {"id": 151, "location": "104.302632,30.60598", "edge": [152]}, 155 | {"id": 152, "location": "104.303785,30.605384", "edge": [153]}, 156 | {"id": 153, "location": "104.304091,30.605961", "edge": [154]}, 157 | {"id": 154, "location": "104.304097,30.606201", "edge": [155]}, 158 | {"id": 155, "location": "104.303297,30.606996", "edge": [156]}, 159 | {"id": 156, "location": "104.303571,30.607485", "edge": [157]}, 160 | {"id": 157, "location": "104.304215,30.607217", "edge": [158]}, 161 | {"id": 158, "location": "104.304574,30.607868", "edge": [159]}, 162 | {"id": 159, "location": "104.304429,30.608122", "edge": [160]}, 163 | {"id": 160, "location": "104.304553,30.607882", "edge": [161]}, 164 | {"id": 161, "location": "104.305196,30.607974", "edge": [162]}, 165 | {"id": 162, "location": "104.305239,30.60875", "edge": [163]}, 166 | {"id": 163, "location": "104.306247,30.608654", "edge": [0]}, 167 | ] 168 | return mapdata 169 | -------------------------------------------------------------------------------- /app/maps/cuit/hkg.py: -------------------------------------------------------------------------------- 1 | def hkg(): 2 | mapdata = [ 3 | {"id": 0, "location": "103.9857179,30.5809638", "edge": [1]}, 4 | {"id": 1, "location": "103.985738,30.5809205", "edge": [2]}, 5 | {"id": 2, "location": "103.9857497,30.5808788", "edge": [3]}, 6 | {"id": 3, "location": "103.9857475,30.5808847", "edge": [4]}, 7 | {"id": 4, "location": "103.9857554,30.5808539", "edge": [5]}, 8 | {"id": 5, "location": "103.985763,30.5808084", "edge": [6]}, 9 | {"id": 6, "location": "103.9857691,30.5807536", "edge": [7]}, 10 | {"id": 7, "location": "103.9857758,30.5806854", "edge": [8]}, 11 | {"id": 8, "location": "103.9857836,30.580608", "edge": [9]}, 12 | {"id": 9, "location": "103.9857918,30.5805238", "edge": [10]}, 13 | {"id": 10, "location": "103.9857992,30.5804395", "edge": [11]}, 14 | {"id": 11, "location": "103.9858042,30.5803542", "edge": [12]}, 15 | {"id": 12, "location": "103.9858071,30.5802669", "edge": [13]}, 16 | {"id": 13, "location": "103.9858076,30.5801809", "edge": [14]}, 17 | {"id": 14, "location": "103.9858009,30.5801015", "edge": [15]}, 18 | {"id": 15, "location": "103.9857875,30.5800312", "edge": [16]}, 19 | {"id": 16, "location": "103.9857839,30.5799658", "edge": [17]}, 20 | {"id": 17, "location": "103.9858023,30.5799011", "edge": [18]}, 21 | {"id": 18, "location": "103.9858411,30.5798373", "edge": [19]}, 22 | {"id": 19, "location": "103.9859004,30.5797807", "edge": [20]}, 23 | {"id": 20, "location": "103.9859782,30.5797358", "edge": [21]}, 24 | {"id": 21, "location": "103.986057,30.5797023", "edge": [22]}, 25 | {"id": 22, "location": "103.9861197,30.5796808", "edge": [23]}, 26 | {"id": 23, "location": "103.9861838,30.5796711", "edge": [24]}, 27 | {"id": 24, "location": "103.9862593,30.5796713", "edge": [25]}, 28 | {"id": 25, "location": "103.9863325,30.5796826", "edge": [26]}, 29 | {"id": 26, "location": "103.9864012,30.5797074", "edge": [27]}, 30 | {"id": 27, "location": "103.9864649,30.5797449", "edge": [28]}, 31 | {"id": 28, "location": "103.9865197,30.5797938", "edge": [29]}, 32 | {"id": 29, "location": "103.986563,30.5798518", "edge": [30]}, 33 | {"id": 30, "location": "103.9865975,30.5799187", "edge": [31]}, 34 | {"id": 31, "location": "103.9866228,30.5799914", "edge": [32]}, 35 | {"id": 32, "location": "103.9866387,30.5800662", "edge": [33]}, 36 | {"id": 33, "location": "103.9866525,30.5801413", "edge": [34]}, 37 | {"id": 34, "location": "103.9866683,30.5802165", "edge": [35]}, 38 | {"id": 35, "location": "103.9866832,30.5802924", "edge": [36]}, 39 | {"id": 36, "location": "103.9866961,30.5803678", "edge": [37]}, 40 | {"id": 37, "location": "103.9867016,30.5804435", "edge": [38]}, 41 | {"id": 38, "location": "103.986699,30.5805202", "edge": [39]}, 42 | {"id": 39, "location": "103.9866949,30.580598", "edge": [40]}, 43 | {"id": 40, "location": "103.9866801,30.5807211", "edge": [41]}, 44 | {"id": 41, "location": "103.986665,30.5807755", "edge": [42]}, 45 | {"id": 42, "location": "103.9866497,30.5808384", "edge": [43]}, 46 | {"id": 43, "location": "103.9866291,30.5809089", "edge": [44]}, 47 | {"id": 44, "location": "103.9865956,30.5809817", "edge": [45]}, 48 | {"id": 45, "location": "103.9865539,30.5810445", "edge": [46]}, 49 | {"id": 46, "location": "103.9865053,30.5810935", "edge": [47]}, 50 | {"id": 47, "location": "103.9864467,30.5811303", "edge": [48]}, 51 | {"id": 48, "location": "103.9863794,30.5811562", "edge": [49]}, 52 | {"id": 49, "location": "103.9863057,30.581171", "edge": [50]}, 53 | {"id": 50, "location": "103.9862281,30.581172", "edge": [51]}, 54 | {"id": 51, "location": "103.986148,30.5811621", "edge": [52]}, 55 | {"id": 52, "location": "103.9860694,30.5811387", "edge": [53]}, 56 | {"id": 53, "location": "103.985996,30.581098", "edge": [54]}, 57 | {"id": 54, "location": "103.9859327,30.5810431", "edge": [55]}, 58 | {"id": 55, "location": "103.9858789,30.5809798", "edge": [56]}, 59 | {"id": 56, "location": "103.9858336,30.5809134", "edge": [57]}, 60 | {"id": 57, "location": "103.9857987,30.5808464", "edge": [58]}, 61 | {"id": 58, "location": "103.9857765,30.5807749", "edge": [59]}, 62 | {"id": 59, "location": "103.9857669,30.5807014", "edge": [60]}, 63 | {"id": 60, "location": "103.9857616,30.5806368", "edge": [61]}, 64 | {"id": 61, "location": "103.9857537,30.5805876", "edge": [62]}, 65 | {"id": 62, "location": "103.9857444,30.580538", "edge": [63]}, 66 | {"id": 63, "location": "103.9857422,30.5805046", "edge": [64]}, 67 | {"id": 64, "location": "103.9857432,30.5804529", "edge": [65]}, 68 | {"id": 65, "location": "103.9857432,30.5804012", "edge": [66]}, 69 | {"id": 66, "location": "103.9857436,30.580339", "edge": [67]}, 70 | {"id": 67, "location": "103.9857369,30.5802733", "edge": [68]}, 71 | {"id": 68, "location": "103.9857252,30.5802025", "edge": [69]}, 72 | {"id": 69, "location": "103.9857192,30.5801306", "edge": [70]}, 73 | {"id": 70, "location": "103.9857185,30.5800598", "edge": [71]}, 74 | {"id": 71, "location": "103.985725,30.5799905", "edge": [72]}, 75 | {"id": 72, "location": "103.9857444,30.5799245", "edge": [73]}, 76 | {"id": 73, "location": "103.9857746,30.5798676", "edge": [74]}, 77 | {"id": 74, "location": "103.9858166,30.5798206", "edge": [75]}, 78 | {"id": 75, "location": "103.9858732,30.5797804", "edge": [76]}, 79 | {"id": 76, "location": "103.9859419,30.579748", "edge": [77]}, 80 | {"id": 77, "location": "103.9860221,30.5797239", "edge": [78]}, 81 | {"id": 78, "location": "103.9861127,30.5797084", "edge": [79]}, 82 | {"id": 79, "location": "103.9862049,30.5797026", "edge": [80]}, 83 | {"id": 80, "location": "103.9862798,30.5797044", "edge": [81]}, 84 | {"id": 81, "location": "103.986334,30.5797123", "edge": [82]}, 85 | {"id": 82, "location": "103.9863856,30.5797311", "edge": [83]}, 86 | {"id": 83, "location": "103.9864349,30.5797617", "edge": [84]}, 87 | {"id": 84, "location": "103.9864967,30.5798123", "edge": [85]}, 88 | {"id": 85, "location": "103.9865262,30.5798488", "edge": [86]}, 89 | {"id": 86, "location": "103.9865498,30.5798927", "edge": [87]}, 90 | {"id": 87, "location": "103.9865678,30.5799456", "edge": [88]}, 91 | {"id": 88, "location": "103.9865822,30.5800084", "edge": [89]}, 92 | {"id": 89, "location": "103.9865955,30.5800751", "edge": [90]}, 93 | {"id": 90, "location": "103.986607,30.5801449", "edge": [91]}, 94 | {"id": 91, "location": "103.9866183,30.580217", "edge": [92]}, 95 | {"id": 92, "location": "103.9866301,30.5802885", "edge": [93]}, 96 | {"id": 93, "location": "103.9866406,30.5803598", "edge": [94]}, 97 | {"id": 94, "location": "103.9866521,30.5804252", "edge": [95]}, 98 | {"id": 95, "location": "103.9866612,30.5804822", "edge": [96]}, 99 | {"id": 96, "location": "103.9866621,30.5805399", "edge": [97]}, 100 | {"id": 97, "location": "103.9866592,30.5805994", "edge": [98]}, 101 | {"id": 98, "location": "103.9866538,30.5806588", "edge": [99]}, 102 | {"id": 99, "location": "103.9866458,30.5807213", "edge": [100]}, 103 | {"id": 100, "location": "103.986636,30.5807868", "edge": [101]}, 104 | {"id": 101, "location": "103.9866164,30.5808529", "edge": [102]}, 105 | {"id": 102, "location": "103.9865822,30.580916", "edge": [103]}, 106 | {"id": 103, "location": "103.9865341,30.5809733", "edge": [104]}, 107 | {"id": 104, "location": "103.9864745,30.5810203", "edge": [105]}, 108 | {"id": 105, "location": "103.9864072,30.5810567", "edge": [106]}, 109 | {"id": 106, "location": "103.9863335,30.5810817", "edge": [107]}, 110 | {"id": 107, "location": "103.9862597,30.5810957", "edge": [108]}, 111 | {"id": 108, "location": "103.9861853,30.5810992", "edge": [109]}, 112 | {"id": 109, "location": "103.9861073,30.5810925", "edge": [110]}, 113 | {"id": 110, "location": "103.9860309,30.5810771", "edge": [111]}, 114 | {"id": 111, "location": "103.9859627,30.5810466", "edge": [112]}, 115 | {"id": 112, "location": "103.985905,30.5810011", "edge": [113]}, 116 | {"id": 113, "location": "103.9858561,30.5809473", "edge": [114]}, 117 | {"id": 114, "location": "103.9858145,30.5808867", "edge": [115]}, 118 | {"id": 115, "location": "103.9857822,30.5808223", "edge": [116]}, 119 | {"id": 116, "location": "103.98576,30.5807579", "edge": [117]}, 120 | {"id": 117, "location": "103.9857472,30.5806918", "edge": [118]}, 121 | {"id": 118, "location": "103.9857439,30.580622", "edge": [119]}, 122 | {"id": 119, "location": "103.9857472,30.5805579", "edge": [120]}, 123 | {"id": 120, "location": "103.9857516,30.5805107", "edge": [121]}, 124 | {"id": 121, "location": "103.9857568,30.5804651", "edge": [122]}, 125 | {"id": 122, "location": "103.9857642,30.58041", "edge": [123]}, 126 | {"id": 123, "location": "103.9857714,30.5803474", "edge": [124]}, 127 | {"id": 124, "location": "103.9857784,30.5802782", "edge": [125]}, 128 | {"id": 125, "location": "103.9857829,30.5802076", "edge": [126]}, 129 | {"id": 126, "location": "103.9857839,30.5801343", "edge": [127]}, 130 | {"id": 127, "location": "103.9857865,30.5800614", "edge": [128]}, 131 | {"id": 128, "location": "103.985792,30.579992", "edge": [129]}, 132 | {"id": 129, "location": "103.985804,30.5799239", "edge": [130]}, 133 | {"id": 130, "location": "103.9858277,30.5798605", "edge": [131]}, 134 | {"id": 131, "location": "103.9858674,30.5798047", "edge": [132]}, 135 | {"id": 132, "location": "103.9859423,30.5797342", "edge": [133]}, 136 | {"id": 133, "location": "103.9859737,30.579716", "edge": [134]}, 137 | {"id": 134, "location": "103.9860285,30.5796914", "edge": [135]}, 138 | {"id": 135, "location": "103.9860843,30.5796729", "edge": [136]}, 139 | {"id": 136, "location": "103.9861498,30.5796594", "edge": [137]}, 140 | {"id": 137, "location": "103.9862224,30.5796542", "edge": [138]}, 141 | {"id": 138, "location": "103.9862999,30.5796586", "edge": [139]}, 142 | {"id": 139, "location": "103.9863703,30.5796706", "edge": [140]}, 143 | {"id": 140, "location": "103.9864323,30.5796932", "edge": [141]}, 144 | {"id": 141, "location": "103.9864898,30.5797325", "edge": [142]}, 145 | {"id": 142, "location": "103.9865384,30.5797808", "edge": [143]}, 146 | {"id": 143, "location": "103.9865759,30.5798349", "edge": [144]}, 147 | {"id": 144, "location": "103.9866006,30.5798975", "edge": [145]}, 148 | {"id": 145, "location": "103.9866126,30.579965", "edge": [146]}, 149 | {"id": 146, "location": "103.9866185,30.5800337", "edge": [147]}, 150 | {"id": 147, "location": "103.9866226,30.5801042", "edge": [148]}, 151 | {"id": 148, "location": "103.9866277,30.5801742", "edge": [149]}, 152 | {"id": 149, "location": "103.9866358,30.5802438", "edge": [150]}, 153 | {"id": 150, "location": "103.986642,30.5803137", "edge": [151]}, 154 | {"id": 151, "location": "103.9866475,30.5803834", "edge": [152]}, 155 | {"id": 152, "location": "103.9866513,30.5804529", "edge": [153]}, 156 | {"id": 153, "location": "103.9866487,30.5805463", "edge": [154]}, 157 | {"id": 154, "location": "103.9866434,30.5805994", "edge": [155]}, 158 | {"id": 155, "location": "103.9866379,30.580657", "edge": [156]}, 159 | {"id": 156, "location": "103.986632,30.5807195", "edge": [157]}, 160 | {"id": 157, "location": "103.9866241,30.5807861", "edge": [158]}, 161 | {"id": 158, "location": "103.9866102,30.58085", "edge": [159]}, 162 | {"id": 159, "location": "103.9865881,30.5809081", "edge": [160]}, 163 | {"id": 160, "location": "103.9865436,30.5809801", "edge": [161]}, 164 | {"id": 161, "location": "103.9865018,30.5810147", "edge": [162]}, 165 | {"id": 162, "location": "103.9864491,30.5810458", "edge": [163]}, 166 | {"id": 163, "location": "103.9863875,30.5810722", "edge": [164]}, 167 | {"id": 164, "location": "103.9863196,30.5810925", "edge": [165]}, 168 | {"id": 165, "location": "103.9862521,30.5811057", "edge": [166]}, 169 | {"id": 166, "location": "103.9861882,30.5811101", "edge": [167]}, 170 | {"id": 167, "location": "103.9861247,30.5811041", "edge": [168]}, 171 | {"id": 168, "location": "103.9860627,30.5810865", "edge": [169]}, 172 | {"id": 169, "location": "103.9860077,30.581057", "edge": [170]}, 173 | {"id": 170, "location": "103.9859588,30.5810177", "edge": [171]}, 174 | {"id": 171, "location": "103.9859194,30.5809795", "edge": [172]}, 175 | {"id": 172, "location": "103.9858921,30.5809451", "edge": [173]}, 176 | {"id": 173, "location": "103.985865,30.5809013", "edge": [174]}, 177 | {"id": 174, "location": "103.9858406,30.5808475", "edge": [175]}, 178 | {"id": 175, "location": "103.9858272,30.5807994", "edge": [176]}, 179 | {"id": 176, "location": "103.985821,30.580763", "edge": [177]}, 180 | {"id": 177, "location": "103.9858186,30.5807327", "edge": [178]}, 181 | {"id": 178, "location": "103.9858172,30.5807077", "edge": [179]}, 182 | {"id": 179, "location": "103.9858167,30.5806858", "edge": [180]}, 183 | {"id": 180, "location": "103.9858169,30.5806515", "edge": [181]}, 184 | {"id": 181, "location": "103.9858184,30.5806353", "edge": [182]}, 185 | {"id": 182, "location": "103.9858229,30.5806104", "edge": [183]}, 186 | {"id": 183, "location": "103.9858274,30.5805687", "edge": [184]}, 187 | {"id": 184, "location": "103.9858275,30.5805119", "edge": [185]}, 188 | {"id": 185, "location": "103.9858241,30.5804478", "edge": [186]}, 189 | {"id": 186, "location": "103.9858172,30.5803788", "edge": [187]}, 190 | {"id": 187, "location": "103.98581,30.5803103", "edge": [188]}, 191 | {"id": 188, "location": "103.9858066,30.5802438", "edge": [189]}, 192 | {"id": 189, "location": "103.9858037,30.5801785", "edge": [190]}, 193 | {"id": 190, "location": "103.9858006,30.5801139", "edge": [191]}, 194 | {"id": 191, "location": "103.9858011,30.5800474", "edge": [192]}, 195 | {"id": 192, "location": "103.9858107,30.5799774", "edge": [193]}, 196 | {"id": 193, "location": "103.985826,30.5799081", "edge": [194]}, 197 | {"id": 194, "location": "103.985849,30.5798421", "edge": [195]}, 198 | {"id": 195, "location": "103.9858883,30.5797804", "edge": [196]}, 199 | {"id": 196, "location": "103.9859407,30.5797275", "edge": [197]}, 200 | {"id": 197, "location": "103.9860063,30.579685", "edge": [198]}, 201 | {"id": 198, "location": "103.9860733,30.5796554", "edge": [199]}, 202 | {"id": 199, "location": "103.986148,30.5796413", "edge": [200]}, 203 | {"id": 200, "location": "103.9862222,30.5796385", "edge": [201]}, 204 | {"id": 201, "location": "103.986281,30.579644", "edge": [202]}, 205 | {"id": 202, "location": "103.986344,30.5796601", "edge": [203]}, 206 | {"id": 203, "location": "103.9864067,30.5796858", "edge": [204]}, 207 | {"id": 204, "location": "103.9864649,30.579719", "edge": [205]}, 208 | {"id": 205, "location": "103.9865149,30.5797506", "edge": [206]}, 209 | {"id": 206, "location": "103.9865522,30.5797799", "edge": [207]}, 210 | {"id": 207, "location": "103.9865872,30.5798209", "edge": [208]}, 211 | {"id": 208, "location": "103.9866195,30.5798744", "edge": [209]}, 212 | {"id": 209, "location": "103.9866444,30.5799361", "edge": [210]}, 213 | {"id": 210, "location": "103.9866636,30.5800032", "edge": [211]}, 214 | {"id": 211, "location": "103.9866791,30.5800719", "edge": [212]}, 215 | {"id": 212, "location": "103.9866906,30.580141", "edge": [213]}, 216 | {"id": 213, "location": "103.9866985,30.5802109", "edge": [214]}, 217 | {"id": 214, "location": "103.9867052,30.5802812", "edge": [215]}, 218 | {"id": 215, "location": "103.9867131,30.5803511", "edge": [216]}, 219 | {"id": 216, "location": "103.9867188,30.5804204", "edge": [217]}, 220 | {"id": 217, "location": "103.9867217,30.5804779", "edge": [218]}, 221 | {"id": 218, "location": "103.9867239,30.5805182", "edge": [219]}, 222 | {"id": 219, "location": "103.9867248,30.5805655", "edge": [220]}, 223 | {"id": 220, "location": "103.9867205,30.5805913", "edge": [221]}, 224 | {"id": 221, "location": "103.9867114,30.5806335", "edge": [222]}, 225 | {"id": 222, "location": "103.9866988,30.5806852", "edge": [223]}, 226 | {"id": 223, "location": "103.9866791,30.5807457", "edge": [224]}, 227 | {"id": 224, "location": "103.9866583,30.5807994", "edge": [225]}, 228 | {"id": 225, "location": "103.9866404,30.5808433", "edge": [226]}, 229 | {"id": 226, "location": "103.9866166,30.5808922", "edge": [227]}, 230 | {"id": 227, "location": "103.9865841,30.5809457", "edge": [228]}, 231 | {"id": 228, "location": "103.9865498,30.580998", "edge": [229]}, 232 | {"id": 229, "location": "103.9865122,30.5810467", "edge": [230]}, 233 | {"id": 230, "location": "103.9864665,30.5810883", "edge": [231]}, 234 | {"id": 231, "location": "103.9864156,30.5811233", "edge": [232]}, 235 | {"id": 232, "location": "103.9863588,30.5811507", "edge": [233]}, 236 | {"id": 233, "location": "103.9862956,30.5811703", "edge": [234]}, 237 | {"id": 234, "location": "103.9862286,30.5811811", "edge": [235]}, 238 | {"id": 235, "location": "103.9861599,30.5811807", "edge": [236]}, 239 | {"id": 236, "location": "103.9860898,30.5811689", "edge": [237]}, 240 | {"id": 237, "location": "103.9860216,30.5811473", "edge": [238]}, 241 | {"id": 238, "location": "103.9859612,30.5811144", "edge": [239]}, 242 | {"id": 239, "location": "103.9859124,30.5810758", "edge": [240]}, 243 | {"id": 240, "location": "103.9858779,30.5810418", "edge": [241]}, 244 | {"id": 241, "location": "103.9858514,30.5810029", "edge": [242]}, 245 | {"id": 242, "location": "103.985825,30.5809508", "edge": [243]}, 246 | {"id": 243, "location": "103.9857985,30.5808906", "edge": [244]}, 247 | {"id": 244, "location": "103.9857767,30.5808225", "edge": [245]}, 248 | {"id": 245, "location": "103.9857626,30.5807506", "edge": [246]}, 249 | {"id": 246, "location": "103.9857547,30.58069", "edge": [247]}, 250 | {"id": 247, "location": "103.9857549,30.5806393", "edge": [248]}, 251 | {"id": 248, "location": "103.9857628,30.5805824", "edge": [249]}, 252 | {"id": 249, "location": "103.9857707,30.5805246", "edge": [250]}, 253 | {"id": 250, "location": "103.9857757,30.5804791", "edge": [251]}, 254 | {"id": 251, "location": "103.9857728,30.5804329", "edge": [252]}, 255 | {"id": 252, "location": "103.9857666,30.580376", "edge": [253]}, 256 | {"id": 253, "location": "103.9857712,30.5803152", "edge": [254]}, 257 | {"id": 254, "location": "103.9857772,30.5802492", "edge": [255]}, 258 | {"id": 255, "location": "103.9857772,30.58018", "edge": [256]}, 259 | {"id": 256, "location": "103.9857777,30.580113", "edge": [257]}, 260 | {"id": 257, "location": "103.9857793,30.580048", "edge": [258]}, 261 | {"id": 258, "location": "103.9857829,30.5799853", "edge": [259]}, 262 | {"id": 259, "location": "103.9857875,30.5799266", "edge": [260]}, 263 | {"id": 260, "location": "103.985803,30.5798732", "edge": [261]}, 264 | {"id": 261, "location": "103.9858361,30.5798227", "edge": [262]}, 265 | {"id": 262, "location": "103.9858935,30.5797576", "edge": [263]}, 266 | {"id": 263, "location": "103.9859414,30.5797291", "edge": [264]}, 267 | {"id": 264, "location": "103.9860003,30.5797059", "edge": [265]}, 268 | {"id": 265, "location": "103.9860711,30.5796886", "edge": [266]}, 269 | {"id": 266, "location": "103.9861527,30.579677", "edge": [267]}, 270 | {"id": 267, "location": "103.9862355,30.5796738", "edge": [268]}, 271 | {"id": 268, "location": "103.9863038,30.5796774", "edge": [269]}, 272 | {"id": 269, "location": "103.98636,30.579686", "edge": [270]}, 273 | {"id": 270, "location": "103.9864192,30.5797039", "edge": [271]}, 274 | {"id": 271, "location": "103.9864744,30.5797337", "edge": [272]}, 275 | {"id": 272, "location": "103.9865266,30.579778", "edge": [273]}, 276 | {"id": 273, "location": "103.9865786,30.579837", "edge": [274]}, 277 | {"id": 274, "location": "103.986618,30.5799033", "edge": [275]}, 278 | {"id": 275, "location": "103.986641,30.5799726", "edge": [276]}, 279 | {"id": 276, "location": "103.9866513,30.5800431", "edge": [277]}, 280 | {"id": 277, "location": "103.9866547,30.5801154", "edge": [278]}, 281 | {"id": 278, "location": "103.9866609,30.5801893", "edge": [279]}, 282 | {"id": 279, "location": "103.98667,30.5802602", "edge": [280]}, 283 | {"id": 280, "location": "103.9866803,30.5803274", "edge": [281]}, 284 | {"id": 281, "location": "103.9866961,30.5803918", "edge": [282]}, 285 | {"id": 282, "location": "103.9867126,30.5804526", "edge": [283]}, 286 | {"id": 283, "location": "103.986726,30.5805101", "edge": [284]}, 287 | {"id": 284, "location": "103.9867387,30.580566", "edge": [285]}, 288 | {"id": 285, "location": "103.9867457,30.5806229", "edge": [286]}, 289 | {"id": 286, "location": "103.9867444,30.5806833", "edge": [287]}, 290 | {"id": 287, "location": "103.9867361,30.5807487", "edge": [288]}, 291 | {"id": 288, "location": "103.9867205,30.5808154", "edge": [289]}, 292 | {"id": 289, "location": "103.9867011,30.58087", "edge": [290]}, 293 | {"id": 290, "location": "103.9866765,30.5809242", "edge": [291]}, 294 | {"id": 291, "location": "103.9866624,30.5809438", "edge": [292]}, 295 | {"id": 292, "location": "103.9866429,30.5809685", "edge": [293]}, 296 | {"id": 293, "location": "103.9866212,30.5809907", "edge": [294]}, 297 | {"id": 294, "location": "103.9865826,30.581025", "edge": [295]}, 298 | {"id": 295, "location": "103.9865307,30.5810665", "edge": [296]}, 299 | {"id": 296, "location": "103.9864718,30.5811081", "edge": [297]}, 300 | {"id": 297, "location": "103.9864091,30.5811433", "edge": [298]}, 301 | {"id": 298, "location": "103.9863409,30.5811674", "edge": [299]}, 302 | {"id": 299, "location": "103.9862684,30.5811808", "edge": [300]}, 303 | {"id": 300, "location": "103.9861958,30.5811847", "edge": [301]}, 304 | {"id": 301, "location": "103.9861245,30.5811798", "edge": [302]}, 305 | {"id": 302, "location": "103.9860544,30.5811679", "edge": [303]}, 306 | {"id": 303, "location": "103.9859869,30.5811472", "edge": [304]}, 307 | {"id": 304, "location": "103.985926,30.581112", "edge": [305]}, 308 | {"id": 305, "location": "103.9858736,30.5810658", "edge": [306]}, 309 | {"id": 306, "location": "103.9858327,30.581016", "edge": [307]}, 310 | {"id": 307, "location": "103.9858011,30.5809624", "edge": [308]}, 311 | {"id": 308, "location": "103.9857772,30.5809078", "edge": [309]}, 312 | {"id": 309, "location": "103.9857666,30.5808563", "edge": [310]}, 313 | {"id": 310, "location": "103.9857697,30.5808092", "edge": [311]}, 314 | {"id": 311, "location": "103.9857813,30.5807521", "edge": [312]}, 315 | {"id": 312, "location": "103.9857874,30.5807295", "edge": [313]}, 316 | {"id": 313, "location": "103.9857884,30.5807152", "edge": [314]}, 317 | {"id": 314, "location": "103.985782,30.5807031", "edge": [315]}, 318 | {"id": 315, "location": "103.9857709,30.5806761", "edge": [0]}, 319 | ] 320 | return mapdata 321 | -------------------------------------------------------------------------------- /unirun.py: -------------------------------------------------------------------------------- 1 | from app.SaveUserData import load_data 2 | from app.Login import check_login_status, login 3 | from app.requests.NewRunRecord import new_run_record 4 | from app.requests.JoinNum import get_join_num 5 | import tkinter as tk 6 | from tkinter import ttk 7 | from tkinter import messagebox 8 | import base64 9 | import json 10 | import threading 11 | 12 | 13 | class Icon(object): 14 | def __init__(self): 15 | self.ig='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' 16 | with open('tmp.ico','wb') as tmp: 17 | tmp.write(base64.b64decode(Icon().ig)) 18 | 19 | # Threads 20 | selected_ids = None 21 | 22 | def show_about_info_thread(): 23 | threading.Thread(target=show_about_info).start() 24 | 25 | def post_new_run_record_thread(): 26 | threading.Thread(target=post_new_run_record, args=(selected_ids,)).start() 27 | 28 | def load_users_num_thread(): 29 | threading.Thread(target=load_users_num).start() 30 | 31 | def user_center_thread(): 32 | threading.Thread(target=user_center).start() 33 | 34 | root = tk.Tk() 35 | root.withdraw() 36 | root.title("校园跑助手") 37 | 38 | screen_width = root.winfo_screenwidth() 39 | screen_height = root.winfo_screenheight() 40 | window_width = 410 41 | window_height = 450 42 | position_top = int(screen_height / 2 - window_height / 2) 43 | position_right = int(screen_width / 2 - window_width / 2) 44 | root.geometry(f"{window_width}x{window_height}+{position_right}+{position_top}") 45 | root.resizable(False, False) 46 | root.iconbitmap('tmp.ico') 47 | 48 | 49 | style = ttk.Style() 50 | style.theme_use('clam') 51 | 52 | default_font = ("思源黑体 CN Heavy", 12) 53 | result_font = ("思源黑体 CN Heavy", 16) 54 | title_font = ('思源黑体 CN Heavy', 30, 'bold') 55 | button_font = ("思源黑体 CN Heavy", 12, 'bold') 56 | bg_color = "white" 57 | fg_color = "black" 58 | button_bg_color = "#FF5F01" 59 | button_fg_color = "white" 60 | 61 | style.configure('TButton', font=button_font, foreground=button_fg_color, background=button_bg_color, relief='flat') 62 | root.configure(bg=bg_color) 63 | 64 | # 关于信息 65 | def show_about_info(event): 66 | about_info_window = tk.Toplevel(root, bg=bg_color) 67 | about_info_window.title("校园跑助手") 68 | about_info_screen_width = about_info_window.winfo_screenwidth() 69 | about_info_screen_height = about_info_window.winfo_screenheight() 70 | about_info_window_width = 410 71 | about_info_window_height = 150 72 | about_info_position_top = int(about_info_screen_height / 2 - about_info_window_height / 2) 73 | about_info_position_right = int(about_info_screen_width / 2 - about_info_window_width / 2) 74 | about_info_window.geometry(f"{about_info_window_width}x{about_info_window_height}+{about_info_position_right}+{about_info_position_top}") 75 | about_info_window.resizable(False, False) 76 | about_info_window.iconbitmap('tmp.ico') 77 | 78 | about_info_label = tk.Label(about_info_window, text="校园跑助手", font=title_font, bg=bg_color, fg=fg_color) 79 | about_info_label.pack(padx=5, pady=5) 80 | 81 | about_info_text = tk.Text(about_info_window, height=4, width=40, font=('思源黑体', 16), fg=fg_color, relief="solid", bd=0) 82 | about_info_text.pack(padx=10, pady=5) 83 | about_info_text.insert(tk.END, "UNIRUN·校园跑助手\n""Developer: yanyaoli\n""Repo: github.com/yanyaoli/unirun") 84 | about_info_text.config(state="disabled") 85 | 86 | # 标题 87 | label_title = tk.Label(root, text="校园跑助手", font=title_font, bg=bg_color, fg=fg_color) 88 | label_title.bind("", show_about_info_thread) 89 | label_title.grid(row=0, column=0, padx=10, pady=10) 90 | 91 | # 账号数量 92 | def load_users_num(): 93 | users_data = load_data() 94 | valid_users = 0 95 | for user_data in users_data: 96 | token = user_data.get('data').get('token') 97 | if check_login_status(token): 98 | valid_users += 1 99 | usersNum.set(f"已登录用户:{valid_users}人") 100 | return valid_users 101 | 102 | usersNum = tk.StringVar(value="正在加载") 103 | usersNum_label = tk.Label(root, textvariable=usersNum, font=default_font, bg=bg_color, fg=fg_color) 104 | usersNum_label.grid(row=1, column=0, padx=5) 105 | 106 | # 用户中心 107 | def user_center(): 108 | global tree 109 | user_center_window = tk.Toplevel(root, bg=bg_color) 110 | 111 | user_center_window_screen_width = user_center_window.winfo_screenwidth() 112 | user_center_window_screen_height = user_center_window.winfo_screenheight() 113 | user_center_window_width = 450 114 | user_center_window_height = 350 115 | user_center_window_position_top = int(user_center_window_screen_height / 2 - user_center_window_height / 2) 116 | user_center_window_position_right = int(user_center_window_screen_width / 2 - user_center_window_width / 2) 117 | user_center_window.geometry(f"{user_center_window_width}x{user_center_window_height}+{user_center_window_position_right}+{user_center_window_position_top}") 118 | 119 | user_center_window.withdraw() 120 | root.update() 121 | user_center_window.deiconify() 122 | 123 | user_center_window.transient(root) 124 | user_center_window.grab_set() 125 | user_center_window.title("校园跑助手") 126 | user_center_window.iconbitmap('tmp.ico') 127 | user_center_window.resizable(False, False) 128 | 129 | 130 | user_center_label = tk.Label(user_center_window, text="账号管理", font=title_font, bg=bg_color, fg=fg_color) 131 | user_center_label.pack(padx=5, pady=5) 132 | 133 | tree = ttk.Treeview(user_center_window, columns=('id', 'studentName', 'studentInfo'), show='headings') 134 | tree.column('id', width=50) 135 | tree.heading('id', text='序号') 136 | tree.column('studentName', width=100) 137 | tree.heading('studentName', text='姓名') 138 | tree.column('studentInfo', width=250) 139 | tree.heading('studentInfo', text='状态信息') 140 | tree.pack(expand=True, fill='both') 141 | 142 | def disable_close(): 143 | user_center_window.protocol("WM_DELETE_WINDOW", lambda: None) 144 | def enable_close(): 145 | user_center_window.protocol("WM_DELETE_WINDOW", user_center_window.destroy) 146 | 147 | # 更新用户列表 148 | def update_user_list(): 149 | disable_close() 150 | for item in tree.get_children(): 151 | tree.delete(item) 152 | 153 | users_data = load_data() 154 | for user_data in users_data: 155 | token = user_data.get('data').get('token') 156 | schoolId = user_data.get('data').get('schoolId') 157 | studentId = user_data.get('data').get('studentId') 158 | id = user_data.get('id') 159 | studentName = user_data.get('data').get('studentName') 160 | studentInfo = str(get_join_num(token, schoolId, studentId)) 161 | tree.insert('', 'end', values=(id, studentName, studentInfo)) 162 | enable_close() 163 | 164 | def update_user_list_thread(): 165 | threading.Thread(target=update_user_list).start() 166 | update_user_list_thread() 167 | 168 | # 全选反选 169 | def toggle_select_all(): 170 | items = tree.get_children() 171 | 172 | if set(items) == set(tree.selection()): 173 | tree.selection_remove(items) 174 | select_all_button.config(text="全选") 175 | else: 176 | tree.selection_set(items) 177 | select_all_button.config(text="反选") 178 | 179 | # 添加用户 180 | def add_user(): 181 | threading.Thread(target=show_login_window).start() 182 | 183 | # 删除用户 184 | def delete_user(): 185 | selected_items = tree.selection() 186 | users_data = load_data() 187 | for item in selected_items: 188 | item_values = tree.item(item, "values") 189 | id_value = int(item_values[0]) # 转换为整数 190 | for user_data in users_data: 191 | if int(user_data.get('id')) == id_value: # 转换为整数 192 | users_data.remove(user_data) 193 | break 194 | tree.delete(item) 195 | with open('user_data.json', 'w', encoding='utf-8') as f: 196 | json.dump(users_data, f) 197 | update_user_list_thread() 198 | 199 | # 确认选择 200 | def confirm_selection(): 201 | global selected_ids 202 | selected_items = tree.selection() 203 | selected_ids = [] 204 | for item in selected_items: 205 | item_values = tree.item(item, "values") 206 | id_value = item_values[0] 207 | selected_ids.append(id_value) 208 | user_center_window.destroy() 209 | usersNum.set(f"已选择用户:{len(selected_ids)}人") 210 | return selected_ids 211 | 212 | # Threads 213 | def delete_user_thread(): 214 | threading.Thread(target=delete_user).start() 215 | 216 | def confirm_selection_thread(): 217 | threading.Thread(target=confirm_selection).start() 218 | 219 | button_frame = tk.Frame(user_center_window, bg=bg_color) 220 | button_frame.pack(pady=5) 221 | 222 | delete_button = ttk.Button(button_frame, text="删除用户", command=delete_user_thread, width=8, style='TButton') 223 | delete_button.grid(row=0, column=0, padx=5) 224 | 225 | add_button = ttk.Button(button_frame, text="添加用户", command=add_user, width=8, style='TButton') 226 | add_button.grid(row=0, column=1, padx=5) 227 | 228 | select_all_button = ttk.Button(button_frame, text="全选", command=toggle_select_all, width=8, style='TButton') 229 | select_all_button.grid(row=0, column=2, padx=5) 230 | 231 | confirm_button = ttk.Button(button_frame, text="确定", command=confirm_selection_thread, width=8, style='TButton') 232 | confirm_button.grid(row=0, column=3, padx=5) 233 | 234 | # 登录窗口 235 | def show_login_window(): 236 | login_window = tk.Toplevel(user_center_window, bg=bg_color) 237 | 238 | login_window_screen_width = login_window.winfo_screenwidth() 239 | login_window_screen_height = login_window.winfo_screenheight() 240 | login_window_width = 300 241 | login_window_height = 200 242 | login_position_top = int(login_window_screen_height / 2 - login_window_height / 2) 243 | login_position_right = int(login_window_screen_width / 2 - login_window_width / 2) 244 | login_window.geometry(f"{login_window_width}x{login_window_height}+{login_position_right}+{login_position_top}") 245 | 246 | login_window.withdraw() 247 | user_center_window.update() 248 | login_window.deiconify() 249 | 250 | login_window.transient(user_center_window) 251 | login_window.grab_set() 252 | login_window.title("校园跑助手") 253 | login_window.iconbitmap('tmp.ico') # 如果没有图标文件,可以暂时注释掉 254 | login_window.resizable(False, False) 255 | 256 | 257 | login_title_label = tk.Label(login_window,text="账号登录", font=title_font, bg=bg_color, fg="#FF5F01") 258 | login_title_label.pack(padx=10, pady=10) 259 | 260 | phone_entry = tk.Entry(login_window, width=20, font=default_font, relief="solid", borderwidth=1, bg=bg_color, fg=fg_color) 261 | phone_entry.pack(padx=5, pady=5) 262 | 263 | password_entry = tk.Entry(login_window, width=20, font=default_font, relief="solid", borderwidth=1, bg=bg_color, fg=fg_color) 264 | password_entry.pack(padx=5, pady=5) 265 | 266 | def clear_placeholder(event): 267 | if event.widget.get() == event.widget.placeholder: 268 | event.widget.delete(0, tk.END) 269 | 270 | def add_placeholder(event): 271 | if event.widget.get() == '': 272 | event.widget.insert(0, event.widget.placeholder) 273 | 274 | phone_entry.placeholder = "请输入手机号码" 275 | phone_entry.insert(0, phone_entry.placeholder) 276 | phone_entry.bind("", clear_placeholder) 277 | phone_entry.bind("", add_placeholder) 278 | 279 | password_entry.placeholder = "请输入密码" 280 | password_entry.insert(0, password_entry.placeholder) 281 | password_entry.bind("", clear_placeholder) 282 | password_entry.bind("", add_placeholder) 283 | 284 | def run_login(): 285 | phone = phone_entry.get() 286 | password = password_entry.get() 287 | threading.Thread(target=login, args=(phone, password)).start() 288 | if login(phone, password): 289 | login_window.destroy() 290 | load_users_num_thread() 291 | update_user_list_thread() 292 | return True 293 | else: 294 | messagebox.showerror("校园跑助手", "登录失败,请检查手机号和密码是否正确") 295 | return False 296 | 297 | login_button = ttk.Button(login_window, text="登录", command=run_login, style='TButton') 298 | login_button.pack(padx=5, pady=10) 299 | 300 | # 账号管理 301 | button_run = ttk.Button(root, width=10, text="账号管理", command=user_center_thread, style='TButton') 302 | button_run.grid(row=2, column=0, padx=5, pady=5) 303 | 304 | # 默认跑步时长和里程 305 | default_run_time = tk.StringVar(value='59') 306 | default_run_distance = tk.StringVar(value='4999') 307 | 308 | # 跑步里程输入框 309 | run_distance_frame = tk.Frame(root, bg=bg_color) 310 | run_distance_frame.grid(row=3, column=0, padx=5, pady=3) 311 | 312 | distance_label = tk.Label(run_distance_frame, text="跑步里程 ( 米 ):", font=default_font, bg=bg_color, fg=fg_color) 313 | distance_label.pack(side=tk.LEFT, padx=5, pady=3) 314 | 315 | run_distance_entry = ttk.Spinbox(run_distance_frame, width=5, textvariable=default_run_distance, font=default_font, from_=1, to=5000, increment=99) 316 | run_distance_entry.pack(side=tk.LEFT, padx=3) 317 | 318 | # 跑步时长输入框 319 | time_frame = tk.Frame(root, bg=bg_color) 320 | time_frame.grid(row=4, column=0, padx=5, pady=3) 321 | 322 | time_label = tk.Label(time_frame, text="跑步时长 (分钟):", font=default_font, bg=bg_color, fg=fg_color) 323 | time_label.pack(side=tk.LEFT, padx=5, pady=3) 324 | 325 | run_time_entry = ttk.Spinbox(time_frame, width=5, textvariable=default_run_time, font=default_font, from_=30, to=100, increment=10) 326 | run_time_entry.pack(side=tk.LEFT, padx=5, pady=3) 327 | 328 | # 地图选择 329 | map_frame = tk.Frame(root, bg=bg_color) 330 | map_frame.grid(row=5, column=0, padx=5) 331 | 332 | map_label = tk.Label(map_frame, text="地图选择:", font=default_font, bg=bg_color, fg=fg_color) 333 | map_label.pack(side=tk.LEFT, padx=5) 334 | 335 | map_option_menu = ttk.Combobox(map_frame, background='pink', font=default_font, state='readonly') 336 | map_option_menu.pack(side=tk.LEFT, padx=5, pady=5) 337 | 338 | map_option_menu['value'] = ('成都信息工程大学(航空港校区)', '成都信息工程大学(龙泉校区)' , '成都中医药大学(温江校区)') 339 | map_option_menu.current(0) 340 | 341 | def getMapChoice(): 342 | choice = map_option_menu.get() 343 | print(choice) 344 | if choice == "成都信息工程大学(航空港校区)": 345 | return 'cuit_hkg' 346 | elif choice == "成都信息工程大学(龙泉校区)": 347 | return 'cuit_lqy' 348 | elif choice == "成都中医药大学(温江校区)": 349 | return 'cdutcm_wj' 350 | else: 351 | return "cuit_lqy" 352 | 353 | # 新增跑步记录 354 | def post_new_run_record(selected_ids): 355 | global result_text 356 | result_text.config(state="normal") 357 | result_text.delete(1.0, tk.END) 358 | runDistance = int(run_distance_entry.get()) 359 | runTime = int(run_time_entry.get()) 360 | map_choice = getMapChoice() 361 | if runDistance <= 0 or runTime <= 0: 362 | result_text.insert(tk.END, "请输入有效的跑步里程和时长。\n") 363 | result_text.config(state="disabled") 364 | return 365 | try: 366 | users_data = load_data() 367 | selected_ids = selected_ids 368 | if not selected_ids: 369 | user_tokens_and_ids = [(user_data.get('data').get('token'), user_data.get('id'), user_data.get('data').get('studentName'), user_data.get('data').get('schoolId')) for user_data in users_data] 370 | else: 371 | user_tokens_and_ids = [(user_data.get('data').get('token'), user_data.get('id'), user_data.get('data').get('studentName'), user_data.get('data').get('schoolId')) for user_data in users_data if str(user_data.get('id')) in selected_ids] 372 | for token, userId, studentName, schoolId in user_tokens_and_ids: 373 | result = new_run_record(runDistance, runTime, map_choice, token, userId, studentName, schoolId) 374 | result_text.insert(tk.END, result) 375 | load_users_num_thread() 376 | result_text.config(state="disabled") 377 | except ValueError as e: 378 | result_text.insert(tk.END, f"运行时发生错误:{e}\n") 379 | result_text.config(state="disabled") 380 | 381 | # 提交按钮 382 | button_run = ttk.Button(root, width=10, text="立即提交", command=post_new_run_record_thread, style='TButton') 383 | button_run.grid(row=6, column=0, padx=5, pady=5) 384 | 385 | # 结果显示 386 | result_text = tk.Text(root, height=7, width=35, font=result_font, bg=bg_color, fg=fg_color, relief='solid') 387 | result_text.grid(row=7, column=0, padx=10, pady=10) 388 | 389 | root.deiconify() 390 | 391 | if __name__ == '__main__': 392 | load_users_num_thread() 393 | root.mainloop() --------------------------------------------------------------------------------