Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec un BOT discord

Message d'erreur de la librairie discord.py

Sujet résolu
15 octobre 2021 à 20:19:59

Bonjour,

Je voudrais programmer un BOT Discord en Python, en utilisant la librairie discord.py. Cette librairie contient notamment la méthode suivante, qui déclenche dans mon cas une exception:

Client().run(token)

D'après tous les cours et tutoriels en ligne que j'aie trouvé, cela devrait lancer le BOT, l'afficher comme étant en ligne, et lui permettre d'exécuter le script qu'il contient. Mais quand je lance cette commande, je reçois un message d'erreur de 3 kilomètres:

>>> import discord

>>> class MyClient(discord.Client):
    async def on_ready(self):
        print(f'Logged in as {self.user} (ID: {self.user.id})')
        print('------')

    async def on_message(self, message):
        # we do not want the bot to reply to itself
        if message.author.id == self.user.id:
            return

        if message.content.startswith('!hello'):
            await message.reply('Hello!', mention_author=True)

>>> client = MyClient()
>>> client.run('token')
Traceback (most recent call last):
  File "/Users/enfants/Library/Python/3.8/lib/python/site-packages/aiohttp/connector.py", line 969, in _wrap_create_connection
    return await self._loop.create_connection(*args, **kwargs)  # type: ignore  # noqa
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/asyncio/base_events.py", line 1042, in create_connection
    transport, protocol = await self._create_connection_transport(
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/asyncio/base_events.py", line 1072, in _create_connection_transport
    await waiter
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/asyncio/sslproto.py", line 529, in data_received
    ssldata, appdata = self._sslpipe.feed_ssldata(data)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/asyncio/sslproto.py", line 189, in feed_ssldata
    self._sslobj.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ssl.py", line 944, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1108)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/Users/enfants/Desktop/HobbesBot/HobbesBot.py", line 17, in <module>
    client.run('<Le token de mon BOT>')
  File "/Users/enfants/Library/Python/3.8/lib/python/site-packages/discord/client.py", line 723, in run
    return future.result()
  File "/Users/enfants/Library/Python/3.8/lib/python/site-packages/discord/client.py", line 702, in runner
    await self.start(*args, **kwargs)
  File "/Users/enfants/Library/Python/3.8/lib/python/site-packages/discord/client.py", line 665, in start
    await self.login(*args, bot=bot)
  File "/Users/enfants/Library/Python/3.8/lib/python/site-packages/discord/client.py", line 511, in login
    await self.http.static_login(token.strip(), bot=bot)
  File "/Users/enfants/Library/Python/3.8/lib/python/site-packages/discord/http.py", line 300, in static_login
    data = await self.request(Route('GET', '/users/@me'))
  File "/Users/enfants/Library/Python/3.8/lib/python/site-packages/discord/http.py", line 192, in request
    async with self.__session.request(method, url, **kwargs) as r:
  File "/Users/enfants/Library/Python/3.8/lib/python/site-packages/aiohttp/client.py", line 1117, in __aenter__
    self._resp = await self._coro
  File "/Users/enfants/Library/Python/3.8/lib/python/site-packages/aiohttp/client.py", line 520, in _request
    conn = await self._connector.connect(
  File "/Users/enfants/Library/Python/3.8/lib/python/site-packages/aiohttp/connector.py", line 535, in connect
    proto = await self._create_connection(req, traces, timeout)
  File "/Users/enfants/Library/Python/3.8/lib/python/site-packages/aiohttp/connector.py", line 892, in _create_connection
    _, proto = await self._create_direct_connection(req, traces, timeout)
  File "/Users/enfants/Library/Python/3.8/lib/python/site-packages/aiohttp/connector.py", line 1051, in _create_direct_connection
    raise last_exc
  File "/Users/enfants/Library/Python/3.8/lib/python/site-packages/aiohttp/connector.py", line 1020, in _create_direct_connection
    transp, proto = await self._wrap_create_connection(
  File "/Users/enfants/Library/Python/3.8/lib/python/site-packages/aiohttp/connector.py", line 971, in _wrap_create_connection
    raise ClientConnectorCertificateError(req.connection_key, exc) from exc
aiohttp.client_exceptions.ClientConnectorCertificateError: Cannot connect to host discord.com:443 ssl:True [SSLCertVerificationError: (1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1108)')]
>>> 

(J'ai copié-collé du code source d'Internet pour tester :))

J'ai l'impression que le programme n'arrive pas à se connecter à Discord, mais je ne suis pas sûr. Est-ce que quelqu'un saurait m'aider SVP?

-
Edité par UnknownUnknown18 15 octobre 2021 à 20:36:13

  • Partager sur Facebook
  • Partager sur Twitter
15 octobre 2021 à 21:45:17

Bonjour. La ligne intéressante, comme souvent, est la dernière. Voici ce que StackOverflow dit à ce sujet : https://stackoverflow.com/questions/35569042/ssl-certificate-verify-failed-with-python3 . On recommande notamment de mettre à jour le module qui s'occupe de la certification ssl : pip install --upgrade certifi . Tu voudras peut-être essayer les autres solutions si Cela ne fonctionne pas.

Autre point anecdotique : on écrit simplement bot ;)

-
Edité par digammaF 15 octobre 2021 à 21:45:33

  • Partager sur Facebook
  • Partager sur Twitter

typage structurel ftw

17 octobre 2021 à 11:05:12

Bonjour. J'ai essayé toutes les solutions que j'ai trouvé sur le lien que tu me propose, mais aucune n'a changé quoi que ce soit.

Détail : pour certaines commandes, j'ai dû rajouter l'option --user pour éviter de me retrouver avec un "permission denied". Est-ce que ça pourrait changer quelque chose? Est-ce que il faudrait exécuter ces commandes à partir d'une session d'administrateur?
  • Partager sur Facebook
  • Partager sur Twitter
17 octobre 2021 à 14:31:15

Exécuter les commandes à partir d'une session administrateur ne présente quasiment aucun risque dans ce cas donc c'est une chose à tenter.

D'autre part, il est apparemment utile de générer un certificat via un navigateur web ; https://stackoverflow.com/questions/62102897/certifacte-verify-failed-certificate-has-expired-ssl-c1108#62104752 

J'ai trouvé ça avec la recherche "python bot discord aiohttp.client_exceptions.ClientConnectorCertificateError: Cannot connect to host discord.com:443 ssl:True [SSLCertVerificationError: (1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1108)')] >>>". C'est une bonne méthode en général.

  • Partager sur Facebook
  • Partager sur Twitter

typage structurel ftw

17 octobre 2021 à 17:56:42

Je ne parviens pas à télécharger le certificat dont j'ai besoin. Beaucoup de forums proposent une solution avec Internet Explorer, mais j'utilise Safari car je suis sous MacOS.
  • Partager sur Facebook
  • Partager sur Twitter
17 octobre 2021 à 18:53:58

Voici encore autre chose alors : https://stackoverflow.com/questions/42098126/mac-osx-python-ssl-sslerror-ssl-certificate-verify-failed-certificate-verify

(Je précise que j'en suis à lancer une recherche duckduckgo et balancer le résultat sans plus d'informations. Il n'y a pas grande expertise dans mes conseils à part peut-être savoir quels mots clés utiliser.)

  • Partager sur Facebook
  • Partager sur Twitter

typage structurel ftw

25 octobre 2021 à 18:07:02

tu as créé ton token d'accès sur discord ? il doit y avoir aussi une section qui te créé ton certificat et configurer ton serveur discord pour ajouter/autoriser ton bot ?
  • Partager sur Facebook
  • Partager sur Twitter
26 octobre 2021 à 22:16:03

J'avais crée un petit bot discord, il y a quelque mois, donc je ne me souviens plus trop de ce que j'avais fait ... Par contre, j'ai écrit un petit exemple de bot ici :
import discord
import asyncio

TOKEN = "<token>"

class MyClient(discord.Client):
    async def on_ready(self):
        print('Logged in as')
        print(self.user.name)
        print(self.user.id)
        print('------')
    async def on_message(self, message):
        if message.content.startswith('$ command'):
            await message.channel.send("C'est une commande très bizarre ! :yum:")

client = MyClient()
client.run(TOKEN)

Tu dois remplacer "<token>" par le token de ton bot que tu peux récupérer sur le discord developper portal. Ce tutoriel te l'expliquera : https://betterprogramming.pub/coding-a-discord-bot-with-python-64da9d6cade7

Après, pour complexifier ton bot, tu peux regarder la doc. de discord.py : https://discordpy.readthedocs.io/en/stable/.

Bonne Chance !

  • Partager sur Facebook
  • Partager sur Twitter

Bonne chance --- Mon profil github : https://github.com/mibi88.

5 novembre 2021 à 14:25:22

umfred a écrit:

tu as créé ton token d'accès sur discord ? il doit y avoir aussi une section qui te créé ton certificat et configurer ton serveur discord pour ajouter/autoriser ton bot ?


Oui, j'ai bien récupéré mon token, et remplacé <token>par celui-ci (j'ai supprimé le token de mon bot dans le message d'erreur pour des raisons de sécurité :)).

Le certificat était téléchargé, mais Discord ne le cherchais pas au bon endroit. Mon père a finalement réussi à faire fonctionner le bot en modifiant le code source de la librairie installée sur mon ordinateur.

Donc, mon bot marche! (enfin!)

Par contre, je me heurte à un autre problème. Je tente de coder une version expérimentale d'une commande "*ping", qui permettrai de mentionner quelqu'un plusieurs fois d'affilée. (l'exemple ici ne le fait qu'une fois !) Le code ressemble à ceci:

import discord

class MyClient(discord.Client):
    
    async def on_ready(self):
        print(f'Logged in as {self.user} (ID: {self.user.id})')
        print('------')

    async def on_message(self, message):
        if message.content.split()[0] == "*ping":
            member_to_ping = message.content.split()[1]
                for member in message.guild.members:
                    if member.name == member_to_ping:
                        channel = message.channel
                        await message.delete()
                        await channel.send(member.mention)
                    
client = MyClient()
client.run("<Le token de mon bot>")

message.guild.members est censé être la liste des membres du serveur. J'ai fait quelque tests, et il apparaît que cette liste ne comprend QUE mon bot comme seul membre…

Il paraît qu'il faut activer le scope "Identify" dans la section OAuth2 du Portail des développeurs Discord. J'ai tenté de le faire, mais quand j'active un scope autre que "bot" et que je tente d'installer le bot sur mon serveur, mon navigateur me dit qu'il ne peut pas se connecter au serveur  82.65.251.18 (au final, soit le bot s'installe mais j'ai l'impression que c'est sans le scope, soit il ne s'installe pas).

Désolé de vous solliciter comme ça, mais je suis un peu désespéré  '^^

Si vous avez besoin de plus d'informations, je suis à votre disposition ^^

-
Edité par UnknownUnknown18 5 novembre 2021 à 14:25:45

  • Partager sur Facebook
  • Partager sur Twitter
10 novembre 2021 à 12:17:33

J'ai réussi à résoudre ce problème : il fallait activer les intentions sur le portail des développeurs Discord et dans le code:

import discord
intents = discord.Intents.default()
intents.members = True

class MyClient(discord.Client):
    ...

client = MyClient(intents=intents)
client.run(token)

Merci à tous pour votre aide, surtout digammaF!

-
Edité par UnknownUnknown18 10 novembre 2021 à 21:24:45

  • Partager sur Facebook
  • Partager sur Twitter
11 juillet 2022 à 17:51:00

Bonjour, Unkown8. tu peux me dire comment tu as résolu le prôblème du cértifécat SSL S'il te plait

  • Partager sur Facebook
  • Partager sur Twitter