변명은 만개 결과는 한개

[Discord Python bot] dm file send 에러 - WinError 10054 현재 연결은 원격 호스트에 의해 강제로 끊겼습니다 본문

공부/Discord

[Discord Python bot] dm file send 에러 - WinError 10054 현재 연결은 원격 호스트에 의해 강제로 끊겼습니다

노마십가 2020. 7. 7. 02:12
728x90
반응형

최근 팀에서 휴면 계정을 확인하는 봇에 대한 요청이 있어서, 몇일동안 밤늦게 자며 작업하였다.

 

진행하며 시간을 정말 많이 소비한 두가지 포인트가 있는데,

첫번째는 "파일 전송시 에러 발생" 이며,

두번째는 "다수 인원에 대한 속도 최적화" 였다.

 

우선 이번 게시글은 파일 전송시의 에러에 대해서만 다룰 예정이다.

두번째는 시간나면 천천히..

 

어쨌든 커맨드를 받을 시 봇이 특정 파일을 요청자에게 DM 으로 Sending 해주는 기능이었는데,

이상하게도 "한줄 전송은 되지만 두줄 이상 전송은 불가능" 하였다.

 

현상은 "커맨드를 수신한 뒤에도 프롬프트에서 가만히 멍때리다 오류메세지 뱉기" 였고,

정확한 오류 메세지는 아래와 같았다

더보기

Ignoring exception in command getList

...

 

aiohttp.client_exceptions.ClientOSError: [WinError 10054] 현재 연결은 원격 호스트에 의해 강제로 끊겼습니다

...

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

...

discord.ext.commands.errors.CommandInvokeError: Command raised an exception: ClientOSError: [WinError 10054] 현재 연결은 원격 호스트에 의해 강제로 끊겼습니다

 

아무래도 '한줄'은 되는데 '두줄' 은 안된다는것에서 파일전송하는 기능 자체는 정상이라는것으로 유추했으며

 

짧은 경험에 따르면 파일입출력에서 한줄만 된다거나, 타임아웃 오류가 온다는건 파일의 인코딩 형식이나 개행문자 관련 문제라고 판단해서 살펴보았다.

 

분명 아래와 같이 각 커맨드마다 "\n" (LF) 값도줬고, 한글지원을 위해 encoding도 잘 줬다고 생각했는데

    f = open("looksGray.txt", 'w', encoding='utf-8')
    f.write(f"today : {today}\n")
    f.write("member.name/member.id")
    ...
    f.close()

이게 웬걸 결과파일에는

요렇게 CRLF가 다 들어가있었다 -_-;;

 

\n 은 LF만 준다고 생각했는데 그게 아니었나보다.

 

요래서 또 열심히 찾아보니 

f = open() 사용 시 inline 값을 '' 로 줘야만 \n 값에 CR이 안들어간다고 해서 아래와 같이 넣어보니

 

f = open("looksGray.txt", 'w', encoding='utf-8', newline='')
f.write(f"today : {today}\n")
f.write("member.name/member.id")
f.close()

요런식으로 CR은 이쁘게 빠지고 LF 값만 들어가게되었다.

 

이대로 만들어진 파일 file send 시 잘됨! : D

 

# 그레이(휴면)명단 ( looksGray.txt ) 을 요청자에게 DM 으로 쏴주는 커맨드
@bot.command()
async def getGrayList(ctx):
    await ctx.message.delete()

    requester = ctx.message.author
    file = discord.File(open('looksGray.txt', 'r', encoding='utf-8'))

    await requester.send(file=file)

 

굿!

 

더보기

 

요걸로 늦게까지 고민하다가 자고일어났고, 

출근하고도 조금 찾아보다가 퇴근한뒤 집에서 테스트해보고 수정하니 너무 잘되길래 어이가 없어서 친 메세지

 

 

 

728x90
반응형