Ir para conteúdo

POWERED BY:

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 violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, poderiam me ajudar.

      Estou com a seguinte dúvida:
      --> como faço para para implementar o input código do produto, para quando o usuário digitar o ID o sistema espera de 1s a 2s, sem ter que pressionar a tecla ENTER.

      exemplo:
      código   ----   descrição
           1       -----   produto_A
       
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Humildemente peço desculpa por postar uma dúvida que tenho.

      Preciso salvar no MySql, os seguinte Registro:

      1 - Principal
      ====> minha dúvida começa aqui
      ==========> como faço para o Sistema Contar Automaticamente o que estiver despois do 1.____?
      1.01 - Matriz
      1.01.0001 - Estoque
      1.01.0002 - Oficina
      etc

      2 - Secundário
      2.01 - Loja_1
      2.01.0001 - Caixa
      2.01.0002 - Recepção
      etc
       
      Resumindo seria como se fosse um Cadastro de PLANO de CONTAS CONTÁBEIL.

      Grato,


      Cesar









       
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a orientação dos amigos.

      Preciso fazer um Relatório onde o usuário pode Gerar uma Lista com prazo para vencimento de: 15 / 20/ 30 dias da data atual.

      Tem como montar uma SQL para o sistema fazer uma busca no MySql por período ou dias próximo ao vencimento ?

      Tentei fazer assim, mas o SQL me traz tudo:
      $query = "SELECT faturamento.*, DATE_ADD(faturamento.dataVencimento, INTERVAL 30 DAY), fornecedor.* FROM faturamento INNER JOIN fornecedor ON fornecedor.idfornecedor = faturamento.id_fornecedor WHERE faturamento.statusFatur = 1 ORDER BY faturamento.idFaturamento $ordenar ";  
      Grato,
       
      Cesar
       
       
       
       
    • Por violin101
      Caros amigos, saudações
       
      Por favor, me perdoa em recorrer a orientação dos amigos, tenho uma dúvida.
       
      Gostaria de uma rotina onde o Sistema possa acusar para o usuário antes dos 30 dias, grifar na Tabela o aviso de vencimento próximo, por exemplo:
       
      Data Atual: 15/11/2024
                                           Vencimento
      Fornecedor.....................Data.....................Valor
      Fornecedor_1...........01/12/2024..........R$ 120,00 <== grifar a linha de Laranja
      Fornecedor_1...........01/01/2025..........R$ 130,00
      Fornecedor_2...........15/12/2024..........R$ 200,00 <== grifar a linha de Amarelo
      Fornecedor_2...........15/01/2025..........R$ 230,00
      Fornecedor_3...........20/12/2024..........R$ 150,00
       
      Alguém tem alguma dica ou leitura sobre este assunto ?

      Grato,
       
      Cesar
×

Informação importante

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