Решил проблему .. никогда не используйте file_get_contents. ДОЛЖЕН использовать cUrl во всех случаях, и он работает.cUrl получить токен для входа cUrl
Я пытаюсь ВХОД с cUrl на этот сайт: http://www.v-tac.ro/.
Теперь на основе заголовков и на основе полей ввода я написал этот php-код.
Проблема в том, что это два последних ввода массива, я просто сделал копию вставки ... но токен генерируется каждый раз, когда страница загружается, находящаяся на странице в качестве скрытого поля ввода.
Итак, вопрос в том, как я могу получить новый токен, который будет работать? EDITED - ДОБАВЛЕНО МОЯ ВСЯ ФУНКЦИЯ:
function login_to_website($targetURL){
global $browser_user_agent;
if(empty($targetURL)) { return; }
if(empty($login_url)) { $login_url = $targetURL; }
$url = $login_url;
$login_user = "loginusername";
$login_password = "loginpassword";
$thetoken = "this-is-my-problem-the-token-from-the-hidden-input";
$post_data = array();
$post_data['username'] = "$login_user";
$post_data['password'] = "$login_password";
$post_data['Submit'] = "Conectare";
$post_data['option'] = "com_users";
$post_data['task'] = "user.login";
$post_data['return'] = "aW5kZXgucGhwP0l0ZW1pZD0yMTY%3D";
$post_data[$thetoken] = "1";
$postthis = http_build_query($post_data);
$login = curl_init();
curl_setopt($login, CURLOPT_COOKIEJAR, dirname(__FILE__) . "/cookie.tmpz");
curl_setopt($login, CURLOPT_COOKIEFILE, dirname(__FILE__) . "/cookie.tmpz");
curl_setopt($login, CURLOPT_VERBOSE, true);
curl_setopt($login, CURLOPT_URL, $url);
curl_setopt($login, CURLOPT_USERAGENT, random_user_agent());
curl_setopt($login, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($login, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($login, CURLOPT_POST, TRUE);
$timeout = 5;
curl_setopt($login, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($login, CURLOPT_TIMEOUT, $timeout);
curl_setopt($login, CURLOPT_MAXREDIRS, 10);
curl_setopt($login, CURLOPT_POSTFIELDS, $postthis); // POST vars
curl_setopt($login, CURLOPT_HEADER, 0); // debug headers sent - 1
$data = curl_exec ($login);
curl_setopt($login, CURLOPT_URL, $targetURL);
$datax = curl_exec ($login);
return $datax;
// close cURL resource, and free up system resources
curl_close($login);
}
и оригинальный живой заголовок такова:
username=username&password=password&Submit=Conectare&option=com_users&task=user.login&return=aW5kZXgucGhwP0l0ZW1pZD0yMTY%3D&0dbf64fe20e2395a7d72ed5b64b3cf7c=1
EDIT:
я получаю маркер вроде этого:
$htmlx = file_get_contents('http://www.v-tac.ro');
$htmlx = mb_convert_encoding($htmlx, 'UTF-8', mb_detect_encoding($htmlx)); //make sure this is utf8
if(!strlen($htmlx)) {echo "No HTML here . stoping execution with a return ."; return;}
$doc = new DomDocument;
@$doc->loadHTML($htmlx);
$xpath = new DOMXPath($doc);
echo $xpath->query('//fieldset[@class="userdata"]/input[5]')->item(0)->getAttribute("name");
$thetoken = $xpath->query('//fieldset[@class="userdata"]/input[5]')->item(0)->getAttribute("name");
и окончательная ошибка: Token Invalid.
я бы сделать это с помощью XPath, а затем preg_match .. но я думал, что может быть что-то я пропускаю, как прошу сервер для новый токен? или что-то ? html_headers? это для меня все ново, но почему у меня такое чувство, что отказ от данных - это не правильный ответ ... –
Вот почему я предложил использовать файлы cookie. Я предполагаю, что сайт создает два токена, хранит их в базах данных, сохраняет один в cookie, а другой предварительно заполняет html-форму. Только если они совпадают, они могут быть уверены, что это законный запрос. P.S .: Я думаю, вы можете смело игнорировать «возврат», это только целевой URL с кодировкой base64. – tillz
У меня уже был файл cookie/cookiejar, добавленный в curl .. кажется, мне действительно нужен токен, и нет, ваше решение не работает, а не из-за кода, я также пробовал это. Я не знаю, что проблема, но ответ всегда: недопустимый токен. –