Um par de semanas atrás eu encontrei a necessidade de utilizar um desses sistemas lá fora, para encurtar 's. URL Eu precisava de um endereço para enviar SMS e tive que tomar o mínimo possível para que o personagem para otimizar o texto da mensagem. Enquanto ele usou inteligência pensou em utilizar um sistema de numeração base36 para reduzir exponencialmente o número de caracteres no redirecionamento. Seria, portanto, um artigo sobre as vantagens dos diferentes sistemas de numeração decimal para determinados projectos, mas acabou por se tornar um projeto completo. Quando eu estava começando a explicação teórica eu pensei, por que não? Por que não mostrar como é rápido e fácil que você pode montar qualquer coisa na internet hoje?

Assim, após 15 horas de trabalho que apresento IraUrl.me , um encurtamento de URL's no estilo de TinyUrl ou Bit.ly . Custou-me mais para escrever o artigo para que isso aconteça, né engraçado?. Na verdade, como o pedido foi me preparando mais coisas foram acontecendo que seria interessante dar uma volta, de modo que o inicial de 8 horas ou assim, eles se tornaram 15.

iraurl1 De artículo a proyecto explicado paso a paso: acorta URLs con IraUrl.me

A teoria

Para quem não sabe, um encurtamento de URLs é baseado em encontrar um nome de domínio mais curto possível e criar redirecionamentos HTTP 301 'URL s. outros O truque é otimizar os parâmetros que contribuem para a URL a ser tão curto quanto possível e não querem penalizar-nos a falta de domínio.

Como então eles encurtar 's URLs? Muito mais fácil do que parece que você e certamente você teria acontecido. Nós só temos um banco de dados onde continuamos a adicionar registros a uma tabela como eles estão criando a nova URL curta. Esta tabela possui um campo AutoNumeração, a chave da tabela, que para cada nova URL retorna um identificador único, que cada sentido poderia ser acessível da forma habitual:

http://dominio.com/1

http://dominio.com/1000000

Isso é exatamente a idéia, tudo que fazemos é alterar o identificador em questão de Base10 (o da nossa métrica) para base36 e base62 no meu caso. Outros sistemas de numeração mais conhecidos são o hexadecimal (Base 16 codificação) e base64 .

Ok, você tem falado em chinês. O que é isso? Vamos ver.

Em bases de numeração

O sistema decimal utiliza dez dígitos (daí o decimal :P ) Para formar todas as combinações possíveis de números. O que já sabemos, vamos lá. O binário utiliza dois dígitos (0 e 1), 16 hexadecimal (0 .. 9ABCDE), base36, como o próprio nome indica, trinta e seis (0 .. 9 .. a z) e usar o base62 62 dígitos incluir os números 0-9 e letras de A a Z, no caso (o 9 .. 0 .. zA .. Z). Aqui estão alguns exemplos:

Binário Decimal Hexadecimal Base36 Base62
0 0 0 0 0
1 1 1 1 1
10 2 2 2 2
1010 10 A para para
1100100 100 64 2s 1c
1000000 F4240 lfls 4c92
10000000 989 680 5yc1s FXsk

Você pode ver rapidamente a medida que aumenta o número, maior a base vai lidar com menos dígitos. Os números, apesar de tudo, continuam entre todas as combinações posibles.Así dígitos, dependendo da base e do número de dígitos, o maior número representável representável seria:

dígitos No.
Decimal Base62
1 10 62
2 100 3844
3 1000 238 328
4 10 000 14776336
5 100 000 916132832
6 1000000 56800235584
7 10000000 3521614606208
8 100000000 218340105584896
9 1000000000 13537086546263552

Ou o que é o mesmo, a base (número de dígitos), 62, 09-10 setembro. Espero que você entenda a teoria. Como curiosidade:

Decimal: 10000000000000000000000

Base62: 36aHo5IWaicak

A pergunta agora seria, por Base62 e Base64, por exemplo, mais conhecido? Simples, porque para além dos 62 caracteres do Base62, Base64 usa dois adicionais, geralmente + e / = além, o que torna a cadeia Site não é seguro, ou seja, caracteres especiais devem ser traduzidos para não dar problemas de transporte, que estaria perdendo os benefícios da nossa criptografia curto. Os 62 caracteres usados em Base62 são completamente seguros, apenas letras (maiúsculas e minúsculas) e números.

Sabendo como funciona o sistema e vamos ver como criar nosso aplicativo. Obviamente que não dizê-lo passo a passo tudo porque senão demoraria muito mais tempo para escrever o artigo sobre como fazer o pedido, vou colocar somente as coisas que são mais importantes.

Para codificar / decodificar base62 Base10 estar usando essas bibliotecas:

  1. $dec , $base , $digits = FALSE ) { função dec2base ($ dezembro, $ base, $ dígitos = FALSE) (
  2. $base < 2 or $base > 256 ) { if ($ base <2 ou US $ base> 256) (
  3. "Invalid Base: .$base \n " ) ; die ("Invalid Base:. $ base \ n");
  4. )
  5. 0 ) ; bcscale (0);
  6. ; Valor $ = ";
  7. ! $digits ) { if (! $ dígitos) (
  8. $base ) ; Dígitos = $ dígitos ($ base);
  9. )
  10. $dec > $base1 ) { while ($> $ base dezembro - 1) (
  11. ( $dec , $base ) ; $ Rest = bcmod ($ dezembro, $ base);
  12. ( $dec , $base ) ; $ Dec = bcdiv ($ dezembro, $ base);
  13. [ $rest ] . $value ; $ Valor = $ dígitos [] $ rest. $ Valor;
  14. )
  15. [ intval ( $dec ) ] . $value ; $ Valor = $ dígitos [ intval $ DEC)]. $ (valor;
  16. string ) $value ; (String de retorno) $ value;
  17. )
  18. $value , $base , $digits = FALSE ) { (Função $ value, $ base, $ dígitos base2dec = FALSE) (
  19. $base < 2 or $base > 256 ) { if ($ base <2 ou US $ base> 256) (
  20. "Invalid Base: .$base \n " ) ; die ("Invalid Base:. $ base \ n");
  21. )
  22. 0 ) ; bcscale (0);
  23. $base < 37 ) { if ($ base <37) (
  24. ( $value ) ; $ Valor = strtolower ($ value);
  25. )
  26. ! $digits ) { if (! $ dígitos) (
  27. $base ) ; Dígitos = $ dígitos ($ base);
  28. )
  29. ( $value ) ; $ Tamanho = strlen ($ valor);
  30. ; $ Dec = '0 ';
  31. $loop = 0 ; $loop < $size ; $loop ++ ) { for ($ loop = 0; $ loop <$ size, $ loop + +) (
  32. ( $digits , $value [ $loop ] ) ; $ Element = strpos ($ dígitos, $ valor [$ loop]);
  33. ( $base , $size - $loop -1 ) ; Power = $ bcpow ($ base, $ size - $ loop-1);
  34. ( $dec , bcmul ( $element , $power ) ) ; $ Dec = bcadd ($ dezembro, bcmul ($ elemento, $ substancia));
  35. )
  36. string ) $dec ; (String de retorno) $ dezembro;
  37. )
  38. $base ) { dígitos de função ($ base) (
  39. $base < 64 ) { if ($ base <64) (
  40. ( '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_' , 0 , $base ) ; retorno substr ('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_ ', 0, $ base);
  41. { Else ()
  42. ( " \x 0 \x 1 \x 2 \x 3 \x 4 \x 5 \x 6 \x 7 \x 8 \x 9 \x a \x b \x c \x d \x e \x f \x 10 \x 11 \x 12 \x 13 \x 14 \x 15 \x 16 \x 17 \x 18 \x 19 \x 1a \x 1b \x 1c \x 1d \x 1e \x 1f ! \x 22# \x 24%&amp;'()*+,-./0123456789:;<=> \x 3f@ABCDEFGHIJKLMNOPQRSTUVWXYZ[ \] ^_`abcdefghijklmnopqrstuvwxyz{|}~ \x 7f \x 80 \x 81 \x 82 \x 83 \x 84 \x 85 \x 86 \x 87 \x 88 \x 89 \x 8a \x 8b \x 8c \x 8d \x 8e \x 8f \x 90 \x 91 \x 92 \x 93 \x 94 \x 95 \x 96 \x 97 \x 98 \x 99 \x 9a \x 9b \x 9c \x 9d \x 9e \x 9f \x a0 \x a1 \x a2 \x a3 \x a4 \x a5 \x a6 \x a7 \x a8 \x a9 \x aa \x ab \x ac \x ad \x ae \x af \x b0 \x b1 \x b2 \x b3 \x b4 \x b5 \x b6 \x b7 \x b8 \x b9 \x ba \x bb \x bc \x bd \x be \x bf \x c0 \x c1 \x c2 \x c3 \x c4 \x c5 \x c6 \x c7 \x c8 \x c9 \x ca \x cb \x cc \x cd \x ce \x cf \x d0 \x d1 \x d2 \x d3 \x d4 \x d5 \x d6 \x d7 \x d8 \x d9 \x da \x db \x dc \x dd \x de \x df \x e0 \x e1 \x e2 \x e3 \x e4 \x e5 \x e6 \x e7 \x e8 \x e9 \x ea \x eb \x ec \x ed \x ee \x ef \x f0 \x f1 \x f2 \x f3 \x f4 \x f5 \x f6 \x f7 \x f8 \x f9 \x fa \x fb \x fc \x fd \x fe \x ff" , 0 , $base ) ; retorno substr ("\ x \ 0 x 1 x \ 2 \ 3 x \ x 4 \ x 5 x \ 6 \ x 7 x \ \ 8 x 9 \ X a \ X \ b X c \ x d x \ e \ x f \ x 10 \ x 11 \ x 12 \ x 13 \ x 14 \ x 15 \ x 16 \ x 17 \ x 18 \ x 19 \ x o 1 \ x 1B x \ 1c \ x 1d \ x 1e \ x 1f ! \ x 22 # \ x 24 %&'()*+,-./ :;<=> 0123456789 \ x 3f @ ABCDEFGHIJKLMNOPQRSTUVWXYZ [\] ^ _ `abcdefghijklmnopqrstuvwxyz (|) ~ \ x 7f \ x 80 \ x 81 \ x 82 \ x 83 \ x 84 \ x 85 \ x 86 \ x 87 \ x 88 \ x 89 x \ o \ 8 x 8-B \ x 8c \ x 8d \ x 8e \ x 8f \ x 90 \ x 91 \ x 92 \ x 93 \ x 94 \ x 95 \ x 96 \ x 97 \ x 98 \ x 99 \ x o 9 \ x 9b \ x 9c \ x 9d \ x 9e \ x 9F \ x a0 x \ A1 \ x a2 \ x \ x A4 \ x a5 \ x a6 \ x a7 \ x a8 \ x a9 \ a3 x aa \ ab x x c \ x d \ x \ ae x af \ b0 x \ x B1 \ B2 x \ x \ b4 x \ x b5 \ b6 x \ x b7 \ x a8 \ x b9 b3 x ba \ bb x x bc \ bd \ x x ser \ bf x \ x c0 \ c1 x \ x c2 \ x c3 \ x \ x c5 \ x c6 \ x c7 \ x c8 \ x c9 \ ca c4 x \ \ x x cb cc cd \ \ x x \ ce cf x \ x d0 \ x d1 \ x d2 \ d3 x \ x d4 \ x d5 \ x d6 \ x d7 \ d8 x \ x d9 \ x\ x \ x db dc \ dd \ x x \ x \ df x e0 \ x e1 \ x e2 \ x e3 \ e4 x \ x e6 x \ x e7 \ x \ E8 x e9 \ EA x \ x EB ce x \ \ x ed x ee \ \ \ e5 x EF x \ f0 \ x f1 \ x f2 x \ f3 \ x f4 \ x f5 \ f7 \ f8 x \ x f9 \ x F \ x FB x k \ x \ x fd \x \ x f6 x ff ", 0, $ base);
  43. )
  44. )
  45. $value ) { função base_encode ($ value) (
  46. base2dec ( $value , 256 ) , 62 ) ; retorno dec2base (base2dec ($ value, 256), 62);
  47. )
  48. $value ) { função base_decode ($ value) (
  49. base2dec ( $value , 62 ) , 256 ) ; retorno dec2base (base2dec ($ value, 62), 256);
  50. )

As duas últimas funções são utilizadas para as conversões.

Pacotes e bibliotecas:

Além disso:

  • Um domínio e hospedagem para hospedá-lo (6 €).
  • PHP e MySQL (não é obrigatório, você pode fazer com qualquer outra tecnologia).
  • 15 horas de seu tempo :P .

Estrutura do Site

Qualquer respeitando web do projecto de auto-deve começar por descrever o que queremos mostrar aos nossos visitantes, temos de recolher todas as idéias, decidir sobre o interesse da verdade, pense em como eles vão estar disponíveis no frontend e terminam com um mapa do site que nos diz que o fluxo continuem a trabalhar. Esta será a nossa:

mapaWebIraUrl1 De artículo a proyecto explicado paso a paso: acorta URLs con IraUrl.me Quando um usuário vai para um dos nossos url's curto muito ser o encaminhamento do script request http internamente a um encarregado de fazer todo o processo, link.php no meu caso.

Para visualizar as estatísticas de uma URL Gostei do sistema de bit.ly , então copiá-lo :P . Adicionar um "+" no final da URL curta, em vez de saltar para a direção de longo estatísticas mostram. Isto é feito, como no caso anterior, levando a um outro script internamente, stats.php.

Se o ID que você pretende usar para saltar para a url longa ou ver as estatísticas lá reenviar para index.php para mostrar uma mensagem de erro como "O URL não existe."

O domínio

Obviamente, temos de encontrar um nome de domínio tão breve quanto possível, a maioria já estão ocupadas, mas olhando e olhando TLD é estranho que você pode encontrar alguma coisa. Eu escolhi uma. Me porque tem um menor que um. Com :) e não custa o que é a. :P .

O banco de dados

Muito simples, apenas duas tabelas em um manter a URLs geradas e outras estatísticas de acesso a eles.

  1. CREATE TABLE IF NOT EXISTS `urls» (
  2. 20 ) NOT NULL auto_increment, `Id` bigint (20) NULL auto_increment, NÃO
  3. ) NOT NULL, Url `` varchar 500) NOT NULL (,
  4. ) NOT NULL, `` Varchar título (255) NOT NULL,
  5. ` ) PRIMARY KEY (`id`)
  6. MyISAM  DEFAULT CHARSET= latin1; ) ENGINE = MyISAM DEFAULT CHARSET = latin1;
  7. CREATE TABLE IF NOT EXISTS `status` (
  8. 20 ) NOT NULL auto_increment, `Id` bigint (20) NULL auto_increment, NÃO
  9. ) NOT NULL, `` Idurl bigint (20) NOT NULL,
  10. ) NOT NULL, `` Codpais varchar (255) NOT NULL,
  11. ) NOT NULL, "Referer varchar (255) NOT NULL,
  12. ) NOT NULL, `` Hostreferer varchar (255) NOT NULL,
  13. ) NOT NULL, «Ua» varchar 255) NOT NULL (,
  14. »Horário» datetime NOT NULL,
  15. ) NOT NULL, «País», varchar 255) NOT NULL (,
  16. ) NOT NULL, «Marca» varchar 255) NOT NULL (,
  17. ) NOT NULL, «Modelo» varchar 255) NOT NULL (,
  18. ` ) , PRIMARY KEY (`id`)
  19. Idurl `` KEY (`idurl`, `hora`)
  20. MyISAM  DEFAULT CHARSET= latin1; ) ENGINE = MyISAM DEFAULT CHARSET = latin1;

Configurando o Apache

Como já dissemos que queremos que, quando alguém vai a qualquer URL do nosso site tipo

http://tudominio.com/prueba3

É redirecionar internamente para link.php script que será responsável por processar a solicitação. Da mesma forma, se alguém visitar

http://tudominio.com/prueba3+

estatísticas mostrará que URL (se disponível). Configurar o Apache para ter em conta todas essas peculiaridades, mod_rewrite será nosso amigo para o fazer. No meu caso eu ter feito isso se a chamada não é um script php ou uma imagem ou um ficheiro ou css ou javascript tem o sinal "+" vai link.php. Se você tem o sinal mais vai stats.php.

 RewriteEngine on RewriteCond% REQUEST_URI () !^/(.*). php $ RewriteCond% (REQUEST_URI)! ^ / \ /(.*)$ RewriteCond% CSS (REQUEST_URI)! ^ / Js \ /(.*)$ RewriteCond % (REQUEST_URI) !^/(.*) \ + $ RewriteCond% (REQUEST_URI)! ^ / images \ /(.*)$ RewriteRule ^(.+) link.php /? id = $ 1 RewriteCond% (REQUEST_URI) ^ /(.*) \ + $ RewriteRule ^(.+) stats.php /? id = $ 1 

Imagem e design

Para o projeto, ou fazê-lo sozinho ou você é um criativo como eu neguei você baixar um modelo de superchula freecsstamplates.org e se adapta às suas necessidades, não entrar em detalhes.

Crie URLs curtas

O primeiro script da nossa aplicação. Uma forma simples, onde o usuário digita a URL que você quer encurtado e encurtou a apresentar ... integração do sistema de verificação de malware que explicou há poucos dias ;) .

  1. ; URLBase $ = "";
  2. isset ( $_POST [ 'url' ] ) ) { if ( isset ($ ['url _POST'])) (
  3. [ 'url' ] ; = $ _POST [Url '$ url'];
  4. tente (
  5. substr ( $url , 0 , 4 ) != "http" ) if ( substr ($ url, 0, 4)! = "http")
  6. . $url ; $ Url = "http://". $ Url;
  7. GoogleSafeBrowsing ( 'ABQIAAAAQYvf-54bCBMuGY20SeONVxQ236Mc_IjryQBl-W_Repaw3fCykA' , true ) ; $ Classe = GoogleSafeBrowsing novo ('ABQIAAAAQYvf-54bCBMuGY20SeONVxQ236Mc_IjryQBl-W_Repaw3fCykA', true);
  8. -> lookupsFor ( $url ) ; $ $ Nomalware => - lookupsFor classe ($ url);
  9. $nomalware ) { if ($ nomalware) (
  10. ; Htmltitle $ = "";
  11. ( $url ) ; $ Html = file_get_contents ($ url);
  12. $html != "" ) { if ($ html! = "") (
  13. '/(.*)< \/ title>/is' , $html , $matches ) ; preg_match ('/(.*)< \ title> / / é ', $ html, $ matches)
  14. is_array ( $matches ) &amp;&amp; count ( $matches > 0 ) ) if ( is_array ($ matches) & & count ($ matches> 0))
  15. ( $matches [ 1 ] ) ; $ Htmltitle = trim ($ matches [1]);
  16. )
  17. ; $ Query = "SELECT * FROM urls WHERE url = '$ url'";
  18. -> Execute ( $query ) ; R $ = $ conn -> Execute ($ query);
  19. $rs -> recordcount ( ) > 0 ) { if ($ rs -> RecordCount ()> 0) (
  20. -> fields [ 'id' ] ; Id = $ rs -> Campos "[id '];
  21. { Else ()
  22. ; $ Query = "INSERT INTO urls (url, title) VALUES (" $ url "," $ htmltitle ') ";
  23. -> Execute ( $query ) ; R $ = $ conn -> Execute ($ query);
  24. -> insert_id ( ) ; Id = $ conn -> INSERT_ID ();
  25. )
  26. $id ) ; Base = $ base_encode ($ id);
  27. . $base ; URLBase $ = "http://iraurl.me/. $ Base;
  28. { Else ()
  29. ; $ Err = 4;
  30. )
  31. exception $e ) { ) Catch (Exception $ e) (
  32. ; $ Err = 3;
  33. )
  34. )

Nós adicionamos um cheque de pequeno porte. Se a URL que você deseja adicionar já existe, voltamos a mesma URL curta, eu tomei essa decisão, você pode fazer o que quiser. Também obter o título final da URL de referência para a mesma questão de visual simples :P .

Consulta ao longo urls

Temos o nosso URL curta, agora frente aos pedidos eventualmente. Lembre-se que o nosso Apache vai redirecionar a solicitação para link.php? Id = XXXX. Nossa atualizações de script, além disso, as estatísticas de visitas do url.

  1. isset ( $_GET [ 'id' ] ) ) { lang = <pre "php"> if ( isset $ _GET 'id'] [()) (
  2. [ 'id' ] ; BID = $ _GET "[id '];
  3. $idb ) +0 ; $ Id = base_decode ($ BID) 0;
  4. tente (
  5. ; $ Query = select * "de URLs onde id = $ id";
  6. -> Execute ( $query ) ; R $ = $ conn -> Execute ($ query);
  7. $rs -> recordcount ( ) > 0 ) { if ($ rs -> RecordCount ()> 0) (
  8. -> fields [ 'url' ] ; $ Url = $ rs -> Campos '[url'];
  9. [ 'HTTP_REFERER' ] ; @ = $ _SERVER [Referer 'HTTP_REFERER $'];
  10. [ 'HTTP_USER_AGENT' ] ; @ = $ _SERVER [Ua 'HTTP_USER_AGENT $'];
  11. [ 'REMOTE_ADDR' ] ; @ = $ _SERVER [IP 'REMOTE_ADDR $'];
  12. ; Hostreferer $ = "";
  13. preg_match ( '@^(?:http://)?([^/]+)@i' , $referer , $matches ) > 0 ) if ( preg_match (http://'@^(?: )?([^/]+) i ', $ referer, $ matches)> 0)
  14. [ 1 ] ; Hostreferer $ = $ matches [1];
  15. $_SERVER [ 'HTTP_USER_AGENT' ] ) ; Terminal getMarcaModelo $ = ($ 'HTTP_USER_AGENT' _SERVER []);
  16. [ 'marca' ] ; Flag = $ fim "tag ['];
  17. [ 'modelo' ] ; $ Modelo = $ fim "modelo ['];
  18. $ip ) ; $ Temp = getGeoCodeAndPais ($ ip);
  19. [ 'code' ] ; Codpais $ = $ temp ['Código'];
  20. [ 'pais' ] ; $ Country = $ temp ['País'];
  21. $ Query = "INSERT INTO stats (idurl, codpais, referer, ua, o tempo, o país, marca, modelo, hostreferer) VALUES
  22. ($ Id, '$ codpais', '$ referer', '$ ua', now () ', $ country', '$ marca', '$ modelo', '$ hostreferer') ";
  23. -> Execute ( $query ) ; Rs2 = $ conn -> Execute ($ query);
  24. "HTTP/1.x 301 Moved" ) ; cabeçalho ("HTTP/1.x 301 Movido");
  25. "Location: $url" ) ; header ("Location: $ url");
  26. saída ;
  27. { Else ()
  28. "Location: http://iraurl.me/index.php?err=1" ) ; header ("Location: http://iraurl.me/index.php?err=1");
  29. saída ;
  30. )
  31. exception $e ) { ) Catch (Exception $ e) (
  32. "Location: http://iraurl.me/index.php?err=2" ) ; header ("Location: http://iraurl.me/index.php?err=2");
  33. saída ;
  34. )
  35. )
  36. "Location: http://iraurl.me/index.php?err=1" ) ; header ("Location: http://iraurl.me/index.php?err=1");

Como você vê, se a URL não existe index.php redirecionar o usuário com uma mensagem de erro. Vamos precisar de duas funções adicionais, que retornam informações que no país de origem de IP e os dados do terminal do usuário (filme ou web). Não entrarei em detalhes sobre como instalar MaxMind GeoLite País ou WURFL / Tera-WURFL .

  1. $ip ) { getGeoCodeAndPais função ($ ip) (
  2. dirname ( __FILE__ ) . "/geoip/geoip.inc" ) ; require_once ( dirname (__FILE__) ". / GeoIP / geoip.inc");
  3. "/usr/share/GeoIP/GeoIP.dat" ,GEOIP_STANDARD ) ; Gi = $ geoip_open ("/ usr / share / GeoIP / GeoIP.dat" GEOIP_STANDARD)
  4. $gi , $ip ) ; $ Codpais = geoip_country_code_by_addr ($ gi, $ ip);
  5. $gi , $ip ) ; $ Country = geoip_country_name_by_addr ($ gi, $ ip);
  6. ) ; geoip_close ($ gi);
  7. ( "pais" => $pais , "code" => $codpais ) ; retornar array ("país" => $ país, "código" => $ codpais)
  8. )
  9. $ua ) { GetCapabilities função ($ ua) (
  10. dirname ( __FILE__ ) . "/Tera-WURFL/TeraWurfl.php" ) ; require_once ( dirname (__FILE__). "/ Tera-WURFL/TeraWurfl.php");
  11. TeraWurfl ( ) ; $ WurflObj TeraWurfl = new ();
  12. -> GetDeviceCapabilitiesFromAgent ( $ua ) ; Matched $ = $ wurflObj -> GetDeviceCapabilitiesFromAgent ($ ua);
  13. -> capabilities ; $ Telefone = $ wurflObj -> Recursos;
  14. ; $ Telefone de retorno;
  15. )

Estatística

A teoria é a mesma. Se houver a URL que carregar os dados, se não redirecionar para o lar. No nosso caso, usamos o componente guias JqueryUI para organizar os diferentes tipos de dados que podem ver e adicione os botões para exportar para Excel e PDF.

  1. ( $_GET [ 'id' ] , 0 , strlen ( $_GET [ 'id' ] ) -1 ) ; $ BID = substr $ _GET 'id'] [(, 0, strlen ($ ["id _GET ']) -1);
  2. $idb ) +0 ; $ Id = base_decode ($ BID) 0;
  3. ; $ Query = select * "de URLs onde id = $ id";
  4. -> Execute ( $query ) ; R $ = $ conn -> Execute ($ query);
  5. $rs -> recordcount ( ) > 0 ) { if ($ rs -> RecordCount ()> 0) (
  6. . $idb ; $ URLBase = "http://iraurl.me/. $ BID;
  7. -> fields [ 'url' ] ; $ Url = $ rs -> Campos '[url'];
  8. -> fields [ 'id' ] ; Id = $ rs -> Campos "[id '];
  9. -> fields [ 'titulo' ] ; Htmltitulo $ = $ rs -> Campos '[título'];
  10. $htmltitulo == "" ) if ($ htmltitulo == "")
  11. ; Htmltitulo = $ url;
  12. ; $ Query = select count (*) a partir de estatísticas WHERE NREGS como idurl = $ id ";
  13. -> Execute ( $query ) ; R $ = $ conn -> Execute ($ query);
  14. -> fields [ 'nregs' ] ; R $ = $ cliques -> Campos ['NREGS'];
  15. { Else ()
  16. "Location: http://iraurl.me/index.php?err=1" ) ; header ("Location: http://iraurl.me/index.php?err=1");
  17. saída ;
  18. )

Muito simples.

stats1 De artículo a proyecto explicado paso a paso: acorta URLs con IraUrl.me

A parte difícil é mostrar os gráficos com FusionCharts. Para cada um que adicionar algum código html:

  1. <div id="chartClicks"> </ div>
  2. <script type="text/javascript">
  3. var = Mychart FusionCharts novo ("images/Charts/FCF_Column3D.swf", "idChartClicks", "430", "400", "0", "1");
  4. myChart.setDataURL (escape ("xml.php? cli t = & id = '. $ BID .'"));
  5. myChart.setTransparent (true);
  6. myChart.render (chartClicks ");
  7. </ Script>

Xml.php O script irá retornar os dados formatados para FusionCharts. Por exemplo:

  1. $ Query = "SELECT DAY (horas), dia, mês (tempo) como mês e ano (tempo) do ano, count (*) como nclicks
  2. Estatísticas da
  3. WHERE id = $ idurl
  4. grupo, por ano, mês, dia
  5. ordenar por hora ";
  6. -> Execute ( $query ) ; R $ = $ conn -> Execute ($ query);
  7. ; $ Xml = 'legenda do gráfico <= "Cliques" rotateNames = "1 xAxisName =" Dia yAxisName = "Cliques" showNames = "1 decimalPrecision =" 0 formatNumberScale = "0 chartLeftMargin" = "5 chartRightMargin" = "5 "chartTopMargin =" 0 "> ';
  8. $r = $rs -> fetchrow ( ) ) { while ($ r = $ rs -> fetchRow ()) (
  9. . $r [ 'dia' ] . "/" . $r [ 'mes' ] . "/" . $r [ 'ano' ] . '" value="' . $r [ 'nclicks' ] . '" color="#A1A1A1" />' ; $ Xml .= "<Nome do conjunto =" ". $ [" Dia R "]." / R $ ['meses'. "]." / R $ ['ano'. "]." Value = "" . $ r ['nclicks']. "color =" # A1A1A1 "/>';
  10. )
  11. ; $ Xml .= '</> gráfico;

Dou apenas um exemplo, montar vós descanso em seu próprio :) .

Decifrando URLs curtas

Todos os sistemas para encurtar URL's estão trabalhando como inapropriada neste artigo, fazer um redirecionamento HTTP/301 para a URL original.

A partir da URL curta, sabemos que a URL original simplesmente redireciona o seguinte ele faz. Muito simples com PHP e também serve para incorporá-lo em nosso malware API , evitar problemas potenciais com a URL final.

  1. $url ) get_web_page função ($ url)
  2. (
  3. ( 'http' => array ( $ Options = array ('http' => array (
  4. , 'User_agent =' spider> '
  5. , "Max_redirects '=> 10,
  6. , 'Timeout' => 120,
  7. ));
  8. ( $options ) ; $ Contexto = stream_context_create ($ options);
  9. ( $url , false , $context ) ; $ Page = @ file_get_contents ($ url, false, $ contexto);
  10. ( ) ; $ Resultado = array ();
  11. $page != false ) if ($ page! = false)
  12. 'content' ] = $page ; '[Conteúdos] Resultado = $ page;
  13. ! isset ( $http_response_header ) ) else if (! isset ($ http_response_header))
  14. ; // Bad url, timeout return null; / Bad url / timeout
  15. / / Salvar o cabeçalho
  16. 'header' ] = $http_response_header ; «[Cabeçalho« Resultado] = $ http_response_header;
  17. / / Pega o último * * código de status HTTP
  18. ( $http_response_header ) ; $ Nline = count ($ http_response_header)
  19. $i = $nLines -1 ; $i >= 0 ; $i -- ) for ($ i = $ nLine -1; $ i> = 0, $ i -)
  20. (
  21. [ $i ] ; $ $ Http_response_header = linha [$ i];
  22. strncasecmp ( "HTTP" , $line , 4 ) == 0 ) if ( strncasecmp ("HTTP" $ linha, 4) == 0)
  23. (
  24. ( ' ' , $line ) ; Resposta $ = explode ('', $ linha);
  25. 'http_code' ] = $response [ 1 ] ; «[Http_code '] Resultado = $ resposta [1];
  26. break;
  27. )
  28. )
  29. ; $ Resultado de retorno;
  30. )
  31. ; $ Url = "";
  32. isset ( $_POST [ 'url' ] ) ) { if ( isset ($ ['url _POST'])) (
  33. [ 'url' ] ; = $ _POST [Url '$ url'];
  34. $url ) ; $ Dados = get_web_page ($ url);
  35. $datos ) { if ($ dados) (
  36. [ 'header' ] ; Headers = $ dados "header ['];
  37. ( $url ) ; Urls $ = array ($ url);
  38. $headers as $head ) { foreach ($ $ headers como cabeça) (
  39. ( " " , $head ) ; $ Temp = explode "," $ (cabeça);
  40. strtolower ( $temp [ 0 ] ) == "location:" ) { if ( strtolower ($ temp [0]) == "localização") (
  41. = $temp [ 1 ] ; $ Urls [] = $ temp [1];
  42. )
  43. )
  44. ; Htmltitle $ = "";
  45. '/(.*)< \/ title>/is' , $datos [ 'content' ] , $matches ) ; preg_match ('/(.*)< \ title> / / é "[" conteúdo "dados], $ matches);
  46. is_array ( $matches ) &amp;&amp; count ( $matches > 0 ) ) if ( is_array ($ matches) & & count ($ matches> 0))
  47. ( $matches [ 1 ] ) ; $ Htmltitle = trim ($ matches [1]);
  48. )
  49. )

Lá, em US $ urls temos a lista de URLs que estão pulando até o final.

descifrar2 De artículo a proyecto explicado paso a paso: acorta URLs con IraUrl.me

Api

Hoje tudo tem que ser Api . Para estatística é muito simples, o verdadeiro XML que geramos para consumir FusionCharts permite que os clientes externos para alimentá-lo. Para criar URL é curta distância, basta criar um arquivo api.php:

  1. isset ( $_GET [ 'url' ] ) ) { if (isset (se _GET ['URL'] $)) (
  2. $_GET [ 'url' ] ) ; Url = urldecode ($ _GET 'url'] [$);
  3. tente (
  4. ; Htmltitle $ = "";
  5. substr ( $url , 0 , 4 ) != "http" ) if (substr ($ url, 0, 4)! = "http")
  6. . $url ; $ Url = "http://". $ Url;
  7. $url ) ; $ = File_get_contents Html ($ url);
  8. $html != "" ) { if ($ html! = "") (
  9. title>/is' , $html , $matches ) ; preg_match ('/(.*)< \ title> / / é ', $ html, $ matches);
  10. is_array ( $matches ) &amp;&amp; count ( $matches > 0 ) ) if (is_array ($ matches) & & count ($ matches> 0))
  11. $matches [ 1 ] ) ; $ Htmltitle = trim ($ matches [1]);
  12. )
  13. ; $ Query = "SELECT * FROM urls WHERE url = '$ url'";
  14. ->Execute ( $query ) ; R $ = $ conn -> Execute ($ query);
  15. $rs ->recordcount ( ) > 0 ) { if ($ rs -> RecordCount ()> 0) (
  16. ->fields [ 'id' ] ; Id = $ rs -> Campos "[id '];
  17. { Else ()
  18. ; $ Query = "INSERT INTO urls (url, title) VALUES ('$ url', '$ htmltitle')";
  19. ->Execute ( $query ) ; R $ = $ conn -> Execute ($ query);
  20. ->insert_id ( ) ; Id = $ conn -> INSERT_ID ();
  21. )
  22. $id ) ; Base = $ base_encode ($ id);
  23. . $base ; URLBase $ = "http://iraurl.me/. $ Base;
  24. ; echo $ URLBase;
  25. exception $e ) { ) Catch (Exception $ e) (
  26. ; echo "ERRO";
  27. )
  28. )

É isso aí. Não se esqueça de também integrar com o sistema de malware.

Conclusões

Bem, este material para quê?. Tão simples, assim você pode ver que hoje a tecnologia é acessível a todos, é simples e rápido para criar um projeto na Web, em cada esquina, a tecnologia não é importante, o que realmente importa é o mover este produto de tecnologia para retornar e fazer um lucro com isso.

Eu tenho o meu projeto em execução superchulo só me custou cerca de 15 horas. Eu coloquei alguns Adsense aqui e ali. E agora? Para esperar as pessoas a entrar e fazer-me um milionário? :P É muito mais complicado do que isso, como todos sabem, primeiro você tem que ter uma grande massa de usuários que dá movimento ao projeto e então você tem que obter a maioria deles são pessoas normais, as pessoas não técnicas, os usuários que não pagam por nada ou clique na publicidade :P .

Hoje, a Internet, como em qualquer negócio, marketing e técnicas de vendas são muito mais importantes do que a tecnologia em si, é difícil admitir, mas é verdade. Não adianta ter o melhor produto do mundo inteiro, se você levar as pessoas a usá-lo e deixar o dinheiro, é claro. Se você tiver as habilidades certas para movimentar o negócio, não se preocupe, a tecnologia dá-lhe qualquer sócio de uma pequena taxa, mas coloquei nas mãos de uma outra estratégia de vendas de todo o seu negócio não é tão clara não é?.

Eu espero que você servir algo que o artigo. Eu queria mostrar basicamente como usar algumas bibliotecas que você pode obter gratuitamente pode realmente fazer algo útil e funcional, com muito pouco esforço. Claro que vocês colocaram para fora alguma idéia.

Desculpem-me por o rolo :P No final me custou mais a escrever o artigo para implementá-lo.

Se você tem revelado útil este artigo ... Compartilhe!