Skip to content

[Feature] 로스트아크 캐릭터 정보 불러오기 #8

@BiteSnail

Description

@BiteSnail

로스트아크 자유게시판에서 글쓴이의 정보를 확인할 때에 아래와 같은 정보가 나옵니다. 여기에서 우리가 주목해야 하는 부분은 전투정보실 버튼에 있는 data-url입니다.
해당 버튼에 물려있는 Member?id=...부분을 통해 설정된 대표캐릭터로 이동하는 것을 알 수 있었습니다. 그래서 이 부분이 생성되는 곳을 조사하였습니다.

<div class="user-info">
    <div class="user-thumb">
        <img src="https://cdn-lostark.game.onstove.com/uploadfiles/badge/03dd4962d07e44de8c82836ff795b274.png" alt="신규 모험가">
    </div>
    <div class="member-info" aria-label="닉네임">
        <span class="member-info__nickname" title="SKTT1페이커">SKTT1페이커</span>
    </div>
    <button type="button" class="button button--user-info" aria-haspopup="true" aria-expanded="false" data-memberno="84520949" data-nickname="SKTT1페이커">유저 정보</button>
    <span class="user-buttons">
        <button type="button" class="button button--user-profile" aria-haspopup="true" aria-expanded="false" data-memberno="84520949" data-nickname="SKTT1페이커">프로필</button>
        <button type="button" class="button button--user-battle" data-url="/Profile/Member?id=KjNd%2BmgJZ79PXA6Hb9hE2MdqHfKL9hfPLbm7E%2Bb%2BYjU%3D">전투정보실</button>
        <button type="button" class="button button--user-library" disabled="">베른대도서관 활동</button>
    </span>
</div>

그리고 소스파일을 뜯어보던 중에 해당 정보를 얻을 수 있는 부분을 찾았습니다. 아래는 원본인데 중요한 내용은 html += '<button type="button" class="button button--user-battle" data-url="/Profile/Member?id=' + encodeURIComponent(encryptMemberNo) + '" >전투정보실</button>';이 부분입니다.
위 코드를 통해서 id가 encrpytMemberNo을 URI 인코딩한 정보임을 알 수 있습니다. 따라서 encrpytMemberNo를 URI 인코딩하여 비교하면 캐릭터 조회할 수 있는 기능이 완성될 것 같습니다.

/* 공통 - 캐릭터 정보 조회 (2차) */
$(document).on('click', '.lostark-wrapper .button--user-info', function (e) { // 유저 정보 버튼 클릭시 리스트 노출
    var isCharacter = false;
    var isActivity = false;
    var encryptMemberNo = '';
    var memberNo = $(this).attr('data-memberNo');
    var nickName = $(this).attr('data-nickName');
    var _this = $(this),
        userinfo = _this.closest('.user-info');

    $.ajax({
        url: "/board/IsCharacterList",
        method: "POST",
        data: { memberNo: memberNo },
        async: false,
        success: function (data) {
            isCharacter = data.isCharacter;
            encryptMemberNo = data.encryptMemberNo;
        },
        error: function (xhr, status, error) {
            ajaxErrorHandler(xhr, status, error);
            return;
        }
    });

    $.ajax({
        url: "/board/IsActivity",
        method: "POST",
        data: { memberNo: memberNo },
        async: false,
        success: function (data) {
            isActivity = data.isActivity;
        },
        error: function (xhr, status, error) {
            ajaxErrorHandler(xhr, status, error);
            return;
        }
    });

    var html = '';
    html += '<span class="user-buttons">';
    html += '<button type="button" class="button button--user-profile" aria-haspopup="true" aria-expanded="false" data-memberNo=\"' + memberNo + '\" data-nickName=\"' + nickName + '\" >프로필</button>';

    if (isCharacter) {
        html += '<button type="button" class="button button--user-battle" data-url="/Profile/Member?id=' + encodeURIComponent(encryptMemberNo) + '" >전투정보실</button>';
    }
    else {
        html += '<button type="button" class="button button--user-battle"  disabled >전투정보실</button>';
    }

    if (isActivity) {
        html += '<button type="button" class="button button--user-library" data-url="/Library/Tip/UserList?page=1&searchtype=4&searchtext=' + encodeURIComponent(nickName) + '&ordertype=1&userPageType=1">베른대도서관 활동</button>';
    }
    else {
        html += '<button type="button" class="button button--user-library" disabled >베른대도서관 활동</button>';
    }

    html += '</span>';

    if (!userinfo.find('.user-buttons').length) userinfo.append(html);

    userinfo.toggleClass('user-info--active');

    e.preventDefault();
});

현재 HTML 상의 id : KjNd%2BmgJZ79PXA6Hb9hE2MdqHfKL9hfPLbm7E%2Bb%2BYjU%3D
encrpytMemberNo : Sztq0vl9H1WVr4xxWeQ8H1TK9h5UJMfn/CpWSFdEfcE=
URI인코딩 : Sztq0vl9H1WVr4xxWeQ8H1TK9h5UJMfn%2fCpWSFdEfcE%3d
HTML과 받아온 데이터가 달라서 안될 것 같았는데 정상적으로 작동한 것을 알 수 있었습니다. 그래서 시간에 따라 값이 바뀌는 것을 확인할 수 있습니다.

아래에 위 과정을 확인할 수 있는 코드를 올립니다.
memberNo만 본인 스토브 번호로 바꾸면 자신의 캐릭터들을 확인할 수 있습니다.

import requests
from urllib import parse

base_url = "https://lostark.game.onstove.com//Profile/Member?id="

response = requests.post(url="https://lostark.game.onstove.com/board/IsCharacterList",
                        data={"memberNo": "82661074"})

encrypt_member_no = response.json()['encryptMemberNo']
URI_encoding_encrypt_member_no = parse.quote(encrypt_member_no)

print(base_url+URI_encoding_encrypt_member_no)

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentation

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions