Plateforme complète d'automatisation pour la publication d'annonces automobiles avec intégration Telegram, génération vidéo et publication automatique sur Ouedkniss.
- Vue d'ensemble
- Fonctionnalités
- API Endpoints
- Installation
- Configuration
- Utilisation
- Déploiement
- Documentation
- Architecture
- Performances
Cette plateforme fournit quatre modules principaux :
- 🤖 Intégration Telegram : Récupération de messages et photos via bot Telegram
- 🎬 Génération vidéo : Création de vidéos MP4 à partir d'images avec FFmpeg
- 🚗 Automation Ouedkniss : Publication automatique complète d'annonces sur Ouedkniss.com
- 🌐 DDNS Hostinger : Mise à jour automatique DNS pour IP dynamique (accès n8n)
Conçu pour l'automatisation complète du workflow de publication d'annonces automobiles avec une API REST FastAPI.
- ✅ Récupération du dernier message reçu
- ✅ Extraction de photos depuis conversations
- ✅ Gestion d'état pour éviter les doublons
- ✅ Mise à jour manuelle de l'ID de vérification
- ✅ Compatible n8n webhooks
- ✅ Polling automatique en arrière-plan
- ✅ Upload multiple d'images
- ✅ Durée automatique selon nombre d'images (2s, 2.5s ou 3s)
- ✅ 3 niveaux de qualité (low, medium, high)
- ✅ Nettoyage automatique des fichiers temporaires
- ✅ Retour direct du fichier MP4
- ✅ Compatible FFmpeg avec codec H.264
- ✅ Gestion du dossier
image_uploaded/
✅ Publication Complète (100% fonctionnel)
| Étape | Status | Description |
|---|---|---|
| Étape 1: Catégorie | ✅ 100% | Sélection Automobiles > Voitures |
| Étape 2: Description | ✅ 100% | Année, Marque, Modèle (texte libre), Kilométrage, Énergie, Boîte + Description |
| Étape 3: Prix | ✅ 100% | Prix + Type d'offre + Échange |
| Étape 4: Contact | ✅ 100% | Wilaya + Commune + Email (autocomplete intelligent) |
| Étape 5: Photos | ✅ 100% | Upload multiple (jusqu'à 20 images) + Attente intelligente |
Fonctionnalités avancées :
- ✅ Connexion automatique avec session Chrome persistante
- ✅ Fermeture automatique des popups publicitaires
- ✅ Modèle en mode texte libre : Sélection automatique de "Autre" + saisie du modèle
- ✅ Gestion des overlays Vuetify (v-overlay) avec fermeture ESC
- ✅ Scroll virtuel intelligent pour listes longues (500+ options)
- ✅ Retry logic : 3 tentatives pour les éléments stale
- ✅ Sanitisation du texte : Suppression des emojis et caractères non-BMP
- ✅ Matching insensible à la casse pour autocomplete (Wilaya/Commune)
- ✅ Upload intelligent : Attente basée sur l'état réel (pas de timeout arbitraire)
- ✅ Double vérification : Progression images + état du bouton "Confirmer"
- ✅ Scroll automatique : scrollIntoView pour éléments non interactables
- ✅ Temps optimisé : ~35-40 secondes pour publication complète
http://localhost:8000
Récupère le dernier message Telegram intercepté.
Réponse :
{
"chat_id": 123456789,
"text": "Message texte",
"sender": "John Doe",
"update_id": 987654321
}Récupère toutes les photos non encore lues.
Réponse :
{
"photos": [
{
"file_id": "AgACAgIAAx...",
"chat_id": 123456789
}
]
}Vérifie si l'update_id est nouveau.
Body :
{
"sender_id": "123456789",
"sender": "John Doe",
"update_id": 987654321
}Réponse :
{
"valid": true
}Upload une image dans image_uploaded/.
Form Data :
file: Image (JPG, PNG, etc.)
Réponse :
{
"success": true,
"filename": "image1.jpg",
"images_count": 5
}Génère une vidéo MP4 depuis toutes les images uploadées.
Query Parameters :
quality: "low" | "medium" | "high" (défaut: "medium")
Réponse : Fichier MP4 en direct
Supprime toutes les images du dossier image_uploaded/.
Réponse :
{
"success": true,
"deleted_count": 4,
"message": "4 image(s) supprimée(s) avec succès"
}Publie automatiquement une annonce sur Ouedkniss avec données dynamiques.
Body JSON :
{
"annee": "2012",
"marque": "Renault",
"modele": "Clio",
"kilometrage": "50000",
"energie": "Essence",
"boite": "Manuelle",
"papiers": "Carte grise / safia",
"description": "Belle voiture...",
"prix": "2.5",
"type_offre": "Négociable",
"echange": "Pas d'échanges",
"wilaya": "Alger",
"commune": "Bab Ezzouar",
"email": "redbleu994@gmail.com"
}Réponse :
{
"success": true,
"message": "Annonce publiée avec succès sur Ouedkniss !",
"url": "https://www.ouedkniss.com/my/u/announcements/list?announcementId=51349018"
}Prérequis :
- Images uploadées dans
image_uploaded/via/upload_image - Session Chrome connectée à Ouedkniss
Python 3.11+
python --versionuv (Package manager Python ultra-rapide)
pip install uvFFmpeg (pour génération vidéo)
winget install --id=Gyan.FFmpeg -e
ffmpeg -versionGoogle Chrome (pour Ouedkniss automation)
# Chrome doit être installé dans le chemin par défautgit clone https://github.com/redabens/Next-Car.git
cd "Next Car"Avec uv (recommandé) :
pip install uv
uv syncAvec pip :
pip install -r requirements.txt
pip install -r ouedkniss/requirements_ouedkniss.txtDépendances principales :
fastapi- Framework webuvicorn- Serveur ASGIpython-telegram-bot- Client Telegrampython-multipart- Upload de fichiersselenium- Automation navigateur (Ouedkniss)webdriver-manager- Gestion ChromeDriver
Créer un fichier .env à la racine :
# Token Telegram Bot (requis)
TELEGRAM_TOKEN=123456789:ABCdefGHIjklMNOpqrsTUVwxyz
# Serveur (optionnel)
HOST=0.0.0.0
PORT=8000Copier et configurer le fichier d'identifiants :
cp ouedkniss/config.example.py ouedkniss/config.pyÉditer ouedkniss/config.py :
OUEDKNISS_USERNAME = "votre_nom_utilisateur"
OUEDKNISS_PASSWORD = "votre_mot_de_passe"- Ouvrir Telegram et chercher @BotFather
- Envoyer
/newbot - Suivre les instructions
- Copier le token fourni
python main.pyServeur accessible à : http://localhost:8000
Mode autonome :
uv run python -m ouedkniss.mainRésultat attendu (5 étapes complètes) :
✅ Connexion réussie
✅ Navigation vers le formulaire
✅ Étape 1: Catégorie sélectionnée (Automobiles > Voitures)
✅ Étape 2: Description complétée (7 champs + Description)
✅ Étape 3: Prix configuré (Prix + Type d'offre + Échange)
✅ Étape 4: Contact renseigné (Wilaya + Commune + Email)
✅ Étape 5: Photos uploadées (17 images)
🎉 Publication réussie!
URL: https://www.ouedkniss.com/my/u/announcements/new
⏱️ Temps d'exécution: ~35 secondes
Mode API (recommandé pour n8n) :
Utiliser l'endpoint /publier-annonce-ouedkniss pour une intégration workflow complète (voir section API Endpoints)
Documentation Swagger : http://localhost:8000/docs
| Endpoint | Méthode | Description |
|---|---|---|
/getlastmessage |
GET | Récupère le dernier message |
/getphotos |
GET | Récupère les photos d'une conversation |
/update_id_verificator |
POST | Met à jour l'ID de vérification |
Détails complets : documentation/TELEGRAM.md
| Endpoint | Méthode | Description |
|---|---|---|
/create_video |
POST | Génère une vidéo depuis des images |
Détails complets : documentation/VIDEO.md
1. Configuration :
# Copier le fichier d'environnement
cp .env.example .env
# Éditer .env avec vos credentials
# TELEGRAM_TOKEN=...
# OUEDKNISS_USERNAME=...
# OUEDKNISS_PASSWORD=...2. Démarrage :
# Build et lancer
docker-compose up -d
# Voir les logs
docker-compose logs -f
# Arrêter
docker-compose downBuild l'image :
docker build -t nextcar-api .Lancer le conteneur :
docker run -d -p 8000:8000 `
-e TELEGRAM_TOKEN=your_token `
-e OUEDKNISS_USERNAME=your_email `
-e OUEDKNISS_PASSWORD=your_password `
-v ${PWD}/videos:/app/videos `
-v ${PWD}/image_uploaded:/app/image_uploaded `
--shm-size=2gb `
--name nextcar `
nextcar-apiPlateformes supportées :
- ✅ Render.com
- ✅ Railway.app
- ✅ DigitalOcean App Platform
- ✅ AWS ECS
- ✅ Google Cloud Run
Guide complet : DEPLOYMENT.md
- DEPLOYMENT.md - 🚀 Guide complet de déploiement Docker et Cloud
- TELEGRAM.md - Documentation complète de l'intégration Telegram
- VIDEO.md - Documentation de la génération vidéo
- OUEDKNISS.md - Documentation complète de l'automation Ouedkniss (API + Automation)
- DDNS Hostinger - 🌐 Mise à jour automatique DNS pour IP dynamique
- Debug Tools - 🛠️ Outils de debug pour Vuetify/Ouedkniss
- Swagger UI - http://localhost:8000/docs (quand serveur lancé)
- ReDoc - http://localhost:8000/redoc (quand serveur lancé)
L'automation a été optimisée pour une exécution 40% plus rapide :
| Métrique | Avant | Après | Gain |
|---|---|---|---|
| Temps total | 60-70s | ~35s | -40% |
| Initialisation | 2s | 1.2-1.5s | -25% |
| Interactions | 1s | 0.3s | -70% |
| Upload images | 5s | 2s | -60% |
| Micro-attentes | 0.5s | 0.2s | -60% |
Stratégie appliquée :
- Réduction intelligente des
time.sleep() - Maintien de la stabilité (pas d'erreurs "element not interactable")
- Optimisation des temps critiques (initialisation, uploads)
- Tests de régression sur les 5 étapes
Next Car/
├── main.py # Serveur FastAPI principal
├── telegram_bot/ # 📁 Module Telegram
│ ├── __init__.py
│ └── telegram_trigger.py # Intégration Telegram bot
├── video/ # 📁 Module Vidéo
│ ├── __init__.py
│ ├── video_generator.py # Module FFmpeg bas niveau
│ └── video_workflow.py # Logique métier vidéo
├── ouedkniss/ # 📁 Module Ouedkniss
│ ├── __init__.py # Package initialization
│ ├── main.py # Script principal + fonction API
│ ├── config.py # Configuration (identifiants)
│ ├── config.example.py # Exemple de configuration
│ ├── browser.py # Gestion navigateur Chrome
│ ├── auth.py # Authentification Ouedkniss
│ ├── navigation.py # Navigation sur le site
│ ├── category.py # Étape 1: Sélection catégorie
│ ├── form.py # Étape 2: Description (7 champs)
│ ├── price.py # Étape 3: Prix & tarification
│ ├── contact.py # Étape 4: Contact & localisation
│ ├── media.py # Étape 5: Upload photos
│ ├── requirements_ouedkniss.txt
│ ├── debug_tools/ # Outils de débogage Vuetify
│ └── images/ # Images de test (17 photos)
├── image_uploaded/ # Images workflow (utilisées par API)
├── videos/ # Vidéos générées (auto-cleanup)
├── test_simple.py # Test local génération vidéo
├── users_state.json # État Telegram (auto-généré)
├── pyproject.toml # Configuration projet Python
├── uv.lock # Lock file uv
├── Dockerfile # Image Docker
├── .gitignore # Exclusions Git
├── README.md # Ce fichier
└── documentation/
├── TELEGRAM.md # Doc Telegram
├── VIDEO.md # Doc vidéo
└── OUEDKNISS.md # Doc Ouedkniss automation
┌─────────────────────────────────────┐
│ FastAPI Server │
│ (main.py) │
├─────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌──────────────┐ │
│ │ Telegram │ │ Vidéo │ │
│ │ APIs │ │ API │ │
│ └─────────────┘ └──────────────┘ │
│ │ │ │
│ ↓ ↓ │
│ ┌─────────────┐ ┌──────────────┐ │
│ │ telegram/ │ │ video/ │ │
│ │ trigger │ │ workflow │ │
│ └─────────────┘ └──────────────┘ │
│ │ │
│ ┌─────────────┐ ↓ │
│ │ Ouedkniss │ ┌──────────────┐ │
│ │ API │ │ video/ │ │
│ └─────────────┘ │ generator │ │
│ │ └──────────────┘ │
│ ↓ │ │
│ ┌─────────────┐ ↓ │
│ │ ouedkniss/ │ ┌─────────┐ │
│ │ main.py │ │ FFmpeg │ │
│ └─────────────┘ └─────────┘ │
│ │ │
│ ↓ │
│ ┌─────────────┐ │
│ │ Selenium │ │
│ │ + Chrome │ │
│ └─────────────┘ │
└─────────────────────────────────────┘
Telegram :
Bot Telegram → telegram/trigger → users_state.json
↑
│
FastAPI Endpoints
↓
Client (n8n)
Vidéo (workflow n8n validé ✅) :
n8n Loop → Google Drive Download → POST /upload_image (x4)
↓
./image_uploaded/
↓
POST /create_video?quality=high
↓
video/workflow → video/generator
↓
FFmpeg
↓
./videos/*.mp4
↓
FileResponse → n8n
↓
Auto-cleanup (2s delay)
Ouedkniss (automation complète ✅) :
POST /publier-annonce-ouedkniss (vehicle_data)
↓
ouedkniss/main.py
↓
publish_ouedkniss_annonce()
↓
┌───────────┴───────────┐
↓ ↓
Selenium + Chrome ./image_uploaded/
↓
┌───────────────────────────────┐
│ 1. auth.py (connexion) │
│ 2. navigation.py (formulaire) │
│ 3. category.py (catégorie) │
│ 4. form.py (description) │
│ 5. price.py (prix) │
│ 6. contact.py (localisation) │
│ 7. media.py (photos) │
└───────────────────────────────┘
↓
Publication réussie (~35s)
↓
{'success': True, 'message': '...', 'url': '...'}
python test_simple.pyRésultat : ma_video.mp4 dans le dossier courant
Telegram :
curl http://localhost:8000/getlastmessageVidéo :
curl -X POST http://localhost:8000/create_video?quality=high \
-F "files=@test_images/IMG-20251012-WA0001.jpg" \
-F "files=@test_images/IMG-20251012-WA0002.jpg" \
-o video.mp4Ouedkniss (PowerShell) :
$body = @{
annee = "2015"
marque = "Renault"
modele = "Clio 4"
kilometrage = "85000"
energie = "Diesel"
boite = "Manuelle"
papiers = "Carte grise / safia"
description = "Très bon état, entretien régulier"
prix = "1200000"
type_offre = "Négociable"
echange = "Pas d'échanges"
wilaya = "Alger"
commune = "Bab Ezzouar"
email = "contact@example.com"
} | ConvertTo-Json
Invoke-RestMethod -Uri "http://localhost:8000/publier-annonce-ouedkniss" `
-Method POST `
-ContentType "application/json" `
-Body $bodyLe serveur affiche des logs détaillés :
[19:37:45] 📱 Démarrage du bot Telegram...
[19:37:45] ✅ Bot connecté : @YourBot
[19:37:46] 🚀 Serveur FastAPI démarré sur http://0.0.0.0:8000
FFmpeg installé ?
ffmpeg -versionToken Telegram valide ?
curl "https://api.telegram.org/bot<YOUR_TOKEN>/getMe"Port occupé ?
netstat -ano | findstr :8000Les fichiers temporaires sont nettoyés automatiquement, mais en cas de besoin :
# Supprimer dossiers temporaires
Remove-Item -Recurse -Force temp_images_*
# Supprimer vidéos générées
Remove-Item -Recurse -Force videos/Remove-Item users_state.jsonAu prochain démarrage, l'état sera recréé.
Projet privé - Tous droits réservés
Pour questions ou problèmes :
- Consulter la documentation
- Vérifier les logs du serveur
- Tester avec les scripts de test fournis
- Documentation API interactive : http://localhost:8000/docs
Dernière mise à jour : 16 Octobre 2025