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