Curl запостить данные

Тема в разделе "PHP программирование", создана пользователем nws, 14 окт 2009.

  1. nws

    nws Гость

    Всем привет.

    На этой странице: http://www.staples.com/Brother-TN-580-Tone.../product_612784
    есть форма для отправки зип кода

    Надо послать в нее зип м получить ответ

    Вот мой код:

    Код (Text):
        <?php

    $PostData = array(
    'zipCode' => '12345',
    'langId' => '-1',
    'storeId' => '10001',
    'URL'    => '/Brother-TN-580-Toner-Cartridge-High-Yield/product_612784',
    'errorUrl' => 'zipcode'
    );
    $ua = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)';
    $url = 'http://www.staples.com/Brother-TN-580-Toner-Cartridge-High-Yield/product_612784';
    $host = $_SERVER['DOCUMENT_ROOT'];

    if ( $curl = curl_init() )
    {
    curl_setopt($curl, CURLOPT_URL, 'http://www4.staples.com/eluminate?ci=90028341&st=1255528609146&vn1=4.0.23B&ec=ISO-8859-1&pi=zipcode&tid=8&ti=1255528737238&hr=javascript%3AformSub%28addZipCodeForm%29%3B');
    curl_setopt($curl, CURLOPT_COOKIE, 'CoreID6=30201255514912193294815;Path=/;Domain=www4.staples.com;expires=Mon, 13-Oct-24 13:08:16 GMT');
    curl_setopt($curl, CURLOPT_COOKIE, 'TestSess3=x;Path=/;Domain=www4.staples.com;expires=End Of Session');
    curl_setopt($curl, CURLOPT_COOKIE, '90028341_login=1255528626018461671490028341;Path=/;Domain=www4.staples.com;expires=End Of Session');
    curl_setopt($curl, CURLOPT_COOKIE, '90028341_reset=1255528626;Path=/;Domain=www4.staples.com;expires=End Of Session');

    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

    curl_exec($curl);
    curl_close($curl);
    } else {
    die('1 fails:' . curl_error($curl));
    }

    unset($curl);

    //get cookie for sent
    if ( $curl = curl_init($url) )
    {  
    curl_setopt($curl, CURLOPT_HEADER, 1);
    curl_setopt($curl, CURLOPT_NOBODY, 1);
    curl_setopt($curl, CURLOPT_USERAGENT, $ua);

    ob_start();

    curl_exec($curl);
    curl_close($curl);

    $headers = explode("\n", ob_get_contents());
    ob_end_clean();
    /* TO DO: if $headers == '' error */
    foreach ($headers as $key => $value)
    {
    if ( stripos($value, 'Set-Cookie:') !== FALSE )
    {
    list($field, $cookie[]) = explode(' ', $headers[$key]);
    }
    }

    //echo '<pre>';
    //print_r($headers);
    //print_r($cookie);

    /* TO DO: if $cookie == '' error */
    } else {
    die('2 fails:' . curl_error($curl));
    }

    unset($curl);

    if( $curl = curl_init($url) )
    {    
    curl_setopt($curl, CURLOPT_COOKIESESSION, TRUE);
    curl_setopt($curl, CURLOPT_COOKIEFILE, $host . 'cookiefile');

    // responce in variable not in flow
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);  
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);

    curl_setopt($curl,CURLOPT_ENCODING, 'gzip,deflate');
    curl_setopt($curl,CURLOPT_USERAGENT, $ua);

    if( $html = curl_exec($curl) )
    {
    curl_setopt($curl, CURLOPT_URL, 'http://www.staples.com/office/supplies/StaplesZipCodeAdd?');
    curl_setopt($curl, CURLOPT_POST, TRUE);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $PostData);

    for ($i=0; $i<sizeof($cookie); $i++)
    {
    curl_setopt($curl, CURLOPT_COOKIE, $cookie[$i]);
    }
    curl_setopt($curl, CURLOPT_COOKIE, $host . 'cookiefile');    
    }
    curl_close($curl);
    } else {
    die('3 fails:' . curl_error($curl));
    }

    unset ($curl);
    unset ($html);

    if ( $curl = curl_init() )
    {
    curl_setopt($curl, CURLOPT_URL, 'http://www.staples.com/Brother-TN-580-Toner-Cartridge-High-Yield/product_612784?errorUrl=zipcode&storeId=10001&zipCode=12345&jspStoreDir=Staples&langId=-1&ddkey=StaplesZipCodeAdd');
    for ($i=0; $i<sizeof($cookie); $i++)
    {
    curl_setopt($curl, CURLOPT_COOKIE, $cookie[$i]);
    }
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    $html = curl_exec($curl);
    curl_close($curl);
    } else {
    die('4 fails:' . curl_error($curl));
    }

    echo $html;

    ?>
    Результат сниффера:

    [​IMG]


    Что я делаю не так ?
     
  2. Artem325

    Artem325 Гость

    Во-первых, $PostData не должен быть массивом, а просто строкой формата "переменная1=значение&переменная2=значение" и т.д.
    Во-вторых, curl_setopt($curl, CURLOPT_COOKIE... это не команда на установку печенек, а отправка самих печенек, т.е. там должна быть строка вида "кука1=значение; кука2=значение" и т.д.
    Более детально рассмотреть пока нету времени, позже посмотрю.
    Будут вопросы, пишите. Я как раз тоже с курлом вожусь в последнее время.
     
  3. nws

    nws Гость

    проблема была в
    curl_setopt($curl, CURLOPT_COOKIE, 'key=value');
    без Path,Domain,expires
     
  4. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    Надо было без или с нимим?

    Добавлено: Один хрен н логинит(
     
  5. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    Уф. Вобщем код который выше - вариант 2004года который легко находится d гугле. В силу того, что пых много менялся.. Стоит переделать немного.. Хотя бы для того, что бы красивее было что ли.. Как-нить так.
    Код (PHP):
    $ch = curl_init("то_где_нас_логинят");

    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, 'User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Widows NT)');
    curl_setopt($ch, CURLOPT_REFERER, 'откуда_мы_типа_пришли');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_COOKIESESSION, TRUE);

    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, 'user_email=aa%40aa.aa&user_password=112233&redirect=%2F&submitted=1&ajax=false'); //Параметры которые передаются. У каждого свои.
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    $req = curl_exec($ch);
    $headers = explode("\n", $req); // Делаем массив из заголовоков ответа

    curl_setopt($ch,CURLOPT_URL,'то_куда_надо_зайти);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_NOBODY, 0);
    curl_setopt($ch, CURLOPT_POST, 0);

    $cookie = array();
    for ($i = 0; $i < count($headers); $i++) { //По всем его элементам
    if (strpos($headers[$i], '
    Set-Cookie:') !== FALSE) { // Если у тек-й элемент - это заголовок печенек
    $c = explode('
    ; ', substr($headers[$i], strlen('Set-Cookie:'))); // Обрезаем строку сет-куки и разбиваем в массив, разделитель не пробел, а "; " потому что в строке кук Expires тоже есть пробелы. И получается кривое разбиение.
    foreach ($c as $k=>$v) // По всем элементам получившегося массива
    {
    if (!empty($v) && ( // Если текущий элемент не пустой, и не один их не нужных заголовков, то добавляем его в массив с куками
    !strstr($v, '
    source') &&
    !strstr($v, '
    path') &&
    !strstr($v, '
    domain') &&
    !strstr($v, '
    expires'))) $cookie[]=$v;
    }

    }
    }
    curl_setopt($ch, CURLOPT_COOKIE, implode('
    ;',$cookie)); // Из массива снова делаем строку..
    $html=curl_exec($ch); //Тут мы залогинены.
    curl_close($ch);
    Ну вот как-то так. Можно еще оптимизировать.. Если кому не лень.
     
Загрузка...
Похожие Темы - Curl запостить данные
  1. sasha465
    Ответов:
    0
    Просмотров:
    3.555
  2. VadikV
    Ответов:
    4
    Просмотров:
    4.205
  3. vital
    Ответов:
    0
    Просмотров:
    1.580
  4. admin
    Ответов:
    1
    Просмотров:
    4.722

Поделиться этой страницей