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
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.
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?
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.
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.
(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.)
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 ?
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 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
typage structurel ftw
typage structurel ftw
typage structurel ftw
Bonne chance --- Mon profil github : https://github.com/mibi88.