A Python library for creating HTML transcripts of Discord channels. This is useful for logging, archiving, or sharing conversations from a Discord server.
The base code comes from py-discord-html-transcripts and has been adapted and improved.
🇫🇷 Documentation en Français
- Python 3.6 ou plus récent
discord.pyv2.4.0 ou plus récent (ou un fork compatible commenextcordoudisnake)
Pour installer la librairie, exécutez la commande suivante :
pip install DiscordTranscriptNOTE : Cette librairie est une extension pour discord.py et ne fonctionne pas de manière autonome. Vous devez avoir un bot discord.py fonctionnel pour l'utiliser.
Il existe trois méthodes principales pour exporter une conversation : quick_export, export, et raw_export.
quick_export: La manière la plus simple d'utiliser la librairie. Elle récupère l'historique du salon, génère la transcription, puis la publie directement dans le même salon.export: La méthode la plus flexible. Elle permet de personnaliser la transcription avec plusieurs options.raw_export: Permet de créer une transcription à partir d'une liste de messages que vous fournissez.
Exemple
import discord
import DiscordTranscript
from discord.ext import commands
intents = discord.Intents.default()
intents.members = True
intents.message_content = True
bot = commands.Bot(command_prefix="!", intents=intents)
@bot.command()
async def save(ctx: commands.Context):
await DiscordTranscript.quick_export(ctx.channel, bot=bot)
bot.run("VOTRE_TOKEN")Exemple
import io
import discord
import DiscordTranscript
from discord.ext import commands
# ... (initialisation du bot)
@bot.command()
async def save_custom(ctx: commands.Context):
transcript = await DiscordTranscript.export(
ctx.channel,
limit=100,
tz_info="Europe/Paris",
military_time=True,
bot=bot,
)
if transcript is None:
return
transcript_file = discord.File(
io.BytesIO(transcript.encode()),
filename=f"transcript-{ctx.channel.name}.html",
)
await ctx.send(file=transcript_file)Exemple
import io
import discord
import DiscordTranscript
from discord.ext import commands
# ... (initialisation du bot)
@bot.command()
async def save_purged(ctx: commands.Context):
deleted_messages = await ctx.channel.purge(limit=50)
transcript = await DiscordTranscript.raw_export(
ctx.channel,
messages=deleted_messages,
bot=bot,
)
if transcript is None:
return
transcript_file = discord.File(
io.BytesIO(transcript.encode()),
filename=f"purged-transcript-{ctx.channel.name}.html",
)
await ctx.send("Voici la transcription des messages supprimés :", file=transcript_file)Exemple
import io
import discord
import DiscordTranscript
from DiscordTranscript.construct.attachment_handler import AttachmentToDataURIHandler
from discord.ext import commands
# ... (initialisation du bot)
@bot.command()
async def save_with_embedded_attachments(ctx: commands.Context):
transcript = await DiscordTranscript.export(
ctx.channel,
attachment_handler=AttachmentToDataURIHandler(),
bot=bot,
)
if transcript is None:
return
transcript_file = discord.File(
io.BytesIO(transcript.encode()),
filename=f"transcript-{ctx.channel.name}.html",
)
await ctx.send(file=transcript_file)Voici une liste des paramètres que vous pouvez utiliser dans les fonctions export() et raw_export() pour personnaliser vos transcriptions.
| Paramètre | Type | Description | Défaut |
|---|---|---|---|
messages |
List[discord.Message] |
Une liste de messages à utiliser pour la transcription. | None |
limit |
int |
Le nombre maximum de messages à récupérer. | None (illimité) |
before |
datetime.datetime |
Récupère les messages avant cette date. | None |
after |
datetime.datetime |
Récupère les messages après cette date. | None |
tz_info |
str |
Le fuseau horaire à utiliser pour les horodatages. Doit être un nom de la base de données TZ (ex: "Europe/Paris"). | "UTC" |
military_time |
bool |
Si True, utilise le format 24h. Si False, utilise le format 12h (AM/PM). |
True |
fancy_times |
bool |
Si True, utilise des horodatages relatifs (ex: "Aujourd'hui à..."). Si False, affiche la date complète. |
True |
bot |
discord.Client |
L'instance de votre bot. Nécessaire pour résoudre les informations des utilisateurs qui ont quitté le serveur. | None |
guild |
discord.Guild |
L'instance de votre serveur. Nécessaire pour résoudre les informations des membres (rôles, couleurs, etc.). | None |
attachment_handler |
AttachmentHandler |
Un gestionnaire pour contrôler la façon dont les pièces jointes sont traitées. Voir l'exemple Intégrer les pièces jointes dans le HTML. | None (les liens des pièces jointes pointent vers le CDN de Discord) |
language |
str |
La langue à utiliser pour la transcription. | "en" |
Note : Le paramètre messages est uniquement disponible pour la fonction raw_export().
Voici comment vous pouvez utiliser les paramètres pour personnaliser vos transcriptions.
-
messages: Pour créer une transcription à partir d'une liste de messages que vous avez déjà. (Uniquement pourraw_export)# Récupère les 50 derniers messages my_messages = await ctx.channel.history(limit=50).flatten() transcript = await DiscordTranscript.raw_export( ctx.channel, messages=my_messages, # Fournit la liste de messages bot=bot, )
-
limit: Pour limiter le nombre de messages à 100.transcript = await DiscordTranscript.export( ctx.channel, limit=100, # Limite à 100 messages bot=bot, )
-
beforeetafter: Pour exporter les messages d'une période spécifique.import datetime transcript = await DiscordTranscript.export( ctx.channel, # Exportera les messages envoyés entre le 10 et le 20 juin 2023 after=datetime.datetime(2023, 6, 10), # Après le 10 juin 2023 before=datetime.datetime(2023, 6, 20), # Avant le 20 juin 2023 bot=bot, )
-
tz_info: Pour afficher les heures en fonction d'un fuseau horaire (ex: heure de Paris).transcript = await DiscordTranscript.export( ctx.channel, tz_info="Europe/Paris", # Fuseau horaire de Paris bot=bot, )
-
military_time: Pour utiliser le format 12h (AM/PM) au lieu du format 24h.transcript = await DiscordTranscript.export( ctx.channel, military_time=False, # Affiche 1:00 PM au lieu de 13:00 bot=bot, )
-
fancy_times: Pour afficher la date complète au lieu de "Aujourd'hui à...".transcript = await DiscordTranscript.export( ctx.channel, fancy_times=False, # Affiche la date complète (ex: 23/09/2025) bot=bot, )
-
bot: Pour résoudre les informations des utilisateurs (même s'ils ont quitté le serveur).transcript = await DiscordTranscript.export( ctx.channel, bot=bot, # Fournit l'instance du bot )
-
guild: Pour vous assurer que les rôles et les couleurs des membres sont corrects.transcript = await DiscordTranscript.export( ctx.channel, guild=ctx.guild, # Fournit l'instance du serveur bot=bot, )
-
attachment_handler: Pour intégrer les pièces jointes directement dans le fichier HTML.from DiscordTranscript.construct.attachment_handler import AttachmentToDataURIHandler transcript = await DiscordTranscript.export( ctx.channel, # Intègre les pièces jointes en tant que Data URIs attachment_handler=AttachmentToDataURIHandler(), bot=bot, )
🇬🇧 English Documentation
- Python 3.6 or newer
discord.pyv2.4.0 or newer (or a compatible fork likenextcordordisnake)
To install the library, run the following command:
pip install DiscordTranscriptNOTE: This library is an extension for discord.py and does not work standalone. You must have a functional discord.py bot to use it.
There are three main methods for exporting a conversation: quick_export, export, and raw_export.
quick_export: The simplest way to use the library. It retrieves the channel's history, generates the transcript, and then publishes it directly in the same channel.export: The most flexible method. It allows you to customize the transcript with several options.raw_export: Allows you to create a transcript from a list of messages you provide.
Example
import discord
import DiscordTranscript
from discord.ext import commands
intents = discord.Intents.default()
intents.members = True
intents.message_content = True
bot = commands.Bot(command_prefix="!", intents=intents)
@bot.command()
async def save(ctx: commands.Context):
await DiscordTranscript.quick_export(ctx.channel, bot=bot)
bot.run("YOUR_TOKEN")Example
import io
import discord
import DiscordTranscript
from discord.ext import commands
# ... (bot initialization)
@bot.command()
async def save_custom(ctx: commands.Context):
transcript = await DiscordTranscript.export(
ctx.channel,
limit=100,
tz_info="America/New_York",
military_time=True,
bot=bot,
)
if transcript is None:
return
transcript_file = discord.File(
io.BytesIO(transcript.encode()),
filename=f"transcript-{ctx.channel.name}.html",
)
await ctx.send(file=transcript_file)Example
import io
import discord
import DiscordTranscript
from discord.ext import commands
# ... (bot initialization)
@bot.command()
async def save_purged(ctx: commands.Context):
deleted_messages = await ctx.channel.purge(limit=50)
transcript = await DiscordTranscript.raw_export(
ctx.channel,
messages=deleted_messages,
bot=bot,
)
if transcript is None:
return
transcript_file = discord.File(
io.BytesIO(transcript.encode()),
filename=f"purged-transcript-{ctx.channel.name}.html",
)
await ctx.send("Here is the transcript of the deleted messages:", file=transcript_file)Example
import io
import discord
import DiscordTranscript
from DiscordTranscript.construct.attachment_handler import AttachmentToDataURIHandler
from discord.ext import commands
# ... (bot initialization)
@bot.command()
async def save_with_embedded_attachments(ctx: commands.Context):
transcript = await DiscordTranscript.export(
ctx.channel,
attachment_handler=AttachmentToDataURIHandler(),
bot=bot,
)
if transcript is None:
return
transcript_file = discord.File(
io.BytesIO(transcript.encode()),
filename=f"transcript-{ctx.channel.name}.html",
)
await ctx.send(file=transcript_file)Here is a list of parameters you can use in the export() and raw_export() functions to customize your transcripts.
| Parameter | Type | Description | Default |
|---|---|---|---|
messages |
List[discord.Message] |
A list of messages to use for the transcript. | None |
limit |
int |
The maximum number of messages to retrieve. | None (unlimited) |
before |
datetime.datetime |
Retrieves messages before this date. | None |
after |
datetime.datetime |
Retrieves messages after this date. | None |
tz_info |
str |
The timezone to use for timestamps. Must be a TZ database name (e.g., "America/New_York"). | "UTC" |
military_time |
bool |
If True, uses 24h format. If False, uses 12h format (AM/PM). |
True |
fancy_times |
bool |
If True, uses relative timestamps (e.g., "Today at..."). If False, displays the full date. |
True |
bot |
discord.Client |
Your bot's instance. Necessary to resolve user information for members who have left the server. | None |
guild |
discord.Guild |
Your server's instance. Necessary to resolve member information (roles, colors, etc.). | None |
attachment_handler |
AttachmentHandler |
A handler to control how attachments are processed. See the Embedding Attachments in HTML example. | None (attachment links point to Discord's CDN) |
language |
str |
The language to use for the transcript. | "en" |
Note: The messages parameter is only available for the raw_export() function.
Here’s how you can use the parameters to customize your transcripts.
-
messages: To create a transcript from a list of messages you already have. (Only forraw_export)# Fetches the last 50 messages my_messages = await ctx.channel.history(limit=50).flatten() transcript = await DiscordTranscript.raw_export( ctx.channel, messages=my_messages, # Provide the list of messages bot=bot, )
-
limit: To limit the number of messages to 100.transcript = await DiscordTranscript.export( ctx.channel, limit=100, # Limit to 100 messages bot=bot, )
-
beforeandafter: To export messages from a specific period.import datetime transcript = await DiscordTranscript.export( ctx.channel, # Will export messages sent between June 10th and June 20th, 2023 after=datetime.datetime(2023, 6, 10), # After June 10, 2023 before=datetime.datetime(2023, 6, 20), # Before June 20, 2023 bot=bot, )
-
tz_info: To display times in a specific timezone (e.g., New York time).transcript = await DiscordTranscript.export( ctx.channel, tz_info="America/New_York", # New York timezone bot=bot, )
-
military_time: To use 12-hour format (AM/PM) instead of 24-hour format.transcript = await DiscordTranscript.export( ctx.channel, military_time=False, # Displays 1:00 PM instead of 13:00 bot=bot, )
-
fancy_times: To display the full date instead of "Today at...".transcript = await DiscordTranscript.export( ctx.channel, fancy_times=False, # Displays the full date (e.g., 09/23/2025) bot=bot, )
-
bot: To resolve user information (even if they have left the server).transcript = await DiscordTranscript.export( ctx.channel, bot=bot, # Provide the bot instance )
-
guild: To ensure member roles and colors are correct.transcript = await DiscordTranscript.export( ctx.channel, guild=ctx.guild, # Provide the guild instance bot=bot, )
-
attachment_handler: To embed attachments directly into the HTML file.from DiscordTranscript.construct.attachment_handler import AttachmentToDataURIHandler transcript = await DiscordTranscript.export( ctx.channel, # Embeds attachments as Data URIs attachment_handler=AttachmentToDataURIHandler(), bot=bot, )







