За последние 24 часа нас посетили 17739 программистов и 1641 робот. Сейчас ищут 2358 программистов ...

как вытащить json с другого сайта?

Тема в разделе "PHP для профи", создана пользователем Ilyamaksimov, 5 фев 2018.

  1. Ilyamaksimov

    Ilyamaksimov Новичок

    С нами с:
    6 сен 2017
    Сообщения:
    26
    Симпатии:
    3
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Думаю можно написать в тех поддержку биржи, сказать что cloudflare блокирует твои запросы к API
     
  3. Emilien

    Emilien Активный пользователь

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    Можно нагуглить что-нибудь готовое по cloudflare bypass или наколхозить самому.
    PHP:
    1. $url = 'https://yobit.net/api/3/ticker/ltc_btc-nmc_btc';
    2.  
    3. $ch  = curl_init();
    4.     CURLOPT_URL => $url,
    5.     CURLOPT_RETURNTRANSFER => 1,
    6.     CURLOPT_FOLLOWLOCATION => 1,
    7.     CURLOPT_USERAGENT => '',
    8.     CURLOPT_COOKIEJAR => ''
    9. ]);
    10. $html = curl_exec($ch);
    11.  
    12.  
    13. if (!strstr($html, "DDoS protection by CloudFlare")) {
    14.     curl_setopt_array($ch, [
    15.         CURLOPT_URL => get_jschl($html, $url),
    16.         CURLOPT_REFERER => $url
    17.     ]);
    18.     $html = curl_exec($ch);
    19. }
    20.  
    21. echo $html;
    22.  
    23.  
    24.  
    25. function get_jschl($html, $url)
    26. {
    27.     // get var name
    28.     // var s,t,o,p,b,r,e,a,k,i,n,g,f, ZKlZkGE={"TRNDyY":+((!+[]+!![]+!![]+[])+(!+[]+!![]+!![]))};
    29.     preg_match('~var \S+\s+(\w+)=\{"(\w+)":([^}]+)\}~', $html, $match);
    30.    
    31.     $answer  = calc($match[3]);
    32.    
    33.     $pattern = sprintf('~%s\.%s([-+*])=([^;]+)~', $match[1], $match[2]);
    34.    
    35.     preg_match_all($pattern, $html, $matches, PREG_SET_ORDER);
    36.  
    37.     foreach ($matches as $m) {
    38.         switch ($m[1]) {
    39.             case '-' : $answer -= calc($m[2]); break;
    40.             case '+' : $answer += calc($m[2]); break;
    41.             case '*' : $answer *= calc($m[2]); break;
    42.         }
    43.     }
    44.    
    45.     $m = parse_url($url);
    46.    
    47.     preg_match_all('~<input type="hidden" name="([^"]+)" value="([^"]+)~', $html, $matches);
    48.    
    49.     $data = array_combine($matches[1], $matches[2]);
    50.     $data['jschl_answer'] = $answer + strlen($m['host']);
    51.    
    52.     sleep(4);
    53.    
    54.     return sprintf('%s://%s/cdn-cgi/l/chk_jschl?%s', $m['scheme'], $m['host'], http_build_query($data));
    55. }
    56.  
    57.  
    58. function calc($expr)
    59. {
    60.     $result = '';
    61.    
    62.     preg_match_all('~\([^()]+\)~', "($expr)", $matches);
    63.    
    64.     foreach ($matches[0] as $v) {
    65.         $result .= substr_count($v, '!+') + substr_count($v, '!![]');
    66.     }
    67.    
    68.     return $result;
    69. }
     
  4. Emilien

    Emilien Активный пользователь

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    Чет там намудрил. Поменять нужно if (!strstr($html, "DDoS protection by Cloudflare") на if (stristr($html, "DDoS protection by Cloudflare")
     
  5. Ilyamaksimov

    Ilyamaksimov Новичок

    С нами с:
    6 сен 2017
    Сообщения:
    26
    Симпатии:
    3
    Дружище ты крут:cool:!!!

    Мне стыдно, но я вообще не понял что делает в функции get_jschl().
    Если сможешь скинь ссылку на ресурс где разбирается этот код?

    еще раз большое спасибо!
     
  6. Ilyamaksimov

    Ilyamaksimov Новичок

    С нами с:
    6 сен 2017
    Сообщения:
    26
    Симпатии:
    3
    смотри у меня вот так еще получилось
    Код (Text):
    1.  
    2.  
    3. $cookie='cookie.txt';
    4. $url = 'https://yobit.net/api/3/ticker/ltc_btc-nmc_btc';
    5.  
    6. $ch  = curl_init();
    7. curl_setopt_array($ch, [
    8.     CURLOPT_URL => $url,
    9.     CURLOPT_RETURNTRANSFER => 1,
    10.     CURLOPT_FOLLOWLOCATION => 1,
    11.     CURLOPT_USERAGENT => '',
    12.     CURLOPT_COOKIEJAR => $cookie,
    13.     CURLOPT_COOKIEFILE=> $cookie,
    14.     CURLOPT_COOKIESESSION=> true,
    15. ]);
    16. $html = curl_exec($ch);
    17.  
    18. echo $html;
    Создал файл в который записываю куки, дальше из этого файла вставляю куки в заголовок и разрешаю сессионные куки

    короче вот эти строчки исправили ситуацию
    Код (Text):
    1. CURLOPT_COOKIEJAR => $cookie,
    2.     CURLOPT_COOKIEFILE=> $cookie,
    3.     CURLOPT_COOKIESESSION=> true,
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    [offtop]
    Йобит - скам!
    [/offtop]
     
  8. Ilyamaksimov

    Ilyamaksimov Новичок

    С нами с:
    6 сен 2017
    Сообщения:
    26
    Симпатии:
    3
    Да пофиг, мне интересно было разобраться в теме, а какой сайт- это не важно! :)
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    У Эксмы API приятнее. Без закидонов и тормозов. Еще б им саппорт вменяемый, вообще была бы красота.