将POST数据发送到带有“ñ”字符的登录表单(With Curl Works)

时间:2015-08-05 12:05:01

标签: python curl python-requests

卷曲效果很好,我可以登录。

curl 'https://server.com/server.jsp?login' --data 'username=usernamex&PASSWORD=contrase%F1a'

对比%F1a15表示“contraseña15”

但是当我尝试使用请求发送相同的内容时,我收到的密码不正确。

payload = 'username=usernamex&PASSWORD=contrase%F1a' 
login = "https://server.com/server.jsp?login"
r = requests.post(url=login,data=payload)
print r.text

我如何解决这个问题?我尝试了几个选项。就像有效载荷= {'密码':'contraseña15“..}并使用json.dumps,但没有,总是我收到相同的结果。

请帮助!

编辑: 我也试试这个

import urllib2, urllib
url = 'https://server.com/server.jsp?login'
data = urllib.urlencode({'USUARIO':'username','PASSWORD':'contrase%F1a15'})
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
d = response.read()
print d

没有,我得到相同的结果。仅适用于Curl。

编辑2:

额外的东西

有了这个,我收到了与请求相同的结果

curl 'https://server.com/server.jsp?login' --data 'USUARIO=username&PASSWORD=contraseña15'

但如果我使用它!工作完善。

curl 'https://server.com/server.jsp?login' --data 'USUARIO=username&PASSWORD=contrase%F1a15' 

编辑3:

使用PyCurl完美!

import pycurl
c = pycurl.Curl()
c.setopt(c.URL, 'https://server.com/server.jsp?login')
postfields = 'USUARIO=username&PASSWORD=contrase%F1a15'
c.setopt(c.VERBOSE, True)
c.setopt(c.POSTFIELDS, postfields)
c.perform()
c.close()

最后!谢谢@mhawke

溶液:

login_url = 'https://server.com/server.jsp?login'
password = u'contraseña15'.encode('iso-8859-1')
payload = {'username': 'usernamex', 'PASSWORD': password}
r = requests.post(login_url, data=payload)

3 个答案:

答案 0 :(得分:1)

尝试发布未编码的值,如下所示:

login_url = 'https://server.com/server.jsp?login'
payload = {'username': 'usernamex', 'PASSWORD': 'contraseña15'}
r = requests.post(login_url, data=payload)

requests将为您处理网址编码。服务器应该看到

username=usernamex&PASSWORD=contrase%C3%B1a15

在POST的正文中。

<强>更新

使用curl,发布的数据似乎是urlencoded ISO-8859-1文本或类似内容。使用requests,发布的数据是urlencoded UTF8数据。看来服务器期望请求体的ISO-8859-1编码。试试这个:

login_url = 'https://server.com/server.jsp?login'
password = u'contraseña15'.encode('iso-8859-1')
payload = {'username': 'usernamex', 'PASSWORD': password}
r = requests.post(login_url, data=payload)

有了这个请求,服务器现在应该看到:

username=usernamex&PASSWORD=contrase%F1a15

curl生成的内容相同。

答案 1 :(得分:0)

我在我的系统中尝试过这个功能:

import requests

requests.post(login, {'username':'<your username>', 'password':'<your password>'})

我输入的密码与我在表单中输入的密码完全相同。它对我有用,我得到了response code of 200

答案 2 :(得分:0)

我的最终评论。 相同的URL和相同的POST DATA。 请求不起作用,但在pycurl中工作。

import requests
import pycurl


login_url = "https://server.com/server.jsp?login"
postfields = 'username=usernamex&PASSWORD=contrase%F1a'

r = requests.post(login_url,postfields)
#This return a html with relatedd with error Login
print r.text


#And this Works perfectly.
c = pycurl.Curl()
c.setopt(c.URL, login_url)
c.setopt(c.VERBOSE, True)
c.setopt(c.POSTFIELDS, postfields)
c.perform()
c.close()