파이썬 세션 로그인

조회수 2088회

"파이썬으로 웹크롤러 만들기" 라는 책으로 파이썬 공부를하고있는데요

세션 로그인 부분을 읽고 세션을 사용해서 아프리카TV 로그인을 한다음 내아이템 페이지를

가져와보려고 하는데 잘안되네요 뭐가 문제인지 몰라서 도움을 구합니다

session = requests.Session()
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko'} 

param = {
    "szWork": 'login',
    "szType" : 'json',
    "szUid" : '#아이디',
    "szPassword" : '#비밀번호',
    "isSaveId" : 'false',
    "szScriptVar": 'oLoginRet',
    "szAction" : "",
    "isLoginRetain" : 'N'
}
logUrl ='https://login.afreecatv.com/afreeca/login.php'
myitemUrl = 'https://point.afreecatv.com/report/AfreecaUseList.asp'

s = session.post(logUrl, param)
print("cookie is set to  : ")
print(s.cookies.get_dict())
print("----------------")
#print("내 아이템 페이지로 이동")  # 로그인이 안되는거 같아서 아래 3줄은 일단 주석처리
#s = session.get(myitemUrl)
#print(s.text)

위에 코드를 실행하면 아래처럼 결과가 나옵니다

cookie is set to  :
{'AbroadChk': 'FAIL', 'AbroadVod': 'FAIL'}
---------------

책의 예제에서는 아이디 비밀번호만 있었는데

f12에서 아프리카 로그인하고 form 데이터를 보니 사진처럼 있길래

이미지

param 형태를 제가 만들었는데 param을 잘못만든건가요??

1 답변

  • 좋아요

    2

    싫어요
    채택 취소하기

    잘못 만든것이 아니라...책이 쓰여진 시점에는 되었을텐데 당시와 비교해서 아프리카tv가 변경된 겁니다.

    logUrl ='https://login.afreecatv.com/afreeca/login.php' 대신에 logUrl ='https://login.afreecatv.com/app/LoginAction.php' 로 변경하면 됩니다.

    로그인 방식이 json 으로 결과를 리턴받아 리다이렉트 시킵니다.

    아래 자바스크립트 펑션을 보면 1인 경우만 성공이고 나머지는 실패입니다.

    function onAfterSecondLogin(data, isApp)
    {
        var szOnAfterLoginMsg ="";
    
        nRet = Number(data.RESULT);
    
        switch(nRet)
        {
            case 1:
                var szRequestUri = (szAfterLoginPage.indexOf("hidden_app") > 0) ? "" : GetCookie("request_uri");
    
                if(szAfterLoginPage =="" && szRequestUri) 
                {
                    szAfterLoginPage = szRequestUri;
                }
    
                if( szRequestUri )
                {
                    var expireDate = new Date(); // 새로운 expireDate 객체를 생성하고
                    expireDate.setDate(expireDate.getDate()-1); // 유효기간의 날짜값을 오늘보다 하루적게(어제) 설정합니다
                    document.cookie = "request_uri=; path=/; domain=afreecatv.com;expires=" + expireDate.toGMTString()+";";
                }
                isLogin =true;
    
                if(data && data.notChangePwd && isApp == false)
                {
                    var url = "https://member.afreecatv.com/app/campaign_pw.php"
                        ,request_uri = getURLParameter(szAfterLoginPage, "request_uri")
                        ,isFromPop = 0 > location.href.indexOf('szFrom=pop') ? false : true
                        ;
                    if( isApp )
                    {
                        szAfterLoginPage += '&isChangePwd=1';
                    }
                    else // 설치형 플레이어 비밀번호 변경창 팝업 안함 (자체에서 처리)
                    {
                        if( !isFromPop )
                        {
                            url += "?request_uri=" + (request_uri ? request_uri : "http://www.afreecatv.com");
                        }
                        if(parent != window)
                        {
                            if( typeof(data.item) != 'undefined' && typeof(data.comment) != 'undefined' )
                            {
                                alert( data.comment );
                            }
                            parent.location.href= url;
                            return;
                        }
                        else
                        {
                            if(location.href.indexOf("szFrom=full") >= 0)
                            {
                                if( typeof(data.item) != 'undefined' && typeof(data.comment) != 'undefined' )
                                {
                                    alert( data.comment );
                                }
                                location.href= url;
                                return;
                            }
                            else window.open(url);
                        }
                    }
                }
                try
                {
                    if( typeof(parent.layerPopup) == 'function' && typeof(data.item) != 'undefined' )
                    {
                        parent.layerPopup( data.item );
                    }
                    else if( typeof(data.item) != 'undefined' && typeof(data.comment) != 'undefined' )
                    {
                        alert( data.comment );
                    }
                }
                catch(e)
                {
                }
    
                onAfterLoginLogOut();
                break;
            case 0:
                szOnAfterLoginMsg ="비밀번호를 잘못 입력하셨습니다.";
                alert(szOnAfterLoginMsg);
                break;
            case -1:
                szOnAfterLoginMsg ="비밀번호를 잘못 입력하셨습니다.";
                alert(szOnAfterLoginMsg);
                break;
            case -4:
                szOnAfterLoginMsg = "아프리카TV 운영원칙 위반으로 서비스 이용이 정지 되었습니다.\n정지기간 중 주민등록번호 도용 등을 통한 허위아이디 생성으로 동일한 위반행위를\n하실경우, 제재조치와는 별도로 관련법에 의거 법적인 처벌을 받을 수 있습니다.";
                alert(szOnAfterLoginMsg);
                break;
            default:
                szOnAfterLoginMsg ="로그인에 실패하였습니다.("+ nRet +")";
                alert(szOnAfterLoginMsg);
                break;
        }
    
        //유저함수
        try{
            onLogin( nRet ,szOnAfterLoginMsg);  // 초콜릿팩토리에서 사용함
        }catch(e){}
    }
    
    import requests
    
    session = requests.Session()
    header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko'} 
    
    param = {
        "szWork": 'login',
        "szType" : 'json',
        "szUid" : '',
        "szPassword" : '',
        "szAction" : "",
        "isLoginRetain" : 'N'
    }
    logUrl ='https://login.afreecatv.com/app/LoginAction.php'
    myitemUrl = 'https://point.afreecatv.com/report/AfreecaUseList.asp'
    
    s = session.post(logUrl, data=param)
    #print("cookie is set to  : ")
    #print(s.cookies.get_dict())
    print(s.text)  # 해당 {"RESULT":1} RESULT 값이 1인지를 확인해야함.
    print("----------------")
    
    
    s2 = session.post(myitemUrl)
    print(s2.text)
    
    • 감사합니다 데이터 잘 가져오네요 책이 4년전에 쓰여졌더군요 nyw123 2020.1.18 18:50

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)