【发布时间】:2019-10-26 21:33:55
【问题描述】:
是否可以在同一个cURL 请求中获取input 的value 和post 信息?
原因:
我正在尝试使用 cURL 登录 here,但是,登录表单会在名为 form_key 的 input 的 value 中生成一个唯一密钥。所以,我想先获取该值,然后发布用户名和密码以成功登录。
PHP(不工作,给出一个空白页面,源代码中没有任何内容):
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, "https://b2b.chiemsee.com/customer/account/login/");
curl_setopt($ch2, CURLOPT_FOLLOWLOCATION, true); // to allow redirections
//curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, FALSE); // to avoid error
curl_setopt($ch2, CURLOPT_POST, true); // to send info
curl_setopt($ch2, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch2, CURLOPT_COOKIEJAR, 'cookie.txt'); // to save cookie data for login
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true); // to get the html
$response2 = curl_exec($ch2);
curl_close($ch2);
$html = new simple_html_dom();
$html->load($response2);
$val = $html->find('input[name=form_key]');
$form_key = $val[0]->value;
$data = array(
'form_key' => $form_key,
'login[username]' => 'myusername',
'login[password]' => 'mypassword',
'send' => '',
);
附: 当我手动登录并检查浏览器控制台 -> 网络 -> 帖子 -> 标题/参数时,我得到以下信息:-
form_key: viiRqZigH0YPC9wu
login[username]: myusername
login[password]: mypassword
send:
更新。 两个单独的 cURL 请求(现在仍在工作):
include('simple_html_dom.php');
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, "https://b2b.chiemsee.com/customer/account/login/");
curl_setopt($ch2, CURLOPT_FOLLOWLOCATION, true); // to allow redirections
curl_setopt($ch2, CURLOPT_COOKIEJAR, 'cookie.txt'); // to save cookie data for login
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true); // to get the html
$response2 = curl_exec($ch2);
curl_close($ch2);
$html = new simple_html_dom();
$html->load($response2);
$val = $html->find('input[name=form_key]');
$form_key = $val[0]->value;
$data = array(
'form_key' => $form_key,
'login[username]' => 'myusername',
'login[password]' => 'mypassword',
'send' => 'Anmelden'
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://b2b.chiemsee.com/customer/account/login/");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // to allow redirections
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // to avoid error
curl_setopt($ch, CURLOPT_POST, true); // to send info
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); // to read data
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // to get the html
$response = curl_exec($ch);
if (curl_error($ch)) {
$error_msg = curl_error($ch);
var_dump($error_msg);
exit;
}
curl_close($ch);
echo $response;
【问题讨论】:
-
CURLOPT_COOKIEJAR 中的注释 请注意 libcurl 不会从 cookie jar 中读取任何 cookie。如果你想从文件中读取cookies,使用
CURLOPT_COOKIEFILE.你需要both。您的第一个请求会将 cookie 写入 cookie jar(因此需要CURLOPT_COOKIEJAR),第二个请求将需要使用CURLOPT_COOKIEFILE从 Jar 中读取 cookie,以确保使用相同的会话。这是必要的,因为 CSRF 保护令牌与会话 cookie 相关联。 -
@apokryfos 好的,但我是在两个请求中使用
CURLOPT_COOKIEJAR还是只在第一个请求中使用?因为在第二个请求中我们发送用户名和密码。 -
您使用的第一个请求
CURLOPT_COOKIEJAR这将存储服务器发送的cookie。在第二个请求中,您同时使用CURLOPT_COOKIEFILE和CURLOPT_COOKIEJAR,这会将cookies 发送回服务器,然后保存来自服务器的任何新的/修改的cookies。然后,服务器将使用它接收到的会话 cookie 交叉引用表单密钥,以确保它来自同一个人。 -
@apokryfos 我试过了,但它不起作用。代码在帖子中更新。
-
该页面表单中的登录 url 是
https://b2b.chiemsee.com/customer/account/loginPost/。你好像打错人了