2014-09-27 3 views
0

Решил проблему .. никогда не используйте 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.

ответ

0

Вам нужно будет выполнить несколько запросов. Этот код загрузит сайт первый, разобрать значения вам нужно, и записать их на почту массив .:

$in=file_get_contents('http://www.v-tac.ro'); 
$re = '/<input type=\\"hidden\\" name=\\"return\\" value=\\"([\\w=]*)\\" \\/>.*?<input type=\\"hidden\\" name=\\"(\\w*)\\" value=\\"1\\" \\/>/s'; 
preg_match($re, $in, $out); 
$post_data['return'] = $out[1]; 
$post_data[$out[2]]  = "1"; 
var_dump($post_data); 

Если это не сработает, попробуйте заменить file_get_contents с завиток-загрузки, сохраняя куки (также см this question)

PS: Не стесняйтесь все комментировать более простой РегВыр

+0

я бы сделать это с помощью XPath, а затем preg_match .. но я думал, что может быть что-то я пропускаю, как прошу сервер для новый токен? или что-то ? html_headers? это для меня все ново, но почему у меня такое чувство, что отказ от данных - это не правильный ответ ... –

+0

Вот почему я предложил использовать файлы cookie. Я предполагаю, что сайт создает два токена, хранит их в базах данных, сохраняет один в cookie, а другой предварительно заполняет html-форму. Только если они совпадают, они могут быть уверены, что это законный запрос. P.S .: Я думаю, вы можете смело игнорировать «возврат», это только целевой URL с кодировкой base64. – tillz

+0

У меня уже был файл cookie/cookiejar, добавленный в curl .. кажется, мне действительно нужен токен, и нет, ваше решение не работает, а не из-за кода, я также пробовал это. Я не знаю, что проблема, но ответ всегда: недопустимый токен. –

Смежные вопросы