使用Python的请求从受密码保护的ASP网站获取数据

2024-05-19 08:35:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用Python的请求获取受密码保护的ASP站点的全部内容。在

ASP站点的程序员告诉我,使用PowerShell,他可以使用以下脚本获取数据:

$c = $host.UI.PromptForCredential('Your Credentials', 'Enter Credentials','','')
$r = Invoke-WebRequest 'https://server.com/app/login.aspx' -SessionVariable my_session
$form = $r.Forms[0]
$form.fields['xUsername']=$c.UserName
$form.fields['xPassword']=$c.GetNetworkCredential().Password
$r = Invoke-WebRequest -Uri ("https://server.com/app/login.aspx?ReturnUrl=%2Fapp%2FgetData.aspx%3Ftype%3DGETDATA%26id%3D123") -WebSession $my_session -Method POST -Body $form.Fields

我试图使用python的请求库来实现这一点,但似乎不能正常工作。我得到的不是数据,而是您在没有密码的情况下通常会看到的HTML代码。在

^{pr2}$

我做错什么了?在


Tags: httpsformcomappfieldsserver站点session
1条回答
网友
1楼 · 发布于 2024-05-19 08:35:52

我发现了以下问题:

  1. 标题不见了,我只是用Chrome去了网站,得到了这些信息。在我的例子中:“Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,像壁虎)Chrome/63.0.3239.132 Safari/537.36”
  2. 在“Form data”下找到的所有数据都必须包含在python请求中。再次,进入Chrome并正常登录网站。@Chrome:检查>网络>搜索登录.asp>;在底部,我找到了“formdata”,在我的例子中,它看起来像这样(在解析视图上):

    事件目标:

    事件参数:

    在__视图状态:随机长字符串

    查看状态生成器:随机十六进制数量

    事件验证:随机长字符串

    在xUsername:用户在

    在xPassword:密码在

    在btnLogin:登录

因此,正确的python代码如下所示:

import getpass
import requests
requests.packages.urllib3.disable_warnings()
from bs4 import BeautifulSoup

user="my_username"
password=getpass.getpass()
url = "https://server.com/app/login.aspx?ReturnUrl=%2fapp%2fgetData.aspx%3ftype%3dGETDATA%26id%3d123"
data = {"xUsername":user, "xPassword": password}
with requests.Session() as s:
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"}
    r = s.get('https://server.com/app/login.aspx',verify=False,headers=headers)
    soup = BeautifulSoup(r.content)
    data["___VIEWSTATE"] = soup.select_one("#__VIEWSTATE")["value"]
    data["__VIEWSTATEGENERATOR"] = soup.select_one("#__VIEWSTATEGENERATOR")["value"]
    data["__EVENTTARGET"] = ""
    data["__EVENTARGUMENT"] = ""
    data["__EVENTVALIDATION"] = soup.select_one("#__EVENTVALIDATION")["value"]
    data["btnLogin"] = "Login"

    response = s.post(url,data=data, headers=headers, allow_redirects=True)
    print response.content

我必须以编码形式包含url,否则我将从服务器收到一条错误消息,指出缺少一个参数,即:

^{pr2}$

也许有人知道一个更好的方法,不用解码网址。在

相关问题 更多 >

    热门问题