Comment analyser un serveur Discord avec Python et DiscordChatExporter : Préambule
Discord est une plateforme de communication puissante et très utilisée de nos jours. Il est donc parfois utile ou intéressant d’analyser les données de son serveur, comme les tendances des messages, les utilisateurs actifs ou les mots les plus utilisés. Les raisons peuvent être multiples, professionnelles par exemple, comme sur le serveur de votre boutique, blog, etc… , ou encore juste pour le fun entre amis. Dans ce guide, nous allons vous montrer comment exporter les données de votre serveur Discord avec DiscordChatExporter et les analyser à l’aide d’un script Python.
Exporter vos données Discord avec DiscordChatExporter
DiscordChatExporter est un outil qui vous permet d’exporter les logs de toutes vos discussions de votre serveur Discord dans différents formats, tels que CSV, JSON ou HTML. Dans notre cas, nous utiliserons le format CSV, car il est très pratique pour analyser ensuite avec Python.
Comment télécharger et configurer DiscordChatExporter
Premièrement, allez sur la page de téléchargement de DiscordChatExporter sur Github, et sélectionnez la version qui convient pour votre système d’exploitation (Windows, macOS ou Linux).
Ensuite, suivez les instructions qui sont expliquées par le programme pour récupérer votre toke.
Attention, comme il est indiqué, utiliser un compte personnel plutôt qu’un BOT est contraire aux règles de Discord. Si vous n’avez pas le choix car vous ne pouvez pas utiliser de BOT, alors créez un compte Discord « poubelle » pour éviter les risques de ban.

Comment exporter vos données
Maintenant, choisissez les salons dont vous voulez récupérer les messages. Vous pouvez sélectionner plusieurs salons en maintenant la touche CTRL tout en cliquant.

Puis cliquez sur le bouton orange, choisissez l’emplacement de téléchargement que vous voulez et mettez en type de fichier CSV.
Il y a aussi plus d’options de téléchargements si vous le souhaitez, comme des dates limites, télécharger les assets (images, fichiers, avatars, …), mais dans la suite du guide nous n’en aurons pas besoin.
Bravo, vous avez maintenant tous les fichiers contenant les données de votre serveur Discord, il ne reste plus qu’à les traiter. N’hésitez pas à les parcours si vous le voulez, vous y trouverez les informations suivantes : AuthorID, Author, Date, Content, Attachments, Reactions
Comment analyser vos données avec le script Python
Une fois que vous avez exporté vos données Discord, vous pouvez utiliser le script Python fourni pour les analyser.
Installer les prérequis
Tout d’abord, vous devez installer Python si ce n’est pas déjà fait, depuis python.org. Ensuite, comme nous allons avoir besoin de plusieurs bibliothèques nécessaires afin d’utiliser le script, exécutez la commande suivante dans votre terminal (cmd) :
pip install matplotlib plotly

Ensuite, téléchargez le script python, où alors copier coller le code se situant à la fin du guide. Mettez le dans un dossier de votre choix, et placez y à côté un autre dossier contenant les fichiers préalablement récupérés. Par exemple :

Exécuter le script
Finalement, ouvrez un terminal dans le dossier où se trouve le script, et exécutez le avec la commande suivante:
python discord_analyzer.py
Suivez les instructions fournies pour analyser les données. Le script vous demandera les informations suivantes :
- Dossier contenant les fichiers CSV : Entrez le chemin du dossier où se trouvent vos fichiers CSV (par exemple,
data
) - Nombre maximum de mots à afficher : Entrez le nombre de mots les plus fréquents que vous souhaitez voir dans l’analyse (par exemple,
30
) - Nombre maximum d’auteurs à afficher : Entrez le nombre d’auteurs les plus actifs que vous souhaitez voir dans le graphique (par exemple,
5
) - Trier les auteurs par nom ou par nombre de messages : Choisissez de trier les auteurs par ordre alphabétique ou par nombre de messages
- Afficher les graphiques : Choisissez si vous souhaitez afficher les graphiques des données
- Exporter les graphiques : Choisissez si vous souhaitez sauvegarder les graphiques en tant qu’images
Examiner les résultats
- Le script affichera des statistiques telles que :
- La fréquence des mots (les mots les plus utilisés dans le serveur)
- Le nombre de messages envoyés par chaque auteur
- Le nombre de messages envoyés par mois
- Le nombre de pièces jointes et de réactions
- La longueur moyenne des messages
- Il affichera également des graphiques pour :
- Les messages par auteur
- Les messages par mois
- Les mots les plus utilisés
- Et un graphique interactif pour les mots les plus utilisés



Super ! Vous avez maintenant réussi à traiter toutes les données que vous avez récupérer. A vous de jouer !
Analyser les données du serveur Discord
Voici comment vous pouvez potentiellement utiliser les résultats que vous avez analysés pour mieux comprendre votre serveur Discord :
1. Messages par Auteur
- Identifiez les membres les plus actifs de votre serveur
- Reconnaissez les contributeurs les plus engagés au sein de votre communauté
2. Messages par Mois
- Suivez les tendances d’activité au fil du temps
- Identifiez les périodes de forte ou faible activité
3. Fréquence des Mots
- Comprenez les mots les plus utilisés dans votre serveur
- Détectez les spams ou les phrases surutilisées
4. Pièces Jointes et Réactions
- Analysez la fréquence à laquelle les membres partagent des fichiers ou réagissent aux messages
- Identifiez les contenus ou sujets populaires
5. Longueur Moyenne des Messages
- Évaluez la profondeur des conversations sur votre serveur
- Ajustez vos stratégies de modération ou d’engagement en fonction des tendances
Personnaliser le script (Optionnel)
Le script Python que l’on vous fournit est hautement personnalisable. Si vous avez des connaissances en Python, voici quelques idées que vous pouvez mettre en place pour l’améliorer :
- Ajoutez plus de statistiques, comme les jours ou les heures les plus actifs.
- Analysez le sentiment des messages avec une bibliothèque de traitement du langage naturel (NLP) comme TextBlob, Vader ou encore Flair (ou même à la main si vous êtes un expert).
- Exportez les résultats dans un fichier CSV ou JSON pour une analyse plus approfondie.
Conclusion
En combinant DiscordChatExporter et le script Python, vous pouvez facilement exporter et analyser les données de votre serveur Discord. Que vous soyez un administrateur de serveur cherchant à améliorer l’engagement, un passionné qui cherche à faire passer le temps, ou encore un groupe d’amis curieux, cette méthode vous offre un moyen vraiment simple pour atteindre votre but.
Vous savez maintenant comment analyser un serveur Discord avec Python et DiscordChatExporter !
Annexe
Fichier Python :
import os
import csv
import logging
from collections import Counter
from datetime import datetime
import matplotlib.pyplot as plt
import plotly.express as px
# Set up logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def normalize_date(date_str):
try:
# Remove the timezone offset and milliseconds if present
date_str = date_str.split('+')[0]
date_str = date_str.split('.')[0]
return datetime.fromisoformat(date_str)
except ValueError:
logging.warning(f"Invalid date format: {date_str}")
return None
def process_csv_files(directory):
word_count = Counter()
messages_by_author = Counter()
messages_by_month = Counter()
attachment_count = Counter()
reaction_count = Counter()
message_lengths = []
# Get a list of all authors to exclude their names from word count
authors = set()
for filename in os.listdir(directory):
if filename.endswith('.csv'):
filepath = os.path.join(directory, filename)
with open(filepath, 'r', encoding='utf-8') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
# Add author to the set of authors
authors.add(row['Author'])
for filename in os.listdir(directory):
if filename.endswith('.csv'):
filepath = os.path.join(directory, filename)
with open(filepath, 'r', encoding='utf-8') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
# Count words in Content, excluding words that are part of author names
words = row['Content'].split()
for word in words:
# Check if the word is not part of any author's name
if not any(word.lower() in author.lower() for author in authors):
word_count[word.lower()] += 1
message_lengths.append(len(words))
# Count messages by Author
messages_by_author[row['Author']] += 1
# Count messages by month
date = normalize_date(row['Date'])
if date:
month = date.strftime('%Y-%m')
messages_by_month[month] += 1
# Count attachments
if row['Attachments']:
attachment_count[row['Author']] += 1
# Count reactions
if row['Reactions']:
reactions = row['Reactions'].split(',')
reaction_count.update(reactions)
avg_message_length = sum(message_lengths) / len(message_lengths) if message_lengths else 0
return {
'word_count': word_count,
'messages_by_author': dict(sorted(messages_by_author.items(), key=lambda x: x[0])),
'messages_by_month': dict(sorted(messages_by_month.items())),
'attachment_count': dict(sorted(attachment_count.items(), key=lambda x: x[0])),
'reaction_count': dict(sorted(reaction_count.items(), key=lambda x: x[0])),
'avg_message_length': avg_message_length,
}
def print_statistics(stats, max_words, sort_by='name'):
"""
Print statistics, with options to sort authors by name or message count.
:param stats: Dictionary containing statistics.
:param max_words: Maximum number of words to display in word count.
:param sort_by: Sort authors by 'name' (alphabetically) or 'count' (by message count).
"""
print("Word Count:")
for word, count in stats['word_count'].most_common(max_words):
print(f" {word}: {count}")
print("\nMessages by Author:")
if sort_by == 'count':
# Sort authors by message count (descending)
sorted_authors = sorted(stats['messages_by_author'].items(), key=lambda x: x[1], reverse=True)
else:
# Sort authors alphabetically (default)
sorted_authors = sorted(stats['messages_by_author'].items(), key=lambda x: x[0])
for author, count in sorted_authors:
print(f" {author}: {count}")
print("\nMessages by Month:")
for month, count in stats['messages_by_month'].items():
print(f" {month}: {count}")
print("\nAttachments by Author:")
for author, count in stats['attachment_count'].items():
print(f" {author}: {count}")
print("\nReactions:")
for reaction, count in stats['reaction_count'].items():
print(f" {reaction}: {count}")
print(f"\nAverage Message Length: {stats['avg_message_length']:.2f} words")
def plot_data(stats, output_dir, max_words, max_authors=None, export_graphs=False):
if output_dir:
os.makedirs(output_dir, exist_ok=True)
# Sort authors by message count (descending)
sorted_authors = sorted(stats['messages_by_author'].items(), key=lambda x: x[1], reverse=True)
# Limit the number of authors to display
if max_authors:
sorted_authors = sorted_authors[:max_authors]
authors, author_counts = zip(*sorted_authors)
# Plot messages by author (sorted by count)
plt.figure(figsize=(20, 10))
plt.bar(authors, author_counts, color='skyblue')
plt.title(f'Top {len(authors)} Authors by Message Count')
plt.xlabel('Author')
plt.ylabel('Number of Messages')
plt.xticks(rotation=45)
plt.tight_layout()
if export_graphs:
plt.savefig(os.path.join(output_dir, 'messages_by_author_sorted_by_count.png'))
plt.show()
# Plot messages by month
months, month_counts = zip(*stats['messages_by_month'].items())
plt.figure(figsize=(20, 10))
plt.plot(months, month_counts, marker='o', color='green')
plt.title('Messages by Month')
plt.xlabel('Month')
plt.ylabel('Number of Messages')
plt.xticks(rotation=45)
plt.tight_layout()
if export_graphs:
plt.savefig(os.path.join(output_dir, 'messages_by_month.png'))
plt.show()
# Plot word frequency
words, word_counts = zip(*stats['word_count'].most_common(max_words))
plt.figure(figsize=(20, 10))
plt.bar(words, word_counts, color='orange')
plt.title(f'Top {max_words} Words')
plt.xlabel('Word')
plt.ylabel('Frequency')
plt.xticks(rotation=45)
plt.tight_layout()
if export_graphs:
plt.savefig(os.path.join(output_dir, f'top_{max_words}_words.png'))
plt.show()
fig = px.bar(x=words, y=word_counts, labels={'x': 'Word', 'y': 'Frequency'}, title=f'Top {max_words} Words')
fig.show()
def main():
directory = input("Enter the directory containing the CSV files (default: ./data): ") or "./data"
max_words = int(input("Enter the maximum number of words to display in word count (default: 10): ") or 10)
max_authors = input("Enter the maximum number of authors to display (leave blank for all): ").strip()
max_authors = int(max_authors) if max_authors else None
sort_by = input("Sort authors by 'name' or 'count'? (default: name): ").strip().lower() or "name"
try:
stats = process_csv_files(directory)
print_statistics(stats, max_words, sort_by=sort_by)
see_graph_choice = input("Would you like to see graphs of the data? (yes/no): ").strip().lower()
if see_graph_choice == 'yes':
export_graph_choice = input("Would you like to export graphs of the data? (yes/no): ").strip().lower()
output_dir = directory if export_graph_choice == 'yes' else None
if export_graph_choice == 'yes':
output_dir = input("Enter the directory to save the graphs (default: ./graphs): ") or "./graphs"
plot_data(stats, output_dir, max_words, max_authors=max_authors, export_graphs=export_graph_choice == 'yes')
except Exception as e:
logging.error(f"An error occurred: {e}")
if __name__ == '__main__':
main()