├── 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 |
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()
--------------------------------------------------------------------------------