utilisation des classes et dernières modifications

This commit is contained in:
Mahel Fonteneau 2025-02-14 16:54:10 +01:00
parent f477cfaf99
commit c1ec22fbb2
9 changed files with 76 additions and 66 deletions

View File

@ -1,2 +1,9 @@
bienvenue sur le projet utilisant l'API de league of legends Bienvenue sur le projet utilisant l'API de league of legends
Ce site flask est un projet dont le but est d'afficher le classement des meilleurs joueurs de league of legends en utilisant l'API de Riot Games pour avoir des données en temps réel
Vous pouvez choisir une région et le nombre de joueur à afficher puis le site se charge du reste
Pour utiliser le projet il faut :
- Cloner le depot
- Créer un environnement virtuel puis faire : pip install -r requirements.txt
- Changer la clé d'API si elle n'est plus valide (24h) sur https://developer.riotgames.com/ elle se trouve dans appli/fonctions.py
- Se rendre à l'URL http://localhost:5000/

10
app.py
View File

@ -5,6 +5,7 @@ from PIL import Image
from appli import models from appli import models
import os import os
from appli.fonctions import main from appli.fonctions import main
from appli.models import Player
template_dir=os.path.abspath("./appli/templates") template_dir=os.path.abspath("./appli/templates")
app = Flask(__name__, template_folder=template_dir, static_folder='appli/static') app = Flask(__name__, template_folder=template_dir, static_folder='appli/static')
@ -14,14 +15,15 @@ app.config['SECRET_KEY'] = 'ma_cle_secrete'
@app.route("/", methods=["GET", "POST"]) @app.route("/", methods=["GET", "POST"])
def index(): def index():
form = RegionForm() form = RegionForm()
data_list = [] players=[]
if form.validate_on_submit(): if form.validate_on_submit():
region = form.region.data region = form.region.data
player_count = form.player_count.data player_count = form.player_count.data
data_list = main(region, player_count) players = main(region, player_count) or []
return render_template("index.html", form=form, data_list=data_list) return render_template("index.html", form=form, players=players)
if __name__ == "__main__": if __name__ == "__main__":
app.run(debug=True) app.run(debug=True)

View File

@ -3,56 +3,60 @@ from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired, Regexp from wtforms.validators import DataRequired, Regexp
import requests import requests
from flask import Flask, render_template, redirect, url_for, flash, request from flask import Flask, render_template, redirect, url_for, flash, request
import sys
import os
sys.path.append(os.path.dirname(os.path.abspath(__file__))) #sans cette ligne le fichier ne trouve pas models.py je ne sais pas pourquoi
from models import Player
import requests
from models import Player
def main(region, player_count): def main(region, player_count):
regionapi=region
nbjoueur = player_count api_key = 'RGAPI-121baff0-66be-475c-bd41-086e01ce3678'
api_key = 'RGAPI-526e580d-b331-4bb0-a343-4f33fa30988c'
data_list = []
time = 1 #utiliser pour le timeout dans les requetes api
#les pages mettent beaucoup de temps à charger mais si on réduit le timeout les pages ne chargeront pas
#/!\ IMPORTANT la clé change toutes les 24h #/!\ IMPORTANT la clé change toutes les 24h
# Dernière clé activé : valide jusqu'au 14/02 à 12h26 # Dernière clé activé : valide jusqu'au 15/02 à 13h00
# veuillez la recréer sur le site riot games developer # veuillez la recréer sur le site riot games developer
time = 1 #utiliser pour le timeout dans les requetes api
#les pages mettent beaucoup de temps à charger mais si on réduit le timeout les pages ne chargeront peut être pas
#Cette url permet de récupérer : leagueId, queueType, tier, rank, summonerId, leaguePoints, #Cette url permet de récupérer : leagueId, queueType, tier, rank, summonerId, leaguePoints,
#wins, losses, veteran, inactive,freshBlood, hotstreak, #wins, losses, veteran, inactive,freshBlood, hotstreak,
#on va avoir besoin des leaguePoints pour faire un classement, et des summonerId pour retrouver les pseudos des joueurs plus tard #on va avoir besoin des leaguePoints pour faire un classement, et des summonerId pour retrouver les pseudos des joueurs plus tard
api_url2 = (f"https://{regionapi}.api.riotgames.com/lol/league-exp/v4/entries/RANKED_SOLO_5x5/CHALLENGER/I?page=1&api_key={api_key}") api_url2 = (f"https://{region}.api.riotgames.com/lol/league-exp/v4/entries/RANKED_SOLO_5x5/CHALLENGER/I?page=1&api_key={api_key}")
resp2 = requests.get(api_url2, timeout=time) resp2 = requests.get(api_url2, timeout=time)
player_info = resp2.json() player_info = resp2.json()
summoner_ids = [entry['summonerId'] for entry in player_info]
lp = [entry['leaguePoints'] for entry in player_info]
for i in range(nbjoueur): players = []
for entry in player_info[:player_count]:
summoner_id = summoner_ids[i] summoner_id = entry.get('summonerId')
api_summonerid = summoner_ids[i] league_points = entry.get('leaguePoints')
league_points = lp[i] players.append({
#print(f"SummonerId: {summoner_id}") 'summoner_id': summoner_id,
#cette api utilise le summonerid et retourne le puuid qui sera utile plus tard pour récupérer les pseudos et tag 'league_points': league_points,
api_url5 = (f"https://{regionapi}.api.riotgames.com/lol/summoner/v4/summoners/{api_summonerid}?api_key={api_key}") })
#cette api utilise le summonerid et retourne le puuid qui sera utile plus tard pour récupérer les pseudos et tag
for player in players:
summoner_id = player['summoner_id']
api_url5 = f"https://{region}.api.riotgames.com/lol/summoner/v4/summoners/{summoner_id}?api_key={api_key}"
resp5 = requests.get(api_url5, timeout=time) resp5 = requests.get(api_url5, timeout=time)
player_data = resp5.json() player_data = resp5.json()
player_puuid = player_data.get('puuid') player['puuid'] = player_data.get('puuid')
#cette api utilise le puuid et retourne les pseudos et tag
for player in players:
if player['puuid']:
api_url6 = f"https://europe.api.riotgames.com/riot/account/v1/accounts/by-puuid/{player['puuid']}?api_key={api_key}"
resp6 = requests.get(api_url6, timeout=time)
data = resp6.json()
player['name'] = data.get('gameName')
player['tag'] = data.get('tagLine')
#cette api utilise le puuid et retourne les pseudos et tag final_players = []
api_url6 = (f"https://europe.api.riotgames.com/riot/account/v1/accounts/by-puuid/{player_puuid}?api_key={api_key}") for i, player in enumerate(players):
resp6 = requests.get(api_url6, timeout=time) final_players.append(Player(name=player['name'],tag=player['tag'],league_points=player['league_points'],rank=i + 1,summoner_id=player['summoner_id']))
data = resp6.json()
Name = data.get('gameName')
Tag = data.get('tagLine')
#boucle pour l'affichage du rang return final_players
i = 1
for player in data_list:
player["rang"] = i
i += 1
#ajout des données dans data_list
data_list.append({"Name": Name, "Tag": Tag, "league_points": league_points, "rang": i})
return data_list

View File

@ -0,0 +1,10 @@
class Player:
def __init__(self, name, tag, league_points, rank, summoner_id):
self.name = name
self.tag = tag
self.league_points = league_points
self.rank = rank
self.summoner_id = summoner_id
def __repr__(self):
return f"Player(Name={self.name}, Tag={self.tag}, LP={self.league_points}, Rank={self.rank}, summoner_id={self.summoner_id})"

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -2,14 +2,12 @@
<html lang="fr"> <html lang="fr">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/styles.css') }}"> <link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
<title>{% block title %}LoL Classement{% endblock %}</title>
<title>{% block title %}Mon Site{% endblock %}</title>
</head> </head>
<body> <body>
<header> <header>
<link rel="icon" type="image/x-icon" href="{{ url_for('static', filename='img/favicon.ico') }}">
<img src="{{ url_for('static', filename='/img/logo.png') }}" class="logosite"> <img src="{{ url_for('static', filename='/img/logo.png') }}" class="logosite">
<img src="{{ url_for('static', filename='/img/europelogo.png') }}" class="logo"> <img src="{{ url_for('static', filename='/img/europelogo.png') }}" class="logo">
<img src="{{ url_for('static', filename='/img/nalogo.png') }}" class="logo"> <img src="{{ url_for('static', filename='/img/nalogo.png') }}" class="logo">
@ -18,7 +16,6 @@
<img src="{{ url_for('static', filename='/img/japonlogo.png') }}" class="logo"> <img src="{{ url_for('static', filename='/img/japonlogo.png') }}" class="logo">
<h1>Classement League of Legends</h1> <h1>Classement League of Legends</h1>
</header> </header>
<main> <main>
{% block content %}{% endblock %} {% block content %}{% endblock %}
</main> </main>

View File

@ -1,20 +1,12 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block title %}Formulaire{% endblock %} {% block title %}Formulaire{% endblock %}
{% block content %} {% block content %}
<div class="container">
<form method="POST"> <form method="POST">
{{ form.hidden_tag() }} {{ form.hidden_tag() }}
<div> {{ form.region.label }}<br>
{{ form.region.label }}<br> {{ form.region() }}<br>
{{ form.region() }}
</div>
<br>
{{ form.submit() }} {{ form.submit() }}
</form> </form>
</div>
{% endblock %} {% endblock %}

View File

@ -1,4 +1,3 @@
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/styles.css') }}">
{% extends "base.html" %} {% extends "base.html" %}
{% block content %} {% block content %}
<form method="POST"> <form method="POST">
@ -14,8 +13,7 @@
<br> <br>
{{ form.submit() }} {{ form.submit() }}
</form> </form>
{% if players %}
{% if data_list %}
<h2>classement :</h2> <h2>classement :</h2>
<table> <table>
<thead> <thead>
@ -27,11 +25,11 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for player in data_list %} {% for player in players %}
<tr> <tr>
<td>{{ player.rang }}</td> <td>{{ player.rank }}</td>
<td>{{ player.Name }}</td> <td>{{ player.name }}</td>
<td>#{{ player.Tag }}</td> <td>#{{ player.tag }}</td>
<td>{{ player.league_points }}</td> <td>{{ player.league_points }}</td>
</tr> </tr>
{% endfor %} {% endfor %}

View File

@ -1,4 +1,4 @@
Flask=3.1.0 Flask==3.1.0
requests=2.32.3 requests==2.32.3
Flask-WTF Flask-WTF
WTForms==3.2.1 WTForms==3.2.1