Add Python examples for FPL teams, league standings and transfers
This commit is contained in:
4 files changed
+304
No files matched your search
@@ -0,0 +1,71 @@
|
||||
"""Print classic mini-league standings, including optional pagination."""
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import sys
|
||||
from urllib.error import URLError
|
||||
from urllib.request import Request, urlopen
|
||||
|
||||
BASE_URL = "https://fantasy.premierleague.com/api/"
|
||||
|
||||
|
||||
def get_json(path):
|
||||
"""Send an HTTP GET request and turn the JSON response into a Python dict."""
|
||||
request = Request(
|
||||
BASE_URL + path,
|
||||
headers={"User-Agent": "FPL-API-Demo/1.0", "Accept": "application/json"},
|
||||
)
|
||||
with urlopen(request, timeout=20) as response:
|
||||
return json.load(response)
|
||||
|
||||
|
||||
def positive_int(value):
|
||||
number = int(value)
|
||||
if number < 1:
|
||||
raise argparse.ArgumentTypeError("must be a positive integer")
|
||||
return number
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("--league-id", type=positive_int, default=37803)
|
||||
parser.add_argument("--page", type=positive_int, default=1)
|
||||
parser.add_argument(
|
||||
"--all-pages", action="store_true", help="fetch all pages from --page onwards"
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
page = args.page
|
||||
while True:
|
||||
# This example uses classic scoring; head-to-head leagues use other endpoints.
|
||||
data = get_json(
|
||||
f"leagues-classic/{args.league_id}/standings/?page_standings={page}"
|
||||
)
|
||||
if page == args.page:
|
||||
print(f"League: {data['league']['name']} (ID {args.league_id})")
|
||||
print(f"\nPage {page}")
|
||||
print(f"{'Rank':<6} {'Team':<30} {'Manager':<26} {'GW':>5} {'Total':>7} {'Entry ID':>10}")
|
||||
standings = data["standings"]
|
||||
for entry in standings["results"]:
|
||||
print(
|
||||
f"{entry['rank']:<6} {entry['entry_name']:<30} "
|
||||
f"{entry['player_name']:<26} {entry['event_total']:>5} "
|
||||
f"{entry['total']:>7} {entry['entry']:>10}"
|
||||
)
|
||||
if not standings["results"]:
|
||||
print("No ranked entries on this page.")
|
||||
if not standings["has_next"]:
|
||||
break
|
||||
if not args.all_pages:
|
||||
print(f"\nMore results available: use --page {page + 1} or --all-pages.")
|
||||
break
|
||||
page += 1
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
main()
|
||||
except (URLError, TimeoutError, OSError, ValueError, KeyError) as exc:
|
||||
print(f"Unable to load league data: {exc}", file=sys.stderr)
|
||||
print("Check the classic league ID and connection. The API may also be unavailable.", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
Reference in new issue
Block a user