Stream de Fembed 🎦 PHP grátis (Proxy)

  • Autor Autor zcriptz
  • Data de início Data de início
Este tópico foi traduzido automaticamente do espanhol. Ver original
zcriptz

zcriptz

1
Xi
Programador
Verificación en dos pasos activada
Suscripción a IA
PHP:
<?php
error_reporting(0);

$fembedUrl = $_GET['url'];
$partSize = 3; //MB
$personalKey = 'sBBcAcKK123';  //Una clave para el token, la que quieran...

class xURL{
    public function __construct($cookies=NULL, $agent=NULL, $proxy=NULL){
        $this->resources = [];
        $this->SETOPT = array(
            'RETURNTRANSFER' => 1,
            'FOLLOWLOCATION' => 1,
            'SSL_VERIFYHOST' => 0,
            'SSL_VERIFYPEER' => 0,
            'CUSTOMREQUEST'  => 'GET',
        );
        $this->proxy = $proxy;
        if($cookies){
            $this->SETOPT['COOKIEJAR'] = $cookies;
            $this->SETOPT['COOKIEFILE'] = $cookies;
        }
        $this->SETOPT['USERAGENT'] = $agent;
    }

    public function cURLOPT($c=''){
        if(!$c) $c = $this->lastResource;
        curl_setopt_array($c, array_combine(array_map(function($k){ return constant('CURLOPT_'.$k); }, array_keys($this->SETOPT)), $this->SETOPT));
        return $this;
    }

    public function cURL($o=''){
        $this->lastResource = curl_init();
        if(!$this->firstResource) $this->firstResource = $this->lastResource;
        if($this->proxy){
            $proxyData = array_flip(explode('@', $this->proxy));
            $this->SETOPT['PROXY'] = $proxyData[0];
            if($pD[1]) $this->SETOPT['PROXYUSERPWD'] = $proxyData[1];
            if($this->URL) $this->SETOPT['URL'] = $this->URL;
            if(!$this->SETOPT['PROXYTYPE']) $this->SETOPT['PROXYTYPE'] = 'HTTP';
        }
        if($o) $this->ADDOPT($o);
        if(@$this->httpHeaders) curl_setopt($c, CURLOPT_HTTPHEADER, $this->httpHeaders);
        $this->resources[] = $this->lastResource;
        return $this;
    }

    public function browse($URL=NULL, $ref=NULL, $post=NULL){
        if($URL) $this->SETOPT['URL'] = $URL;
        if($ref) $this->SETOPT['REFERER'] = $ref;
        if($this->SETOPT['POSTFIELDS'] || $this->SETOPT['POSTFIELDS'] = $post){
            $this->SETOPT['POST'] = 1;
            $this->SETOPT['CUSTOMREQUEST'] = 'POST';
        }else{
            $this->SETOPT['POST'] = 0;
            unset($this->SETOPT['CUSTOMREQUEST']);
        }
        return $this->exec($this->cURL()->cURLOPT()->lastResource);
    }

    public function exec($c=''){
        if(!$c) $c = $this->lastResource;
        $this->result = curl_exec($c);
        return $this;
    }

    private function close($c){
        return curl_close($c);
    }

    public function getSize(){
        $s = $this->getHeader('Content-Range') ? explode('/', $this->getHeader('Content-Range')[1])[1] : $this->getHeader('Content-Length')[1];
        return $s;
    }

    public function searchHeader($h){
        foreach($this->headers AS $k => $v) if($e = explode(': ', $v) AND stristr($e[0], $h)) return array_map('trim', $e);
        return false;
    }

    public function getHeader($header=NULL, $follow=1){
        $this->cURL(
            array(
                'HEADER' => 1,
                'FOLLOWLOCATION' => $follow,
                //'NOBODY' => 1
                'RANGE' => '0-200'
            )
        );
        $this->headers = array_filter(array_map('trim', explode(PHP_EOL, $this->exec($this->cURLOPT()->lastResource)->result)));
        if($header) return $this->searchHeader($header);
        return $this;
    }

    private function flushBytes($c, $str){
        echo $str;
        $this->flush();
        return strlen($str);
    }

    public function flush(){
        ob_end_flush();
        ob_flush();
        flush();
        ob_start();
        return $this;
    }

    public function ADDOPT($a){
        $this->SETOPT = array_merge($this->SETOPT, $a);
        return $this;
    }

    function cmd($c){
        preg_match_all('/curl "[^"]+|-H "[^"]+|--[^"]+"[^"]+/', str_replace('^', '', str_replace('\^"', "'", $c)), $cmdInfo);
        $this->SETOPT['POSTFIELDS'] = '';
        foreach($cmdInfo[0] AS $curlInfo)
            !strstr($curlInfo, '--data')
                ?
                    strstr($curlInfo, '-H "')
                        &&
                    ($curlInfo = str_replace('-H "', '', $curlInfo))
                        &&
                    $this->headers[] = $curlInfo
                :
                    $this->SETOPT['POSTFIELDS'] = urldecode(preg_replace('/--[^"]+"/', '', $curlInfo))
        ;

        return $this->browse(str_replace('curl "', '', $cmdInfo[0][0]), '');
    }

    private function setRange($x, $r, $r2){
        $this->ADDOPT(
            array(
                'HEADER' => 0,
                'RANGE' => $r.'-'.$r2,
                'NOPROGRESS' => 0,
                'BUFFERSIZE' =>  $this->bufferSize,
                'TIMEOUT' => 0,
                'CONNECTTIMEOUT' => 0,
                'WRITEFUNCTION' => array($this, 'flushBytes')
            )
        );
        return $this->cURLOPT($x);
    }
 
    public function streamVideo($i=0, $end=NULL, $s = 0, $bf = 10240){
            $this->bufferSize = $bf;
            if(!$s) $s = $this->getSize();
            if(!$end) $end = $s;
            header('Content-Length:'.$end+1);
            $this->setRange($this->lastResource, $i, $end);
            $this->exec($curl);
    }
}


$size = isset($_COOKIE['size_FStream']) ? $_COOKIE['size_FStream'] : '';
$videoLocation = isset($_COOKIE['videoLocation_FStream']) ? $_COOKIE['videoLocation_FStream'] : '';
$token = isset($_COOKIE['token_FStream']) ? $_COOKIE['token_FStream'] : '';

if(isset($_GET['reset']) OR $token != md5($size.$videoLocation.$personalKey)){
    $xURL = new xURL('cookies.txt', $_SERVER['HTTP_USER_AGENT']);

    $host = str_ireplace('www.', '', parse_url($fembedUrl)['host']);

    preg_match('/v\/([a-z0-9-]+)/', $fembedUrl, $fembedId);

    $xURL->cmd('curl "https://'.$host.'/api/source/'.$fembedId[1].'" -H "authority: '.$host.'" -H "accept: */*" -H "origin: '.$host.'" -H "x-requested-with: XMLHttpRequest" -H "user-agent: '.$_SERVER['HTTP_USER_AGENT'].'" -H "content-type: application/x-www-form-urlencoded; charset=UTF-8" -H "sec-fetch-site: same-origin" -H "sec-fetch-mode: cors" -H "referer: https://'.$host.'/v/'.$fembedId.'" -H "accept-language: es-ES,es;q=0.9" --data "r=^&d='.$host.'" --compressed');

    $videoData = json_decode($xURL->result);
    $xURL = new xURL('cookies.txt', $_SERVER['HTTP_USER_AGENT']);
    $videoLocation = $videoData->data[count($videoData->data)-1]->file;
    $xURL->SETOPT['URL'] = $videoLocation;

    $size = $xURL->getSize();
    $token = md5($size.$videoLocation.$personalKey.$fembedUrl);
    setcookie('videoLocation_FStream', urlencode($videoLocation), time()+7200);
    setcookie('size_FStream', $size, time()+7200);
    setcookie('token_FStream', $token, time()+7200);
}else{
    $xURL = new xURL('cookies.txt', $_SERVER['HTTP_USER_AGENT']);
}

if($_SERVER['HTTP_RANGE'])
    $rangeReceived = explode('-', explode('=', $_SERVER['HTTP_RANGE'])[1]);
;

$beginReceived = preg_replace("/[^0-9](.*)$/", '', $rangeReceived[0]);

$endReceived = preg_replace("/[^0-9](.*)$/", '', $rangeReceived[1]);

$begin = $beginReceived OR $begin = 0;

$end = $endReceived OR $end = 1024*1024*$partSize+$begin;

$begin > 0 || $end < $size
    ?
        header('HTTP/1.0 206 Partial Content')
    :
        header('HTTP/1.0 200 OK')
;

$length = $end-$begin+1;
header("Content-Length: $length");
header("Content-Type: video/mp4");
header('Accept-Ranges: bytes');
header("Content-Transfer-Encoding: BINARY");
header("Content-Disposition: inline");
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header('Connection: close');

header("Content-Range: bytes $begin-$end/$size");

$xURL->SETOPT['URL'] = $videoLocation;
$xURL->streamVideo($begin, $end, $size, 10240);

Não precisa de Frameworks.

Pode definir que a URL do Fembed seja definida por GET ou POST, isso fica a critério. (Este código só funciona com Fembed)

É possível avançar o vídeo. 👍 (Graças ao sistema de rangos)

O que ele faz?
Baixa o vídeo do Fembed (na memória, não o salva) e vai passando para o usuário constantemente. (Proxy)

Só é preciso copiar o código e salvá-lo como PHP. 👍

Pode usar hospedagem normal. (Embora talvez trave um pouco)


Vamos ver quem é o primeiro que diz que funciona! (Ou que não 😂)
Funciona maravilhosamente 😍


Podem adicionar um pouco de segurança com o seguinte:

PS: editando-o, serve para outros servidores.


___________

 
Última edição:
Foi útil? Participe da conversa

Com sua conta grátis você pode responder, mandar mensagem privada ao autor e comprar com Saldo retido: o pagamento é liberado quando você recebe o combinado.

Leva 30 segundos · você volta a este tópico ao terminar
Vou testar, mano. 😉
 
Genial 😀👍

Por cierto, tu web de la firma está caída 🙁, no se si sea hace mucho, por las dudas te aviso.
Sim mano, já não estou usando ela, e deixei lá mesmo, me dediquei a outras coisas 😉 mas estou testando seu script em outro site 😍
 
Para que serve exatamente? que diferença tem de usar o embed normal do fembed?
 
Não tem PopUp.

Você pode ter controle do vídeo colocando-o em seu próprio player.

Se você editar, pode baixar o filme também.
Funciona maravilhosamente bem 😍
 
Não tem PopUp.

Você pode ter controle do vídeo colocando-o em seu próprio player.

Se você editar, pode baixar o filme também.

Mas se o pessoal do fembed te pegar fazendo isso, com certeza vão te banir xD
 
Mas se o pessoal do fembed te pegar fazendo isso, com certeza vão te banir xD

Eu estou usando para fazer scraping de centenas de filmes e ainda não me baniram. 😎
 
Que servidor você recomenda para utilizar esses tipos de script, já que consome bastante?
 
Você mediu o consumo? 🤔
Sim, gasta muito e se for usado em uma hospedagem compartilhada, a velocidade de transferência é muito lenta, chega a um ponto em que se muitas pessoas assistem ao vídeo ao mesmo tempo, para muitos não carrega.
 
Sim, gasta muito e se for usado em uma hospedagem compartilhada, a velocidade de transferência é muito lenta, chega a um ponto em que se muitas pessoas assistem ao vídeo ao mesmo tempo, para muitos não carrega.

Tenho usado no hostgator em uma hospedagem compartilhada (dá para selecionar a mais cara) com o cupom CRAZYMONTH de $0.01 por um mês e funcionou bem.
O consumo que marcava era baixíssimo.

Mas não saberia te dizer quantas pessoas ao mesmo tempo...

Também nos VPS mais baratos da OVH.

O ideal seria ter vários servidores e distribuir...

_____

Atualizei o código para declarar o tamanho das partes em MB.
 
Última edição:
Como configuro, mano? Se eu substituo a url pela url do vídeo, me dá o mesmo erro
 

Anexos

  • Captura de pantalla de 2020-04-23 13-40-26.webp
    Captura de pantalla de 2020-04-23 13-40-26.webp
    244,9 KB · Visitas: 232
Como configuro, mano? Se eu substituo a url pela url do vídeo, me dá o mesmo erro
Algo você está fazendo errado, mano. Em si, o código funciona corretamente, já testei e testei de novo e vai maravilhosamente bem.
Verifique se é uma URL do fembed 🙂
 
Algo você está fazendo errado, mano. Em si, o código funciona corretamente, já testei e testei de novo e vai maravilhosamente bem.
Verifique se é uma URL do fembed 🙂
Até fiz com o formulário e aparece o seguinte erro
 

Anexos

  • Captura de pantalla de 2020-04-23 14-04-14.webp
    Captura de pantalla de 2020-04-23 14-04-14.webp
    31,3 KB · Visitas: 155
Até fiz com o formulário e aparece o seguinte erro

Acho que está falhando ao pegar o MP4.

O link do Fembed que você colocou, funciona?
(Pode ser que tenha sido removido e por isso não funciona)
 
Acho que está falhando ao pegar o MP4.

O link do Fembed que você colocou, funciona?
(Pode ser que tenha sido removido e por isso não funciona)
Parece que está com erro, mano. Acabei de testar e dá erro, o que testei anteriormente foi a versão anterior, antes de você atualizar o código, porque vejo que é diferente. 😉
 

Tópicos similares

Voltar
Topo