Un paio di settimane fa ho trovato la necessità di utilizzare uno di questi sistemi là fuori per abbreviare 's. URL Avevo bisogno di inviare un SMS indirizzo e ha dovuto prendere la minor quantità possibile di quel personaggio al fine di ottimizzare il testo del messaggio. Mentre lui usato ingegno pensato di utilizzare un sistema di numerazione base36 per ridurre in modo esponenziale il numero di caratteri nel reindirizzamento. Sarebbe quindi un articolo sui vantaggi dei diversi sistemi di numerazione decimale per alcuni progetti, ma è finito per diventare un progetto completo. Quando stavo iniziando la spiegazione teorica ho pensato, perché no? Perché non mostrare come semplice e veloce che è possibile montare qualsiasi cosa su Internet oggi?

Così, dopo 15 ore di lavoro vi presento IraUrl.me , un accorciamento del URL nello stile di TinyUrl o Bit.ly . E mi è costato di più a scrivere l'articolo per farlo accadere, eh divertente?. In realtà l'applicazione mi stava preparando altre cose che stavano accadendo sarebbe interessante da guidare, così il primo otto ore o poco più, sono diventati 15.

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

La teoria

Per coloro che non sanno, un accorciamento di URL è basato sulla ricerca di un nome di dominio come short possibile, nonché redirect HTTP 301 URL 's. other Il trucco è quello di ottimizzare i parametri che aggiungere alla URL di essere il più breve possibile, non vogliono penalizzare noi la brevità del dominio.

Come poi accorciare 's URL? Molto più facile di quanto sembri come te e sicuramente sarebbe successo. Dobbiamo solo uno database in cui noi continuiamo ad aggiungere record a uno come table are creating nuovo URL della breve. This tabella è uno campo Contatore, la chiave della tabella, that for each URL restituisce uno nuovo identificatore univoco, che ogni direzione potrebbero essere resi accessibili nel solito modo:

http://dominio.com/1

http://dominio.com/1000000

Questo è esattamente l'idea, tutto ciò che facciamo è cambiare l'identificatore di una questione di base10 (quella dei nostri metriche) a base36 o base62 nel mio caso. Altri sistemi di numerazione conosciuti sono i esadecimale (base 16 codifiche) e base64 .

Bene, hai parlato in cinese. Che cosa è questo? Vediamo.

Su basi di numerazione

Il sistema decimale utilizza dieci cifre (da cui il decimale :P ) Per formare tutte le possibili combinazioni di numeri. Quello che già sappiamo, dai. Gli usi due cifre binarie (0 e 1), 16 esadecimale (0 .. 9ABCDE), base36, come indica il nome, trentasei (il nono .. 0 .. z) e utilizzare i 62 base62 cifre comprendono i numeri 0-9 e le lettere dalla A alla Z nel caso in cui (il 9 .. 0 .. zA .. Z). Ecco alcuni esempi:

Binario Decimale Esadecimale Base36 Base62
0 0 0 0 0
1 1 1 1 1
10 2 2 2 2
1010 10 A a a
1100100 100 64 2s 1c
1000000 F4240 lfls 4c92
10000000 989 680 5yc1s FXsk

Potete vedere a colpo d'occhio, come il numero aumenta, maggiore sarà la base sarà di gestire un minor numero di cifre. I numeri, dopo tutto, continuano tra tutte le combinazioni posibles.Así cifre, a seconda della base e il numero di cifre, il più grande numero rappresentabile rappresentabili sarebbe:

No. cifre
Decimale Base62
1 10 62
2 100 3.844
3 1000 238 328
4 10 000 14776336
5 100 000 916132832
6 1000000 56800235584
7 10000000 3521614606208
8 100000000 218340105584896
9 1000000000 13537086546263552

O che cosa è la stessa, base (numero di cifre), 62 9-10 settembre. Spero che tu capisca la teoria. A titolo di curiosità:

Decimale: 10000000000000000000000

Base62: 36aHo5IWaicak

La questione adesso sarebbe, perché Base62 e Base64, per esempio, meglio conosciuto? Semplice, perché oltre alle 62 caratteri di Base62, Base64 utilizza due supplementari, di solito + e / = aggiunta, il che rende la catena Il sito non sicuro, cioè, i caratteri speciali dovrebbe essere tradotta in non dare problemi di trasporto, avremmo perdere i benefici della nostra encryption breve. Il 62 caratteri utilizzati in Base62 sono completamente sicuri, solo lettere (maiuscole e minuscole) e numeri.

Sapere come funziona il sistema e vedremo come creare la nostra applicazione. Ovviamente non vi dico tutto step by step, perché altrimenti ci vuole molto più tempo per scrivere l'articolo per rendere l'applicazione, io metterò solo le cose che sono più importanti.

Per codificare / decodificare base10 per base62 utilizzerà queste librerie:

  1. $dec , $base , $digits = FALSE ) { funzione ($ dicembre, $ base, $ cifre dec2base = FALSE) (
  2. $base < 2 or $base > 256 ) { if ($ base <2 o $ base> 256) (
  3. "Invalid Base: .$base \n " ) ; die ("Invalid Base:. $ base \ n");
  4. )
  5. 0 ) ; bcscale (0);
  6. ; Value $ = ";
  7. ! $digits ) { if ($ cifre) (
  8. $base ) ; Cifre $ = cifre ($ base);
  9. )
  10. $dec > $base1 ) { while ($> $ dicembre base - 1) (
  11. ( $dec , $base ) ; Resto $ = bcmod ($ dicembre, $ base);
  12. ( $dec , $base ) ; $ Dec = bcdiv ($ dicembre, $ base);
  13. [ $rest ] . $value ; $ Valore = $ numeri [] $ riposo. $ Valore;
  14. )
  15. [ intval ( $dec ) ] . $value ; $ Valore = $ cifre [ intval ($ dec)]. $ valore;
  16. string ) $value ; ritorno (string) $ valore;
  17. )
  18. $value , $base , $digits = FALSE ) { funzione base2dec ($ valore, $ base, $ numeri = FALSE) (
  19. $base < 2 or $base > 256 ) { if ($ base <2 o $ 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 ) ; $ Valore = strtolower ($ valore);
  25. )
  26. ! $digits ) { if ($ cifre) (
  27. $base ) ; Cifre $ = cifre ($ base);
  28. )
  29. ( $value ) ; $ Size = strlen ($ valore);
  30. ; $ Dec = '0 ';
  31. $loop = 0 ; $loop < $size ; $loop ++ ) { for ($ loop = 0; $ loop <$ dimensione, ciclo $ + +) (
  32. ( $digits , $value [ $loop ] ) ; Elemento $ = strpos ($ cifre, $ valore [$ loop]);
  33. ( $base , $size - $loop -1 ) ; Potenza = $ bcpow ($ base, $ dimensione - $ loop -1);
  34. ( $dec , bcmul ( $element , $power ) ) ; $ Dec = bcadd ($ dec, bcmul ($ elemento, $ componente));
  35. )
  36. string ) $dec ; ritorno (string) $ dicembre;
  37. )
  38. $base ) { cifre funzione ($ base) (
  39. $base < 64 ) { if ($ base <64) (
  40. ( '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_' , 0 , $base ) ; ritorno 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 ) ; ritorno substr ("\ 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 il 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 la \ 8 x 8 ter \ x 8c \ x 8 D \ 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 il 9 \ x 9 ter \ x 9c \ x 9 D \ x 9e \ x 9 F \ x a0 \ x a1 \ x a2 \ x a3 \ x a4 \ x a5 \ x a6 \ x a7 \ x a8 \ x a9 \ AA \ ab x \ x c \ x d \ x \ x ae af \ x b0 \ x B1 \ B2 x \ x b3 \ b4 x \ x b5 \ b6 x \ x b7 \ x a8 \ x b9 \ x ba \ bb x \ x bc \ bd \ x essere x \ x bf \ x c0 \ c1 x \ x c2 \ x c3 \ c4 x \ x c5 \ x c6 \ x c7 \ x c8 \ x c9 \ x CA \ cb x \ x cc \ x \ cd x \ ce x cf \ x d0 \ x d1 \ x d2 \ x d3 \ x d4 \ x d5 \ x d6 \ x d7 \ d8 x \ x d9 \ x\ x \ db x dc \ x \ gg x \ x \ x df e0 \ x e1 \ x e2 \ x e3 \ e4 x \ x E6 x \ x e7 \ x e8 \ x e9 \ x EA \ x EB x \ ce \ x ed x ee \ \ \ e5 x EF \ x f0 \ x f1 \ x f2 \ f3 x \ x f4 \ x f5 \ f7 \ f8 x \ x f9 \ x F \ x fb x k \ x \ x fd \ \ fede x \ x f6 x ff ", 0, $ base);
  43. )
  44. )
  45. $value ) { funzione base_encode ($ valore) (
  46. base2dec ( $value , 256 ) , 62 ) ; dec2base return (base2dec ($ valore, 256), 62);
  47. )
  48. $value ) { funzione base_decode ($ valore) (
  49. base2dec ( $value , 62 ) , 256 ) ; dec2base return (base2dec ($ value, 62), 256);
  50. )

Le ultime due funzioni sono quelle usate per le conversioni.

Pacchetti e biblioteche:

Inoltre:

  • Un dominio e hosting di ospitare (6 €).
  • PHP e MySQL (non obbligatorio, si può fare con qualsiasi tecnologia).
  • 15 ore del vostro tempo :P .

Struttura del Sito

Qualsiasi rispettando progetto web self should cominciare col descrivere quello che vogliamo mostrare i nostri visitatori, dobbiamo raccogliere tutte le idee, decidere nell'interesse della verità, si consideri come saranno disponibili nel frontend e terminano con una mappa del sito che ci dice il flusso per continuare a lavorare. Questa è la nostra:

mapaWebIraUrl1 De artículo a proyecto explicado paso a paso: acorta URLs con IraUrl.me Quando un utente si reca in uno dei nostri URL breve davvero essere l'inoltro della richiesta http script all'interno di una tassa di rendere l'intero processo, link.php nel mio caso.

Per visualizzare le statistiche per un URL che mi piaceva il sistema di bit.ly , quindi la copia :P . L'aggiunta di un "+" alla fine della URL breve, invece di saltare alla direzione lungo le statistiche dimostrano. Ciò avviene, come nel caso precedente, portando ad un altro script internamente, stats.php.

Se l'ID che si intende utilizzare per saltare per l'url lunga o visualizzare statistiche lì, nuovamente a index.php per visualizzare un messaggio di errore come "L'URL non esiste."

Il dominio

Ovviamente dobbiamo trovare un nome di dominio più breve possibile, la maggior parte sono già occupati, ma guardando e guardando TLD 's strano che puoi trovare qualcosa. Ho scelto uno. Me perché ha un meno di un. Com :) e non costa ciò che è a. :P .

La banca dati

Molto semplice, solo due tabelle di un tenere gli URL generati e altre statistiche di accesso ad essi.

  1. CREATE TABLE IF NOT EXISTS `URL` (
  2. 20 ) NOT NULL auto_increment, `Id` bigint (20) NOT NULL auto_increment,
  3. ) NOT NULL, `URL` varchar (500) NOT NULL,
  4. ) NOT NULL, `Titolo` varchar (255) NOT NULL,
  5. ` ) PRIMARY KEY (`id`)
  6. MyISAM  DEFAULT CHARSET= latin1; ) ENGINE = MyISAM DEFAULT CHARSET = latin1;
  7. CREATE TABLE IF NOT EXISTS `stats` (
  8. 20 ) NOT NULL auto_increment, `Id` bigint (20) NOT NULL auto_increment,
  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. »Ore` datetime NOT NULL,
  15. ) NOT NULL, »PAESE` varchar (255) NOT NULL,
  16. ) NOT NULL, `Marca` varchar (255) NOT NULL,
  17. ) NOT NULL, `Modello` varchar (255) NOT NULL,
  18. ` ) , PRIMARY KEY (`id`)
  19. Idurl `` KEY (`idurl`, `ora`)
  20. MyISAM  DEFAULT CHARSET= latin1; ) ENGINE = MyISAM DEFAULT CHARSET = latin1;

Configurazione di Apache

Come abbiamo detto che vogliamo che quando qualcuno va a tutte le url del nostro sito tipo

http://tudominio.com/prueba3

E reindirizzare internamente per link.php script che sarà responsabile per l'elaborazione della richiesta. Analogamente, se qualcuno visita

http://tudominio.com/prueba3+

statistiche mostrano che l'URL (se disponibile). Configurare Apache per tener conto di tutte queste peculiarità, mod_rewrite sarà il nostro amico per farlo. Nel mio caso ho fatto che se la chiamata non è uno script PHP o un'immagine o un file o un css o javascript è il segno "+" sta per link.php. Se hai il segno "+" andrà stats.php.

 RewriteEngine su RewriteCond% (REQUEST_URI) !^/(.*). php $ RewriteCond% (REQUEST_URI)! ^ / Css \ /(.*)$ RewriteCond% (REQUEST_URI)! ^ / J \ /(.*)$ RewriteCond % (REQUEST_URI) !^/(.*) \ + $ RewriteCond% (REQUEST_URI)! ^ / images \ /(.*)$ RewriteRule ^(.+) / link.php? id = 1 RewriteCond% $ (REQUEST_URI) ^ /(.*) \ + $ RewriteRule ^(.+) / stats.php? id = $ 1 

Di immagine e design

Per la progettazione, o fai da te o tu are un creativo come ho negato di scaricare un modello di superchula freecsstamplates.org and adatta al vostro bisogno, non non andare nei dettagli.

Creare url brevi

Il primo script della nostra applicazione. Una forma semplice in cui l'utente inserisce la URL che si desidera accorciato e ridotto a presentare ... l'integrazione con il sistema di controllo del malware , che ha spiegato alcuni giorni fa ;) .

  1. ; URLBase $ = "";
  2. isset ( $_POST [ 'url' ] ) ) { if ( isset ($ ['url _POST'])) (
  3. [ 'url' ] ; Url = $ _POST ['$ url'];
  4. prova (
  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 nuovo ('ABQIAAAAQYvf-54bCBMuGY20SeONVxQ236Mc_IjryQBl-W_Repaw3fCykA', true);
  8. -> lookupsFor ( $url ) ; Nomalware $ = $ classe - lookupsFor> ($ 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 URL dove url = '$ url';"
  18. -> Execute ( $query ) ; $ Rs = $ conn -> Execute ($ query);
  19. $rs -> recordcount ( ) > 0 ) { if ($ rs -> RecordCount ()> 0) (
  20. -> fields [ 'id' ] ; Id = $ rs -> campi ['id'];
  21. { Else ()
  22. ; $ Query = inserire "nella URL (url, titolo) VALUES ('$ url', '$ htmltitle')";
  23. -> Execute ( $query ) ; $ Rs = $ 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. )

Abbiamo aggiunto un piccolo controllo. Se l'URL che si desidera aggiungere esiste già, si ritorna lo stesso URL breve, ho preso questa decisione, si può fare quello che vuoi. Anche ottenere il titolo del URL finale di rinvio alla stessa questione di semplice visiva :P .

Rinvio alla URL lunghi

Noi abbiamo la nostra breve URL, ora in avanti le richieste ad esso alla fine. Ricordate che il nostro Apache sta per reindirizzare la richiesta di link.php? Id = XXXX. Il nostro script aggiorna, inoltre, le statistiche delle visite del url.

  1. isset ( $_GET [ 'id' ] ) ) { lang = <pre "php"> if ( isset $ _GET ['id'] ()) (
  2. [ 'id' ] ; IDB $ = $ _GET 'id ['];
  3. $idb ) +0 ; $ Id = base_decode ($ IDB) 0;
  4. prova (
  5. ; $ Query = "select * from URL dove id = $ id";
  6. -> Execute ( $query ) ; $ Rs = $ conn -> Execute ($ query);
  7. $rs -> recordcount ( ) > 0 ) { if ($ rs -> RecordCount ()> 0) (
  8. -> fields [ 'url' ] ; $ Url = $ rs -> campi ['url'];
  9. [ 'HTTP_REFERER' ] ; Referer = @ $ _SERVER ['HTTP_REFERER $'];
  10. [ 'HTTP_USER_AGENT' ] ; Ua = @ $ _SERVER ['HTTP_USER_AGENT $'];
  11. [ 'REMOTE_ADDR' ] ; Ip = @ $ _SERVER ['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 ($ _SERVER ['HTTP_USER_AGENT']);
  16. [ 'marca' ] ; Bandiera $ = $ fine 'tag ['];
  17. [ 'modelo' ] ; Modello $ = $ fine modello '['];
  18. $ip ) ; $ Temp = getGeoCodeAndPais ($ ip);
  19. [ 'code' ] ; Codpais $ = $ temp 'codice ['];
  20. [ 'pais' ] ; Paese $ = $ temp 'paese ['];
  21. $ Query = inserisce "in stats (idurl, codpais, referer, UA, tempo, paese, marca, modello, hostreferer) VALUES
  22. Id, '$ codpais', '$ referer', '$ ua', now (), '$ paese' $, '$ marca (', '$ modello', '$ hostreferer') ";
  23. -> Execute ( $query ) ; Rs2 $ = $ conn -> Execute ($ query);
  24. "HTTP/1.x 301 Moved" ) ; header ("HTTP/1.x 301 Spostato");
  25. "Location: $url" ) ; header ("Location: $ url");
  26. uscita ;
  27. { Else ()
  28. "Location: http://iraurl.me/index.php?err=1" ) ; header ("Location: http://iraurl.me/index.php?err=1");
  29. uscita ;
  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. uscita ;
  34. )
  35. )
  36. "Location: http://iraurl.me/index.php?err=1" ) ; header ("Location: http://iraurl.me/index.php?err=1");

Come si vede, se l'URL non esiste index.php reindirizzare l'utente con un messaggio di errore. Ci sarà bisogno di due funzioni supplementari, che ci restituiscono le informazioni nel paese di origine di IP e dati del terminale utente (film o web). Senza entrare nei dettagli sull'installazione MaxMind GeoLite Paese o WURFL / Tera-WURFL .

  1. $ip ) { getGeoCodeAndPais funzione ($ 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 ) ; Paese $ = geoip_country_name_by_addr ($ gi, $ ip);
  6. ) ; geoip_close ($ gi);
  7. ( "pais" => $pais , "code" => $codpais ) ; ritorno array ("paese" => $ paese, "codice" => $ codpais)
  8. )
  9. $ua ) { GetCapabilities funzione ($ ua) (
  10. dirname ( __FILE__ ) . "/Tera-WURFL/TeraWurfl.php" ) ; require_once ( dirname (__FILE__) ". / Tera-WURFL/TeraWurfl.php");
  11. TeraWurfl ( ) ; $ WurflObj TeraWurfl = new ();
  12. -> GetDeviceCapabilitiesFromAgent ( $ua ) ; Abbinato $ = $ wurflObj -> GetDeviceCapabilitiesFromAgent ($ ua);
  13. -> capabilities ; $ Telefono = $ wurflObj - Capacità>;
  14. ; return $ telefono;
  15. )

Statistica

La teoria è la stessa. Se vi è l'URL carichiamo i dati, se non reindirizzare la casa. Nel nostro caso si utilizza il componente schede JqueryUI to organizzare i tipi differenti di dati che consente di visualizzare e add i buttons per esportare in Excel e PDF.

  1. ( $_GET [ 'id' ] , 0 , strlen ( $_GET [ 'id' ] ) -1 ) ; IdB $ = substr ($ _GET ['id'], 0, strlen ($ ['id _GET']) -1);
  2. $idb ) +0 ; $ Id = base_decode ($ IDB) 0;
  3. ; $ Query = "select * from URL dove id = $ id";
  4. -> Execute ( $query ) ; $ Rs = $ conn -> Execute ($ query);
  5. $rs -> recordcount ( ) > 0 ) { if ($ rs -> RecordCount ()> 0) (
  6. . $idb ; = $ URLBase http://iraurl.me/ ". $ Dell'IDB;
  7. -> fields [ 'url' ] ; $ Url = $ rs -> campi ['url'];
  8. -> fields [ 'id' ] ; Id = $ rs -> campi ['id'];
  9. -> fields [ 'titulo' ] ; Htmltitulo $ = $ rs -> campi ['title'];
  10. $htmltitulo == "" ) if ($ htmltitulo == "")
  11. ; Htmltitulo $ = $ url;
  12. ; $ Query = "select count (*) da statistiche DOVE NREGS come idurl = $ id";
  13. -> Execute ( $query ) ; $ Rs = $ conn -> Execute ($ query);
  14. -> fields [ 'nregs' ] ; Clic $ = $ rs -> campi ['NREGS'];
  15. { Else ()
  16. "Location: http://iraurl.me/index.php?err=1" ) ; header ("Location: http://iraurl.me/index.php?err=1");
  17. uscita ;
  18. )

Molto semplice.

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

La parte difficile è quello di mostrare il grafico con FusionCharts. Per ciascuno di essi si aggiungono alcuni codice html:

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

Xml.php Lo script restituirà i dati formattati per FusionCharts. Per esempio:

  1. $ Query = "SELECT giorno (ore) come il giorno, MESE (ora) come mese, anno (ora) come l'anno, count (*) come nclicks
  2. statistiche dal
  3. WHERE id = $ idurl
  4. gruppo per anno, mese, giorno
  5. ordina per tempo ";
  6. -> Execute ( $query ) ; $ Rs = $ conn -> Execute ($ query);
  7. ; Xml $ = 'caption grafico <= "Click" rotateNames = "1" xAxisName = "yAxisName Day" = "Click" 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 .= <"set name =" '. $ [' Giorno R ']. "/ $ R [' mese '.]". "/ $ R [' year '.]".' "Value =" ' . $ r ['nclicks'] '. "color =" # A1A1A1 "/>';
  10. )
  11. ; $ Xml .= '</> grafico';

Ho un solo esempio, il resto si guida da sola :) .

Decifrare URL brevi

Tutti i sistemi per accorciare URL stanno lavorando come non appropriato in questo articolo, fare un redirect HTTP/301 all'URL originale.

Dalla breve URL sappiamo che cosa l'URL originale reindirizza semplicemente a seguito della lo fa. Molto semplice con PHP e serve anche ad esso l'integrazione nel nostro malware API , evitare potenziali problemi connessi con l'URL finale.

  1. $url ) get_web_page funzione ($ url)
  2. (
  3. ( 'http' => array ( $ Opzioni = array ('http' => array (
  4. , 'User_agent' = 'ragno>'
  5. , 'Max_redirects' => 10,
  6. , 'Timeout' => 120,
  7. ));
  8. ( $options ) ; $ Context = stream_context_create ($ opzioni);
  9. ( $url , false , $context ) ; $ Page = @ file_get_contents ($ url, false, $ contesto);
  10. ( ) ; $ Risultato = array ();
  11. $page != false ) if ($ pagina! = false)
  12. 'content' ] = $page ; [Risultato 'contenuto $'] = $ pagina;
  13. ! isset ( $http_response_header ) ) else if (! isset ($ http_response_header))
  14. ; // Bad url, timeout ritorno null; / / url Bad, timeout
  15. / / Salva l'intestazione
  16. 'header' ] = $http_response_header ; '[Header' Risultato] = $ http_response_header;
  17. / / Recupera l'ultima * * codice di stato 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 ] ; $ Riga = $ http_response_header [$ i];
  22. strncasecmp ( "HTTP" , $line , 4 ) == 0 ) if ( strncasecmp ("HTTP", $ linea, 4) == 0)
  23. (
  24. ( ' ' , $line ) ; Risposta = $ esplodere '', $ line ();
  25. 'http_code' ] = $response [ 1 ] ; [Risultato 'http_code $'] = $ risposta [1];
  26. break;
  27. )
  28. )
  29. ; return $ risultato;
  30. )
  31. ; $ Url = "";
  32. isset ( $_POST [ 'url' ] ) ) { if ( isset ($ ['url _POST'])) (
  33. [ 'url' ] ; Url = $ _POST ['$ url'];
  34. $url ) ; $ Dati = get_web_page ($ url);
  35. $datos ) { if ($ data) (
  36. [ 'header' ] ; $ Intestazioni = $ dati 'header ['];
  37. ( $url ) ; $ Urls = array ($ url);
  38. $headers as $head ) { foreach ($ intestazioni come testa di $) (
  39. ( " " , $head ) ; $ Temp = esplodere "", $ capo ();
  40. strtolower ( $temp [ 0 ] ) == "location:" ) { if ( strtolower ($ temp [0]) == "location") (
  41. = $temp [ 1 ] ; $ Urls [] = $ temp [1];
  42. )
  43. )
  44. ; Htmltitle $ = "";
  45. '/(.*)< \/ title>/is' , $datos [ 'content' ] , $matches ) ; preg_match ('/(.*)< \ / title> / è ', [' content 'dati] $, $ 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ì, a $ url, abbiamo la lista di URL che stanno saltando fino alla finale.

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

Api

Oggi tutto deve essere Api . Per le statistiche è molto semplice, l'attuale XML che si generano a consumare FusionCharts permette ai clienti esterni per la sua alimentazione. Per creare l'URL 's breve distanza, è sufficiente creare un file api.php:

  1. isset ( $_GET [ 'url' ] ) ) { if (isset ($ ['url _GET'])) (
  2. $_GET [ 'url' ] ) ; $ Url = urldecode ($ _GET ['url']);
  3. prova (
  4. ; Htmltitle $ = "";
  5. substr ( $url , 0 , 4 ) != "http" ) if (substr ($ url, 0, 4)! = "http")
  6. . $url ; $ Url = "http://". $ Url;
  7. $url ) ; $ Html = file_get_contents ($ 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 URL dove url = '$ url';"
  14. ->Execute ( $query ) ; $ Rs = $ conn -> Execute ($ query);
  15. $rs ->recordcount ( ) > 0 ) { if ($ rs -> RecordCount ()> 0) (
  16. ->fields [ 'id' ] ; Id = $ rs -> campi ['id'];
  17. { Else ()
  18. ; $ Query = inserire "nella URL (url, titolo) VALUES ('$ url', '$ htmltitle')";
  19. ->Execute ( $query ) ; $ Rs = $ 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 "errore";
  27. )
  28. )

Tutto qui. Non dimenticare di integrare anche con il sistema di malware.

Conclusioni

Bene, tutta questa roba per cosa?. Così semplice, così can vedere che oggi la tecnologia è disponibile a tutti, è semplice e veloce per creare un progetto su Internet, c'è tutto from tutti gli angoli, la tecnologia non è importante, ciò che conta è come spostare questo prodotto della tecnologia per il ritorno e un profitto da esso.

Ho il mio progetto in corso superchulo solo mi è costato circa 15 ore. Ho messo qualche Adsense in giro qua e là. E adesso? Per attendere le persone a entrare e mi fanno un milionario? :P E 'molto più complicato di quello che come tutti sapete, prima devi avere una grande massa di users che movimenta il progetto e poi si deve ottenere la maggior parte di loro sono persone normali, non i tecnici, gli utenti che non pagano per niente oppure fare clic nella pubblicità :P .

Oggi, Internet, come in qualsiasi attività commerciale, marketing e tecniche di vendita sono molto più importante della tecnologia stessa, è difficile ammetterlo, ma vero. Nessun uso di avere il miglior prodotto del mondo intero, se si ottiene la gente lo utilizza e lasciare i soldi, questo è chiaro. Se si hanno le giuste competenze per spostare l'attività, non si preoccupi, la tecnologia ti dà qualsiasi partner per una piccola tassa, ma mettere nelle mani di un altro vendite intera strategia di business è il tuo non è così chiaro non è vero?.

Spero che qualcosa di servire l'articolo. Volevo mostrare praticamente come usare alcune librerie che si possono ottenere gratuitamente può realmente fare qualcosa di utile e funzionale con il minimo sforzo. Certo, si ottiene una certa idea.

Ci scusiamo per il rotolo :P Alla fine mi costa di più a scrivere l'articolo per attuarla.

Se si sono rivelati utili questo articolo ... Condividi!