본문 바로가기

기능과 기술

메이플 계정의 캐릭터가 갖고 있는 메소 확인하는 프로그램 - 10억을 찾았습니다.

728x90

메이플스토리를 즐기면서 메소를 모으는 것은 많은 유저들에게 동기 부여 요소 중 하나입니다. 게임 속에서 메소를 모으고 이를 통해 성취감을 느끼는 것은 메이플을 오랫동안 즐기게 만드는 중요한 이유가 될 수 있습니다. 하지만, 그 과정을 조금 더 체계적이고 효과적으로 관리하고 싶다는 생각을 하게 되었습니다.

 

메소를 수집하는 과정에서 구글 스프레드시트를 활용하면, 내가 모은 메소를 날짜별로 기록하고 나만의 성취를 눈으로 확인할 수 있겠죠? 물론, 실제로 메소를 모으는 것이 최저 시급과 비교할 때 상대적으로 적을 수 있고, 자존감이 떨어질 수도 있습니다. 하지만 게임에서 내가 무언가를 달성하고 기록으로 남기는 것 자체는 충분한 성취감을 주는 요소입니다.

요렇게 기록하면 나의 메생일지가 완성됩니다?

 

아래는 메소를 수집하고 이를 자동으로 기록하는 프로그램을 만들기 위한 과정을 설명한 것입니다.

 

목표 설정 및 메소 수집 관리의 필요성

제가 구글 스프레드시트에 메소 수집 정보를 기록하는 이유는, 게임 속에서 내가 이룬 것을 정리하고 성취감을 느끼고 싶어서입니다. 하지만, 여러 캐릭터를 육성하거나 자주 기록해야 하는 경우에는 수동으로 기록하는 것이 번거로울 수 있습니다. 이럴 때 프로그래밍을 통해 이를 자동화할 수 있다면 훨씬 효율적이겠죠.

 

메소 수집과 관련하여 NEXON Open API를 살펴보았지만, 아쉽게도 메소 정보는 제공되지 않더군요. 캐릭터의 레벨, 경험치 등의 정보는 확인할 수 있지만, 메소 정보는 별도로 제공되지 않는다는 점이 아쉬웠습니다.

여기에 메소만 넣어주면 되잖아요. 홈페이지에 자기들은 나오면서!

 

프로그래밍을 통해 메소 수집 자동화

그래서 결국 홈페이지에서 직접 로그인을 하고 메소 정보를 크롤링하는 방법을 찾았습니다. 넥슨 홈페이지에서 로그인 후 캐릭터 페이지에 접근하면, 내가 보유한 메소가 표시됩니다. 이 정보를 자동으로 수집하여 스프레드시트에 기록할 수 있게 하면 되겠다는 생각을 하게 되었습니다. 물론, 로그인 과정이나 정보 수집이 다소 번거롭지만, 이를 통해 동기 부여를 할 수 있다면 충분히 가치가 있다고 생각합니다.

 

다음은 제가 고민한 프로그램 설계 과정입니다.

 

사이트에서 로그인을 하고, 대표 캐릭터를 선택한 후 메소 정보를 조회한 다음, 그 정보를 구글 스프레드시트에 업데이트하는 흐름입니다. Maple ID 선택은 대표 계정을 설정하지 않은 멀티 계정일 경우에 뜹니다.

이 중에 하나를 선택해야 로그인이 됩니다.

 

필요한 패키지 설치 및 설정

프로그래밍을 위해 몇 가지 패키지를 pip로 설치해 주어야 합니다.

pip install beautifulsoup4 gspread playwright psutil pyyaml requests

 

그리고 config.yaml 파일을 통해 계정 정보를 설정해줍니다.

id: # 메이플 계정 아이디
pw: # 메이플 계정 비밀번호
maple_id: # 메이플 ID (선택 창이 뜨면 선택하기 위한 옵션)

 

이후 구글 스프레드시트 핸들링을 위한 사전 작업을 진행해야 합니다. 구글 API를 사용해 인증을 처리하고, 스프레드시트에 접근할 수 있는 설정을 해야 합니다. 이 과정에서 인증 정보를 담은 json 파일을 다운로드하고, 해당 파일을 통해 파이썬에서 구글 스프레드시트를 핸들링할 수 있도록 해야 합니다.

 

구글 스프레드 시트 업데이트 함수 예시

다음은 구글 스프레드시트에 메소 정보를 업데이트하는 예시 함수입니다.

def update_worksheet(spreadsheet_url: str, sheet_name: str, data):
    logging_config.logger.debug(
        f"update_worksheet() spreadsheet_url: {spreadsheet_url}, data: {data}"
    )
    try:
        json_file_path = "xxx.json"  # 구글 API 인증 json 파일
        gc = gspread.service_account(json_file_path)
        doc = gc.open_by_url(f"https://docs.google.com/spreadsheets/{spreadsheet_url}")

        worksheet = doc.worksheet(sheet_name)
        row_count = get_row_count(worksheet)

        worksheet.update(
            range_name=f"A{row_count+2}:B{row_count+1+len(data)}", values=data
        )
    except Exception as e:
        logging_config.logger.error(e)
        return None

 

이 함수는 구글 스프레드시트에 날짜와 메소 수치를 업데이트하는 기능을 수행합니다.

 

메인 로직

다음은 메인 로직의 예시 코드입니다. 전체적인 흐름은 사이트에 로그인하고, 캐릭터 정보를 수집한 후, 이를 구글 스프레드시트에 기록하는 작업을 수행합니다.

def main():
    # result 폴더 하위에 today 폴더 생성
    utils.init_setting()

    utils.make_folder(f"result/{utils.today}")
    utils.send_telegram_message("-4524096972", f"{utils.today} {utils.settings['id']} 메이플 메소 결과")

    utils.start_chrome(utils.user_port)  # chromium 브라우저 실행
    maple_login()
    maple_home()
    user_maple_id = utils.settings["maple_id"]
    if user_maple_id:
        maple_login_detail(user_maple_id)
    maple_move_character()
    character_list = maple_character_info()

    filename = f"result/{utils.today}/character_list_{utils.settings['id']}_{utils.now}.pickle"
    utils.save_pickle(character_list, filename)

    report_result(character_list)

    maple_logout()
    utils.close_chrome(utils.user_port)

    total_mesos = calculate_total_mesos(character_list, "스카니아")
    spreadsheet_url = "d/xxx"  # 구글 스프레드시트 URL
    sheet_name = "메소 기록"
    data = [[utils.today2, total_mesos]]
    utils_gspread.update_worksheet(spreadsheet_url, sheet_name, data)

 

이 메인 함수는 메소 정보를 수집하고 스프레드시트에 기록하는 과정을 자동화합니다.

 

CharacterInfo 클래스

캐릭터 정보를 관리하기 위해 CharacterInfo 클래스를 만들었습니다. 여기 나온 항목은 홈페이지의 캐릭터 정보 내용입니다.

 

class CharacterInfo:
    def __init__(self, maple_id, server, character_name, world, job, popularity, guild, mesos, maple_points):
        self.maple_id = maple_id
        self.server = server
        self.character_name = character_name
        self.world = world
        self.job = job
        self.popularity = popularity
        self.guild = guild
        self.mesos = mesos
        self.maple_points = maple_points

 

이 클래스를 통해 각 캐릭터의 메소 정보를 포함한 다양한 데이터를 관리할 수 있습니다. 물론 넥슨 메이플 api에서 된다면 더 좋겠죠. 매우 좋겠죠. 더 많은 것을 할 수 있겠죠.

 

급 마무리

플로우 중에서 메이플 사이트 핸들링 하는 부분의 소스는 올리지 않겠습니다. 부끄러워요. 혼날까봐 걱정도 됩니다. 그럼에도 혹시 필요하신 분들이 있으시면 댓글 또는 메일로 요청해주세요. github에 오픈을 할까도 생각했는데 부끄러워요. 그리고 이렇게 만든 소스를 스케줄러로 23시 마다 실행 시키도록 해놓았습니다. (그리고 메이플을 안하면 속상하겠네요...)

어쨌든 이런 것들로 메이플에 더 집착할 수 있기를 바라면서. (근데 또 이러다가 겨울 방학에나 돌아오게 될지도 모릅니다.)

반응형