да, ваш токен csrf привязан к сеансу cookie, указанному в запросе stream_get_contents, без этого cookie ваш токен csrf бесполезен, и вы никогда не извлекаете cookie из stream_get_contents (и я не думаю, что stream_get_contents даже поддерживает это ), перепишите его с помощью curl_ api и убедитесь, что система cookie curl включена (например, установите для CURLOPT_COOKIEFILE значение emptystring, что активирует систему обработки файлов cookie libcurl). также ваш код извлечения csrf ненадежен, он не декодирует html-сущности (например, если токен csrf содержит &
, он будет html-кодирован как &
, но ваш код не переводит &
обратно &
.), вместо этого используйте правильный HTML-анализатор, такой как DOMDocument. Кроме того, вы не urlencode csrf_key, так что снова он может быть поврежден, если он содержит специальные символы (например, @, подробнее об этом позже). используйте urlencode () или http_build_query () для правильного urlencode ключа csrf, и вашего имени пользователя, и вашего пароля, потому что вы их тоже не кодируете. Знаете ли вы, что @
в вашем электронном письме должно быть закодировано в %40
? Бьюсь об заклад, когда вы жестко закодируете свой адрес электронной почты для входа в систему, вы просто пишете foo@gmail.com
, вы не пишете foo%40gmail.com
, поэтому вам придется также ввести это код.
попробуйте это, используя http_build_query для кодирования данных поста и DOMDocument для анализа токена csrf:
<?php
declare(strict_types = 1);
$ch = curl_init ();
curl_setopt_array ( $ch, array (
CURLOPT_COOKIEFILE => '',
CURLOPT_ENCODING => '',
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_URL => 'https://invisioncommunity.com/login/'
) );
$html = curl_exec ( $ch );
$domd = @DOMDocument::loadHTML ( $html );
$xp = new DOMXPath ( $domd );
curl_setopt_array ( $ch, array (
CURLOPT_URL => 'https://invisioncommunity.com/login/',
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => http_build_query ( array (
'csrfKey' => $xp->query ( '//input[@name="csrfKey"]' )->item ( 0 )->getAttribute ( "value" ),
'auth' => '____USERNAME_______',
'password' => '___PASSWORD____',
'remember_me' => 1,
'_processLogin' => 'usernamepassword'
) )
) );
$html = curl_exec ( $ch );
echo $html;