【问题标题】:Why I can't fill this form using Python "requests" library?为什么我不能使用 Python “请求”库填写此表单?
【发布时间】:2015-05-18 13:32:56
【问题描述】:

我想在 Python 中使用 requests 库填写登录表单。如下所示,字段名称为 usernamepassword

所以我写了下面的脚本:

session = requests.session()
p = session.post("http://192.168.94.1/SubSystem/Portal/Index1/Login/Login2.aspx", {'username':'myUsername','password':'myPassword'})
print 'headers', p.headers
print 'cookies', requests.utils.dict_from_cookiejar(session.cookies)
print 'html',  p.text

问题是,当我运行它时,它再次返回登录页面!我的程序有什么问题?

更新:

我也尝试将参数作为数据发送,但没有任何改变。即下面的代码也返回相同的输出:

payload = {'username': 'myUsername', 'password': 'myPassword'}
r = requests.post("http://192.168.94.1/SubSystem/Portal/Index1/Login/Login2.aspx", data=payload)
print(r.text)

更新2:

我使用 Burp Suit 捕获数据包以查看差异:

这是我的浏览器发送的数据包:

POST /SubSystem/Portal/Index1/Login/Login2.aspx HTTP/1.1
Host: 192.168.94.1
Proxy-Connection: keep-alive
Content-Length: 134
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: http://192.168.94.1
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://192.168.94.1/SubSystem/Portal/Index1/Login/Login2.aspx
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8
Cookie: ASP.NET_SessionId=nntwluu5uhrldzuymsv333uc; CURRENT_LANGUAGE_2=fa

__VIEWSTATE=%2FwEPDwUKMTY5ODAzNzY1MmRkpL4TXtJfODqn0yxypIJaOzkl4YUWynT8urN%2BYYXM%2FnY%3D&Command=LOGIN&username=myUsername&password=myPassword

这是第二个 Python 脚本发送的数据包:

POST /SubSystem/Portal/Index1/Login/Login2.aspx HTTP/1.1
Host: 192.168.94.1
Content-Length: 31
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: python-requests/2.4.3 CPython/2.7.0 Windows/7
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded

username=myUsername&password=myPassword

【问题讨论】:

  • @EsseTi 试过了,没有任何改变。相同的输出。
  • .post 中你已经完成了payload = {'username': 'myUsername', 'passowrd': 'myPassword'} - 注意错字passowrd
  • @JonClements 我更正了。没有任何改变。谢谢
  • @Jean 好吧,一个区别是浏览器帖子正在发送一个隐藏字段......所以你需要一个 {'Command': 'LOGIN'} 添加到你的 payload (看看你更新编辑的底线查看正在发送的字段的差异...)

标签: python python-2.7 python-requests


【解决方案1】:

看起来您首先需要发送一个 POST 请求,但从您最近的更新来看,该 POST 还需要一些可用的 cookie - 还有一个名为“Command”的隐藏字段需要发送值为“LOGIN”,所以。

import requests

URL = "http://192.168.94.1/SubSystem/Portal/Index1/Login/Login2.aspx"

# Set up session object so we can store cookies across requests
session = requests.session()
# GET the page to get any initial cookies required for the POST
r = session.get(URL)
# POST to the login form (making sure to add "Command")
r = session.post(URL, data={'Command': 'LOGIN', 'username': 'x', 'password': 'y'})

至于为什么您在保存页面时没有获得图像是因为当浏览器加载页面时,它会看到指向资源/样式表/图像的链接并发出进一步的访问请求 - 所有requests 所做的是加载页面的“文本”。有一些方法可以实现这一点,但这超出了这里核心问题的答案范围。


根据关于我可以使用这些会话对象进行多次登录的评论吗? - 这是一种方法...

# List of users and passwords
USERS = {
    'rod': 'password1',
    'jane': 'password2',
    'freddy': 'password3'
}
# Initial name->initial session with cookies
sessions = {name:requests.session().get(URL) for name in USERS}
# Login users
sessions.update(
    (name, session.post(URL, data={'Command': 'LOGIN', 'username': name, 'password': USERS[name]})) 
    for name, session in sessions.items()
)
# Now do something with users
r1 = sessions['rod'].get('http://something.com')
r2 = sessions['freddy'].get('http://something.com', params={'foo': 'bar'})
# etc...

【讨论】:

  • 我可以使用这些会话对象进行多次登录吗?我的意思是有什么方法可以通过 python 进程(程序)同时使用两个或多个用户名和密码对登录?(可能通过为每个帖子指定不同的 cookie?)这个库有这样的功能吗?通常在浏览器中是不可能的。
  • @Jean 你创建了 N 个会话对象(相当于在隐身/私人模式下打开 N 个浏览器)
  • @Jean 给出了一个(未经测试的)示例,我认为您会发现它很容易扩展
  • 哦,是的!非常感谢您的时间:)
【解决方案2】:

支持@EsseTi 的回答,使用 data=Payload 方法来获取它们。 .

import requests
payload = {'id_login': 'UserName', 'id_password': 'Password'}
url = #Your URL
something = requests.post(url, data=payload)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 2016-07-16
    • 2021-12-20
    相关资源
    最近更新 更多