Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
@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
>
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.
>
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.
>
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.
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.
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%.
@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?>
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.
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 {