unsolved.wa 개발하기 1 - solved.ac api 호출하기

Yaminyam·2022년 5월 11일
2

시작하기

나는 PS로 컴공에 입문한 만큼 PS에 꾸준히 관심이 있었으나 주변의 사람들이 생각보다 PS에 관심이 많이 없어 PS를 전파하는것에 열심히 활동했다

학교내 알고리즘 동아리 AnA에서 꾸준히 활동하며 행사들을 기획하고, 특히 매년 boj 플랫폼을 이용하여 알고리즘 대회를 개최하였다
https://www.acmicpc.net/category/402

그 후 꾸준히 알고리즘 스터디를 진행하다가 랭킹이 오르는거에 굉장히 성취감과 동기를 느끼는것 같아 boj에서 제공되는 특정 조직의 랭킹작을 하면서 조직내에서의 PS 스터디를 강화할 수 있을 것 같았다

프로그램 개발

boj에서는 크롤링을 약관상 금지하고 있으며 api도 제공하고 있지 않아 solved.ac의 비공식 api를 이용하기로 했다

solved.ac에서는 api를 제공할 예정이나 문서화를 할 시간이 없어 공개된 코드에서 엔드포인트를 직접 알아내서 사용하는 방식으로 먼저 사용하라는 입장이었다
그래서 어떤분께서 이 방법으로 알아낸 엔드포인트들을 문서화를 진행하여 정리해둔 solved.ac 비공식 api 문서를 참고하였다

https://solvedac.github.io/unofficial-documentation/#/

python request 모듈을 이용하여 api 호출을 통해 구현하였다

  1. 특정 그룹의 유저목록 요청하기
  2. 각 유저별 푼 문제 요청하기
  3. 각 유저별 푼 문제를 모두 set에 담아 그룹이 푼 문제리스트 만들기
  4. tier별 문제 호출하기
  5. tier낮은 순으로 각 tier별 문제에서 그룹이 푼 문제리스트 제외하기

다음과 같은 순서를 통해 프로그램이 실행된다
tier별 문제를 호출 한것은 많은 그룹원들의 참여 유도와 그룹 랭킹은 푼 문제수로 결정되기 때문에 쉬운문제부터 풀기 위함이었다

각 단계에서 api를 호출할 때 유의할 점이 있었는데 api의 response가 전부 pagination되어있어 결과 count / 100 + 1번 만큼 api를 호출해야 한다는 것이다

https://github.com/AnA-algorithm/boj-organization-solved-list

활용 및 한계

나는 이 프로그램을 42Seoul 그룹에서 활용하였다
42Seoul slack에 algorithm 관련 채널을 개설하였고 이 프로그램을 이용하여 unsolved 문제들을 공유하기 시작했다

다음과 같이 하루에 15문제씩 공유했고 매일 15문제가 모두 풀리며 42Seoul의 조직랭킹이 5일만에 3단계나 올라갔다

하지만 몇가지 문제점이 있었는데 solved.ac api의 호출제한이 약 15분당 300회 정도까지만 가능해서 429 에러가 발생하는 것이었다
이 문제를 해결하기 위해 api호출마다 sleep을 줘서 문제를 해결하였더니 각 호출당 5초가량 대기를 하며 200명의 유저가 평균 200문제를 풀었다고 할 때, 한 번 실행하면 약 50분이 소요되었다
위의 사진에서 언급한것과 같이 이것을 최적화 하는데 여러가지 고민을 했고 이 내용은 다음 포스팅에서 정리하도록 하겠다

두번째 문제는 boj의 랭킹을 올리기 위한 프로그램이지만 solved.ac의 api를 이용하여 boj와 solved의 조직원의 sync가 맞지 않는 문제가 발생했다
solved의 조직은 boj에서 처음 연동을 할 때를 기준으로 가져오고 그 이후 boj에서 등록된 조직은 프로필의 강제갱신을 해줘야만 반영이 되었다

이 문제를 solved.ac 측에 문의를 하였고 boj, solved.ac 양쪽에서 이 문제를 해결 해 주실 것이라는 긍정적인 답변을 받아 추후 해결 될 것으로 생각된다
그 전까지는 조직원들에게 프로필에서 강제갱신을 눌러달라고 요청을 하며 진행을 했다

생각보다 반응이 좋아서 뿌듯했고 이 서비스를 현재는 리스트를 직접 관리자인 내가 공유하고 있지만 추후 웹서비스로 제작하여 unsolved 리스트 뿐만 아니라 나의 그룹랭킹 상승의 기역내역등을 기능으로 제공하려고 생각하고 있다
구현을 위해 42Seoul에서 팀원을 모집하였고 나를 포함 총 6명의 인원이 모여 열심히 기획중이다
42World 프로젝트를 중간에 합류하게 되어서 프로젝트 초기 기획 및 셋팅을 경험하지 못해 아쉬웠는데 이렇게 새로운 프로젝트를 하며 경험하게 되는 좋은 기회라고 생각된다

참조

https://gist.github.com/is2js/3c32a75986e6f17364c39e6fa2a05cbc
https://github.com/pjy1368/ku-solved-ac

1개의 댓글

comment-user-thumbnail
2022년 5월 13일

wa!

답글 달기