Compare commits

..

No commits in common. "main" and "v2.4" have entirely different histories.
main ... v2.4

5 changed files with 38 additions and 56 deletions

View File

@ -16,7 +16,7 @@ RUN pip install --no-cache-dir -r requirements.txt
# Définir les variables d'environnement par défaut (modifiable lors du lancement du conteneur) # Définir les variables d'environnement par défaut (modifiable lors du lancement du conteneur)
ENV DISCORD_WEBHOOK_URL="https://example.com/webhook" \ ENV DISCORD_WEBHOOK_URL="https://example.com/webhook" \
REFRESH_TIME="30" REFRESH_TIME="60"
# Exposer un point de commande pour exécuter le script # Exposer un point de commande pour exécuter le script
CMD ["python", "nvidia-stock-bot.py"] CMD ["python", "nvidia-stock-bot.py"]

View File

@ -11,20 +11,20 @@
<img src="https://git.djeex.fr/Djeex/nvidia-stock-bot/raw/branch/main/assets/img/nvidia-stock-bot-logo.png" alt="Nvidia Stock Bot" width="300"> <img src="https://git.djeex.fr/Djeex/nvidia-stock-bot/raw/branch/main/assets/img/nvidia-stock-bot-logo.png" alt="Nvidia Stock Bot" width="300">
</div> </div>
**🤖 Nvidia Stock Bot** - Un robot qui permet d'être alerté en temps réel des stocks de cartes graphiques **Nvidia RTX FE** grâce à des notifications Discord. **Nvidia Stock Bot** - Un robot qui permet d'être alerté en temps réel des stocks de cartes graphiques **Nvidia RTX FE** grâce à des notifications Discord.
*Le code a été en partie rédigé et structuré à l'aide d'une IA générative.* *Le code a été en partie rédigé et structuré à l'aide d'une IA générative.*
## 📌 Sommaire ## Sommaire
- [Fonctionnalités](#fonctionnalit%C3%A9s) - [Fonctionnalités](#fonctionnalit%C3%A9s)
- [🐳 Installation docker sans le dépot (rapide)](#installation-sans-le-d%C3%A9pot-avec-docker-compose) - [Installation docker sans le dépot (rapide)](#installation-sans-le-d%C3%A9pot-avec-docker-compose)
- [🐙 Installation docker avec le dépot (développeur)](#installation-avec-le-d%C3%A9pot) - [Installation docker avec le dépot (développeur)](#installation-avec-le-d%C3%A9pot)
- [🐍 Installation avec Python (développeur)](#installation-avec-python) - [Installation avec Python (développeur)](#installation-avec-python)
- [🖼️ Captures d'écran](#captures-d%C3%A9cran) - [Captures d'écran](#captures-d%C3%A9cran)
- [🧑‍💻 Contributeurs](#contributeurs) - [Contributeurs](#contributeurs)
## Fonctionnalités ## Fonctionnalités
- Notification Discord `@everyone` en cas de changement du SKU (potentiel drop imminent) - Notification Discord `@everyone` en cas de changement du SKU (potentiel drop imminent)
- Notification Discord `@everyone` en cas de stock détecté avec modèle, prix, et lien - Notification Discord `@everyone` en cas de stock détecté avec modèle, prix, et lien
@ -34,7 +34,7 @@
<img src="https://git.djeex.fr/Djeex/nvidia-stock-bot/raw/branch/main/assets/img/nvbot_schematics.png" align="center"> <img src="https://git.djeex.fr/Djeex/nvidia-stock-bot/raw/branch/main/assets/img/nvbot_schematics.png" align="center">
## 🐳 Installation sans le dépot avec docker compose ## Installation sans le dépot avec docker compose
Vous trouverez-ci dessous les instructions pour configurer le conteneur avec notre image pré-compilée. Avec cette solution, votre bot tournera tout seul tant que le conteneur est actif. Vous trouverez-ci dessous les instructions pour configurer le conteneur avec notre image pré-compilée. Avec cette solution, votre bot tournera tout seul tant que le conteneur est actif.
@ -47,31 +47,24 @@ Vous trouverez-ci dessous les instructions pour configurer le conteneur avec not
- Créez le fichier `compose.yaml` dans ce dossier avec la configuration ci-dessous : - Créez le fichier `compose.yaml` dans ce dossier avec la configuration ci-dessous :
```yaml ```yaml
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:latest
container_name: nvidia-stock-bot container_name: nvidia-stock-bot
restart: unless-stopped restart: always
environment: environment:
- DISCORD_WEBHOOK_URL= # URL de votre webhook Discord - DISCORD_WEBHOOK_URL= # URL de votre webhook Discord
- PRODUCT_NAME= # Le nom exact du GPU que vous recherchez comme "RTX 5080" - 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=
- PRODUCT_URL= # URL d'achat du GPU
- PRODUCT_NAME= # Le nom du GPU qui s'affiche dans les notifications
- 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 command: python nvidia-stock-bot.py # Lance le script Python au démarrage du conteneur
``` ```
**Variables d'environnements :**
| Variables | Explications | Valeurs possibles | Valeur par défaut |
|---------------------|-------------------------------------------------|--------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------|
| DISCORD_WEBHOOK_URL | URL de votre webhook Discord | Une URL | |
| REFRESH_TIME | Durée de rafraichissement du script en secondes | `60`, `30`, etc... | `30` |
| API_URL_SKU | API listant le produit | Une URL | `https://api.nvidia.partners/edge/product/search?page=1&limit=100&locale=fr-fr&Manufacturer=Nvidia` |
| API_URL_STOCK | API donnant le stock | Une URL | `https://api.store.nvidia.com/partner/v1/feinventory?locale=fr-fr&skus=` |
| PRODUCT_URL | URL d'achat du GPU | Une URL | `https://marketplace.nvidia.com/fr-fr/consumer/graphics-cards/?locale=fr-fr&page=1&limit=12&manufacturer=NVIDIA` |
| PRODUCT_NAME | Le nom exact du GPU que vous recherchez | `RTX 5090`, `RTX 5080` ou `RTX 5070`. | |
| TEST_MODE | Pour tester sans envoyer de notifs | `True`, `False` | `False` |
| PYTHONUNBUFFERED | #Permet d'afficher les logs en temps réel | `1`, `0` | `1` |
**Lancer l'image** **Lancer l'image**
Rendez-vous dans le dossier `nvidia-stock-bot` et lancez le conteneur : Rendez-vous dans le dossier `nvidia-stock-bot` et lancez le conteneur :
@ -85,7 +78,7 @@ docker compose up -d
docker logs -f nvidia-stock-bot docker logs -f nvidia-stock-bot
``` ```
## 📦 Installation avec le dépot ## Installation avec le dépot
Vous trouverez-ci dessous les instructions pour installer le dépot, compiler l'image docker, et lancer le conteneur. Avec cette solution, votre bot tournera tout seul tant que le conteneur est actif. Vous trouverez-ci dessous les instructions pour installer le dépot, compiler l'image docker, et lancer le conteneur. Avec cette solution, votre bot tournera tout seul tant que le conteneur est actif.
@ -123,7 +116,7 @@ docker compose up -d
docker logs -f nvidia-stock-bot docker logs -f nvidia-stock-bot
``` ```
## 🐍 Installation avec Python ## Installation avec Python
Vous trouverez ci-dessous comment exécuter directement le script Python. Avec cette solution, le bot s'arretera si vous fermez votre terminal. Vous trouverez ci-dessous comment exécuter directement le script Python. Avec cette solution, le bot s'arretera si vous fermez votre terminal.
@ -158,13 +151,13 @@ Vous trouverez ci-dessous comment exécuter directement le script Python. Avec c
python nvidia-stock-bot.py python nvidia-stock-bot.py
``` ```
## 🖼️ Captures d'écran ## Captures d'écran
<div align="center" > <div align="center" >
<img src="https://git.djeex.fr/Djeex/nvidia-stock-bot/raw/branch/main/assets/img/nvidia-stock-bot-discord.png" alt="Nvidia Stock Bot - captures"> <img src="https://git.djeex.fr/Djeex/nvidia-stock-bot/raw/branch/main/assets/img/nvidia-stock-bot-discord.png" alt="Nvidia Stock Bot - captures">
</div> </div>
## 🧑‍💻 Contributeurs ## Contributeurs
On remercie pour leurs contributions : On remercie pour leurs contributions :

View File

@ -1,6 +1,6 @@
DS_HOOK= # Votre url du webhook Discord DS_HOOK= #votre url du webhook Discord
FREQ= # Frequence de rafraichissement en secondes, par défaut 30 FREQ= #frequence de rafraichissement en secondes
API_URL_SKU= # API listant le produit, par défaut https://api.nvidia.partners/edge/product/search?page=1&limit=100&locale=fr-fr&Manufacturer=Nvidia 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 défaut https://api.store.nvidia.com/partner/v1/feinventory?locale=fr-fr&skus= 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=
PRODUCT_URL= # URL d'achat du GPU PRODUCT_URL= # URL d'achat du GPU
PRODUCT_NAME= # Le nom exact du GPU que vous recherchez comme : "RTX 5080" PRODUCT_NAME= #Le nom du GPU qui s'affiche dans les notifications

View File

@ -1,8 +1,9 @@
version: "3.8"
services: services:
nvidia-stock-bot: nvidia-stock-bot:
image: nvidia-stock-bot image: nvidia-stock-bot
container_name: nvidia-stock-bot container_name: nvidia-stock-bot
restart: unless-stopped restart: always # Le conteneur redémarrera automatiquement en cas d'échec
env_file: env_file:
- .env - .env
environment: environment:
@ -10,7 +11,5 @@ services:
- REFRESH_TIME=${FREQ} - REFRESH_TIME=${FREQ}
- API_URL_SKU=${API_URL_SKU} - API_URL_SKU=${API_URL_SKU}
- API_URL_STOCK=${API_URL_STOCK} - API_URL_STOCK=${API_URL_STOCK}
- PRODUCT_URL=${PRODUCT_URL}
- PRODUCT_NAME=${PRODUCT_NAME}
- 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

View File

@ -14,22 +14,13 @@ 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.get('DISCORD_WEBHOOK_URL') DISCORD_WEBHOOK_URL = os.environ['DISCORD_WEBHOOK_URL']
API_URL_SKU = os.environ.get('API_URL_SKU', 'https://api.nvidia.partners/edge/product/search?page=1&limit=100&locale=fr-fr&Manufacturer=Nvidia') API_URL_SKU = os.environ['API_URL_SKU']
API_URL_STOCK = os.environ.get('API_URL_STOCK', 'https://api.store.nvidia.com/partner/v1/feinventory?locale=fr-fr&skus=') API_URL_STOCK = os.environ['API_URL_STOCK']
REFRESH_TIME = int(os.environ.get('REFRESH_TIME')) REFRESH_TIME = int(os.environ['REFRESH_TIME']) # Convertir en entier
TEST_MODE = os.environ.get('TEST_MODE', 'False').lower() == 'true' TEST_MODE = os.environ.get('TEST_MODE', 'False').lower() == 'true'
PRODUCT_URL = os.environ.get('PRODUCT_URL', 'https://marketplace.nvidia.com/fr-fr/consumer/graphics-cards/?locale=fr-fr&page=1&limit=12&manufacturer=NVIDIA') PRODUCT_URL = os.environ['PRODUCT_URL']
PRODUCT_NAME = os.environ.get('PRODUCT_NAME') PRODUCT_NAME = os.environ['PRODUCT_NAME']
# Logging des erreurs
if not DISCORD_WEBHOOK_URL:
logging.error("❌ DISCORD_WEBHOOK_URL est requis mais non défini.")
exit(1)
if not PRODUCT_NAME:
logging.error("❌ PRODUCT_NAME est requis mais non défini.")
exit(1)
# Regex pour extraire l'ID et le token # Regex pour extraire l'ID et le token
match = re.search(r'/(\d+)/(.*)', DISCORD_WEBHOOK_URL) match = re.search(r'/(\d+)/(.*)', DISCORD_WEBHOOK_URL)
@ -46,7 +37,6 @@ try:
# Reconstruction de l'url masquée # Reconstruction de l'url masquée
wh_masked_url = f"https://discord.com/api/webhooks/{masked_webhook_id}/{masked_webhook_token}" wh_masked_url = f"https://discord.com/api/webhooks/{masked_webhook_id}/{masked_webhook_token}"
# Logging des erreurs
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) exit(1)