Compare commits
	
		
			12 Commits
		
	
	
		
			8ccc925966
			...
			66ca9e907d
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 66ca9e907d | |||
| 82557b77ab | |||
| d48d9d537b | |||
| 8d1fd5d94a | |||
| 86665b7137 | |||
| f9bc3dfe32 | |||
| bd5b703eb7 | |||
| af88b778bf | |||
| 57a64b0274 | |||
| 95bb127cdf | |||
| dcd666c39b | |||
| 20aa4991a8 | 
							
								
								
									
										20
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								README.md
									
									
									
									
									
								
							@@ -1,16 +1,16 @@
 | 
				
			|||||||
# Nvidia Stock Bot - Principale
 | 
					# Nvidia Stock Bot
 | 
				
			||||||
Par KevOut & Djeex
 | 
					Par KevOut & Djeex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[](https://discord.gg/gxffg3GA96)
 | 
					[](https://discord.gg/gxffg3GA96)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Ce robot :
 | 
					Ce robot :
 | 
				
			||||||
- Appelle régulièrement l'api des stocks français de nvidia FE (par défaut toutes les 60s)
 | 
					- Appelle l'API de Nvidia listant le produit (par défaut toutes les 60s)
 | 
				
			||||||
- Vérifie si RTX 5090, RTX 5080, RTX 5070ti et RTX 5070 sont en stock
 | 
					- Récupère le SKU du produit concerné
 | 
				
			||||||
 | 
					- Appelle le stock lié à ce SKU
 | 
				
			||||||
- Si du stock est trouvé, envoie une notification discord via le webhook paramétré
 | 
					- Si du stock est trouvé, envoie une notification discord via le webhook paramétré
 | 
				
			||||||
 | 
					- Si le produit était déjà en stock, il n'envoie plus de notification
 | 
				
			||||||
<img src="https://git.djeex.fr/Djeex/nvidia-stock-bot/raw/branch/main/assets/img/nvbot.png" align="center">
 | 
					- Si le produit était en stock mais ne l'est plus, envoie une notification discord signifiant la fin du stock
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Trois modes d'installation :
 | 
					Trois modes d'installation :
 | 
				
			||||||
- [Avec le dépot Git et Docker](https://git.djeex.fr/Djeex/nvidia-stock-bot/#installation-avec-le-d%C3%A9pot)
 | 
					- [Avec le dépot Git et Docker](https://git.djeex.fr/Djeex/nvidia-stock-bot/#installation-avec-le-d%C3%A9pot)
 | 
				
			||||||
@@ -67,12 +67,15 @@ Vous trouverez-ci dessous les instructions pour configurer le conteneur avec not
 | 
				
			|||||||
version: "3.8"
 | 
					version: "3.8"
 | 
				
			||||||
services:
 | 
					services:
 | 
				
			||||||
  nvidia-stock-bot:
 | 
					  nvidia-stock-bot:
 | 
				
			||||||
    image: git.djeex.fr/djeex/nvidia-stock-bot:latest
 | 
					    image: git.djeex.fr/djeex/nvidia-stock-bot
 | 
				
			||||||
    container_name: nvidia-stock-bot
 | 
					    container_name: nvidia-stock-bot
 | 
				
			||||||
    restart: always # Le conteneur redémarrera automatiquement en cas d'échec
 | 
					    restart: always # Le conteneur redémarrera automatiquement en cas d'échec
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      - DISCORD_WEBHOOK_URL= # URL de votre webhook Discord
 | 
					      - DISCORD_WEBHOOK_URL= # URL de votre webhook Discord
 | 
				
			||||||
      - REFRESH_TIME= # Durée de rafraichissement du script en secondes
 | 
					      - REFRESH_TIME= # Durée de rafraichissement du script en secondes
 | 
				
			||||||
 | 
					      - API_URL_SKU= # API listant le produit par exemple https://api.nvidia.partners/edge/product/search?page=1&limit=100&locale=fr-fr&Manufacturer=Nvidia&gpu=RTX%205090
 | 
				
			||||||
 | 
					      - API_URL_STOCK= # API appelant le stock sans préciser la valeur du sku, par exemple https://api.store.nvidia.com/partner/v1/feinventory?locale=fr-fr&skus=
 | 
				
			||||||
 | 
					      - TEST_MODE=  #true pour tester les notifications discord. false par défaut.
 | 
				
			||||||
      - PYTHONUNBUFFERED=1 # Permet d'afficher les logs en temps réel
 | 
					      - PYTHONUNBUFFERED=1 # Permet d'afficher les logs en temps réel
 | 
				
			||||||
    command: python nvidia-stock-bot.py # Lance le script Python au démarrage du conteneur
 | 
					    command: python nvidia-stock-bot.py # Lance le script Python au démarrage du conteneur
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
@@ -100,6 +103,9 @@ Vous trouverez ci-dessous comment exécuter directement le script Python. Avec c
 | 
				
			|||||||
  ```sh
 | 
					  ```sh
 | 
				
			||||||
  export DISCORD_WEBHOOK_URL="https://votre_url_discord"
 | 
					  export DISCORD_WEBHOOK_URL="https://votre_url_discord"
 | 
				
			||||||
  export REFRESH_TIME="60"
 | 
					  export REFRESH_TIME="60"
 | 
				
			||||||
 | 
					  export API_URL_SKU="https://api.nvidia.partners/edge/product/search?page=1&limit=100&locale=fr-fr&Manufacturer=Nvidia&gpu=RTX%205090"
 | 
				
			||||||
 | 
					  export API_URL_STOCK="https://api.store.nvidia.com/partner/v1/feinventory?locale=fr-fr&skus="
 | 
				
			||||||
 | 
					  export TEST_MODE=false
 | 
				
			||||||
  ```
 | 
					  ```
 | 
				
			||||||
- Lancez le script
 | 
					- Lancez le script
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,2 +1,4 @@
 | 
				
			|||||||
DS_HOOK="votre url du webhook discord"
 | 
					DS_HOOK= #votre url du webhook Discord
 | 
				
			||||||
FREQ=60 #frequence de rafraichissement en secondes
 | 
					FREQ= #frequence de rafraichissement en secondes
 | 
				
			||||||
 | 
					API_URL_SKU= # API listant le produit par exemple https://api.nvidia.partners/edge/product/search?page=1&limit=100&locale=fr-fr&Manufacturer=Nvidia&gpu=RTX%205090
 | 
				
			||||||
 | 
					API_URL_STOCK= # API appelant le stock sans préciser la valeur du sku, par exemple https://api.store.nvidia.com/partner/v1/feinventory?locale=fr-fr&skus=
 | 
				
			||||||
@@ -9,5 +9,7 @@ services:
 | 
				
			|||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      - DISCORD_WEBHOOK_URL=${DS_HOOK}
 | 
					      - DISCORD_WEBHOOK_URL=${DS_HOOK}
 | 
				
			||||||
      - REFRESH_TIME=${FREQ}
 | 
					      - REFRESH_TIME=${FREQ}
 | 
				
			||||||
 | 
					      - API_URL_SKU=${API_URL_SKU}
 | 
				
			||||||
 | 
					      - API_URL_STOCK=${API_URL_STOCK}
 | 
				
			||||||
      - PYTHONUNBUFFERED=1 # Permet d'afficher les logs en temps réel
 | 
					      - PYTHONUNBUFFERED=1 # Permet d'afficher les logs en temps réel
 | 
				
			||||||
    command: python nvidia-stock-bot.py # Lance le script Python
 | 
					    command: python nvidia-stock-bot.py # Lance le script Python
 | 
				
			||||||
@@ -2,37 +2,37 @@ import requests
 | 
				
			|||||||
import logging
 | 
					import logging
 | 
				
			||||||
import time
 | 
					import time
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
 | 
					from requests.adapters import HTTPAdapter, Retry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Configuration du logger
 | 
					# Configuration du logger
 | 
				
			||||||
logging.basicConfig(
 | 
					logging.basicConfig(
 | 
				
			||||||
    level=logging.INFO,
 | 
					    level=logging.INFO,
 | 
				
			||||||
    format="%(asctime)s [%(levelname)s] %(message)s",
 | 
					    format="%(asctime)s [%(levelname)s] %(message)s",
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					 | 
				
			||||||
logging.info("Démarrage du script")
 | 
					logging.info("Démarrage du script")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Récupération des variables d'environnement
 | 
					# Récupération des variables d'environnement
 | 
				
			||||||
try:
 | 
					try:
 | 
				
			||||||
    DISCORD_WEBHOOK_URL = os.environ['DISCORD_WEBHOOK_URL']
 | 
					    DISCORD_WEBHOOK_URL = os.environ['DISCORD_WEBHOOK_URL']
 | 
				
			||||||
 | 
					    API_URL_SKU = os.environ['API_URL_SKU']
 | 
				
			||||||
 | 
					    API_URL_STOCK = os.environ['API_URL_STOCK']
 | 
				
			||||||
    REFRESH_TIME = int(os.environ['REFRESH_TIME'])  # Convertir en entier
 | 
					    REFRESH_TIME = int(os.environ['REFRESH_TIME'])  # Convertir en entier
 | 
				
			||||||
 | 
					    TEST_MODE = os.environ.get('TEST_MODE', 'False').lower() == 'true'
 | 
				
			||||||
except KeyError as e:
 | 
					except KeyError as e:
 | 
				
			||||||
    logging.error(f"Variable d'environnement manquante : {e}")
 | 
					    logging.error(f"Variable d'environnement manquante : {e}")
 | 
				
			||||||
    exit(1)  # Quitter le script proprement en cas d'erreur
 | 
					    exit(1)
 | 
				
			||||||
except ValueError:
 | 
					except ValueError:
 | 
				
			||||||
    logging.error("REFRESH_TIME doit être un entier valide.")
 | 
					    logging.error("REFRESH_TIME doit être un entier valide.")
 | 
				
			||||||
    exit(1)
 | 
					    exit(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Afficher les valeurs des variables d'environnement
 | 
					# Affichage des URLs et configurations
 | 
				
			||||||
print(f"url du webhook Discord: {DISCORD_WEBHOOK_URL}")
 | 
					logging.info(f"URL Webhook Discord: {DISCORD_WEBHOOK_URL[:30]}******")
 | 
				
			||||||
print(f"Temps d'actualisation (en secondes) : {REFRESH_TIME}")
 | 
					logging.info(f"URL API SKU: {API_URL_SKU}")
 | 
				
			||||||
 | 
					logging.info(f"URL API Stock: {API_URL_STOCK}")
 | 
				
			||||||
 | 
					logging.info(f"Temps d'actualisation: {REFRESH_TIME} secondes")
 | 
				
			||||||
 | 
					logging.info(f"Mode Test: {TEST_MODE}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# L’URL de l’API (exemple)
 | 
					# Entêtes HTTP
 | 
				
			||||||
API_URL = "https://api.nvidia.partners/edge/product/search?page=1&limit=9&locale=fr-fr&category=GPU&gpu=RTX%205080,RTX%205090"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# GPUs à surveiller
 | 
					 | 
				
			||||||
GPU_TARGETS = ["RTX 5070 Ti", "RTX 5070", "RTX 5080", "RTX 5090"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Entêtes HTTP pour la requête
 | 
					 | 
				
			||||||
HEADERS = {
 | 
					HEADERS = {
 | 
				
			||||||
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
 | 
					    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
 | 
				
			||||||
                  "AppleWebKit/537.36 (KHTML, like Gecko) "
 | 
					                  "AppleWebKit/537.36 (KHTML, like Gecko) "
 | 
				
			||||||
@@ -51,85 +51,115 @@ HEADERS = {
 | 
				
			|||||||
    "Sec-GPC": "1",
 | 
					    "Sec-GPC": "1",
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Dictionnaire stockant l'état de stock
 | 
					# Session avec retries
 | 
				
			||||||
stock_status = {gpu.upper(): False for gpu in GPU_TARGETS}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
session = requests.Session()
 | 
					session = requests.Session()
 | 
				
			||||||
 | 
					retries = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
 | 
				
			||||||
 | 
					session.mount('https://', HTTPAdapter(max_retries=retries))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Stockage de l'état des stocks
 | 
				
			||||||
 | 
					global_stock_status = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def send_discord_notification(gpu_name: str, product_link: str):
 | 
					def send_discord_notification(gpu_name: str, product_link: str):
 | 
				
			||||||
    """Envoie une notification Discord avec un embed via un webhook."""
 | 
					    if TEST_MODE:
 | 
				
			||||||
 | 
					        logging.info(f"[TEST MODE] Notification Discord: {gpu_name} disponible !")
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    embed = {
 | 
					    embed = {
 | 
				
			||||||
        "title": f"🚀 {gpu_name} en stock !",
 | 
					        "title": f"🚀 {gpu_name} en stock !",
 | 
				
			||||||
        "description": f":point_right: **[Achetez ici](https://marketplace.nvidia.com/fr-fr/consumer/graphics-cards/?locale=fr-fr&page=1&limit=12&gpu=RTX%205090,RTX%205080&manufacturer=NVIDIA)**",
 | 
					        "description": f":point_right: **[Achetez ici](https://marketplace.nvidia.com/fr-fr/consumer/graphics-cards/?locale=fr-fr&page=1&limit=12&gpu=RTX%205090,RTX%205080&manufacturer=NVIDIA)**",
 | 
				
			||||||
        "color": 3066993,  # Couleur verte
 | 
					        "color": 3066993,
 | 
				
			||||||
        "timestamp": time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime()),
 | 
					        "timestamp": time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime()),
 | 
				
			||||||
        #"thumbnail": {
 | 
					 | 
				
			||||||
        #    "url": "https://www.nvidia.com/content/dam/en-zz/Solutions/geforce/graphic-cards/50-series/rtx-5090/geforce-rtx-5090-learn-more-og-1200x630.jpg"
 | 
					 | 
				
			||||||
        #}
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    payload = {"content": "@everyone", "username": "Nvidia Bot", "embeds": [embed]}
 | 
				
			||||||
    payload = {
 | 
					 | 
				
			||||||
        "content": "@everyone",
 | 
					 | 
				
			||||||
        "username": "Nvidia Bot",
 | 
					 | 
				
			||||||
        "embeds": [embed]
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        response = requests.post(DISCORD_WEBHOOK_URL, json=payload)
 | 
					        response = requests.post(DISCORD_WEBHOOK_URL, json=payload)
 | 
				
			||||||
        if response.status_code == 204:
 | 
					        if response.status_code == 204:
 | 
				
			||||||
            logging.info("✅ Embed envoyé sur Discord.")
 | 
					            logging.info("✅ Notification envoyée sur Discord.")
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            logging.error(f"❌ Erreur d'envoi du webhook : {response.status_code} - {response.text}")
 | 
					            logging.error(f"❌ Erreur Webhook : {response.status_code} - {response.text}")
 | 
				
			||||||
 | 
					    except Exception as e:
 | 
				
			||||||
 | 
					        logging.error(f"🚨 Erreur lors de l'envoi du webhook : {e}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def send_out_of_stock_notification(gpu_name: str, product_link: str):
 | 
				
			||||||
 | 
					    if TEST_MODE:
 | 
				
			||||||
 | 
					        logging.info(f"[TEST MODE] Notification Discord: {gpu_name} hors stock !")
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    embed = {
 | 
				
			||||||
 | 
					        "title": f"❌ {gpu_name} n'est plus en stock",
 | 
				
			||||||
 | 
					        "description": f":disappointed_relieved:",
 | 
				
			||||||
 | 
					        "color": 15158332,  # Rouge pour hors stock
 | 
				
			||||||
 | 
					        "timestamp": time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime()),
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    payload = {"content": "@everyone", "username": "Nvidia Bot", "embeds": [embed]}
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        response = requests.post(DISCORD_WEBHOOK_URL, json=payload)
 | 
				
			||||||
 | 
					        if response.status_code == 204:
 | 
				
			||||||
 | 
					            logging.info("✅ Notification 'hors stock' envoyée sur Discord.")
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            logging.error(f"❌ Erreur Webhook : {response.status_code} - {response.text}")
 | 
				
			||||||
    except Exception as e:
 | 
					    except Exception as e:
 | 
				
			||||||
        logging.error(f"🚨 Erreur lors de l'envoi du webhook : {e}")
 | 
					        logging.error(f"🚨 Erreur lors de l'envoi du webhook : {e}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def check_rtx_50_founders():
 | 
					def check_rtx_50_founders():
 | 
				
			||||||
    """Vérifie l'état de stock des GPU Founders Edition et notifie Discord si un GPU repasse en stock."""
 | 
					    global global_stock_status
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        response = session.get(API_URL_SKU, headers=HEADERS, timeout=10)
 | 
				
			||||||
 | 
					        logging.info(f"Réponse de l'API : {response.status_code}")
 | 
				
			||||||
 | 
					        response.raise_for_status()
 | 
				
			||||||
 | 
					        data = response.json()
 | 
				
			||||||
 | 
					    except requests.exceptions.RequestException as e:
 | 
				
			||||||
 | 
					        logging.error(f"Erreur API SKU : {e}")
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    product_details = data['searchedProducts']['productDetails'][0]
 | 
				
			||||||
 | 
					    product_sku = product_details['productSKU']
 | 
				
			||||||
 | 
					    product_upc = product_details.get('productUPC', "")
 | 
				
			||||||
 | 
					    if not isinstance(product_upc, list):
 | 
				
			||||||
 | 
					        product_upc = [product_upc]
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    API_URL = API_URL_STOCK + product_sku
 | 
				
			||||||
 | 
					    logging.info(f"URL de l'API de stock appelée : {API_URL}")
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        response = session.get(API_URL, headers=HEADERS, timeout=10)
 | 
					        response = session.get(API_URL, headers=HEADERS, timeout=10)
 | 
				
			||||||
        logging.info(f"Réponse de l'API : {response.status_code}")  
 | 
					        logging.info(f"Réponse de l'API : {response.status_code}")  
 | 
				
			||||||
        response.raise_for_status()
 | 
					        response.raise_for_status()
 | 
				
			||||||
        data = response.json()
 | 
					        data = response.json()
 | 
				
			||||||
    except requests.exceptions.RequestException as e:
 | 
					    except requests.exceptions.RequestException as e:
 | 
				
			||||||
        logging.error(f"Erreur lors de l'appel API : {e}")
 | 
					        logging.error(f"Erreur API Stock : {e}")
 | 
				
			||||||
        return
 | 
					        return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    products = data.get("searchedProducts", {}).get("productDetails", [])
 | 
					    products = data.get("listMap", [])
 | 
				
			||||||
    found_in_stock = set()
 | 
					    found_in_stock = set()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for p in products:
 | 
					    for p in products:
 | 
				
			||||||
        gpu_name = p.get("gpu", "").upper()
 | 
					        gpu_name = p.get("fe_sku", "").upper()
 | 
				
			||||||
        is_founder = p.get("isFounderEdition") is True
 | 
					        is_active = p.get("is_active") == "true"
 | 
				
			||||||
        is_nvidia = (p.get("manufacturer") == "NVIDIA")
 | 
					        if is_active and any(target.upper() in gpu_name for target in product_upc):
 | 
				
			||||||
        is_buy_now = (p.get("prdStatus") != "out_of_stock")
 | 
					            found_in_stock.add(gpu_name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if is_founder and is_nvidia and is_buy_now:
 | 
					    for gpu in product_upc:
 | 
				
			||||||
            if any(target.upper() in gpu_name for target in GPU_TARGETS):
 | 
					 | 
				
			||||||
                found_in_stock.add(gpu_name)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for gpu in GPU_TARGETS:
 | 
					 | 
				
			||||||
        gpu_upper = gpu.upper()
 | 
					        gpu_upper = gpu.upper()
 | 
				
			||||||
        currently_in_stock = (gpu_upper in found_in_stock)
 | 
					        currently_in_stock = gpu_upper in found_in_stock
 | 
				
			||||||
        previously_in_stock = stock_status[gpu_upper]
 | 
					        previously_in_stock = global_stock_status.get(gpu_upper, False)
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        if currently_in_stock and not previously_in_stock:
 | 
					        if currently_in_stock and not previously_in_stock:
 | 
				
			||||||
            for product in products:
 | 
					            product_link = "https://marketplace.nvidia.com/fr-fr/consumer/graphics-cards/?locale=fr-fr&page=1&limit=12&gpu=RTX%205090,RTX%205080"
 | 
				
			||||||
                product_name = product.get("gpu", "").upper()
 | 
					            send_discord_notification(gpu_upper, product_link)
 | 
				
			||||||
                if product_name == gpu_upper:
 | 
					            global_stock_status[gpu_upper] = True
 | 
				
			||||||
                    real_gpu_name = product.get("gpu", "Inconnu")
 | 
					            logging.info(f"{gpu} est maintenant en stock!")
 | 
				
			||||||
                    product_link = "https://marketplace.nvidia.com/fr-fr/consumer/graphics-cards/?locale=fr-fr&page=1&limit=12&gpu=RTX%205090,RTX%205080"
 | 
					        elif not currently_in_stock and previously_in_stock:
 | 
				
			||||||
                    send_discord_notification(real_gpu_name, product_link)
 | 
					            product_link = "https://marketplace.nvidia.com/fr-fr/consumer/graphics-cards/?locale=fr-fr&page=1&limit=12&gpu=RTX%205090,RTX%205080"
 | 
				
			||||||
 | 
					            send_out_of_stock_notification(gpu_upper, product_link)
 | 
				
			||||||
            stock_status[gpu_upper] = True
 | 
					            global_stock_status[gpu_upper] = False
 | 
				
			||||||
            print(f"{gpu} est maintenant en stock!")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        elif (not currently_in_stock) and previously_in_stock:
 | 
					 | 
				
			||||||
            logging.info(f"{gpu} n'est plus en stock.")
 | 
					            logging.info(f"{gpu} n'est plus en stock.")
 | 
				
			||||||
            stock_status[gpu_upper] = False
 | 
					 | 
				
			||||||
            print(f"{gpu} est hors stock !")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        elif not currently_in_stock:
 | 
					        elif currently_in_stock and previously_in_stock:
 | 
				
			||||||
            print(f"{gpu} est actuellement hors stock.")
 | 
					            logging.info(f"{gpu} est actuellement en stock.")
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            logging.info(f"{gpu} est actuellement hors stock.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if __name__ == "__main__":
 | 
					if __name__ == "__main__":
 | 
				
			||||||
    while True:
 | 
					    while True:
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user