Я перемещаю своего бота со своего старого сломанного ноутбука на полноценный VPS. Я использую более старую асинхронную версию Discord.py (0.16.0), потому что я начал работать над этим задолго до того, как переписывание было чем-то; и у меня нет большого опыта работы с Linux, поэтому переход на Windows Server казался разумным. Я установил все те же пакеты (насколько мне известно), но я постоянно получаю сообщение об ошибке при запуске в строке bot.run()
:
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)
Ошибка возникает во время рукопожатия, насколько я могу судить по трассировке стека, не то чтобы я знал, каковы последствия этого.
Эта установка работала несколько лет на двух разных ноутбуках (хотя и под управлением Windows 10) без каких-либо проблем, и сервер discord.py, похоже, не сталкивался с такими проблемами на машине Windows (это происходит на OS X, но из-за некоторая идиосинкразия Python 3.6, и это также происходило в Python 3.5. Тоже неправильная ОС.) Я попытался изменить установки Python и установить некоторые автоматические обновления Windows, а также выполнить некоторые команды, которые я нашел здесь и там: pip install certifi
и pip install incremental
.
После нескольких часов бездействия из любопытства: и разочарования, и из-за того, что у меня есть тестовый бот на одном сервере, который я не возражаю, чтобы его выбросили, я попробовал что-то, что я видел в обсуждении stackoverflow.
bot = commands.Bot(
command_prefix='/',
connector=aiohttp.TCPConnector(verify_ssl=False)
)
(добавленная строка - это, в частности, весь connector
kwarg, которого раньше не было.)
Странно то, что это ИЗМЕНИЛО трассировку стека, но на самом деле не изменило ошибку, как показано ниже:
Перед добавлением verify_ssl = False я получал ...
Traceback (most recent call last):
File "C:\Program Files\Python36\lib\site-packages\aiohttp\connector.py", line 601, in _create_direct_connection
local_addr=self._local_addr)
File "C:\Program Files\Python36\lib\asyncio\base_events.py", line 802, in create_connection
sock, protocol_factory, ssl, server_hostname)
File "C:\Program Files\Python36\lib\asyncio\base_events.py", line 828, in _create_connection_transport
yield from waiter
File "C:\Program Files\Python36\lib\asyncio\sslproto.py", line 503, in data_received
ssldata, appdata = self._sslpipe.feed_ssldata(data)
File "C:\Program Files\Python36\lib\asyncio\sslproto.py", line 201, in feed_ssldata
self._sslobj.do_handshake()
File "C:\Program Files\Python36\lib\ssl.py", line 683, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Program Files\Python36\lib\site-packages\aiohttp\connector.py", line 304, in connect
yield from self._create_connection(req)
File "C:\Program Files\Python36\lib\site-packages\aiohttp\connector.py", line 578, in _create_connection
transport, proto = yield from self._create_direct_connection(req)
File "C:\Program Files\Python36\lib\site-packages\aiohttp\connector.py", line 624, in _create_direct_connection
(req.host, req.port, exc.strerror)) from exc
aiohttp.errors.ClientOSError: [Errno 1] Can not connect to discordapp.com:443 [[SSL: CERTIFICATE_VERIFY_FAILED] certific
ate verify failed (_ssl.c:749)]
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "harubotFE98.py", line 43748, in <module> # trust me, I know
bot.run('SNIP')
File "C:\Program Files\Python36\lib\site-packages\discord\client.py", line 519, in run
self.loop.run_until_complete(self.start(*args, **kwargs))
File "C:\Program Files\Python36\lib\asyncio\base_events.py", line 466, in run_until_complete
return future.result()
File "C:\Program Files\Python36\lib\site-packages\discord\client.py", line 490, in start
yield from self.login(*args, **kwargs)
File "C:\Program Files\Python36\lib\site-packages\discord\client.py", line 416, in login
yield from getattr(self, '_login_' + str(n))(*args, **kwargs)
File "C:\Program Files\Python36\lib\site-packages\discord\client.py", line 346, in _login_1
data = yield from self.http.static_login(token, bot=is_bot)
File "C:\Program Files\Python36\lib\site-packages\discord\http.py", line 195, in static_login
data = yield from self.get(self.ME)
File "C:\Program Files\Python36\lib\site-packages\discord\http.py", line 105, in request
r = yield from self.session.request(method, url, **kwargs)
File "C:\Program Files\Python36\lib\site-packages\aiohttp\client.py", line 555, in __iter__
resp = yield from self._coro
File "C:\Program Files\Python36\lib\site-packages\aiohttp\client.py", line 198, in _request
conn = yield from self._connector.connect(req)
File "C:\Program Files\Python36\lib\site-packages\aiohttp\connector.py", line 314, in connect
.format(key, exc.strerror)) from exc
aiohttp.errors.ClientOSError: [Errno 1] Cannot connect to host discordapp.com:443 ssl:True [Can not connect to discordap
p.com:443 [[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)]]
Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x00000224005401D0>
но потом его сократили (?) до ...
Traceback (most recent call last):
File "harubotFE98.py", line 43748, in <module>
bot.run('NOPE')
File "C:\Program Files\Python36\lib\site-packages\discord\client.py", line 519, in run
self.loop.run_until_complete(self.start(*args, **kwargs))
File "C:\Program Files\Python36\lib\asyncio\base_events.py", line 466, in run_until_complete
return future.result()
File "C:\Program Files\Python36\lib\site-packages\discord\client.py", line 491, in start
yield from self.connect()
File "C:\Program Files\Python36\lib\site-packages\discord\client.py", line 444, in connect
self.ws = yield from DiscordWebSocket.from_client(self)
File "C:\Program Files\Python36\lib\site-packages\discord\gateway.py", line 175, in from_client
ws = yield from websockets.connect(gateway, loop=client.loop, klass=cls)
File "C:\Program Files\Python36\lib\site-packages\websockets\py35\client.py", line 19, in __await__
return (yield from self.client)
File "C:\Program Files\Python36\lib\site-packages\websockets\client.py", line 150, in connect
factory, wsuri.host, wsuri.port, **kwds)
File "C:\Program Files\Python36\lib\asyncio\base_events.py", line 802, in create_connection
sock, protocol_factory, ssl, server_hostname)
File "C:\Program Files\Python36\lib\asyncio\base_events.py", line 828, in _create_connection_transport
yield from waiter
File "C:\Program Files\Python36\lib\asyncio\sslproto.py", line 503, in data_received
ssldata, appdata = self._sslpipe.feed_ssldata(data)
File "C:\Program Files\Python36\lib\asyncio\sslproto.py", line 201, in feed_ssldata
self._sslobj.do_handshake()
File "C:\Program Files\Python36\lib\ssl.py", line 683, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)
Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x0000021A50E0E358>
Я также пробовал возиться с чем-то, что называется OpenSSL, но практически любое обсуждение, которое я могу найти на нем, достаточно плотное, чтобы я не мог полностью осмыслить его.
Изменить: после некоторого возни я написал что-то вроде минимального скрипта, чтобы вызвать ошибку:
import aiohttp
import asyncio
import ssl
async def main():
async with aiohttp.ClientSession() as cs:
async with cs.get("https://www.discordapp.com") as r:
res = await r.text()
print(res)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
который возвращает:
Traceback (most recent call last):
File "C:\Program Files\Python36\lib\site-packages\aiohttp\connector.py", line 924, in _wrap_create_connection
await self._loop.create_connection(*args, **kwargs))
File "C:\Program Files\Python36\lib\asyncio\base_events.py", line 802, in create_connection
sock, protocol_factory, ssl, server_hostname)
File "C:\Program Files\Python36\lib\asyncio\base_events.py", line 828, in _create_connection_transport
yield from waiter
File "C:\Program Files\Python36\lib\asyncio\sslproto.py", line 503, in data_received
ssldata, appdata = self._sslpipe.feed_ssldata(data)
File "C:\Program Files\Python36\lib\asyncio\sslproto.py", line 201, in feed_ssldata
self._sslobj.do_handshake()
File "C:\Program Files\Python36\lib\ssl.py", line 683, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "test2.py", line 12, in <module>
loop.run_until_complete(main())
File "C:\Program Files\Python36\lib\asyncio\base_events.py", line 466, in run_until_complete
return future.result()
File "test2.py", line 7, in main
async with cs.get("https://www.discordapp.com") as r:
File "C:\Program Files\Python36\lib\site-packages\aiohttp\client.py", line 1005, in __aenter__
self._resp = await self._coro
File "C:\Program Files\Python36\lib\site-packages\aiohttp\client.py", line 476, in _request
timeout=real_timeout
File "C:\Program Files\Python36\lib\site-packages\aiohttp\connector.py", line 522, in connect
proto = await self._create_connection(req, traces, timeout)
File "C:\Program Files\Python36\lib\site-packages\aiohttp\connector.py", line 854, in _create_connection
req, traces, timeout)
File "C:\Program Files\Python36\lib\site-packages\aiohttp\connector.py", line 992, in _create_direct_connection
raise last_exc
File "C:\Program Files\Python36\lib\site-packages\aiohttp\connector.py", line 974, in _create_direct_connection
req=req, client_error=client_error)
File "C:\Program Files\Python36\lib\site-packages\aiohttp\connector.py", line 929, in _wrap_create_connection
raise ClientConnectorSSLError(req.connection_key, exc) from exc
aiohttp.client_exceptions.ClientConnectorSSLError: Cannot connect to host www.discordapp.com:443 ssl:None [[SSL: CERTIFI
CATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)]
Я также пробовал несколько других решений, таких как использование веб-клиента для посещения discordapp.com:443 (который работал, но не исправил это) и обновление python aiohttp до самой последней сборки (которая не исправила это) .