如何在Python中执行Curl

时间:2017-09-15 19:52:12

标签: python windows curl

我正在尝试在python脚本中执行curl命令,但无法传递带符号的密码。

import os;
os.system("curl -H 'Content-Type: text/xml;charset=UTF-8' -u 'appuser:appuser!@3pass' -i -v 'http://app.com/webservice/getUserData' -o userdata.xml")

我收到了Access Denied消息,用户名和密码都是正确的。我想这是因为密码中的特殊字符。 我试过逃避像appuser\!\@3pass这样的角色但没有帮助。

任何人都可以指导这个吗?

1 个答案:

答案 0 :(得分:4)

您使用的命令无法正常工作,因为单引号在Windows中没有特殊含义,它们会直接传递给curl程序。因此,如果您从Linux(它可以工作的地方)复制命令行,那么这里不会起作用(虚假引号传递给curl,例如接收'appuser的登录/密码字段和appuser!@3pass'Content-Type: text/xml;charset=UTF-8根本没有受到保护,被理解为2个单独的参数)

从控制台进行简单测试:

K:\progs\cli>curl.exe -V
curl 7.50.3 (x86_64-pc-win32) libcurl/7.50.3 OpenSSL/1.0.2h nghttp2/1.14.1
Protocols: dict file ftp ftps gopher http https imap imaps ldap pop3 pop3s rtsp smb smbs smtp smtps
telnet tftp
Features: AsynchDNS IPv6 Largefile NTLM SSL HTTP2

(如果我使用带双引号的"-V"也有效),但如果我在版本arg上使用简单引用,我会得到:

K:\progs\cli>curl.exe '-V'
curl: (6) Could not resolve host: '-V'

正如o11c评论的那样,有一个python模块来处理卷曲,你最好还是可以使用它。

对于其他情况,否则不建议使用os.system。例如,使用subprocess.check_call更好(python 3.5具有统一的run函数):

  • 检查返回代码,如果错误则引发异常
  • 能够通过&引用参数而不用手动。

让我们修复你的例子:

subprocess.check_call(["curl","-H","Content-Type: text/xml;charset=UTF-8","-u",'appuser:appuser!@3pass',"-i","-v",'http://app.com/webservice/getUserData',"-o","userdata.xml"])
请注意,我的目的是混合单身和双引号。 Python并不关心。如果参数中有空格,check_call机制会自动处理参数保护/引用。

调用此脚本时,我会填写userdata.xml,如:

HTTP/1.1 301 Moved Permanently
Date: Fri, 15 Sep 2017 20:49:50 GMT
Server: Apache
Location: http://www.app.com/webservice/getUserData
Content-Type: text/html; charset=iso-8859-1
Transfer-Encoding: chunked

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.app.com/webservice/getUserData">here</a>.</p>
</body></html>