0

我的 vb.net Web 应用程序中有一个简单的表单,用户使用它来登录网站。

我正在尝试使用 Python 3 和 Python Requests HTTP 库来模拟用户登录。

当我运行 python 脚本时,'get' 和 'post' 状态码都得到了 '200'。

但是当我在发布后打印出返回的文本时,它只会打印出登录页面的 HTML。

我对 Python 很陌生,但我认为它应该可以工作,但我可能遗漏了一些东西。

这是我的python代码:

import requests

returnText = ''
r = requests.get('https://myappurl/Login.aspx')

returnCode = r.status_code
returnText = r.text

print('Get Status: ', returnCode)
# print('results: ', returnText)

headers = {'User-Agent': 'Mozilla/5.0'}
payload = {'loginName':'admin','password':'abc123'}

session = requests.Session()
s = session.post('https://myappurl/Login.aspx',headers=headers,data=payload)

print('Post Status: ', s.status_code)
print('form cookies: ', session.cookies)
print('returned text: ', s.text)

这是 vb.net 代码:

登录.aspx:

<form id="frmLogin" runat="server" defaultfocus="txtEmail">
  <div>
      <label for="txtEmail">Email:</label>
      <asp:TextBox ID="txtEmail" runat="server"></asp:TextBox>
  </div>

  <div>
      <label for="txtPassword">Password:</label>
      <asp:TextBox ID="txtPassword" runat="server"></asp:TextBox>
  </div>

  <div>
      <a href="#" onclick="document.forms['frmLogin'].submit();return false;" id="submit-btn">
        LOG IN
      </a>
  </div>
</form>

当用户单击登录链接时,这称为:

登录.aspx.vb:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
   ' *** when user clicks the form "submit" button, this is loaded ***
   Call ValidateLogin()
End Sub

Here are the two relevant methods:

Sub ValidateLogin()
    ' *** get the values inside the textEmail and txtPassword TextBox controls
    Dim loginName As String = txtEmail.Text
    Dim password As String = txtPassword.Text
    Dim loginMessage As String = String.Empty

    loginMessage = AuthUser(loginName, password)

    If loginMessage = "success" Then
       ' *** user is authenticated, load main web app screen ***
    End If

End Sub

Public Shared Function AuthUser(ByVal loginName As String, ByVal password As String) As String
    ' *** lots of code that checks "loginName" and "password" against a database call ***
    ' *** if both loginName and password are good then return "success"
    Return "Success"
End Function

我期待在成功登录后看到返回的下一页的文本(html),这是一个游戏列表。

我已检查以确保登录名和密码正确。当我正常登录网站时,它们工作正常。

我需要在我的 Python 脚本中做些什么或修复什么才能成功登录吗?

谢谢!

4

1 回答 1

0

使用库 BeautifulSoup 来获取所有隐藏的表单字段为我解决了这个问题。

import requests

from bs4 import BeautifulSoup

data = {} URL="https://myappurl/Login.aspx" 
headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36"}

username = "me@me.me" 
password = "mypassword123"

s = requests.Session() 
s.headers.update(headers) 
r=s.get(URL) 

soup=BeautifulSoup(r.content)

VIEWSTATE = soup.find(id="__VIEWSTATE")['value'] 
VIEWSTATEGENERATOR = soup.find(id="__VIEWSTATEGENERATOR")['value'] 
EVENTVALIDATION = soup.find(id="__EVENTVALIDATION")['value']

login_data={"__VIEWSTATE":VIEWSTATE, 
"__VIEWSTATEGENERATOR":VIEWSTATEGENERATOR, 
"__EVENTVALIDATION":EVENTVALIDATION, 
"frmControlNameForLoginNameField":username, 
"frmControlNameForPasswordField":password, 
"submit-btn":"frmLogin"}

r=s.post(URL, data=login_data) 
print (r.url) 
print (r.content)
于 2019-02-22T18:48:19.803 回答