파이썬을 이용해 그동안 제출한 문제 모두 백준허브 업로드하기

yoondgu·2023년 1월 5일
1

기능 구현

목록 보기
1/4

다시 알고리즘 문제 풀이 연습을 시작하기에 앞서,기존에 문제를 풀고 기록해두던 저장소를 더 편리하게 정리하고 싶었다.
그리고 백준허브 라는 아주 좋은 익스텐션을 알게 되었다.
그래서 앞으로는 이를 이용해 기록을 하려고 하는데, 그동안의 기록과도 일관성이 있었으면 좋겠어서
새 저장소를 만들고 그 저장소에 그 동안 푼 문제들을 모두 백준허브 익스텐션을 통해 저장하려고 했다.

하지만 그렇게 하기 위해서는 각 문제 제출 페이지를 직접 하나 하나 들어가주어야 했다.
(해당 제출 페이지에 들어가면 익스텐션이 자동으로 해당 정보를 커밋해주는 시스템이다.)

나는 아직 푼 문제가 그렇게 많지 않아(ㅎㅎ..) 아주 어려운 일은 아니었지만
개발을 공부하는 사람으로서 이걸 자동화하지 않고 손수 하기에는..! 재밌는 기회를 하나 놓치는 거라는 생각이 들었다.

나는 이런 익스텐션을 직접 개발할 능력이 아직 못되지만,
그래도 단순히 어떤 형식의 url을 반복적으로 요청하는 일 정도는 컴퓨터에게 시켜볼 수 있지 않겠는가.

그래서 파이썬의 webbrowser를 이용해 아래와 같은 코드를 실행하여 해당하는 문제 번호를 가진 url을 전부 요청하도록 하였다.
조금 무식한 방법인가..?ㅎㅎ 그래도 내 손을 안써도 된다.

import webbrowser
import asyncio

url = "https://www.acmicpc.net/status?from_mine=1&problem_id={}&user_id=사용자아이디"
webbrowser.get("open -a /Applications/Google\ Chrome.app %s")

async def openProblem(id):
    await asyncio.sleep(5)
    webbrowser.open_new_tab(url.format(id))

problems = "1000 1001 1008 1065 1110 1152 1157 1302 1316 1330 1449 1546 1712 2164 2292 2309 2438 2439 2480 2525 2557 2562 2577 2588 2675 2739 2741 2742 2753 2884 2908 2941 3052 4344 4673 5622 8393 8958 9012 9498 10171 10172 10430 10718 10809 10818 10869 10871 10926 10950 10951 10952 10998 11021 11022 11047 11286 11654 11720 14681 15552 15596 18108"
ids = problems.split(" ")

for id in ids:
    asyncio.run(openProblem(id))

1. 맞은 문제 번호 관련


처음에는 내가 푼 문제 번호를, 백준의 마이페이지 링크에서 스크래핑해오려고 했다. 그런데 아마도 보안(?) 문제로 Html 문서가 스크랩되지 않았다.
하지만 그냥 복사 붙여넣기 해서 코드에 넣어주기만 해도 되는 부분이므로, 코드에 단순하게 붙여넣기 했다.

2. 순차적으로 처리하기(대신 충분히 기다려주기..)

주어진 문제 번호에 대해 반복문으로 openProblem(id)을 호출했을 때,예상한 대로 다수의 브라우저 창이 열렸다.
하지만 모든 창이 열린 뒤 백준허브에 연결된 github 저장소에 가보면, 4개 정도만 새로 커밋되어있는 걸 확인할 수 있었다.

정확하진 않지만
백준허브 사용 설명서를 확인한 결과, 업로드까지 2초 정도의 시간이 걸린다고 되어 있었고
파이썬을 통해 빠르게 계속 새 탭을 열다보니 각 페이지에 대한 업로드 작업이 제대로 이루어지지 않는 것 같았다.

정확하게 해당 페이지의 백준허브 업로드가 완료된 뒤, 다음 url을 요청하도록 코드를 짜면 좋겠지만,
일단은 대충 굴러가게 하는 것이 목적이므로
하나의 url을 요청할 때 5초의 대기 시간을 가지도록 만들어주었다.
(아직 동기, 비동기에 대해 제대로된 이해를 갖추고 있지 못해서 async, await에 대한 적절한 사용인지는 모르겠다.)

한 문제에 여러 개의 답안이 있는 경우 등 생각보다 업로드 시간이 더 오래 걸리는 경우도 있어서 5초 만큼 여유를 주었다.
사람이 직접 손으로 하나 하나 접속할 때와 비슷한 속도이지만
기다리기만 하면, 내 손을 움직이지 않아도 모든 제출 문제를 커밋할 수 있게 되었다.

0개의 댓글