Seems to work so far
This commit is contained in:
commit
3194493e64
6 changed files with 98 additions and 0 deletions
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
venv/
|
||||||
|
*.pyc
|
||||||
|
__pycache__/
|
||||||
|
settings.ini
|
0
LICENSE
Normal file
0
LICENSE
Normal file
7
README.md
Normal file
7
README.md
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# TrackingMore API Tool
|
||||||
|
|
||||||
|
This is a simple Python tool to use the TrackingMore API.
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
This tool has no dependencies other than Python 3. It has been tested with Python 3.10.9, but should work with any Python >= 3.8.
|
47
classes/api.py
Normal file
47
classes/api.py
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
from typing import Optional
|
||||||
|
from json import dumps, loads
|
||||||
|
|
||||||
|
import urllib.request
|
||||||
|
|
||||||
|
|
||||||
|
class TrackingMore:
|
||||||
|
def __init__(self, api_key: str):
|
||||||
|
self.api_key = api_key
|
||||||
|
|
||||||
|
def request(self, endpoint: str, payload: Optional[dict | str] = None, method: Optional[str] = None):
|
||||||
|
url = f"https://api.trackingmore.com/v3/trackings/{endpoint}"
|
||||||
|
|
||||||
|
headers = {"Tracking-Api-Key": self.api_key}
|
||||||
|
|
||||||
|
if isinstance(payload, dict):
|
||||||
|
payload = dumps(payload)
|
||||||
|
|
||||||
|
if payload:
|
||||||
|
headers["Content-Type"] = "application/json"
|
||||||
|
|
||||||
|
if payload and not method:
|
||||||
|
method = "POST"
|
||||||
|
elif method:
|
||||||
|
method = method.upper()
|
||||||
|
else:
|
||||||
|
method = "GET"
|
||||||
|
|
||||||
|
req = urllib.request.Request(
|
||||||
|
url, payload.encode() if payload else None, headers=headers, method=method)
|
||||||
|
|
||||||
|
res = urllib.request.urlopen(req)
|
||||||
|
return loads(res.read())
|
||||||
|
|
||||||
|
def get_carriers(self):
|
||||||
|
return self.request("carriers").get("data", [])
|
||||||
|
|
||||||
|
def detect_carrier(self, tracking_number: str):
|
||||||
|
return self.request("detect", {"tracking_number": tracking_number}).get("data", {})
|
||||||
|
|
||||||
|
def track_shipment(self, tracking_number: str, carrier_code: str):
|
||||||
|
payload = {
|
||||||
|
"tracking_number": tracking_number,
|
||||||
|
"courier_code": carrier_code or self.detect_carrier(tracking_number)[0]["courier_code"]
|
||||||
|
}
|
||||||
|
|
||||||
|
return self.request("realtime", payload).get("data", {})
|
2
settings.dist.ini
Normal file
2
settings.dist.ini
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
[TrackingMore]
|
||||||
|
APIKey = YourAPIKey
|
38
tracker.py
Normal file
38
tracker.py
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
from classes.api import TrackingMore
|
||||||
|
|
||||||
|
from configparser import ConfigParser
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
config = ConfigParser()
|
||||||
|
config.read('settings.ini')
|
||||||
|
|
||||||
|
parser = ArgumentParser()
|
||||||
|
|
||||||
|
parser.add_argument('tracking_number', nargs="?", help='Tracking number to track')
|
||||||
|
parser.add_argument('--carrier', '-c', help='Carrier to track (carrier code – see --list-carriers/-l, auto-detected if not specified)')
|
||||||
|
parser.add_argument('--detect-carrier', '-d', action='store_true', help='Detect and output carrier from tracking number')
|
||||||
|
parser.add_argument('--list-carriers', '-l', action='store_true', help='List carriers')
|
||||||
|
parser.add_argument('--key', '-k', help='TrackingMore API Key (overrides config)')
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
if (args.tracking_number or args.carrier) and args.list_carriers:
|
||||||
|
print("Cannot specify both tracking number and --list-carriers/-l")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
api_key = args.key or config['TrackingMore']['APIKey']
|
||||||
|
|
||||||
|
api = TrackingMore(api_key)
|
||||||
|
|
||||||
|
if args.list_carriers:
|
||||||
|
for carrier in api.get_carriers():
|
||||||
|
print(f"{carrier['courier_name']} ({carrier['courier_code']})")
|
||||||
|
|
||||||
|
elif args.tracking_number:
|
||||||
|
if args.detect_carrier:
|
||||||
|
for carrier in api.detect_carrier(args.tracking_number):
|
||||||
|
print(f"{carrier['courier_name']} ({carrier['courier_code']})")
|
||||||
|
|
||||||
|
else:
|
||||||
|
print(api.track_shipment(args.tracking_number, args.carrier))
|
Loading…
Reference in a new issue