Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

BrunoBit

Pegar ref de celular

Recommended Posts

Faala rapaziiada.

To com uma duvida, como faço pra pegar o ref de mobile? tentei usar o HTTP_REFERER, mas ta retornando em branco, sem o ref, ou seja, no desktop funciona, mas no mobile ta retornando vazio. De acordo com a experiência de vocês tem alguma alternativa?

 

Valeu rapaziiada, abração e fiquem com Deus.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou acompanhar seu post, estou interessado nessas coisas pois estou fazendo um classe para tratar disso e muito mais que seja relacionado.

Segue o que já fiz:

Spoiler

<?php
/**
 * ****************************************************
 * @Copyright (c) 2017, Spell Master.
 * @version 1.2 : 2018 Spell Master
 * ****************************************************
 * @Class: Retorna dados na máquina que está acessamdo
 *         o servidor.
 * ****************************************************
 * @log v1.2 : Adicionado método para obter o IP da 
 *             máquina.
 * ****************************************************
 **/

class UserAgent {

    private $userData;
    private $userIP;
    private $setOS;
    private $setBrowser;
    private $osTrue = null;
    private $browserTrue = null;

    /** ************************************************
     * @Method: Define os dados e chama os métodos.
     * *************************************************/
    function __construct() {
        $filterServe = filter_input_array(INPUT_SERVER, FILTER_DEFAULT);
        $filterIp = filter_input_array(INPUT_SERVER, FILTER_VALIDATE_IP);
        $this->userData = $filterServe['HTTP_USER_AGENT'];
        $this->userIP = $filterIp['REMOTE_ADDR'];
        $this->checkOs();
        $this->checkBrowser();
    }

    /** ************************************************
     * @Method: Verifica o sistema operacional.
     * *************************************************/
    private function checkOs() {
        $os = ['/windows nt 10/i' => 'Windows 10', '/windows nt 6.3/i' => 'Windows 8.1', '/windows nt 6.2/i' => 'Windows 8', '/windows nt 6.1/i' => 'Windows 7', '/windows nt 6.0/i' => 'Windows Vista', '/windows nt 5.2/i' => 'Windows Server 2003/XP x64', '/windows nt 5.1/i' => 'Windows XP', '/windows xp/i' => 'Windows XP', '/windows nt 5.0/i' => 'Windows 2000', '/windows me/i' => 'Windows ME', '/win98/i' => 'Windows 98', '/win95/i' => 'Windows 95', '/win16/i' => 'Windows 3.11', '/macintosh|mac os x/i' => 'Mac OS X', '/mac_powerpc/i' => 'Mac OS 9', '/linux/i' => 'Linux', '/ubuntu/i' => 'Ubuntu', '/iphone/i' => 'iPhone', '/ipod/i' => 'iPod', '/ipad/i' => 'iPad', '/android/i' => 'Android', '/blackberry/i' => 'BlackBerry', '/webos/i' => 'Mobile'];
        foreach ($os as  $reg => $value) {
            if (preg_match($reg, $this->userData)) {
                $this->setOS = (string) $value;
                $this->osTrue = true;
            }
        }
    }

    /** ************************************************
     * @Method: Verifica o navegador.
     * *************************************************/
    private function checkBrowser() {
        $browser = ['/msie/i' => 'Internet Explorer', '/firefox/i' => 'Firefox', '/safari/i' => 'Safari', '/chrome/i' => 'Chrome', '/edge/i' => 'Edge', '/opera/i' => 'Opera', '/netscape/i' => 'Netscape', '/maxthon/i' => 'Maxthon', '/konqueror/i' => 'Konqueror', '/mobile/i' => 'Handheld Browser'];
        foreach ($browser as $reg => $value) {
            if (preg_match($reg, $this->userData)) {
                $this->setBrowser = (string) $value;
                $this->browserTrue = true;
            }
        }
    }

    /** ************************************************
     * @Method: Retorna os dados da máquina que está
     * acessando.
     * *************************************************/
    public function getUserMachine() {
        return $this->userData;
    }

    /** ************************************************
     * @Method: Retorna o sistema operacional da máquina
     * que está acessando.
     * *************************************************/
    public function getOs() {
        if (isset($this->osTrue)) {
            return $this->setOS;
        } else {
            return " ";
        }
    }

    /** ************************************************
     * @Method: Retorna o navegador da máquina que está
     * acessando.
     * *************************************************/
    public function getBrowser() {
        if (isset($this->browserTrue)) {
            return $this->setBrowser;
        } else {
            return " ";
        }
    }

    /** ************************************************
     * @Method: Obtem o endereço de IP da máquina que
     * está acessando.
     * *************************************************/
    public function requestIP() {
        return $this->userIP;
    }
}

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@BrunoBit, o Referer não é nada confiável.

1 - Se você está em um aplicativo, como o Whats ou Fb, não existe referência, mas você pode inserir uma informação para saber de onde veio esse acesso ao compartilhar o link. Exemplo: http://meusite.com.br/ref=whats

2 - Pode ser óbvio, mas ao trocar de aba ou abrir em nova janela, perde-se a referência. E isso não é nada incomum.

 

Especificamente sobre a sua dúvida, não tenho como saber o que pode estar acontecendo, pois depende de uma infinidade de coisas: seu servidor web, seu navegador mobile e outras variáveis que podem estar afetando, mas na teoria era para funcionar sim.

 

@Omar~, veja essa biblioteca: https://github.com/ThaDafinser/UserAgentParser

Compartilhar este post


Link para o post
Compartilhar em outros sites
14 horas atrás, Omar~ disse:

Vou acompanhar seu post, estou interessado nessas coisas pois estou fazendo um classe para tratar disso e muito mais que seja relacionado.

Segue o que já fiz:

  Mostrar conteúdo oculto


<?php
/**
 * ****************************************************
 * @Copyright (c) 2017, Spell Master.
 * @version 1.2 : 2018 Spell Master
 * ****************************************************
 * @Class: Retorna dados na máquina que está acessamdo
 *         o servidor.
 * ****************************************************
 * @log v1.2 : Adicionado método para obter o IP da 
 *             máquina.
 * ****************************************************
 **/

class UserAgent {

    private $userData;
    private $userIP;
    private $setOS;
    private $setBrowser;
    private $osTrue = null;
    private $browserTrue = null;

    /** ************************************************
     * @Method: Define os dados e chama os métodos.
     * *************************************************/
    function __construct() {
        $filterServe = filter_input_array(INPUT_SERVER, FILTER_DEFAULT);
        $filterIp = filter_input_array(INPUT_SERVER, FILTER_VALIDATE_IP);
        $this->userData = $filterServe['HTTP_USER_AGENT'];
        $this->userIP = $filterIp['REMOTE_ADDR'];
        $this->checkOs();
        $this->checkBrowser();
    }

    /** ************************************************
     * @Method: Verifica o sistema operacional.
     * *************************************************/
    private function checkOs() {
        $os = ['/windows nt 10/i' => 'Windows 10', '/windows nt 6.3/i' => 'Windows 8.1', '/windows nt 6.2/i' => 'Windows 8', '/windows nt 6.1/i' => 'Windows 7', '/windows nt 6.0/i' => 'Windows Vista', '/windows nt 5.2/i' => 'Windows Server 2003/XP x64', '/windows nt 5.1/i' => 'Windows XP', '/windows xp/i' => 'Windows XP', '/windows nt 5.0/i' => 'Windows 2000', '/windows me/i' => 'Windows ME', '/win98/i' => 'Windows 98', '/win95/i' => 'Windows 95', '/win16/i' => 'Windows 3.11', '/macintosh|mac os x/i' => 'Mac OS X', '/mac_powerpc/i' => 'Mac OS 9', '/linux/i' => 'Linux', '/ubuntu/i' => 'Ubuntu', '/iphone/i' => 'iPhone', '/ipod/i' => 'iPod', '/ipad/i' => 'iPad', '/android/i' => 'Android', '/blackberry/i' => 'BlackBerry', '/webos/i' => 'Mobile'];
        foreach ($os as  $reg => $value) {
            if (preg_match($reg, $this->userData)) {
                $this->setOS = (string) $value;
                $this->osTrue = true;
            }
        }
    }

    /** ************************************************
     * @Method: Verifica o navegador.
     * *************************************************/
    private function checkBrowser() {
        $browser = ['/msie/i' => 'Internet Explorer', '/firefox/i' => 'Firefox', '/safari/i' => 'Safari', '/chrome/i' => 'Chrome', '/edge/i' => 'Edge', '/opera/i' => 'Opera', '/netscape/i' => 'Netscape', '/maxthon/i' => 'Maxthon', '/konqueror/i' => 'Konqueror', '/mobile/i' => 'Handheld Browser'];
        foreach ($browser as $reg => $value) {
            if (preg_match($reg, $this->userData)) {
                $this->setBrowser = (string) $value;
                $this->browserTrue = true;
            }
        }
    }

    /** ************************************************
     * @Method: Retorna os dados da máquina que está
     * acessando.
     * *************************************************/
    public function getUserMachine() {
        return $this->userData;
    }

    /** ************************************************
     * @Method: Retorna o sistema operacional da máquina
     * que está acessando.
     * *************************************************/
    public function getOs() {
        if (isset($this->osTrue)) {
            return $this->setOS;
        } else {
            return " ";
        }
    }

    /** ************************************************
     * @Method: Retorna o navegador da máquina que está
     * acessando.
     * *************************************************/
    public function getBrowser() {
        if (isset($this->browserTrue)) {
            return $this->setBrowser;
        } else {
            return " ";
        }
    }

    /** ************************************************
     * @Method: Obtem o endereço de IP da máquina que
     * está acessando.
     * *************************************************/
    public function requestIP() {
        return $this->userIP;
    }
}

 

 

Valeu por ter compartilhado Omar, guardei aqui pra estudar o código.

 

7 horas atrás, Matheus Tavares disse:

@BrunoBit, o Referer não é nada confiável.

1 - Se você está em um aplicativo, como o Whats ou Fb, não existe referência, mas você pode inserir uma informação para saber de onde veio esse acesso ao compartilhar o link. Exemplo: http://meusite.com.br/ref=whats

2 - Pode ser óbvio, mas ao trocar de aba ou abrir em nova janela, perde-se a referência. E isso não é nada incomum.

 

Especificamente sobre a sua dúvida, não tenho como saber o que pode estar acontecendo, pois depende de uma infinidade de coisas: seu servidor web, seu navegador mobile e outras variáveis que podem estar afetando, mas na teoria era para funcionar sim.

 

@Omar~, veja essa biblioteca: https://github.com/ThaDafinser/UserAgentParser

Sim, pelo o que pesquisei o HTTP_REFERER não funciona em alguns navegadores também, sem falar que está retornando vazio o ref quando é mobile.

Os testes que fiz pra pegar o ref usei o facebook, no desktop ele funcionou normalmente usando HTTP_REFERER, mesmo abrindo em nova aba, mas no mobile retornou vazio.

A última opção vai ter que ser o uso de parâmetro na URL mesmo, porém dependendo da usabilidade isso pode ser burlável por alguém que vai manusear a URL e se bobear pode jogar a URL em qualquer outro canto da internet que o ref vai ser sempre facebook, pq está como parâmetro na URL.

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, BrunoBit disse:

A última opção vai ter que ser o uso de parâmetro na URL mesmo, porém dependendo da usabilidade isso pode ser burlável por alguém que vai manusear a URL e se bobear pode jogar a URL em qualquer outro canto da internet que o ref vai ser sempre facebook, pq está como parâmetro na URL.

Não é uma solução perfeita, concordo, mas pq alguém iria burlar?

Você não precisa fazer algo tão evidente como o exemplo que eu citei. Pode ser algo assim: http://site.com.br/12345/artigo-sobre-alguma-coisa, onde 12345 é o código da referência de acesso. Ninguém iria tentar burlar assim, até pelo fato de que não parece ter algo burlável nessa URL.

 

1 hora atrás, BrunoBit disse:

se bobear pode jogar a URL em qualquer outro canto da internet que o ref vai ser sempre facebook, pq está como parâmetro na UR

Verdade, mas, ele vai ter visto a primeira vez no fb. A origem inicial você teria, e é isso que realmente importa normalmente.

Além disso, se ele jogar o link em algum site, você provavelmente passaria a ter uma referência.

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 minuto atrás, Matheus Tavares disse:

Não é uma solução perfeita, concordo, mas pq alguém iria burlar?

Você não precisa fazer algo tão evidente como o exemplo que eu citei. Pode ser algo assim: http://site.com.br/12345/artigo-sobre-alguma-coisa, onde 12345 é o código da referência de acesso. Ninguém iria tentar burlar assim, até pelo fato de que não parece ter algo burlável nessa URL.

Pior que é burlável, pq é uma plataforma de publishers, pessoas que irão divulgar link de campanhas pra receber por visitas que irão vir somente do facebook, e a regra é eles serem pagos somente por visitas do face, no meio dos divulgadores pode ter uma pessoa que pode jogar a URL em um site de venda de tráfego ou até mesmo bots e o sistema vai contabilizar como se viesse do facebook, pq está buscando a referência pela URL. Se fosse somente pra eu administrar a divulgação dessas URL, a referência por parâmetro na url seria perfeito mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma ferramenta que depende primariamente do HTTP_REFERER é falha, pois esse dado é facilmente burlável.

Com CURL ou até mesmo com alguma extensão do Chrome você pode definir o REFERER que bem entender.

Qualquer bot poderia fazer 25k acessos em segundos, e todos parecendo ter vindo do fb. Depende apenas da motivação da pessoa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, pior que existe essa possibilidade mesmo, infelizmente. Com o http_referer foi o início pra ir bolando uma solução mais completa, mas depois dos testes nem o referer ta funcionando direito, pelo menos na parte do mobile, pq a maior parte do tráfego vem do mobile hoje em dia, principalmente se tratando de rede social, é na casa dos 85%/90%.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Matheus Tavares tava fazendo uns testes aqui e estudando js, parece que o js pega corretamente o referer do mobile + desktop. Fiz o teste assim:

x = document.referrer;

O que o HTTP_REFERER não fez, o document.referrer conseguiu fazer, que no caso é identificar o ref do visitante que está usando celular e está vindo do facebook ou qualquer outro lugar, funcionou mesmo abrindo nova aba.

 

Está correto isso? nesse caso o document.referrer js é mais eficiente e confiável que o HTTP_REFERER do php?

Compartilhar este post


Link para o post
Compartilhar em outros sites
10 minutos atrás, BrunoBit disse:

Está correto isso? nesse caso o document.referrer js é mais eficiente e confiável que o HTTP_REFERER do php?

Creio que você esteja confundindo um pouco as coisas...

 

Tanto o HTTP_REFERER que você recebe no PHP, quanto o do JS, são declarados pelo navegador. Na teoria, se funciona um, deveria funcionar o outro também. A questão é precisamente como você implementa essa captura e de onde (aplicativo, navegador, etc) você recebe essa informação.

 

O que você pode fazer é enviar o referer que você tem no JS pela requisição, preferencialmente ofuscado por algum algoritmo de criptografia (como o base64). Exemplo: site.com.br/recurso/a/ser/acessado?ref=dstn86ftsbd__OFUSCADO__76fsdbr7ftns67t.

 

Ao receber, você desofusca e armazena a informação, dando prioridade ao PHP. Seria algo assim:

/**
 * Se referer do SERVER estiver definido, use-a.
 * Senão, descriptografe o ref do GET (enviado manualmente com o JS).
 * Se inválido ou indisponível, escreva a string 'Sem referência'
 */

$referer = $_SERVER[ 'HTTP_REFERER' ] ?: base64_decode( $_GET[ 'ref' ] ) ?: 'Sem referência';

O exemplo é apenas ilustrativo. Dificilmente você escreveria "Sem referência"... mas acho que você entendeu.

 

Além disso dá pra mandar a informação manual pelo cabeçalho da requisição, desvinculando com o link e diminuindo a exposição ao usuário.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por landerbadi
      Boa tarde pessoal. Estou tentado fazer uma consulta no banco de dados porém estou tendo dificuldades. Tenho uma tabela chamada "itens" com os seguintes campos: id, item, ativo. Nela tem cadastrado vários itens. No campo ativo eu coloco a letra "S" para informar que este item está ativo no sistema. Por exemplo: 1, casa, S 2, mesa, S 3, cama, S 4, moto S 5, rádio O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo ativo. E outra tabela chamada "produtos" com os seguintes campos (id, item1, item2, item3) com os seguintes registros: 1, casa, mesa, moto 2, mesa, casa, cama 3, rádio, cama, mesa Eu preciso fazer uma busca na tabela produtos da seguinte maneira: Eu escolho um registro na tabela "itens", por exemplo "mesa". Preciso fazer com que o php me liste todos os registros da tabela "produtos" que contenham a palavra "mesa". Até aqui tudo bem eu consigo listar. Estou fazendo assim: <?php $item = "mesa" $sql = mysqli_query($conn, "SELECT * FROM produtos WHERE item1 LIKE '$item' OR item2 LIKE '$item' OR item3 LIKE '$item' LIMIT 10"); while($aux = mysqli_fetch_assoc($sql)) { $id = $aux["id"]; $item1 = $aux["item1"]; $item2 = $aux["item2"]; $item3 = $aux["item3"]; echo $id . " - " . $item1 . ", " . $item2 . ", " $item3 . "<br>"; } ?> O problema é que está listando todos os registros que contém o item mesa. Eu preciso que o php verifique os demais item e me liste somente os registro em que todos os registros estejam ativos no sistema. No exemplo acima ele não deveria listar o registro 3. pois nesse registro contém o item "radio" e este item não está ativo no sistema. Ou seja, o registro "radio" na tabela itens não possui um "S" na coluna "ativo". Alguém sabe como resolver isso?
    • Por ILR master
      Fala galera.
      Espero que todos estejam bem.
      Seguinte: Tenho um arquivo xml onde alguns campos estão com : (dois pontos), como o exemplo abaixo:
       
      <item>
      <title>
      d sa dsad sad sadasdas
      </title>
      <link>
      dsadas dsa sad asd as dsada
      </link>
      <pubDate>sadasdasdsa as</pubDate>
      <dc:creator>
      d sad sad sa ad as das
      </dc:creator>
      </item>
       
      Meu código:
       
      $link = "noticias.xml"; 
      $xml = simplexml_load_file($link); 
      foreach($xml -> channel as $ite) {     
           $titulo = $ite -> item->title;
           $urltitulo = $ite -> item->link;
           print $urltitulo = $ite -> item->dc:creator;
      } //fim do foreach
      ?>
       
      Esse campo dc:creator eu não consigo ler. Como faço?
       
      Agradeço quem puder me ajudar.
       
      Abs
       
       
    • Por First
      Olá a todos!
       
      Eu estou criando um sistema do zero mas estou encontnrando algumas dificuldades e não estou sabendo resolver, então vim recorrer ajuda de vocês.
      Aqui está todo o meu código: https://github.com/PauloJagata/aprendizado/
       
      Eu fiz um sistema de rotas mas só mostra o conteúdo da '/' não sei porque, quando eu tento acessar o register nada muda.
      E eu também quero que se não estiver liberado na rota mostra o erro de 404, mas quando eu tento acessar um link inválido, nada acontece.
      Alguém pode me ajudar com isso? E se tiver algumas sugestão para melhoria do código também estou aceitando.
       
       
      Desde já, obrigado.
    • Por landerbadi
      Olá pessoal, boa tarde
       
      Tenho uma tabela chamada "produtos" com os seguintes campos (id, produto) e outra tabela chamada "itens" com os seguintes campos (id, prod_01, prod_02, prod_03, prod_04).
       
      Na tabela produtos eu tenho cadastrado os seguintes produtos: laranja, maçã, uva, goiaba, arroz, feijão, macarrão, etc.
       
      Na tabela itens eu tenho cadastrado os itens da seguinte maneira:
       
      1, laranja, uva, arroz, feijão;
      2, maçã, macarrão, goiaba, uva;
      3, arroz, feijão, maçã, azeite
       
      Meu problema é o seguinte: 
      Eu escolho um produto da tabela "produtos", por exemplo "uva".  Preciso fazer uma consulta na tabela "itens" para ser listado todos os registros que contenham o produto "uva" e que todos os demais produtos estejam cadastrados na tabela "produtos".
       
      No exemplo acima seria listado apenas dois registros, pois o terceiro registro não contém o produto "uva". 
       
      Alguém pode me ajudar? Pois estou quebrando a cabeça a vários dias e não consigo achar uma solução.
    • Por landerbadi
      Boa tarde pessoal. Estou tentado fazer uma consulta no banco de dados porém estou tendo dificuldades. Tenho uma tabela chamada "itens" com os seguintes campos: id, item, plural, ativo. Nela tem cadastrado vários itens e seu respectivo plural. No campo ativo eu coloco a letra "S" para informar que esta palavra está ativa no sistema. Por exemplo: 1, casa, casas, S 2, mesa, mesas, S 3, cama, camas, S 4, moto, motos, S 5, rádio, rádios O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo ativo. E outra tabela chamada "variações" com os seguintes campos (id, item1, item2, item3) com os seguintes registros: 1, casa, camas, moto 2, mesas, casas, radio 3, rádio, cama, mesa Eu preciso fazer uma busca na tabela variações da seguinte maneira: Eu escolho um registro na tabela "itens", por exemplo "casa". Preciso fazer com que o php me liste todos os registros da tabela "variações" que contenham a palavra "casa". Porém se tiver algum registro com a palavra "casas" também tem que ser listado. Neste caso ele irá encontrar dois registros. Agora eu preciso que o php verifique os demais itens e faça a listagem apenas dos item que estão ativos (que contenham um "S" no campo ativo. Neste caso ele irá encontrar apenas um registro, pois o segundo registro contém a palavra "rádio". E "rádio" não está ativo na tabela itens. Como faço isso?
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.