Странное поведение Curl

Тема в разделе "Как сделать...", создана пользователем Q_BASIC, 18 июл 2015.

  1. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    352
    Симпатии:
    223
    Приветствую,

    Весь день с этой ошибкой сижу, всё не могу понять почему так выходит.

    Делаю автоматическое добавление сайтов в CloudFlare.

    Получаем записи домена так:
    PHP:
    $records $this->request('api/v4/zones/'.$content['result']['id'].'/dns_records?page=1&per_page=100&order=type&direction=asc', array(), false$headers);
    $records json_decode($recordstrue);

    if(
    $records['success']===false)
    {
        return 
    'Ошибка при получении данных домена';
    }
    Функция request:
    PHP:
    public function request($url$data=array(), $return_headers=false$send_headers=array(), $method=false$referer=false)
        {
            
    $cookie_path FCPATH.'application/cache/cookie.dat';

            if(!
    $cookie config_item('cf_cookie') or config_item('cf_cookie')==='')
                
    $cookie file_get_contents($cookie_path);
          
            
    $curl curl_init();
            
    curl_setopt($curlCURLOPT_URL'https://www.cloudflare.com/'.$url);
            
    curl_setopt($curlCURLOPT_RETURNTRANSFERtrue);
            
    curl_setopt($curlCURLOPT_HEADERtrue);
            
    curl_setopt($curlCURLOPT_COOKIE$cookie);
            
    curl_setopt($curlCURLOPT_HTTPHEADER$send_headers);
            
    curl_setopt($curlCURLINFO_HEADER_OUTtrue);
            
    curl_setopt($curlCURLOPT_USERAGENTself::$useragent);
          
            if(
    $method)
            {
                
    curl_setopt($curlCURLOPT_CUSTOMREQUEST$method);
            }
          
            if(
    $referer)
            {
                
    curl_setopt($curlCURLOPT_REFERER$referer);
            }
          
            if(
    sizeof($data))
            {
                
    curl_setopt($curlCURLOPT_POSTtrue);
                
    curl_setopt($curlCURLOPT_POSTFIELDShttp_build_query($data));
            }
          
            
    $out curl_exec($curl);
            
    $info curl_getinfo($curl);

          
            
    $return = array();
            
    $return['h'] = substr($out0$info['header_size']);
            
    $return['b'] = substr($out$info['header_size']);
            
    $return['i'] = $info;
          
            
    curl_close($curl);
          
          
            
    preg_match_all("/Set-Cookie: (.*?)=(.*?);/i",$return['h'],$out_cookie);
          
            
    $cookie='';
            foreach (
    $out_cookie[1] as $key => $value) {
                
    $cookie .= $value.'='.$out_cookie[2][$key].';';
            };
          
            
    set_config('cf_cookie'$cookie);
            
    file_put_contents($cookie_path$cookie);
            
    $this->log("URL: https://www.cloudflare.com/{$url};\nRequest headers:\n{$return['i']['request_header']};\n\nReferer: {$referer};\n\nResponse headers:\n{$return['h']};\n\nResponse body:\n{$return['b']};");
          
            if(
    $return_headers) return $return;
                    else return 
    $return['b'];
        }
    Тут последним параметром указываем $referer и если он есть, то передаем курлу, а так же записываем в лог всё это. И реферер тоже отдельно записываем в лог.

    Смотрим лог:
    Код:
    2015-07-18 21-09-03 - URL: https://www.cloudflare.com/api/v4/zones/912ebb6a697ac6523653854c34b61f64/dns_records?page=1&per_page=100&order=type&direction=asc;
    Request headers:
    GET /api/v4/zones/912ebb6a697ac6533653854c34b31f64/dns_records?page=1&per_page=100&order=type&direction=asc HTTP/1.1
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36
    Host: www.cloudflare.com
    Accept: */*
    Cookie: vses2=7guo955gbdk0v986aq5min8c93;__cf_effload=1;
    Referer: https://www.cloudflare.com/a/setup/site.ru/step/2
    X-ATOK: 1437329340-da25eee3ed4d5443eb3b
    X-NewRelic-ID: XOUOVMNRGwcJVlRQBAA=
    X-Requested-With: XMLHttpRequest
    
    ;
    
    Referer: ;
    
    Response headers:
    HTTP/1.1 403 Forbidden
    Server: cloudflare-nginx
    Date: Sat, 18 Jul 2015 18:09:03 GMT
    Content-Type: application/json
    Transfer-Encoding: chunked
    Connection: keep-alive
    Set-Cookie: __cfduid=de464e74528e5d12cfcba35a94cc85ae21437342942; expires=Sun, 17-Jul-16 18:09:02 GMT; path=/; domain=.cloudflare.com; HttpOnly
    Expires: Sun, 25 Jan 1981 05:00:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    X-NewRelic-App-Data: PxQPUl9WCgETUFhQAgMEV0YdFGQHBDcQUQxLA1tMXV1dORYiRBJHDQlqGCYjNxhvHx4ODFJCa0leWFJvTQINEW8QXQFXSlBBEUkJTwFRA1JUGgdPVlMAAQdITFMbEwcEBQEHA1ZeW1QFUQ5VAVwWHlUEVRJUPA==
    Strict-Transport-Security: max-age=31536000
    X-Content-Type-Options: nosniff
    CF-RAY: 208022a5ba1015cb-FRA
    
    ;
    
    Response body:
    {"success":false,"errors":[{"code":9303,"message":"Invalid Action Token"}],"messages":[],"result":null};
    
    [---[END]---]
    В отправленных заголовках вроде как есть реферер, но в отдельном поле, где для реферера место выделено пусто!

    И ошибка пришла от CF: Invalid Action Token, а она, на сколько я знаю, приходит когда реферер не тот или его вообще нет.

    Что с реферером?
     
  2. wwwxakep

    wwwxakep Создатель

    Регистр.:
    4 фев 2007
    Сообщения:
    28
    Симпатии:
    8
    Какие заголовки уходят в переменной $headers в функцию request? Вероятно реферер описан там, иначе ему неоткуда появиться. CURLOPT_AUTOREFERER не включен и не может повлиять.
    Почему в данной конструкции он не фигурирует в отдельном логе - потому что переменная $referer = false при переводе в строку будет пустой строкой. true перевелся бы в единицу.