php - 如何在 PHP 中使用 cURL 将会话值从一个请求连续传递到另一个请求?
问题描述
当发出第一个请求时,会创建一个会话 ID。相同的会话 ID 被传送到第二个请求。
在我的第三个请求中,为成功登录创建了一个新的会话 ID,但是当我为第三个请求打印会话 ID 时,响应给出了不同的会话 ID。为什么会这样?我想将我在第 3 次响应中获得的会话 ID 发送到第 4 次?
如何做到这一点?
这是我的代码:
<?php
$fp = fopen("cookies.txt", "w");
fclose($fp);
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_HEADER => TRUE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_URL => 'https://192.168.2.35/cgi-bin/common/login/webLogin',
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_COOKIESESSION => TRUE,
CURLOPT_COOKIEFILE => "cookies.txt",
CURLOPT_COOKIEJAR => "cookies.txt",
CURLOPT_FOLLOWLOCATION => TRUE,
CURLOPT_AUTOREFERER => TRUE,
));
$result = curl_exec($curl);
if (!curl_exec($curl))
{
die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl));
}
echo "<h2>Response 1</h2>";
print_r($result);
$cookies = curl_getinfo($curl, CURLINFO_COOKIELIST);
print_r($cookies);
// #######################################################################################
$fields = array(
'userName' => 'dadmin',
'logonButton' => 'Logon',
'actionStep' => 2,
);
$fields_string = http_build_query($fields);
curl_setopt_array($curl, array(
CURLOPT_HEADER => TRUE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_URL => 'https://192.168.2.35/cgi-bin/common/login/webLogin',
CURLOPT_POST => TRUE,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_POSTFIELDS => $fields_string,
CURLOPT_FOLLOWLOCATION => TRUE,
CURLOPT_COOKIESESSION => TRUE,
CURLOPT_AUTOREFERER => TRUE,
));
$resp = curl_exec($curl);
if (!curl_exec($curl))
{
die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl));
}
echo "<h2>Response 2</h2>";
print_r($resp);
$cookies = curl_getinfo($curl, CURLINFO_COOKIELIST);
print_r($cookies);
// ################################################################################################
$fields = array(
'userName' => urlencode('dadmin') ,
'pa55word' => urlencode('dadmin01') ,
'logonButton' => urlencode('Logon') ,
'actionStep' => urlencode(3) ,
);
$fields_string = http_build_query($fields);
curl_setopt_array($curl, array(
CURLOPT_HEADER => TRUE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_URL => 'https://192.168.2.35/cgi-bin/common/login/webLogin',
CURLOPT_POST => TRUE,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_POSTFIELDS => $fields_string,
CURLOPT_FOLLOWLOCATION => TRUE,
CURLOPT_COOKIESESSION => TRUE,
CURLOPT_AUTOREFERER => TRUE,
));
$response = curl_exec($curl);
if (!curl_exec($curl))
{
die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl));
}
echo "<h2>Response 3</h2>";
print_r($response);
echo "<br/>";
$cookies = curl_getinfo($curl, CURLINFO_COOKIELIST);
print_r($cookies);
// ###########Login Completed##################
curl_setopt_array($curl, array(
CURLOPT_COOKIESESSION => TRUE,
CURLOPT_HEADER => TRUE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_URL => 'https://192.168.2.35/cgi-bin/msg/mango/admin/controller/SubscriberMgmt',
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_FOLLOWLOCATION => TRUE,
CURLOPT_AUTOREFERER => TRUE,
));
$result = curl_exec($curl);
if (!curl_exec($curl))
{
die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl));
}
echo "<h2>Response 4</h2>";
print_r($result);
echo "<br/>";
$cookies = curl_getinfo($curl, CURLINFO_COOKIELIST);
print_r($cookies);
exit;
?>
解决方案
您必须在每个请求中指定 cookie 文件,而不仅仅是前一个或两个:
CURLOPT_COOKIEFILE => "/tmp/cookies.txt",
CURLOPT_COOKIEJAR => "/tmp/cookies.txt",
还要确保文件实际上是可写的:
$cookieFile = '/tmp/cookies.txt';
if (! is_readable($cookieFile) || ! is_writable($cookieFile)) {
throw new \Exception(
'Cookiefile ' . $cookieFile . ' is not writable or readable.'
);
}
推荐阅读
- javascript - 在 React Native 中单击下一个按钮时如何聚焦第二个字段
- javascript - 在 Fabric 对象移动事件中获取 x/y 偏移
- react-native - 带有反应导航 5 的 switchNavigator
- cognos - 如何在 IBM Cognos 中基于多个条件创建计算
- create-react-app - 在 create-react-app 中找不到弹出命令 - 如何添加到 package.json?
- r - 使用 R 中的 Leaflet 可视化我的 1 GB mb csv 文件数据时遇到问题。我有 8GB RAM 和 256 GB SD 卡
- javascript - Django:如何使 React 和导出/导入在单个 JS 静态文件中工作?
- javascript - 如何在 React App 完成加载之前显示整页加载器/微调器
- matlab - Matlab更快的rcnn多个类和属性
- python - Marching_cubes_lewiner() 的输入格式?