[英]Use python requests to login to website using ajax json post
我是python的新手,无法生成使用python请求登录网站的正确代码。
网站上的表格代码
<form autocomplete="off" class="js-loginFormModal">
<input type="hidden" class="js- redirect" name="redirect" value="bn_vLe6OsoRXl4E4LEaOwGkUCvazta7iTkG81ShqumA." />
<input type="hidden" name="token" id="token" value="MTQ4OTg2MzYwMzCaZm653OAL-mKayzhg_4wCyEBXDqZBQUJxdbLLF- foi6EdPeKBgIVz97pUew9YgKPmxiW2NDzrAewdtIJWrBM." />
<input type="hidden" name="remember_me" value="1" />
<input type="hidden" name="from" value="pc_login_modal_:login">
<div class="leftSide floatLeft loginColumnLeft-en">
<p class="signinError" style="display:none;"></p>
<p id="signinLoggingin" style="display:none;">Logging in...</p>
<div><input id="usernameModal" placeholder="Username (6+ characters)" class="js-signinUsernameModal signup_field" name="username" maxlength="50" type="text" value=""></div>
<div><input id="passwordModal" placeholder="Password (6+ characters)" class="js-signinPasswordModal signup_field" name="password" type="password" value=""></div>
<div class="loginAccessRemember">
<input type="checkbox" checked id="signinRemember" />
<label for="signinRemember">Remember me on this computer<br />
<span class="loginAccessRememberInfo">(not recommended on public or shared computers)</span>
</label>
</div>
<div id="signinSubmit" class="orangeButton buttonBase js-loginSubmitModal">Login</div>
<div class="leftCol">
<ul>
<li>
<li><a id="signinForgotpassword" href="/front/lost_password" onclick="ga('send', 'event', 'Login Page', 'click', 'Lost Password');">Forgot Username or Password?</a></li> |
<li><a id="signinConfirmationEmail" href="/front/resend_confirmation_email" onclick="ga('send', 'event', 'Login Page', 'click', 'Resend Confirmation');">Resend confirmation email</a></li>
</ul>
</div>
</div>
<div class="rightSide floatRight loginColumnRight-en">
<h2 class="loginAccessTitle-en">Not a free member yet?</h2>
<span class="loginAccessMessage loginAccessMessageRight">Here's what you're missing out on!</span><br /><br />
<ul class="clearfix">
<li><i class="mark registerSprite enabled"></i><span class="tab1">Download Videos</span></li>
<li><i class="mark registerSprite enabled"></i><span>Post Comments</span></li>
<li><i class="mark registerSprite enabled"></i><span class="tab3">Add Favorites</span></li>
<li><i class="mark registerSprite enabled"></i><span class="tab4">Create Playlists</span></li><br>
<li>And many more!</li>
</ul>
<br/><a class="buttonBase greyButton" id="signupButtonId" href="/create_account_select">Sign Up</a>
</div>
</form>
这是javascript“ js-loginFormModal”所引用的ajax语句
function loginAjax() {
$j.ajax({
type: "POST",
url: "/front/authenticate",
cache: false,
dataType: "json",
data: $j(".js-loginForm").serialize(),
success: function(a) {
if (a.premium_redirect_cookie == "0") {
if (a.redirect) {
document.location.assign(a.redirect)
} else {
$j(".signinError").show().text(a.message)
}
} else {
$j.ajax({
url: premiumRedirectCookieURL,
cache: false,
crossDomain: true,
xhrFields: {
withCredentials: true
},
success: function() {
if (a.redirect) {
document.location.assign(a.redirect)
} else {
$j(".signinError").show().text(a.message)
}
}
})
}
}
});
return false
}
head.ready(document, function() {
var a = false;
$j(".js-loginSubmit").on("click", function(b) {
b.preventDefault();
loginAjax()
});
$j("input.js-signinUsername, input.js-signinPassword").on("keydown", function(b) {
if (!a) {
if (b.which == 13) {
loginAjax()
}
a = true
}
});
$j("input.js-signinUsername, input.js-signinPassword").on("keyup", function(b) {
if (a) {
a = false
}
})
});
我当前的python代码(Python 2.6.6)给出的结果是“ {{message”:“会话超时-重新加载并重试”}“
#!/usr/bin/python
from requests import Session
import requests
http_proxy = "http://ip:3128"
https_proxy = "http://ip:3128"
ftp_proxy = "http://ip:3128"
proxyDict = {
"http" : http_proxy,
"https" : https_proxy,
"ftp" : ftp_proxy
}
session = requests.Session()
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
}
payload = {
'remember_me': '0',
'username': 'user',
'password': 'pass'
}
login_link = 'website/front/authenticate'
link = 'http://website'
login = session.post(url=login_link, data=payload, allow_redirects=True, headers=headers,proxies=proxyDict)
print (login.text)
response2 = session.get(url=link, headers=headers,proxies=proxyDict)
#print response2.content
#print(r2.text).encode('utf-8').strip() #TEXT/HTML
#print(r.status_code, r.reason)
我想我的有效负载中缺少东西。 我不知道是否需要将json指定为有效载荷的格式,或者是否必须序列化任何内容。
解决方法如下
#!/usr/bin/python
from requests import Session
import requests
import json
import re
http_proxy = "http://ip:3128"
https_proxy = "http://ip:3128"
ftp_proxy = "http://ip:3128"
proxyDict = {
"http" : http_proxy,
"https" : https_proxy,
"ftp" : ftp_proxy
}
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'en-US,en;q=0.8',
'Connection': 'keep-alive',
'Content-Length': '209',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Host': 'www.website.com',
'Origin': 'http://www.website.com',
'Referer': 'http://www.website.com/login',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
}
login_link = 'http://www.website.com/front/authenticate'
link = 'http://www.website.com/'
with requests.Session() as r:
s = r.get(url=link, proxies=proxyDict)
token = re.findall(r'token" value.*', s.text)[0]
token = token.split('=')[1]
token = token.split('"')[1]
redirect = re.findall(r'redirect" value.*', s.text)[0]
redirect = redirect.split('=')[1]
redirect = redirect.split('"')[1]
payload = {
'loginpage': '1',
'redirect': redirect,
'token': token,
'username': 'user',
'password': 'pass'
}
login = r.post(url=login_link, data=payload, allow_redirects=True, headers=headers, proxies=proxyDict)
print (login.content)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.