我如何知道登录 Web 会话的要求?

How do I know the requirements for a logged in web session?

以下 python 脚本通常用于自动填写登录网络表单:

import requests

payload = {
    user : myusrname
    password : mypass
    ...etc...
}

s = requests.Session()
s.post(formurl, data = payload)
r = s.get(protectedurl)

但是在某些网站上,上述似乎无法启动会话。我正在寻找阻止我进入受保护页面的原因。

在网站上 (https://www.avanza.se) 表格看起来像

<form autocomplete="off" class="loginForm clearFix"  method="POST"action="/ab/noop">
    <input placeholder="Användarnamn" type="text" name="j_username" autocapitalize="none"> 
    <input placeholder="Lösenord" type="password" name="j_password">
    <div class="errorToolTipPlacement">
        <button class="focusBtn loginButton" type="submit" disabled="disabled">Logga in</button>
        <a class="fRight marginTop4px defaultSize plcLink" href="/glomt-uppgift.html">Problem att logga in?</a>
    </div>
</form>

我正在为 post 请求提供所有 name:value 字段(在本例中为 j_usernamej_password

请求成功,给我一个状态码200,然后重定向回原始网页-未登录。起始页和受保护页的url和cookies是相同的。

我注意到即使我填写了错误的用户名和密码,结果也是一样的。

我是否缺少一些要发送的信息?

是否使用了我看不到的更复杂的身份验证?

它只是阻止自动登录机器人吗?

最初看起来请求有第三个参数 (url)

下面是所有的请求头参数,我会设置(至少) Referer、Content-Type 和 "Accept" 参数。

Host: www.avanza.se
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:35.0) Gecko/20100101 Firefox/35.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Cache-Control: no-cache
X-Requested-With: XMLHttpRequest
Referer: https://www.avanza.se/start
Content-Length: 70
Cookie: _ga=GA1.2.714386931.1422441452; _gat_rollup=1; _gat=1; optimizelySegments=%7B%22696152504%22%3A%22ff%22%2C%22696851909%22%3A%22direct%22%2C%22702410951%22%3A%22false%22%7D; optimizelyEndUserId=oeu1422441452807r0.117113927933018; optimizelyBuckets=%7B%7D; optimizelyPendingLogEvents=%5B%5D
Connection: keep-alive
Pragma: no-cache

您可以在命名数组中设置它们,并使用 "headers" 参数将它们传递给 post 方法。

一旦 post 方法 "returns" 你应该实际阅读响应(以 json 格式)并且它应该给你 url 重定向到。