Как передать значения сеанса из одного запроса в другой запрос последовательно, используя cURL в PHP? - PullRequest
0 голосов
/ 06 февраля 2019

Когда первый запрос сделан, идентификатор сеанса создается.Тот же идентификатор сеанса переносится на второй запрос.

В моем третьем запросе создается новый идентификатор сеанса для успешного входа в систему, но когда я печатаю идентификатор сеанса для третьего запроса, ответ даетдругой идентификатор сессииПочему это происходит?И я хочу отправить идентификатор сеанса, который я получил в 3-м ответе на 4-й?

Как этого добиться?

enter image description here

Это мой код:

<?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;
?>

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019
  1. удалить все CURLOPT_COOKIESESSION => TRUE, сохранить только один файл cookie, не переписывать его
  2. $fcookies = __DIR__."/cookies.txt"; имя файла инициализации
  3. Добавить во все запросы CURLOPT_COOKIEFILE => $fcookies, CURLOPT_COOKIEJAR => $fcookies,

Шаг разбора 3

echo "<h2>Response 3</h2>";
print_r($response);

$new_sid = explode("sessionId=",$response);
$new_sid = explode(";",$new_sid[1]);
$new_sid = $new_sid[0];

file_put_contents($fcookies,"192.168.2.35 FALSE / TRUE 0 sessionId ".$new_sid);

echo "<br/>";
$cookies = curl_getinfo($curl, CURLINFO_COOKIELIST);
print_r($cookies);

$curl = curl_init();

Wget way

wget --load-cookies cookie.txt --save-cookies cookie.txt -S -O step1.txt --no-check-certificate https://192.168.2.35/cgi-bin/common/login/webLogin
cat cookie.txt
wget --load-cookies cookie.txt --save-cookies cookie.txt -S -O step2.txt --post-data "userName=dadmin&logonButton=Logon&actionStep=2" --no-check-certificate https://192.168.2.35/cgi-bin/common/login/webLogin
cat cookie.txt
wget --load-cookies cookie.txt --save-cookies cookie.txt -S -O step3.txt --post-data "userName=dadmin&pa55word=dadmin01&logonButton=Logon&actionStep=3" --no-check-certificate https://192.168.2.35/cgi-bin/common/login/webLogin
cat cookie.txt
wget --load-cookies cookie.txt --save-cookies cookie.txt -S -O step4.txt --post-data "motdContinue=Continue&actionStep=motdContinue" --no-check-certificate https://192.168.2.35/cgi-bin/common/loginMotd/w_motd
cat cookie.txt
wget --load-cookies cookie.txt --save-cookies cookie.txt -S -O step5.txt --no-check-certificate https://192.168.2.35/cgi-bin/msg/mango/admin/controller/SubscriberMgmt
cat cookie.txt
0 голосов
/ 15 февраля 2019

, поскольку вы постоянно указываете curl выбрасывать все существующие сеансовые куки, вот документация php по CURLOPT_COOKIESESSION:

TRUE, чтобы пометить это как новый сеанс cookie.Это заставит libcurl игнорировать все файлы cookie, которые он собирается загрузить, которые являются «файлами cookie сеанса» из предыдущего сеанса.По умолчанию libcurl всегда сохраняет и загружает все куки, независимо от того, являются ли они сессионными куки или нет.Сессионные куки-файлы - это куки-файлы без даты истечения, и они предназначены для того, чтобы быть живыми и существующими только для этой «сессии».

  • каждый раз, когда вы устанавливаете CURLOPT_COOKIESSION, вы говорите, что curl выбрасыватьвсе существующие сеансовые куки , и вы устанавливаете это для каждого вызова.на самом деле вам вообще не нужно его устанавливать, если только вы не хотите очистить старые файлы cookie предыдущих версий в банке файлов cookie.просто избавьтесь от ВСЕХ ссылок на CURLOPT_COOKIESESSION - если ваши старые куки истекли, сервер просто даст вам новый сеанс в curl_exec ().

кстати, вы делаете это неправильно:

$fields = array(
    'userName' => urlencode('dadmin') ,
    'pa55word' => urlencode('dadmin01') ,
    'logonButton' => urlencode('Logon') ,
    'actionStep' => urlencode(3) ,
);
$fields_string = http_build_query($fields);

здесь имя пользователя / пароль / и т. Д. Будут дважды кодированы.код должен выглядеть следующим образом:

$fields = http_build_query(array(
    'userName' => 'dadmin',
    'pa55word' => 'dadmin01',
    'logonButton' => 'Logon',
    'actionStep' => 3,
));

, поскольку http_build_query ДЕЛАЕТ URL-кодировку, http_build_query практически реализован так:

function http_build_query(array $data):string{
    $ret='';
    foreach($data as $key=>$val){
        $ret.=urlencode($key)."=".urlencode($data)."&";
    }
    $ret=substr($ret,0,-1);
    return $ret;
}
0 голосов
/ 06 февраля 2019

Вы должны указывать файл 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.'
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...