【发布时间】:2022-01-19 08:55:13
【问题描述】:
我似乎是一个明显的问题,以编程方式登录网站,然后在通过身份验证时获取数据。
我已经阅读 StackOverflow 几天了,但找不到可行的解决方案。
这里是登录表单,也可以使用单独的 URL 访问,通过浏览器登录后它会重定向到主页:
<strong class="popup-title">i class="fa fa-lock" aria-hidden="true"></i>Login</strong>
<div class="popup-holder">
<form action="https://test.com/login/" data-form="ajax" method="post">
<div class="generic-error hidden">
</div>
<div>
<div class="row">
<label for="login_username" class="field-label required">Username</label>
<input type="text" name="username" id="login_username" class="textfield"
placeholder="Enter your username" />
<div class="field-error down"></div>
</div>
<div class="row">
<label for="login_pass" class="field-label required">Password</label>
<input type="password" name="pass" id="login_pass" class="textfield" placeholder="Enter your password" />
<div class="field-error down"></div>
</div>
<div class="row">
<div class="col-sm-4" style="padding-left: 0;">
<input type="checkbox" name="remember_me" id="login_remember_me" class="checkbox" value="1" checked />
<label for="login_remember_me">remember me</label>
</div>
<div class="col-sm-5 forgot pull-right" style="padding-right: 0px;">
<a href="https://test.com/reset-password/" data-fancybox="ajax">Forgot password?</a><br />
<a href="https://test.com/resend-confirmation/" data-fancybox="ajax">Missing confirmation email?</a>
</div>
</div>
<div class="row">
<input type="hidden" name="action" value="login" />
<input type="hidden" name="email_link" value="https://test.com/email/" />
<input type="submit" class="btn btn-danger btn-lg btn-block" value="Log in" />
</div>
<div class="row">
<span class="form-separator">Not a member yet? Sign up now for free!</span>
</div>
<div class="row">
<a href="https://test.com/signup/" class="btn btn-info btn-lg btn-block" data-fancybox="ajax">Sign up</a>
</div>
</div>
</form>
</div>
这是我尝试过的 Python 代码:
payload = {
'username': 'mylogin',
'pass': 'mypass'
}
with requests.Session() as s:
r = s.post('https://test.com/login/', data=payload)
r = s.get('https://test.com/testpage/')
PowerShell 中的逻辑相同:
$payload = @{
username = 'mylogin'
pass = 'mypass'
}
$r = Invoke-RestMethod 'https://test.com/login/' -Method POST -Body $payload -SessionVariable 'Session'
$r = Invoke-WebRequest -Uri "https://test.com/testpage/" -WebSession $Session
但上述方法均无效,我仍在为未经身份验证的用户获取结果。
【问题讨论】:
-
Web服务器是否使用了登录时需要返回的会话cookie?
-
是的,从我在 Postman 中看到的情况来看,问题获取登录表单的请求后有两个 cookie:PHPSESSID=48947532f789fd83711946b87d07a309;路径=/;域=test.com;安全的; kt_ips=178.137.7.23;路径=/;域=test.com;安全的;过期=格林威治标准时间 2021 年 12 月 17 日星期五 11:59:10;
-
那么,您需要在 POST 请求中返回这些 cookie:
cookies = {'PHPSESSID': '48947532f789fd83711946b87d07a309'} r = requests.post(''https://test.com/login/, cookies=cookies, data=payload)。但是您需要先发出 GET 请求才能获取实际的 cookie 值。 -
尝试了不同的方式,使用 Session 和没有它,在我看来,使用它更方便,因为理论上应该自动设置 cookie 和 headers,所以我不必手动设置它们。但无论如何,只是尝试获取页面,提取 cookie 值,然后使用 post 和后续 get 方法发回,但仍然为未经身份验证的用户获取结果。
标签: python ajax powershell web-scraping forms-authentication