[Python] Pyppeteer를 버리다
·
Study/Python
여하튼 오래 걸리는 작업이다. Selenium보다 Pyppeteer가 빨랐지만, 결국 브라우저가 페이지의 많은 부분을 렌더링 해야만 하는 무거운 작업의 연속이었기에 해결책이 필요했다. 물론 Yahoo! Finance가 짧은 주기로 주가를 실시간 갱신해 주고, 다른 사이트는 이 정도로 신속하게 갱신해 주지 않기에 최대한 이를 활용하면서 속도를 올리고 싶었다. 하지만 너무 느린 속도를 감당할 수 없어서 갱신 주기를 포기하고 좀 더 가벼운 사이트를 찾기로 했다. 쓸만한 사이트를 찾은 것 같다 Stock Analysis라는 사이트를 발견했다. 처리 속도가 빠른 데스크탑에서 비교해도 명백히 이쪽이 빠르다. 아후는 무거운 렌더링 과정 없이 데이터를 가져올 수 없었지만 여기는 lxml을 통해 빠르게 가져올 수 있었다..
[Python] 스크래핑 과정 최적화를 위한 시도
·
Study/Python
동적 웹을 스크래핑하는 과정은 필수적으로 JS 렌더링이 필요하기 때문에 그 부하가 크고 시간이 오래 걸린다. 이전에 Selenium을 썼지만 이 녀석, 너무 느리다. 내 아마존 프리티어 VM이 감당하기엔 너무 큰 짐이 아니었나 싶기도 하다. 그래서 아래와 같은 방법들을 모색해 봤다. 1. 클라우드 변경 조금 더 속도가 빠른 클라우드를 찾기 위해 구글링을 거듭했다. 약간의 돈이라면 지불할 용의도 있었다. 그러다 문득 뇌리에 스친 Oracle Cloud. 1개의 OCPU를 제공한다는 뜻은 2개의 스레드를 돌릴 수 있다는 뜻이다. 일정 사용량을 초과하지만 않으면 평생 무료이기도 하니 이것으로 낙점. 한 달짜리 무료 크레딧도 받은 김에 12 코어짜리 VM도 설정했다. 내 봇엔 너무 과한 스펙이지만 어차피 사라질..
[Python] Aim Smoothing
·
Study/Python
Aim Smoothing이란 말 그대로 FPS게임 등의 에임봇이나 컨트롤러 유저를 위한 Aim Assist에 사용되는 개념이다. 조준을 수행할 때, 적에 자석처럼 붙는 것이 아니라 자연스럽게 적에게 에임을 이동시키게 해 주는 기술이라 할 수 있다. 에임 어시스트에 관한 영상으로 아래의 영상을 참고할 수 있다. https://www.youtube.com/watch?v=-RQbAO9jx_I 방법은? 적이 있는 좌표와 내 에임 사이의 좌표 간의 이동을 보간해 구현할 수 있다. 일단 각각의 차이를 보자. 보간X 아주 찰싹 달라붙는다. 빈말로도 자연스럽다고 할 수 없다. 비선형 보간법 움직임이 비교적 자연스럽다. 여전히 어색하지만 가감속도 들어가 있고 그나마 봐줄 만하다. 선형 보간법을 사용하면 저기에 가감속이 ..
[Python] 봇 개선 및 커맨드 추가
·
Study/Python
새로운 기능으로 주식 정보를 가져오는 명령어를 만드려고 했다가 아주 큰일이 됐다. 굳이 손대고 싶지 않았던 귀찮은 부분들에 손을 대기로 했다. 1. 메인 봇 코드 다이어트 기존엔 명령어를 별도로 빼는 것이 아니라, 아래처럼 그 명령어 함수 안에 구동부를 다 때려 넣은 형식이었다. #region sync @client.tree.command(name='sync', description='Owner only') async def sync(interaction: discord.Interaction): if interaction.user.id == OWNER_ID: await interaction.response.defer(ephemeral=True) await client.tree.sync() await in..
[Python] 웹 파싱 / 기존 기능 개선
·
Study/Python
어떤 웹페이지에서 특정 시간 정보를 가져올 일이 간간히 있는데, 지금까진 그냥 눈으로 보고 손으로 데이터를 변환한 후 사용했다. 너무 미련한 짓인 것 같아서 확실히 자동화해야겠다고 생각했다... 해당 기능을 구현해 봇에 올릴 것이다. 1. 어떤 데이터를 받아올 것인가? FFXIV의 로드스톤엔 점검 관련 공지가 올라온다. 그 공지의 내용에 있는 일정에 대한 정보를 뜯어올 것이다. [続報]全ワールド メンテナンス作業 終了時間変更のお知らせ(8/8) 全ワールド メンテナンス作業 終了時間変更のお知らせ(8/8) | FINAL FANTASY XIV, The Lodestone 全ワールド メンテナンス作業 終了時間変更のお知らせ(8/8) jp.finalfantasyxiv.com 위 공지에서 시간을 나타내는 아래와 같다. 정규식..
[Python] DeepL 번역 API 써보기
·
Study/Python
DeepL 번역이 성능이 썩 괜찮고 가끔 써봄직 하여 봇에 추가해 봤다. 1. 번역 API 선정 사실 처음부터 DeepL을 사용하기로 한 건 아니었다. 후보로 여러 번역기들을 생각해 봤다. GPT 비싸다. 그냥 비싸다. 그리고 번역이 메인인 모델이 아니기 때문에 번역 품질의 신뢰성이 가장 높다고 보기 힘들다. Papago 이미 kd()를 위해 사용하고 있다. 제한 토큰 수가 적기 때문에 패스. Google Translate 번역 품질이 나쁜 것은 아니지만, 마냥 좋다고도 할 수 없고 돈을 내지 많으면 사실상 사용하는 것이 무의미한 수준이다. DeepL 그나마 무료 플랜으로도 제한이 널널하고 번역 품질도 생각보다 괜찮아서 낙점했다. 그래서 DeepL의 홈페이지로 가서 등록하려니... 국내 카드를 안 먹는다..
[Python] 단위 변환
·
Study/Python
우리는 임페리얼 단위를 영구히 퇴출시키기 위해 노력할 필요가 있다. 1. 클래스 from Utils.Log import Logger as lg class unit(): # Convert Imperial to Metric def imperial_to_metric(value, unit): if unit == "in": return value * 2.54, "cm" elif unit == "ft": return value * 0.3048, "m" elif unit == "yd": return value * 0.9144, "m" elif unit == "mi": return value * 1.60934, "Km" elif unit == "gal": return value * 3.78541, "L" elif un..
[Python / GPT] 봇 코드 리팩터링
·
Study/Python
사실 이번 글을 이 카테고리에 써도 되나 모르겠다. 그래도 배우는 것이긴 하니 일단 여기에 쓴다. 1. Log 요즘 GPT 모르는 사람이 없다. 얘가 코드도 짜준다더라. 있는 걸 갖다 넣으면 리팩터링도 해주고. 그래서 내 기존 봇 코드를 이를 활용해 리팩터링 해 보기로 했다. 아래는 기존에 내가 작성한 코드다. class types(Enum): INFO = 1 ERROR = 2 DEBUG = 3 UNKNOWN = 4 class Colors: BLACK = '[\033[30m' RED = '[\033[31m' GREEN = '[\033[32m' YELLOW = '[\033[33m' BLUE = '[\033[34m' MAGENTA = '[\033[35m' CYAN = '[\033[36m' WHITE = '[..
[Python, AWS] csv에서 DynamoDB에로의 교체
·
Study/Python
원래 봇 로그 데이터 저장엔 Pandas를 활용해 csv 형태로 저장했지만, Cloudtype 상에서 csv를 확인한다는 게 여간 귀찮은 일이 아니었다. 접근성이 떨어지는 만큼 보려는 의욕 자체가 떨어진다고 할까... 그래서 이 불편함을 타파하고 나름대로 DB 공부를 해보고자 이걸 DB로 전부 교체하기로 결정했다. 원래는 Cloudtype에서 제공하는 MariaDB 템플릿을 쓰려고 했지만... HeidiSQL 상에서 접속을 시도했는데 안되더라? 클라우드에서 제공한 가이드도 현재의 UI랑 달랐다. 외부에서 TCP 접속이 막힌 느낌이긴 한데 그냥 안 되는 김에 다른 DB를 찾아보기로 했다. 집에 있는 라즈베리파이를 DB로 쓸까 잠깐 스쳐 지나가듯 생각했지만 파기. 적은 트래픽을 사용한다면 무료로 쓸 수 있는..
[Python] 로깅 클래스 추가
·
Study/Python
역시 무슨 일이 벌어지는지 알기 위해선 필요한 로그를 남겨놔야 한다. 간단한 로깅 클래스를 만들고 봇의 로깅이 필요한 곳에 추가했다. 1. 부가 클래스 작성 class types(Enum): INFO = 1 ERROR = 2 DEBUG = 3 UNKNOWN = 4 class Colors: BLACK = '[\033[30m' RED = '[\033[31m' GREEN = '[\033[32m' YELLOW = '[\033[33m' BLUE = '[\033[34m' MAGENTA = '[\033[35m' CYAN = '[\033[36m' WHITE = '[\033[37m' UNDERLINE = '[\033[4m' RESET = '\033[0m]' 먼저 enum클래스와 컬러링을 위한 Colors 클래스를 만들었..