mirror of
https://github.com/FliegendeWurst/naviki-gpx-download.git
synced 2024-11-21 11:24:57 +00:00
Initial commit
This commit is contained in:
commit
e15a52a9ad
7
README.md
Normal file
7
README.md
Normal file
@ -0,0 +1,7 @@
|
||||
# naviki-gpx-download
|
||||
|
||||
Download a copy of your Naviki tracks.
|
||||
|
||||
## Usage
|
||||
|
||||
Download `naviki_gpx_download.py` and modify the configuration variables at the start of the script.
|
63
naviki_gpx_download.py
Normal file
63
naviki_gpx_download.py
Normal file
@ -0,0 +1,63 @@
|
||||
from bs4 import BeautifulSoup
|
||||
import requests
|
||||
import time
|
||||
import re
|
||||
import pathlib
|
||||
|
||||
# set this to your token (open naviki.org, login, copy the value of the Authorization header in the browser dev tools)
|
||||
oauth_token = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
|
||||
# (optional) select which routes to export
|
||||
route_types = "routedAll,recordedMy,recordedOthers"
|
||||
# GPX files will be saved in this directory
|
||||
output_dir = pathlib.Path("/tmp")
|
||||
title_pattern = r'(?P<day>\d\d).(?P<month>\d\d).(?P<year>\d\d), (?P<hour>\d\d):(?P<minute>\d\d)'
|
||||
century = "20"
|
||||
timestamp = str(int(time.time()))
|
||||
|
||||
s = requests.Session()
|
||||
s.headers.update({'Authorization': f'Bearer {oauth_token}'})
|
||||
s.headers.update({'Accept': 'application/json'})
|
||||
|
||||
more_to_download = True
|
||||
offset = 0
|
||||
|
||||
while more_to_download:
|
||||
r = s.get(f'https://www.naviki.org/naviki/api/v6/Way/2/findUserWaysByFilter/?filter={route_types}&sort=crdateDesc&offset={offset}&fullDataSet=0&_={timestamp}')
|
||||
j = r.json()
|
||||
more_to_download = len(j["ways"]) > 0
|
||||
offset += len(j["ways"])
|
||||
for way in j["ways"]:
|
||||
uuid = way["uuid"]
|
||||
title = way["title"]
|
||||
print(title, uuid)
|
||||
m = re.search(title_pattern, title)
|
||||
if m is None:
|
||||
print("failed to extract time from title!")
|
||||
# it is possible to extract the time from way["crdate"]
|
||||
# datetime.utcfromtimestamp(way["crdate"]).strftime("%Y-%m-%d_%H-%M")
|
||||
# but this requires knowing the time zone!
|
||||
# which is not returned by the API
|
||||
more_to_download = False # exit outer loop
|
||||
break
|
||||
new_title = century + m.group("year") + "-" + m.group("month") + "-" + m.group("day")
|
||||
new_title += "_" + m.group("hour") + "-" + m.group("minute")
|
||||
new_title += "_Naviki.gpx"
|
||||
form_data = {
|
||||
"wayUuid": uuid,
|
||||
"oauth_token": oauth_token,
|
||||
"format": "gpx"
|
||||
}
|
||||
dl_headers = {
|
||||
"Authorization": None # token is passed in form data
|
||||
}
|
||||
dl = s.post('https://www.naviki.org/naviki/api/v6/Util/wayToFileWithUser/',
|
||||
data=form_data,
|
||||
headers=dl_headers)
|
||||
if not dl.text.startswith("<?xml"):
|
||||
print("failed to download GPX!")
|
||||
more_to_download = False # exit outer loop
|
||||
break
|
||||
save_path = output_dir.joinpath(new_title)
|
||||
with open(save_path, "wb") as f:
|
||||
print("saving", save_path)
|
||||
f.write(dl.text.encode())
|
Loading…
Reference in New Issue
Block a user