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,75 @@
|
||||
"""Show an FPL team's public transfer history, newest first (no login needed)."""
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import sys
|
||||
from datetime import datetime
|
||||
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 parse the JSON into Python objects."""
|
||||
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("--team-id", type=positive_int, default=2134)
|
||||
parser.add_argument("--gameweek", type=positive_int, choices=range(1, 39))
|
||||
args = parser.parse_args()
|
||||
|
||||
# Public history contains completed transfers released by the API.
|
||||
transfers = get_json(f"entry/{args.team_id}/transfers/")
|
||||
if args.gameweek is not None:
|
||||
transfers = [item for item in transfers if item["event"] == args.gameweek]
|
||||
transfers.sort(key=lambda item: item["time"], reverse=True)
|
||||
|
||||
print(f"Transfer history for team {args.team_id}")
|
||||
if args.gameweek is not None:
|
||||
print(f"Gameweek: {args.gameweek}")
|
||||
print(f"Transfers: {len(transfers)}")
|
||||
if not transfers:
|
||||
print("No public transfers found for this selection.")
|
||||
return
|
||||
|
||||
# Transfer records contain IDs; bootstrap data supplies readable player names.
|
||||
bootstrap = get_json("bootstrap-static/")
|
||||
players = {player["id"]: player["web_name"] for player in bootstrap["elements"]}
|
||||
|
||||
print(f"\n{'Date/time (UTC)':<20} {'GW':>3} {'Player out':<24} {'Sold':>8} {'Player in':<24} {'Bought':>8}")
|
||||
for transfer in transfers:
|
||||
timestamp = datetime.fromisoformat(transfer["time"].replace("Z", "+00:00"))
|
||||
date = timestamp.strftime("%Y-%m-%d %H:%M:%S")
|
||||
player_out = players.get(transfer["element_out"], f"ID {transfer['element_out']}")
|
||||
player_in = players.get(transfer["element_in"], f"ID {transfer['element_in']}")
|
||||
# API prices are in tenths of a million pounds: 61 means £6.1m.
|
||||
sold = f"£{transfer['element_out_cost'] / 10:.1f}m"
|
||||
bought = f"£{transfer['element_in_cost'] / 10:.1f}m"
|
||||
print(
|
||||
f"{date:<20} {transfer['event']:>3} {player_out:<24} {sold:>8} "
|
||||
f"{player_in:<24} {bought:>8}"
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
main()
|
||||
except (URLError, TimeoutError, OSError, ValueError, KeyError) as exc:
|
||||
print(f"Unable to load transfer data: {exc}", file=sys.stderr)
|
||||
print("Check the team ID and connection. The API may also be unavailable.", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
Reference in new issue
Block a user