Как оставаться на сайте, используя скрипт Python (библиотека запросов)?

Я пытаюсь использовать библиотеку запросов Python для входа на сайт surfline.com, затем get веб-страница после входа в систему (предположительно в течение продолжающегося сеанса).

Форма входа, которую использует surfline.com на всех своих страницах onclick() сопоставить с функцией JS под названием verifyLogin()который в свою очередь отправляет сообщения .cfm файл. На success, он обновляет страницу, и теперь пользователь остается в системе, пока сохраняются файлы cookie.

Я впервые использую библиотеку запросов и не знаю, как:

  1. авторизоваться успешно,
  2. оставаться в системе на протяжении всей сессии,
  3. затем распечатайте домашнюю страницу как зарегистрированный пользователь в терминале.

Вот форма входа (HTML):

<form id="loginForm">
    <label for="name">Email Address:</label><br>
    <input type="text" name="username" id="username">
    <label for="mail">Password:</label><br>
    <input type="password" name="password" id="password">
    <input type="hidden" name="top_login" id="top_login" value="true">
    <button class="surfline-button blue1" type="button" onclick="verifyLogin();">Log In</button>
    <button class="surfline-button grey1" type="button" onclick="jQuery('#dialog-login').dialog('close');">Cancel</button>
    <div id="forgot">Forgot Password? <a href="/myaccount/?action=forgot_password">Click Here</a></div>
    <div class="clear"></div>
    <div><input style="float:left; width:18px; height:18px; margin-right:6px; border:none" type="checkbox" name="rememberMe" id="rememberMe" value="true" checked="checked"><div id="remember-me-text" style="float:left; width:200px; text-align:left; margin-top:1px;">Remember me on this computer?</div></div>
    <div class="clear"></div>
    <p>Not a Premium member?  <a href="https://www.surfline.com/subscribe_vindicia/index.cfm?mkt=login&amp;slintcid=LOGIN&amp;slcmpname=LOGIN-MODAL">TRY PREMIUM FREE NOW</a></p>
</form>

Здесь verifyLogin() функция в файле /05222013_slmenu.js:

function verifyLogin(){  
    //var username = jQuery("#username").val();
    //var password = jQuery("#password").val();
    var usernameVal = jQuery("#username").val();
    var passwordVal = jQuery("#password").val();
    var rememberMeVal = jQuery("#rememberMe").val();    
    var top_loginVal = jQuery("#top_login").val(); 

    if(usernameVal.length === 0 || passwordVal.length === 0 ){
        jQuery("#login-note").addClass("warning");
        if(usernameVal.length === 0){ jQuery("#username").addClass('warning'); jQuery("#login-note").html("Email Field is Blank"); }else{ jQuery("#username").removeClass('warning');}
        if(passwordVal.length === 0){ jQuery("#password").addClass('warning'); jQuery("#login-note").html("Password Field is Blank"); }else{ jQuery("#password").removeClass('warning'); }
        if(usernameVal.length === 0 && passwordVal.length === 0){jQuery("#login-note").html("Email and Password Fields are Blank"); }
    }else{  
        jQuery("#inner-dialog").fadeOut("slow",function(){
            var htmlData = "<center><div style='padding-top:60px;'><h1>Verifying Login</h1><img src='/global_includes/images/ajax-loader-snake-295284.gif' style='margin-top:24px;'></div></center>";                                                
            jQuery("#verifying").html(htmlData).fadeIn("slow", function(){ 
                //var loginData = jQuery('#loginForm').serialize();

                var loginData = 'username=' + escape(usernameVal) + '&password=' + escape(passwordVal) + '&rememberMe=' + rememberMeVal + '&top_login=' + top_loginVal;

                jQuery.ajax({
                    type:'POST', 
                    url: '/myaccount/inc_login_handler.cfm', 
                    data:loginData, 
                    cache:false,
                    success: function(response){
                        var responseTrimmed = response.replace(/^\s+||\s+$/g,'');
                        if(responseTrimmed != true){    
                             jQuery("#verifying").fadeOut("slow",function(){ jQuery("#inner-dialog").fadeIn("slow"); jQuery("#login-note").html("Unable to find your login information. Please Try Again...").addClass("warning");  jQuery("#username").addClass('warning');  jQuery("#password").addClass('warning'); });
                        }else{ 
                            var successData = "<center><div style='padding-top:60px;'><h1>Success!</h1><img src='/global_includes/images/checkmark.png' style='margin-top:24px; margin-bottom:20px;'><br /> Please Wait, Site Reloading...</div></center>";
                            jQuery("#verifying").fadeOut("slow",function(){  jQuery('#verifying').html(successData).fadeIn("slow"); });
                            setTimeout(function(){ window.location.reload(); }, 1200 ); 
                        }
                    },
                    error:function (xhr, ajaxOptions, thrownError){
                        jQuery("#verifying").fadeOut("slow",function(){ jQuery("#inner-dialog").fadeIn("slow"); jQuery("#login-note").html("There was an error finding your login infomation. Please Try Again...").addClass("warning");  });
                    }  
                });
            });
        })
    }
}

Я пробовал этот код, но не могу получить домашнюю страницу как зарегистрированный пользователь; он все еще возвращается, как и тому, кто не вошел в систему (мое полное имя должно появиться в заголовке и т. д.):

>>> import requests, json
>>> s = requests.Session()
>>> page_signed_out = s.get('http://www.surfline.com/home/index.cfm')
>>> form_data = {'type':'POST',
...              'url':'/myaccount/inc_login_handler.cfm',               
...              'data':"username=myemail@example.com&password=mypassword&rememberMe=true&top_login=true",
...              'cache':False}
>>> s.post(url,
...        data=json.dumps(form_data),
...        headers= {'content-type': 'application/json'})
<Response [200]>
>>> page_signed_in = s.get('http://www.surfline.com/home/index.cfm')

Как я могу войти на surfline.com из файла python и получить страницу как зарегистрированный пользователь? Я не против использования другой библиотеки, если это невозможно с requests библиотека. Спасибо.

РЕДАКТИРОВАТЬ: Вот печенье после того, как было сделано POST, как предложено @ Андре

<[Cookie (версия = 0, имя = 'CRYPTOPASS', значение = '% 296% 25% 2A% 2521B% 3FO% 2A% 3C% 28', порт = нет, port_specified = False, domain = '. Surfline.com ', domain_specified = True, domain_initial_dot = True, path =' / ', path_specified = True, безопасный = False, срок действия истекает = 2338694583, discard = False, комментарий = None, comment_url = None, rest = {}, rfc2109 = False), Cookie (версия = 0, имя = 'CRYPTOUSER', значение = '23% 252600% 2E3Z% 5FM% 5EEZV1IK% 27TFIW% 3E ', порт = нет, port_specified = False, домен ='. Surfline.com ', domain_specified = True, domain_initial_dot = True, путь = '/', path_specified = True, безопасный = False, срок действия истекает = 2338694583, discard = False, комментарий = None, comment_url = None, rest = {}, rfc2109 = False), Cookie (версия = 0, name = 'LOGGED_OUT', значение = 'true', порт = нет, port_specified = False, домен = '. surfline.com', domain_specified = True, domain_initial_dot = True, путь = '/', path_specified = True, безопасный = False, expires = 2338694583, discard = False, comment = None, comment_url = None, rest = {}, rfc2109 = False), Cookie (версия = 0, name = 'USER_ID', значение = '259829', порт = None, port_specified = False, домен = '. surfline.com', domain_specified = True, domain_initial_dot = True, путь = '/', path_specified = True, безопасный = False, срок действия истекает = 2338694583, discard = False, комментарий = нет, comment_url = нет, rest = {}, rfc2109 = False), Cookie (версия = 0, имя = 'CFID', значение = '437349255', port = нет, port_specified = False, domain = 'www.surfline.com', domain_specified = False, domain_initial_dot = False, path = '/', path_specified = True, безопасный = False, срок действия истекает = 2338694583, discard = False, комментарий = нет, comment_url = нет, остальные = {}, rfc2109 = False), файл cookie (версия = 0, name = 'CFTOKEN', value = '1082d1233da237c-3E4C2D43-FFC6-4ECC-1E80D9B505E495CE', port = None, port_specified = False, domain = 'www.surfline.com', domain_specified = False, domain_initial_dot = False, False / ', path_specified = True, безопасный = False, expires = 2338694583, discard = False, comment = None, comment_url = None, rest = {}, rfc2109 = False)]>

2 ответа

Решение

Я попытался войти на этот сайт, отслеживая запросы, сделанные с помощью Firebug, и похоже, что данные в application/x-www-form-urlencoded формат, а не application/json, а также вы неверно истолковали некоторые значения из кода Javascript, type, url, data а также cache были параметры для вызова AJAX, а не фактические данные, которые должны быть отправлены на сервер.

Надеюсь, это рабочий код, замените свой адрес электронной почты и пароль в запросе POST.

from requests import Session # we can just import Session, no need to import the entire requests

s = Session() # new session

page_signed_out = s.get('http://www.surfline.com/home/index.cfm') # gets signed out page, this will set eventual cookies that may be needed later

s.post("http://www.surfline.com/myaccount/inc_login_handler.cfm", {"username":"myemail@example.com", "password":"mypassword", "rememberMe":"true", "top_login":"true"}) # does the actual login, if successful this will set a session cookie

page_signed_in = s.get('http://www.surfline.com/home/index.cfm') # good, we're logged in

РЕДАКТИРОВАТЬ:

Или, если по какой-либо причине surfline.com не может успешно войти в систему, вы можете скопировать cookie-файлы, установленные в вашем браузере при физическом входе в систему, и "вставить" их в свою программу, а затем передать их по вашему запросу.

from requests import Session

s = Session()
s.cookies["s_cc"] = "your_session_cookie" # replace this with your actual login cookie

page_signed_in = s.get("http://www.surfline.com") # you're logged in :)

Если вы также серфер и просто пытаетесь заставить потоки проигрывать весь день, я подскажу, как проверить соединения RTMP, которые делает их флеш-плеер.

Еще больший намек:

tcpdump -A -n -s 0 -r file.tcpdump | grep connect

при посещении страницы кулачка и grep для потока RTMP.

Но вы могли бы пойти на что-то другое, и тогда это будет не по теме..

Другие вопросы по тегам