Files
fpl_api_examples/transfers.py
T

76 lines
2.9 KiB
Python

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