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

AnrDaemon

Продвинутый новичок
Теоретически сделать можно что угодно. Практически - пиши владельцам сайта и задавай им все вопросы.
 

fixxxer

К.О.
Партнер клуба
А что, ты попробовал запустить тот код на python и он у тебя заработал?
 

WMix

герр M:)ller
Партнер клуба
там проверка через js происходит, нужен node и эмуляция dom
 

fixxxer

К.О.
Партнер клуба
там проверка через js происходит, нужен node и эмуляция dom
Не надо, исходники-то посмотри, там банальщина, curl-ом все можно сделать

UPD: а, там eval. Но там любой js-интерпретатор подойдет простейший уровня ES3, DOM не нужен.

https://github.com/codemanki/cloudscraper

Проверять, работает ли это, я, конечно, не буду.
Ладно, уговорили.

PHP:
» npm i cloudscraper

» node
> require('cloudscraper').get('https://yobit.net/api/3/ticker/ltc_btc-nmc_btc', (e, _, r) => console.log(r));

'{"ltc_btc":{"high":0.01834518,"low":0.0174,"avg":0.01787259,"vol":225.36849955,"vol_cur":12508.46814668,"last":0.01786,"buy":0.01785445,"sell":0.01786000,"updated":1517871682},"nmc_btc":{"high":0.00039999,"low":0.00028802,"avg":0.000344,"vol":0.11146779,"vol_cur":329.26721858,"last":0.00031753,"buy":0.00028802,"sell":0.00032054,"updated":1517871610}}'
 
Последнее редактирование:

ilya12345

Новичок
А что, ты попробовал запустить тот код на python и он у тебя заработал?
Код:
$url = 'https://yobit.net/api/3/ticker/ltc_btc-nmc_btc';
 
$ch  = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL => $url,
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_FOLLOWLOCATION => 1,
    CURLOPT_USERAGENT => '',
    CURLOPT_COOKIEJAR => ''
]);
$html = curl_exec($ch);
 
 
if (strstr($html, "DDoS protection by CloudFlare")) {
    curl_setopt_array($ch, [
        CURLOPT_URL => get_jschl($html, $url),
        CURLOPT_REFERER => $url
    ]);
    $html = curl_exec($ch);
}
 
echo $html;
 
 
 
function get_jschl($html, $url)
{
    // get var name
    // var s,t,o,p,b,r,e,a,k,i,n,g,f, ZKlZkGE={"TRNDyY":+((!+[]+!![]+!![]+[])+(!+[]+!![]+!![]))};
    preg_match('~var \S+\s+(\w+)=\{"(\w+)":([^}]+)\}~', $html, $match);
 
    $answer  = calc($match[3]);
 
    $pattern = sprintf('~%s\.%s([-+*])=([^;]+)~', $match[1], $match[2]);
 
    preg_match_all($pattern, $html, $matches, PREG_SET_ORDER);
 
    foreach ($matches as $m) {
        switch ($m[1]) {
            case '-' : $answer -= calc($m[2]); break;
            case '+' : $answer += calc($m[2]); break;
            case '*' : $answer *= calc($m[2]); break;
        }
    }
 
    $m = parse_url($url);
 
    preg_match_all('~<input type="hidden" name="([^"]+)" value="([^"]+)~', $html, $matches);
 
    $data = array_combine($matches[1], $matches[2]);
    $data['jschl_answer'] = $answer + strlen($m['host']);
 
    sleep(4);
 
    return sprintf('%s://%s/cdn-cgi/l/chk_jschl?%s', $m['scheme'], $m['host'], http_build_query($data));
}
 
 
function calc($expr)
{
    $result = '';
 
    preg_match_all('~\([^()]+\)~', "($expr)", $matches);
 
    foreach ($matches[0] as $v) {
        $result .= substr_count($v, '!+') + substr_count($v, '!![]');
    }
 
    return $result;
}
 

ilya12345

Новичок
Не надо, исходники-то посмотри, там банальщина, curl-ом все можно сделать

UPD: а, там eval. Но там любой js-интерпретатор подойдет простейший уровня ES3, DOM не нужен.



Ладно, уговорили.

PHP:
» npm i cloudscraper

» node
> require('cloudscraper').get('https://yobit.net/api/3/ticker/ltc_btc-nmc_btc', (e, _, r) => console.log(r));

'{"ltc_btc":{"high":0.01834518,"low":0.0174,"avg":0.01787259,"vol":225.36849955,"vol_cur":12508.46814668,"last":0.01786,"buy":0.01785445,"sell":0.01786000,"updated":1517871682},"nmc_btc":{"high":0.00039999,"low":0.00028802,"avg":0.000344,"vol":0.11146779,"vol_cur":329.26721858,"last":0.00031753,"buy":0.00028802,"sell":0.00032054,"updated":1517871610}}'
Спасибо и за твой вариант!
 

ilya12345

Новичок
Никак, там клоудфакинг на входе.
курлом все таки получилось!!! Нужно было только заголовки с куками добавить

Код:
$cookie='cookie.txt';
$url = 'https://yobit.net/api/3/ticker/ltc_btc-nmc_btc';
 
$ch  = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL => $url,
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_FOLLOWLOCATION => 1,
    CURLOPT_USERAGENT => '',
    CURLOPT_COOKIEJAR => $cookie,
    CURLOPT_COOKIEFILE=> $cookie,
    CURLOPT_COOKIESESSION=> true,
]);
$html = curl_exec($ch);
 
echo $html;
 

fixxxer

К.О.
Партнер клуба
// get var name
// var s,t,o,p,b,r,e,a,k,i,n,g,f, ZKlZkGE={"TRNDyY":+((!+[]+!![]+!![]+[])+(!+[]+!![]+!![]))};
preg_match('~var \S+\s+(\w+)=\{"(\w+)":([^}]+)\}~', $html, $match);

$answer = calc($match[3]);
Хехе.
Хитро, конечно!
Но боюсь, что это short term solution и этот код там постоянно меняется.
Для надежности я бы втащил какой-нить js интерпретатор.
Можно v8 или rhino втащить. А вообще вот такое гуглится - https://github.com/hiltonjanfield/js4php5 - фиг знает, насколько оно работоспособное, но с такой то ерундой должно справиться.
 
Сверху