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, saudações.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos, referente a PDV.
       
      Estou escrevendo um Sistema com Ponto de Vendas, a minha dúvida é o seguinte, referente ao procedimento mais correto.

      Conforme o caixa vai efetuando a venda, o Sistema de PDV já realiza:
      a baixa direto dos produtos no estoque
      ou
      somente após concretizar a venda o sistema baixa os produtos do estoque ?
       
      Grato,
       
      Cesar
       
    • 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
×

Informação importante

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