无法使用 python 请求登录到特定的 ASP.NET 网站

Can't login to a specific ASP.NET website using python requests

所以我在过去的 6 个小时里一直在努力使这项工作成功,但我做不到,而且无休止的搜索也无济于事,所以我想我要么做错了一些根本性的错误,要么只是一个微不足道的错误,恰好符合我的逻辑,所以我需要更多的眼睛来帮助我修复它。
网站 url 是 this
我写了一段乱七八糟的 python 代码来登录并阅读下一页,但我得到的只是一个讨厌的 500 错误,说服务器在处理我的请求时出错了。
这是浏览器发出的请求,工作正常,没问题。
此请求的 HTTP 响应代码是 302(重定向)

POST /appstatus/index.aspx HTTP/1.1
Host: www.wes.org
Connection: close
Content-Length: 303
Cache-Control: max-age=0
Origin: https://www.wes.org
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: https://www.wes.org/appstatus/index.aspx
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8,fa;q=0.6
Cookie: ASP.NET_SessionId=bu2gemmlh3hvp4f5lqqngrbp; _ga=GA1.2.1842963052.1473348318; _gat=1

__VIEWSTATE=%2FwEPDwUKLTg3MTMwMDc1NA9kFgICAQ9kFgICAQ8PFgIeBFRleHRkZGRk9rP20Uj9SdsjOKNUBlbw55Q01zI%3D&__VIEWSTATEGENERATOR=189D346C&__EVENTVALIDATION=%2FwEWBQK6lf6LBAKf%2B9bUAgK9%2B7qcDgK8w4S2BALowqJjoU1f0Cg%2FEAGU6r2IjpIPG8BO%2BiE%3D&txtUID=Email%40Removed.com&txtPWD=PASSWORDREMOVED&Submit=Log+In&Hidden1=

这个是我的脚本发出的请求。

POST /appstatus/index.aspx HTTP/1.1
Host: www.wes.org
Connection: close
Accept-Encoding: gzip, deflate, br
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Origin: https://www.wes.org
Accept-Language: en-US,en;q=0.8,fa;q=0.6
Cache-Control: max-age=0
Referer: https://www.wes.org/appstatus/indexca.aspx
Cookie: ASP.NET_SessionId=nxotmb55jjwf5x4511rwiy45
Content-Length: 303

txtPWD=PASSWORDREMOVED&Submit=Log+In&__EVENTVALIDATION=%2FwEWBQK6lf6LBAKf%2B9bUAgK9%2B7qcDgK8w4S2BALowqJjoU1f0Cg%2FEAGU6r2IjpIPG8BO%2BiE%3D&txtUID=Email%40Removed.com&__VIEWSTATE=%2FwEPDwUKLTg3MTMwMDc1NA9kFgICAQ9kFgICAQ8PFgIeBFRleHRkZGRk9rP20Uj9SdsjOKNUBlbw55Q01zI%3D&Hidden1=&__VIEWSTATEGENERATOR=189D346C

这是发出请求的脚本,很抱歉,如果它太乱了,我需要一些快速的东西。

import requests
import bs4
import urllib.parse
def main():
    session = requests.Session()
    headers = {"Origin": "https://www.wes.org",
               "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
               "Cache-Control": "max-age=0", "Upgrade-Insecure-Requests": "1", "Connection": "close",
               "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",
               "Referer": "https://www.wes.org/appstatus/indexca.aspx", "Accept-Encoding": "gzip, deflate, br",
               "Accept-Language": "en-US,en;q=0.8,fa;q=0.6", "Content-Type": "application/x-www-form-urlencoded"}
    r = session.get('https://www.wes.org/appstatus/index.aspx',headers=headers)
    cookies = r.cookies
    soup = bs4.BeautifulSoup(r.content, "html5lib")
    viewState=urllib.parse.quote(str(soup.select('#__VIEWSTATE')[0]).split('value="')[1].split('"/>')[0])
    viewStateGenerator=urllib.parse.quote(str(soup.select('#__VIEWSTATEGENERATOR')[0]).split('value="')[1].split('"/>')[0])
    eventValidation=urllib.parse.quote(str(soup.select('#__EVENTVALIDATION')[0]).split('value="')[1].split('"/>')[0])
    paramsPost = {}
    paramsPost.update({'__VIEWSTATE':viewState})
    paramsPost.update({'__VIEWSTATEGENERATOR':viewStateGenerator})
    paramsPost.update({'__EVENTVALIDATION':eventValidation})
    paramsPost.update({"txtUID": "My@Email.Removed"})
    paramsPost.update({"txtPWD": "My_So_Called_Password"})
    paramsPost.update({"Submit": "Log In"})
    paramsPost.update({"Hidden1": ""})
    response = session.post("https://www.wes.org/appstatus/index.aspx", data=paramsPost, headers=headers,
                            cookies=cookies)
    print("Status code:", response.status_code) #Outputs 500.
    #print("Response body:", response.content)


if __name__ == '__main__':
    main()

如有任何帮助,我们将不胜感激。

你做的工作太多了,这样做没有传递有效数据,你直接提取值属性,即 .select_one('#__VIEWSTATEGENERATOR')["value"],其余所有相同,cookie 将在 Session 对象中设置之后你最初得到的逻辑归结为:

with requests.Session() as session:
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"}
        r = session.get('https://www.wes.org/appstatus/index.aspx', headers=headers)

        soup = bs4.BeautifulSoup(r.content, "html5lib")
        viewState = soup.select_one('#__VIEWSTATE')["value"]
        viewStateGenerator = soup.select_one('#__VIEWSTATEGENERATOR')["value"]
        eventValidation = soup.select_one('#__EVENTVALIDATION')["value"]
        paramsPost = {'__VIEWSTATE': viewState,'__VIEWSTATEGENERATOR': viewStateGenerator,
                      '__EVENTVALIDATION': eventValidation,"txtUID": "My@Email.Removed",
                    "txtPWD": "My_So_Called_Password",
                      "Submit": "Log In","Hidden1": ""}
        response = session.post("https://www.wes.org/appstatus/index.aspx", data=paramsPost, headers=headers)
        print("Status code:", response.status_code)

Python 按照惯例使用 CamelCase 表示 class 名称,使用小写字母和下划线分隔多个单词,您可能需要考虑将其应用到您的代码中。