Как оставаться на сайте, используя скрипт Python (библиотека запросов)?
Я пытаюсь использовать библиотеку запросов Python для входа на сайт surfline.com, затем get
веб-страница после входа в систему (предположительно в течение продолжающегося сеанса).
Форма входа, которую использует surfline.com на всех своих страницах onclick()
сопоставить с функцией JS под названием verifyLogin()
который в свою очередь отправляет сообщения .cfm
файл. На success
, он обновляет страницу, и теперь пользователь остается в системе, пока сохраняются файлы cookie.
Я впервые использую библиотеку запросов и не знаю, как:
- авторизоваться успешно,
- оставаться в системе на протяжении всей сессии,
- затем распечатайте домашнюю страницу как зарегистрированный пользователь в терминале.
Вот форма входа (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&slintcid=LOGIN&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.
Но вы могли бы пойти на что-то другое, и тогда это будет не по теме..