curl+cookie

Тема в разделе "PHP Pro", создана пользователем lena berkova, 26 авг 2009.

Статус темы:
Закрыта.
  1. lena berkova

    lena berkova

    Регистр.:
    14 янв 2009
    Сообщения:
    441
    Симпатии:
    19
    после долгого гугления хочу спросить- можно ли работать с куками в курле через переменную? во всех примерах используется файл.
    или это фича курла?
     
  2. omfg

    omfg

    Регистр.:
    4 авг 2009
    Сообщения:
    159
    Симпатии:
    46
    Судя по мануалу http://ru.php.net/manual/en/function.curl-setopt.php нельзя, хотя может я не нашел, посмотри.
    Я думаю крайне важно чтобы куки сохранялись именно в файл, потому что скрипт может работать несколько раз.
     
  3. saifu

    saifu

    Регистр.:
    13 фев 2008
    Сообщения:
    337
    Симпатии:
    38
    Почему нельзя то?:D
    Вот кусок рабочего кода - соответственно переменная $cookies11[$i] в дальнейшем используется

    PHP:
    $ch curl_init("http://www.yahoo.com");
        
    curl_setopt($chCURLOPT_HEADER1);
        
    curl_setopt($chCURLOPT_USERAGENT'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)');
        
    curl_setopt($chCURLOPT_REFERER'http://www.google.com');
        
    curl_setopt($chCURLOPT_TIMEOUT10);
        
    //curl_setopt($ch, CURLOPT_PROXY, $proxy[$i]);
        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
    $res1[$i] = curl_exec($ch);
        
    curl_close ($ch);

    preg_match('|Cookie:(.*);|U'$res1[$i],$mat);
    $cookies11[$i]=$mat[0];
     
    lena berkova нравится это.
  4. lungsmoney

    lungsmoney Постоялец

    Регистр.:
    25 апр 2008
    Сообщения:
    81
    Симпатии:
    23
    еще неплохо бы переменную $cookies через implode() пропустить
     
  5. pori

    pori Постоялец

    Регистр.:
    30 авг 2009
    Сообщения:
    114
    Симпатии:
    18
    Я тоже поначалу парсил куки из заголовка. Но, как оказалось, это в корне неверно.

    Это не будет работать, если, допустим, вы отсылаете запрос сайту, он ставит вам куки и перенаправляет вас на другую страницу (напимер, 302ым или 301ым редиректом). В это случае куки никуда не запишутся до того, как мы не перейдем на конечный сайт. Ну и собсно нифига работать не будет. Можете увидеть это на примере регистрации/логина на gmail.com.

    Поэтому, если вы хотите хранить куки в переменной, то вам нужно выставить:

    PHP:
    curl_setopt($chCURLOPT_FOLLOWLOCATIONfalse);
    и самим реализовать редирект.

    Кстати, в кодах выше не забудьте

    PHP:
    curl_setopt($chCURLOPT_COOKIE$cookies);
    а то толку будет мало ;)
     
  6. lungsmoney

    lungsmoney Постоялец

    Регистр.:
    25 апр 2008
    Сообщения:
    81
    Симпатии:
    23
    Почему не верно?
    Работает все даже в гмаил. Редирект тут не причем.
    Не нужно FOLLOWLOCATION, false
    Хотя конечно проще делать так:
    PHP:
    curl_setopt($cUrlCURLOPT_COOKIEJAR"cookie.txt");
    curl_setopt($cUrlCURLOPT_COOKIEFILE"cookie.txt");
     
  7. ZCFD

    ZCFD

    Регистр.:
    16 янв 2008
    Сообщения:
    989
    Симпатии:
    437
    вообще-то куки отправляются вместе с http запросом в заголовках

    Если хочется работать с ними не через файл -- смотри
    CURLOPT_COOKIE -- сюда в строку загоняются куки
    или
     
  8. potuga

    potuga

    Регистр.:
    22 сен 2009
    Сообщения:
    376
    Симпатии:
    91
    А вы проверяли? Я проверил - все как pori написал. Не пишутся куки по-нормальному при curl'овском редиректе, это даже логично. Если у вас все работает, то приведите код авторизации на gmail (или любого другого сайта с аналогичной авторизацией).


    Это уже было написано выше. Дело не в том, чтобы их запихнуть в заголовки, а скорее в том, что их нужно еще и самому из заголовков распарсить.
     
  9. ZCFD

    ZCFD

    Регистр.:
    16 янв 2008
    Сообщения:
    989
    Симпатии:
    437
    и в чем проблема с парсингом ?
    уже посоветовали CURLOPT_HEADER в 1 установить
     
  10. potuga

    potuga

    Регистр.:
    22 сен 2009
    Сообщения:
    376
    Симпатии:
    91
    Хм... Вы не поняли... Попробую объяснить на пальцах. Вот смотрите:

    Есть сайт с авторизацией. Авторизация проходит так:

    1. юзер заходит на url1 и вбивает логин/пароль
    2. происходит отправка формы с передачей информации по авторизации на url2
    3. на url2 ставятся куки и происходит редирект на url3 с помощью Location в заголовке
    4. на url3 обрабатываются куки полученные ранее

    Так вот, если в курле стоит

    PHP:
    curl_setopt($chCURLOPT_FOLLOWLOCATIONtrue);
    то сохранить в переменную куки не получится, так как курл выдаст уже конечную страницу url3 вместе с заголовками url2, а не промежуточные заголовки страницы url2 с нужными нам куками.

    Поэтому придется куки парсить и заного отрпавлять запрос на url3 вручную.

    Теперь, надеюсь, понятно объяснил?

    PS: такая авторизация на gmail'е
     
Статус темы:
Закрыта.