"""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)