91

Re: moonwalk

morphin пишет:

Привет, ребят.

Как можно проиграть *.m3u8 на стороне клиента не передавая сам файл.
Сделать что то типо ретрансляции ? И если это так. То как это реализовать на php?

Хоть поздно, но оотвечу.
Скрипт на PHP может работать не более того количество времени, которое указано в php.int в параметре max_execution_time.
Т.е. на чисто php ретрансляцию не реализовать. Плюс брать сервер нужно под это дело с таким тарифом, который выдержит по ширине потока, если таких ретрансляций будет одновременно много.

Sony Bravia KDL-32CX523

92

Re: moonwalk

Tiarait пишет:

я все равно не понимаю, то есть достаточно сделать post с параметрами?
но как бы не пытался ответ

"error_code": 100

правда делал через онлайн (web-sniffer и прочее)

Да, достаточно отослать правильный POST запрос.
Если параметры ОК и все нужные заголовки в HTTP присутствуют, то ответ будет нужный.
Вот через сниффер то и удобно посмотреть, чем наш неудачный запрос отличается от того, что делается на каком-нибудь сайте, типа hdserials.tv.

Sony Bravia KDL-32CX523
Спасибо сказали: Tiarait1

93

Re: moonwalk

WendyH пишет:

Да, достаточно отослать правильный POST запрос.
Если параметры ОК и все нужные заголовки в HTTP присутствуют, то ответ будет нужный.
Вот через сниффер то и удобно посмотреть, чем наш неудачный запрос отличается от того, что делается на каком-нибудь сайте, типа hdserials.tv.

и правда, не хватало только пары заголовков, X-Requested-With и X-Access-Level

94 (2017.10.01 08:06:07 отредактировано bond)

Re: moonwalk

ребята у кого получилось поправить скрипт на php поделитесь смотрел на гите так и не понял как сделать много поменялось  :( Спасибо

95

Re: moonwalk

и опять нужно переделывать парсер((

96

Re: moonwalk

к сожалению да вроде что то с заголовками запроса пока не разобрался  :(

97

Re: moonwalk

Уважаемые спецы!!!
В запросах часто повторяется параметр типа

c90b4ca500a12b91e2b54b2d4a1e4fb7=cc5610c93fa23befc2d244a76500ee6c

Кто-нибудь разбирался - что это и с чем его едят ?

С уважением,
matkin

С уважением,
matkin

98 (2017.10.08 18:56:28 отредактировано Tiarait)

Re: moonwalk

bond пишет:

к сожалению да вроде что то с заголовками запроса пока не разобрался  :(

они просто скрипт перенесли в отдельный файл, ну и чуть подправили его, собственно оказалось ничего сложного))

matkin пишет:

В запросах часто повторяется параметр типа

c90b4ca500a12b91e2b54b2d4a1e4fb7=cc5610c93fa23befc2d244a76500ee6c

Кто-нибудь разбирался - что это и с чем его едят ?

да, их нужно парсить с нового js файла, пример для java

//x params
            String x1 = js_data.html().split("mw_key:\"")[1].split("\",")[1].split(":\"")[0];
            String x2 = js_data.html().split("mw_key:\"")[1].split(":\"")[1].split("\"")[0];
            Log.d("post manifests", x1 + ":" + x2);

Вот мой рукожопый парсер под андроид на java
https://github.com/Tiarait/ColdFilm_cli … nwalk.java

99

Re: moonwalk

Сделал вам тоже не без извращений скрипт на PHP.
https://github.com/WendyH/PHP-Scripts/b … onwalk.php

Sony Bravia KDL-32CX523
Спасибо сказали: bond, lidars2

100

Re: moonwalk

Здравствуйте! Может не сюда пишу(заранее извиняюсь). Может кто объяснить как работать с getmovie.cc ? Вставить урл из кинопоиска в iframe я понял, а вот апи вставить на сайт как непонятно, куда скрипт плеера вставлять , какие id в него вставлять,почему не копируется в буфер код для вставки фильмов на сайт? есть вообще подобная инструкция что и как? а то пишу в поддержку сайта а там тишина полная! Буду признателен за помощь! ageofgods.ru сайт если кто может сделайте скрин куда вставить! извините за ссылку если нельзя тут) Спасибо.

101

Re: moonwalk

jimmy2009 пишет:

Здравствуйте! Может не сюда пишу(заранее извиняюсь). Может кто объяснить как работать с getmovie.cc ? Вставить урл из кинопоиска в iframe я понял, а вот апи вставить на сайт как непонятно, куда скрипт плеера вставлять , какие id в него вставлять,почему не копируется в буфер код для вставки фильмов на сайт? есть вообще подобная инструкция что и как? а то пишу в поддержку сайта а там тишина полная! Буду признателен за помощь! ageofgods.ru сайт если кто может сделайте скрин куда вставить! извините за ссылку если нельзя тут) Спасибо.

если не ошибаюсь то getmovie берет ту же базу с moonwalk, по крайней мере при парсинге iframe getmovie следующий iframe идет от moonwalk

102

Re: moonwalk

jimmy2009 пишет:

Здравствуйте! Может не сюда пишу(заранее извиняюсь). Может кто объяснить как работать с getmovie.cc ? Вставить урл из кинопоиска в iframe я понял, а вот апи вставить на сайт как непонятно, куда скрипт плеера вставлять , какие id в него вставлять,почему не копируется в буфер код для вставки фильмов на сайт? есть вообще подобная инструкция что и как? а то пишу в поддержку сайта а там тишина полная! Буду признателен за помощь! ageofgods.ru сайт если кто может сделайте скрин куда вставить! извините за ссылку если нельзя тут) Спасибо.

Там все предельно понятно. Там где вы хотите чтобы отображался плеер, вставляете этот код:

<div id="getmovieplayer"></div>

А скрипт подключаете там где у вас все скрипты:

<script type="text/javascript" src="//getmovie.cc/api/videos.js?token=тут_ваш_токен&k=тут_id_кинопоиска&w=607&h=360"></script>
+ Где брать Token и ID Kinopoisk?

Токен получаете здесь
https://i.imgur.com/8ZL2Ki7.png

ID Kinopoisk берете тут
https://i.imgur.com/G7l4Hpl.png
Где 666 - это ID фильма

103

Re: moonwalk

Ребята помогите с регуляркой слабо дружу как вытянуть серии из всех сезонов.Спасибо

+ открыть спойлер

<?php
// Входные параметры
$url  = isset($_REQUEST['url']) ? $_REQUEST['url' ] : "";
$dom = array(
           1 => '.biz',
           2 => '.top',
           3 => '.org',
           4 => '.co',
           5 => '.pw'
            );
$url = str_replace($dom,'.cc',$url);

$cookies = array();
$headers = "Accept-Encoding: gzip, deflate\r\n".
"Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n".
"Referer: ".$url."\r\n".
"User-Agent: Mozilla/5.0\r\n";
// Загружаем страницу iframe
$page = LoadPage($url, "GET", $headers);
//print_r($page);
$token = GetRegexValue($page, "#video_token:\s'([^']+)'#");
//print_r($token);
$token_serial = GetRegexValue($page, "#serial_token:\s'([^']+)'#");
//print_r($token_serial);
$sez = GetRegexValue($page, "#seasons:\s\[(.*)\]#");
//print_r($sez);
$sea = explode(',',$sez);//вытянул сезоны
//print_r($sea);
for ($j=0; $j<count($sea); $j++){
$page = LoadPage('http://moonwalk.cc/serial/'.$token_serial.'/iframe?season='.$sea[$j], "GET", $headers);
//print_r($page);
preg_match_all('#episodes:.*(\[\d+,(\d+),\d+\])+#is',$page,$epi);//cтупор как серии вытянуть
//print_r($epi);
$epiz = $epi[2];
unset($epiz[count($epiz) - 1]);
for ($i=0; $i<count($epiz); $i++){
//echo 'Серия: '. $epiz[$i].'<br />http://moonwalk.cc/video/'.$token.'/iframe?season='.$sea[$j].'&episode='.$epiz[$i].'<hr />';
echo '<br>http://moonwalk.cc/video/'.$token.'/iframe?season='.$sea[$j].'&episode='.$epiz[$i].'|'.'Ceзон '.$sea[$j]. ' серия '.$epiz[$i].'"';
//('<<< '):('')).'Ceзон '.$season_set.' ('.$episode_all[$i].' серия")';

}
}

///////////////////////////////////////////////////////////////////////////////
// Получение страницы с указанными методом и заголовками
function LoadPage($url, $method, $headers, $data='') {
    global $cookies;

    // Если есть кукисы - добавляем их значения в HTTP заголовки
    $coo = "";
    foreach($cookies as $key => $val) $coo .= $key."=".urlencode($val)."; ";
    if ($coo) $headers .= "Cookie: $coo\r\n";

    $options = array();
    $options['http'] = array('method' => $method ,
                             'header' => $headers,
                             'content'=> $data   );
    $context = stream_context_create($options);
    $page    = @file_get_contents($url, false, $context);
    // Перебираем HTTP заголовки ответа, чтобы установить кукис
    foreach($http_response_header as $c => $h) {
        if (stristr($h, 'content-encoding') and stristr($h, 'gzip')) {
            $page = @gzdecode($page);
        } else if (preg_match('#^Set-Cookie:\s*([^;]+)#', $h, $matches)) {
            parse_str($matches[1], $tmp);
            $cookies += $tmp;
        }
    }
    return $page;
}
////////////////////////////////////////////////////////////////////
// Функция получения значения по указанному регулярному выражению
function GetRegexValue($text, $pattern, $group=1) {
    if (preg_match($pattern, $text, $matches))
      return $matches[$group];
    return "";
}

/////////////////////////////////////////
?>

104 (2018.02.23 15:36:17 отредактировано WendyH)

Re: moonwalk

bond пишет:

Ребята помогите с регуляркой слабо дружу как вытянуть серии из всех сезонов.Спасибо

А можно и не регуляркой. Вот тут в скрипте я делал функцию JSDecode (последняя функция в скрипте), которая приводила выдранные данные о сериале к валидному json. И с такими преобразованными данными в массив удобней работать.
Т.е. сначала выдираем данные о сериале командой:
$data = GetRegexValue($page, "#VideoBalancer\((.*?)\);#is");

а потом превращаем их в ассоциативный массив (json_decode с подготовкой входных данных):
$options = JSDecode($data);

А там уже перебирать массивы можно.

Пример:

+ открыть спойлер
<?php
// Входные параметры
$url = isset($_REQUEST['url']) ? $_REQUEST['url' ] : "";  
//$url = "http://moonwalk.cc/serial/3fed8e1c46b14db0a398d392dff83b15/iframe";
$url = str_replace(array('.biz','.top','.org','.co','.pw'),'.cc',$url);

$cookies = array();
$headers = "Accept-Encoding: gzip, deflate\r\n".
           "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n".
           "Referer: ".$url."\r\n".
           "User-Agent: Mozilla/5.0\r\n";

// Загружаем страницу iframe
$page = LoadPage($url, "GET", $headers);
//print_r($page);

// Берём json данные о сериале
$data = GetRegexValue($page, "#VideoBalancer\((.*?)\);#is");
if (!$data) die("No VideoBalancer info in the loaded iframe.<br>".$page);
$options = JSDecode($data);

$token_serial = $options["serial_token"];
//print_r($token_serial);

//var_dump($options); 

foreach ($options["seasons"] as $season) {
    $pageSeason = LoadPage('http://moonwalk.cc/serial/'.$token_serial.'/iframe?season='.$season, "GET", $headers);

    // Берём json данные о сериале
    $data = GetRegexValue($pageSeason, "#VideoBalancer\((.*?)\);#is");
    $optionsSeason = JSDecode($data);
    
    foreach ($options["episodes"] as $episode) {
        echo '<br>http://moonwalk.cc/video/'.$token_serial.'/iframe?season='.$season.'&episode='.$episode.'|'.'Ceзон '.$season. ' серия '.$episode.'"';

    }
}




///////////////////////////////////////////////////////////////////////////////
// Получение страницы с указанными методом и заголовками
function LoadPage($url, $method, $headers, $data='') {
    global $cookies;

    // Если есть кукисы - добавляем их значения в HTTP заголовки
    $coo = "";
    foreach($cookies as $key => $val) $coo .= $key."=".urlencode($val)."; ";
    if ($coo) $headers .= "Cookie: $coo\r\n";

    $options = array();
    $options['http'] = array('method' => $method ,
                             'header' => $headers,
                             'content'=> $data   );
    $context = stream_context_create($options);
    $page    = file_get_contents($url, false, $context);
    // Перебираем HTTP заголовки ответа, чтобы установить кукис
    foreach($http_response_header as $c => $h) {
        if (stristr($h, 'content-encoding') and stristr($h, 'gzip')) {
            $page = gzdecode($page);
        } else if (preg_match('#^Set-Cookie:\s*([^;]+)#', $h, $matches)) {
            parse_str($matches[1], $tmp);
            $cookies += $tmp;
        }
    }
    return $page;
}

////////////////////////////////////////////////////////////////////
// Функция получения значения по указанному регулярному выражению
function GetRegexValue($text, $pattern, $group=1) {
    if (preg_match($pattern, $text, $matches))
        return $matches[$group];
    return "";
}

///////////////////////////////////////////////////////////////////////////////
// Функция получения массива из JS кода вместо json_decode
function JSDecode($data) {
    $data = str_replace("encodeURIComponent(", "", $data); // Убираем левые js команды
    $data = str_replace("'),", "',", $data);
    $data = str_replace("'", "\""  , $data); // Заменяем одинарные кавычки на экранированные обычные
    $data = str_replace(["\n","\r"], "", $data);                    // Убираем переносы строк
    $data = preg_replace('/([^\w"\.])(\w+)\s*:/','$1"$2":', $data); // Берём в кавычки имена
    $data = preg_replace('/("\w+")\s*:\s*([\w\.]+)/' ,'$1:"$2"', $data); // Берём в кавычки все значения
    $data = preg_replace('/(,\s*)(})/','$2', $data);                     // Убираем лишние пробелы
    $json = json_decode($data, true);
    return $json;
}
Sony Bravia KDL-32CX523
Спасибо сказали: bond, kliopa1002

105

Re: moonwalk

kliopa100 пишет:

маленькая очепяточка $token >> $token_serial ?
спасибо

Да, конечно же. Исправил в сообщении выше. Спс.

Sony Bravia KDL-32CX523
Спасибо сказали: kliopa1001

106

Re: moonwalk

Уважаемый WendyH опять что то сломалось в php скрипте не работает не могли бы вы поправить
смотрел здесь

+      if (sVal=="e._mw_adb") sVal="false";
       sPost += POSTDATA.Names[i] + "=" + sVal + "&";
     }
     // Get global variable
-    if (HmsRegExMatch2("window\\['(\\w+)'\\]\\s*=\\s*'(\\w+)'", sHtml, sVar, sVal))
-      if (HmsRegExMatch("\\w+\\.(\\w+)\\s*=\\s*\\w+\\[[\"']"+sVar, sJsData, sVar)) 
+    if (HmsRegExMatch2("window\\['(\\w+)'\\]\\s*=\\s*'(\\w+)'", sHtml, sVar, sVal)) {
+      if (HmsRegExMatch('n\\["(\\w+)"\\]\\s*=\\s*\\w+\\["'+sVar, sJsData, sVar)) 
         sPost += sVar + "=" + sVal;
+      if (HmsRegExMatch('n\\.(\\w+)\\s*=\\s*\\w+\\["'+sVar, sJsData, sVar)) 
+        sPost += sVar + "=" + sVal;
+    }

но так ничего и непонял как его перегнать в Ваш скрипт на php.Спасибо

107

Re: moonwalk

bond пишет:

Уважаемый WendyH опять что то сломалось в php скрипте не работает не могли бы вы поправить
смотрел здесь
...
но так ничего и непонял как его перегнать в Ваш скрипт на php.Спасибо

В PHP скрипте этот участок может выглядеть так:

// Get global variable
if (preg_match("#window\['(\w+)'\]\s*=\s*'(\w+)'#", $page, $m1)) {
  if (preg_match('#n\["(\w+)"\]\s*=\s*\w+\["'.$m1[1].'#', $jsData, $m2))
    $post .= $m2[1] . "=" . $m1[2];
  if (preg_match('#n\.(\w+)\s*=\s*\w+\["'.$m1[1].'#', $jsData, $m2))
    $post .= $m2[1] . "=" . $m1[2];
}
Sony Bravia KDL-32CX523
Спасибо сказали: bond1

108

Re: moonwalk

День добрый! Подскажите что за беда? Парсер выдает ошибку

+ открыть спойлер

Warning: file_get_contents(http://moonwalk.cc/video/bb1899fdea058f6c/index.m3u8?cd=0&expired=1522314695&mw_pid=2502&signature=b5b7863a07e9541f111830d1dd11faaf): failed to open stream: HTTP request failed! HTTP/1.1 403

срипт с гитхаба от уважаемого WendyH, и что характерно пару дней такая беда а потом может заработать. После опять уходит в ошибку.

109

Re: moonwalk

День добрый! Подскажите что за беда? Парсер выдает ошибку
Потому что moonwalk в запросе снова что то изменил  :(

110

Re: moonwalk

Доброго времени суток! У кого не работает парсер найдите участок в PHP скрипте и замените на этот

+ открыть спойлер
// Get global variable
if (preg_match("#window\['(\w+)'\]\s*=\s*'(\w+)'#", $page, $m1)) {
  if (preg_match('#e\["(\w+)"\]\s*=\s*\w+\["'.$m1[1].'#', $jsData, $m2))
    $post .= $m2[1] . "=" . $m1[2] . "&";
  if (preg_match('#e\.(\w+)\s*=\s*\w+\["'.$m1[1].'#', $jsData, $m2))
    $post .= $m2[1] . "=" . $m1[2] . "&";
}
if (preg_match('#getVideoManifests.*?e\.(\w+)\s*=\s*"(.*?)"#', $jsData, $m2))
  $post .= $m2[1] . "=" . $m2[2] . "&";

дальше найдите этот кусочек и замените

+ открыть спойлер
if ($link) {
    if ($urlonly) 
        $data = $link;
    else {
//        if      ($type=="m3u8") header("Content-Type: application/vnd.apple.mpegurl");
//        else if ($type=="f4m" ) header("Content-Type: application/xml");
$param = '795cf4c386d50e2a2f2d0ae70bfda2fd=ac80466e400db3b7429dcc6ee9575534&d7f3900a390f644d082c806772dadbb1=88315196ce303224f0e1d0ddc103448e';
        $data = LoadPage($link, "GET", $headers,$param);
        if ($attacha) {
            header("Content-Length: ".strlen($data));
            header("Content-Disposition: attachment; filename=play.$type");
        }
    }
} 
Отладка кода — это как охота. Только охота, на баги.
Спасибо сказали: foks50501

111

Re: moonwalk

spell пишет:

Доброго времени суток! У кого не работает парсер найдите участок в PHP скрипте и замените на этот

Спасибо огромное! Все заработало!  *THUMBSUP*

112 (2018.03.29 14:54:42 отредактировано foks5050)

Re: moonwalk

Блин поработало но не долго((( теперь выдает: POST parameters not found in loaded js. Похоже что то с регуляркой вот тут:

+ открыть спойлер

$data = GetRegexValue($jsData, "#var\s+\w+=(\{mw_key.*?\})#is");

113

Re: moonwalk

foks5050 пишет:

Блин поработало но не долго(((

Я видел,значения кода в js поменяли

Отладка кода — это как охота. Только охота, на баги.

114

Re: moonwalk

spell пишет:

Я видел,значения кода в js поменяли

Задолбали((( А как поправить?

115

Re: moonwalk

Эти гады не просто код поменяли, а причем капитально так поменяли, а не косметически как последнее время.

116

Re: moonwalk

Теперь функция в самом javascript выглядит так:

            getVideoManifests: function() {
                var e = "617adae21a8aedc4e13938619b62f4ecdd3b947cd64620569df257d333e4f11d", // значение ключа шифрования
                    t = { // Данные, которые будут шифроваться. Вместо переменных нужно подставить их реальные значения.
                        a: this.options.partner_id,
                        b: this.options.domain_id,
                        c: window._mw_adb,
                        d: window["7268338cb2fefca17ebbd2be216fd1de"],
                        e: this.options.video_token,
                        f: navigator.userAgent
                    },
                    n = "c46b534f9def34b0f2040a503d978eed", // значение инициализирующего вектора iv для шифрования
                    r = JSON.stringify(t), // преобрпзования объекта в строковое представление JSON
                    i = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(r), CryptoJS.enc.Hex.parse(e), { // Непосредственное шифрование методом AES 256 CBC PKCS7 Padding
                        iv: CryptoJS.enc.Hex.parse(n)
                    }),
                    o = $.ajax({
                        url: "/vs", // теперь путь запроса стал коротким: http://moonwalk.cc/vs
                        type: "post",
                        data: {
                            q: i.toString() // передаётся единственный параметр с шифрованным значением JSON представления параметров t (и не забыть сделать urlencode)
                        },
                        dataType: "json"
                    });
                o.done(_.bind(this.onGetManifestSuccess, this)), o.fail(_.bind(this.onGetManifestError, this))
            },

Ответ тоже изменился. Теперь в JSON данных ссылка на m3u8 плейлист и может быть ссылка на json данные, которые содержат ссылки на mp4 файлы разного качества.

В принципе, ничего сложного. Дольше разбирался, почему у меня шифрованные данные немного короче получались и их конец немного отличался.
Всё дело в Padding - дополнение длины данных до 16-ти кратного размера методом PKCS7.

На PHP функция шифрования выглядит так, если установлено PHP расширение openssl:

$crypted = openssl_encrypt($data4Encrypt, 'AES-256-CBC', hex2bin($key), 0, hex2bin($iv));

В случае использовании функции openssl_encrypt - дополнение будет делаться автоматически. Если использовать mcrypt_encrypt (должен быть установлен модуль mcrypt), то нужно заботиться об этом самим:

function aes256_cbc_encrypt($data, $key, $iv) {
  $padding = 16 - (strlen($data) % 16);
  $data .= str_repeat(chr($padding), $padding);
  return mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CBC, $iv);
}

Функцию hex2bin используется только если (как в нашем случае) в $key и $iv шестнадцатиричное строковое представление значений.
В $data4Encrypt должно быть что-то вроде:

{"a":4787,"b":445219,"c":true,"d":"8156109e46b295466542f3587f35f0fe","e":"491a79f12da8d2fa","f":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}

В $iv: c46b534f9def34b0f2040a503d978eed
В $key: 617adae21a8aedc4e13938619b62f4ecdd3b947cd64620569df257d333e4f11d
После шифрования с этими значениями должны получиться данные:

TaceW9SHQD4kcvcEcGkKH4VNqX6ass2AalGk0S9hG5F9QoAViXV51KksyWXdSPqr2DNEKzVmkeDfK8Wh0W6LJIO4ZGUo2UNIUhJtPwLndK4VwBJsdVLPmTepIo4Lkagq7XY87AhYl1faWh1eQZGdr27ZRy55916dbj9SQR5tF9axNNUZcZ/PpMyXdQLtLOkZOYLjz9XDWpBWQuED1kw7rBDqz6+0Ao2DBok1h1p17tubM2+CvEsHAw27xV6SXpcQbQnL6Ug5Gx0rPZSADIfZfNpdwufVFv6963rO8z4MK5I=

Это для проверки правильности работы реализуемой функции, если кто будет писать.

Sony Bravia KDL-32CX523
Спасибо сказали: tantal, KoBa4, bond, lidars, matkin5

117

Re: moonwalk

Чудеса да и только! Старый код заработал  *PARDON*

118

Re: moonwalk

foks5050 пишет:

Чудеса да и только! Старый код заработал  *PARDON*

Как это определили?

Sony Bravia KDL-32CX523

119 (2018.03.30 12:26:35 отредактировано foks5050)

Re: moonwalk

WendyH пишет:

Как это определили?

http://smartportaltv.ru/20/4.php?url=ht … 84c/iframe

в скрипте ваш код с гитхаба

120

Re: moonwalk

foks5050 пишет:

в скрипте ваш код с гитхаба

Вот этот штоле https://github.com/WendyH/PHP-Scripts/b … onwalk.php? Старым его нельзя назвать. 12 часов отроду.

Sony Bravia KDL-32CX523
Спасибо сказали: foks50501