将PHP curl_setopt()转换为Python请求和CLI curl


Converting PHP curl_setopt() to Python Requests and to CLI curl

我正在尝试将以下PHP curl_setopt()转换为Python Requests中的等效程序以及CLI curl。对于Python,如果在请求中不可能,我将使用pycurl

curl_setopt($process, CURLOPT_RETURNTRANSFER, true);
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);

以下是正在运行的PHP curl代码:

$params = array(
    'username' => $username,
    'password' => $password
);
$params_string = json_encode($params);
$process = curl_init($url);
curl_setopt($process, CURLOPT_RETURNTRANSFER, true);
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($process, CURLOPT_POSTFIELDS, $params_string);
$headers = array();
$headers[] = 'Content-Type: application/json';
curl_setopt($process, CURLOPT_HTTPHEADER, $headers);
$data = curl_exec ($process);
curl_close ($process);   

我不知道我需要在Python请求中为这两个PHP curl_setopt(s)设置什么。

我在CLI curl中尝试了以下操作,但出现了错误请求错误:

AUTHENTICATE_DATA="usename=${USERNAME}&password=${PASSWORD}"
AUTHENTICATE_RESPONSE=$(curl '
  -X POST '
  -H 'Content-Type: application/json' '
  --data-urlencode "${AUTHENTICATE_DATA}" '
  -v '
  ${AUTHENTICATE_URL})
echo ${AUTHENTICATE_RESPONSE}

我需要什么?

谢谢你,感谢你的帮助。

使用请求:

import requests
url = 'https://...'
username = 'username'
password = 'supersecret'
# curl_setopt($process, CURLOPT_RETURNTRANSFER, true);
# PHP bashing time: Who in their right minds would create a function
# that spews its return value to stdout by default, unless explicitly
# instructed not to do so.
resp = requests.post(
    # $process = curl_init($url);
    url,
    # $params = array(
    #    'username' => $username,
    #    'password' => $password
    # );
    # $params_string = json_encode($params);
    # curl_setopt($process, CURLOPT_POSTFIELDS, $params_string);
    # $headers[] = 'Content-Type: application/json';
    # curl_setopt($process, CURLOPT_HTTPHEADER, $headers);
    json=dict(username=username, password=password),
    # curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);
    # note: you shouldn't do this, really
    verify=False,
)
data = resp.text
# or if you expect json response
data = resp.json()
curl_setopt($process, CURLOPT_RETURNTRANSFER, true);

这个选项只是说curl_exec()的结果被传递给一个返回变量。在命令行上,默认情况是输出到标准输出。

curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);

这是一个非常糟糕的主意,会让你很容易受到中间人的攻击。没有理由使用它。--insecure是等效的命令行选项。

另外值得一提的是,您正在传递一个JSON字符串作为CURLOPT_POSTFIELDS的参数,并且CLI代码中没有进行JSON编码。