Co je lepší a co používat? Už dlouho jsem tady nezveřejňoval žádné skripty, v tomto článku naleznete zdrojové kódy pro AutoTrackback.

Ano, po funkci pro zkracování odkazů v PHP přichází další, tentokrát trochu složitější skript. Viz. níže.

Trackback

Jaký je jeho problém?

  • V ČR ho používá jen hrstka IT pracovníků, ale většinou ani ti ne.

  • Většina blogerů vůbec neví, jak trackback funguje, a jak ho použít.

Co je to trackback a jak ho mám použít ve Wordpressu?

Trackback slouží blogerům a obecně publicistům na webu k tvoření vazeb mezi souvisejícími informacemi. Pokud např. najdete článek na téma, ke kterému máte hodně co říct a rozhodnete se napsat vlastní článek, měli byste použít trackback (ostatně jste to vy, kdo dostane relevantní zpětný odkaz). Ve výsledku to potom vypadá tak, že na obou webech se objeví odkaz na ten druhý.

Narychlo jsem prolétnul WordPress Trackback Tutorial(EN). Nejdříve je třeba získat trackback URL, které by mělo být (např.) pod článkem, na který chcete reagovat. Ve Wordpressu pak při psaní článku nakoukněte do pokročilých voleb, a tam by pro něj měla být kolonka. Nevím, Wordpress nepoužívám, kdyžtak nakoukněte do výše odkazovaného článku nebo googlete dál.

Pokud vás zajímá technická stránka trackbacku, přečtěte si např. článek na Mirin webspace.

AutoTrackback

Jaký je jeho problém?

  • V případě velkého počtu zpětných odkazů je náročný na server. Toto ale kompenzuje CRON a noční spouštění.

  • Musíte mít databázi webů (obvykle vyhledávačů), ze kterých nechcete přejímat zpětné odkazy. I to není nic hrozného, po nějaké době máte klid.

  • V případě špatné struktury webu, který na vás odkazuje, může dojít k objevování se duplicitních odkazů. Mluvím tady o webech, který mají různé verze (např. verzi pouze v plain-text) stránek s různými URL. Tzn. k jednomu jejich (např.) článku vede více URL. (Ano, Google to nemá rád ... a nemají to rádi ani provozovatelé AutoTrackbacků icon_smile.gif.)
    Dalo by se to vyřešit nastavením, že na jeden váš článek může jeden host odkazovat pouze z jedné stránky. Nic těžkého na dopsání.

Nebudu dál chodit kolem horké kaše. Rozhodl jsem se používat onen AutoTrackback. Název AutoTrackback je umělý, zakladatelem je patrně Patrick Zandl, který jej údajně nějakou dobu provozoval na svém blogu. (Mimochodem v odkazovaném článku rony v komentářích bojuje proti použití tohoto slova, tak si můžete přečíst něco proti AutoTrackbacku. Většinou s ním nesouhlasím.)

AutoTrackback - vysvětlení

Požadavky

trackback.jpg

Předtím než vůbec budete číst dále, si zjistěte, zda váš server podporuje funkci fopen nebo curl - stačí jedna z nich. Také je vhodné mít CRON, abyste nemuseli bota pouštět manuálně.

Co to tedy vlastně tento skript dělá? Ukládá do databáze všechny weby, ze kterých k nám někdo přišel, kromě těch které zakážeme. Přitom to dělá pouze na těch stránkách, kam vložíme soubor zaznamenavani.php. Takže je jasné, že např. na titulní stránku ho nedáme.

Žádné takto uložené odkazující weby však nejsou autorizované - žádný odkaz není zobrazen. K tomu aby se odkazy autorizovaly, je třeba spustit bota kontrolni-bot.php. Tento skript projde všechny (s určitými limity - viz. komentáře) neautorizované weby a zjistí, jestli se na nich odkaz opravdu nachází. Je to nutné, protože mnoho spam botů falšuje referery.

Kromě toho také prochází staré, autorizované odkazovače a zjišťuje, jestli ještě stále odkazují. Je to nutné z toho důvodu, protože jsou různé dynamické indexy s odkazem na vás, které ale časem zmizí. Stáří odkazů, které je třeba znovu zkontrolovat, si můžete nastavit v souboru nastaveni.php, stejně jako ostatní věci.

Soubor kontrolni-bot.php je vhodné dát do CRONu, takže se pak už nemusíte o autorizace zpětných odkazů starat. Vždy vám akorát přijde mail s výsledky. Tady se můžete podívat, jak takové hlášení vypadá. Zrovna se zde nachází vyhledávač, který toho času ještě nebyl zahrnut do mé databáze.

AutoTrackback - zdrojové kódy

AutoTrackback jsem rozdělil do 5 souborů, přičemž výkonné jsou především dvě části. Všechny soubory si můžete stáhnout v tomto archivu (5,6 KB).

tabulka.sql

Jak už asi tušíte, jedná se o strukturu tabulky databáze. Vytvořte si databázi a nad ní spusťte tento dotaz.

  1. CREATE TABLE `zpetne_odkazy` (
  2.   `id` INT(11) NOT NULL AUTO_INCREMENT,
  3.   `adresa` VARCHAR(255) COLLATE utf8_czech_ci,
  4.   `http_referer` VARCHAR(255) COLLATE utf8_czech_ci DEFAULT NULL,
  5.   `host` VARCHAR(255) COLLATE utf8_czech_ci DEFAULT NULL,
  6.   `pocet_pristupu` INT(11) DEFAULT NULL,
  7.   `autorizace` INT(11) DEFAULT NULL,
  8.   `last_mod` DATETIME DEFAULT NULL,
  9.   PRIMARY KEY  (`id`)
  10. ) COLLATE=utf8_czech_ci;

nastaveni.php

Není co dodat, čtěte komentáře.

  1. <?php
  2.  
  3. $server = "http://blog.antonindanek.cz"; // Vložte adresu vašeho serveru, NEZAKONČUJTE LOMÍTKEM
  4.  
  5. // Do tohoto pole vložte servery, ze kterých nechcete zaznamenávat zpětné odkazy. Minimálně by zde neměl chybět váš web, aby se nezaznamenávaly přechody v rámci vašeho serveru (proměnná $server). Budou použity jako regulární výrazy!
  6. $nezaznamenavej = array ("127.0.0.1",  "search.seznam.cz", "google.cz", "google.sk", "google.com", "google.co.uk", "google.de", "search.icq.com", "search.live.com", "centrum.cz", "atlas.cz", "linkuj.cz", "vybralisme.cz", "topclanky.cz", "jyxo.1188.cz","nova.cz/search/");
  7. $interval = 7; // Sem zadejte počet dní, po jejichž uplynutí chcete kontrolovat staré odkazy, zda se zde ještě stále nacházejí.
  8.  
  9. /* NASTAVENÍ PRO DATABÁZI */
  10.  
  11. $db_server = "127.0.0.1";
  12. $uzivatel = "root";
  13. $heslo = "";
  14. $databaze = "autotrackback";
  15.  
  16. /* NASTAVENÍ PRO DATABÁZI konec */
  17.  
  18. ?>

zaznamenavani.php

Dostáváme se k prvnímu výkonnému skriptu, který ukládá do databáze weby, které na vás odkazují. Tento soubor vložte na všechny stránky, na kterých chcete zaznamenávat zpětné odkazy. Tedy např. na všechny stránky, kde se zobrazují články.

  1. <?php
  2.  
  3. require_once "nastaveni.php";
  4.  
  5. if(isset($_SERVER['HTTP_REFERER'])) { // Pokud nebyla adresa manuálně zadána do adresního řádku, podíváme se na vstupní web.
  6.  
  7. $format= "Y-m-d H:i:s";
  8. $datum=date($format); // Aktuální datumu.
  9.  
  10. $http_referer = addslashes($_SERVER['HTTP_REFERER']); // Vstupní web.
  11. $adresa = $server.$_SERVER['REQUEST_URI']; // Cílový web (váš).
  12.  
  13. $pocet = count($nezaznamenavej);
  14. // Projdeme pole serverů, které nechceme zaznamenávat a porovnáme je s aktuálním webem. První argument funkce ereg je regulární výraz, proto je třeba vstup poslat nejdříve do fce. preg_quote jsme, aby byla brána např. tečka jen jako tečka a né jako jakýkoliv znak.
  15. for($i=0 ; $i<$pocet ; $i++) if (ereg(preg_quote($nezaznamenavej[$i]), $http_referer) or $http_referer=="") {$nebrat = 1; break;} // Pokud dojde ke shodě, nastavíme indikátor $nebrat a ukončíme cyklus.
  16.  
  17.  
  18.   if ($nebrat == false){ // Pokud byl nastaven indikátor $nebrat, zbytek skriptu se neprovede.
  19.  
  20. // Připojíme se k databázi.
  21. $pripojeninaDB = mysql_connect ("$db_server","$uzivatel","$heslo") or die ("Nepovedlo se připojit na databázový server");
  22. mysql_select_db("$databaze") or die ("Nepovedlo se otevřít databázi");
  23. mysql_query("SET CHARACTER SET utf8") or die ("Dotaz se nepodařilo provést."); // Nastavení znakové sady přenosu.
  24.  
  25.     $url = parse_url($http_referer); // Rozdělí URL na části.
  26.     $host = eregi_replace("^www\.", "", $url['host']); // Odstraní "www.".
  27.      
  28.     $query = mysql_query("SELECT id FROM zpetne_odkazy WHERE http_referer = \"$http_referer\" AND adresa=\"$adresa\"");
  29.     if ($vysledky = mysql_fetch_array($query)) { // Je stránka v databázi ? (pokud ano, přidáme přístup z této url) (pokud ne, přidáme ji)
  30.       $dotaz = "UPDATE zpetne_odkazy SET pocet_pristupu=pocet_pristupu+1 WHERE http_referer = \"$http_referer\" AND adresa=\"$adresa\"";
  31.       mysql_query($dotaz) or die("1-SQL dotaz nešlo provést");
  32.      
  33.     } else {
  34.       $dotaz = "INSERT INTO zpetne_odkazy VALUES (0, \"$adresa\", \"$http_referer\", \"$host\", \"1\", \"0\", \"$datum\")";
  35.       mysql_query($dotaz)  or die("2-SQL dotaz nešlo provést");
  36.     }
  37.    
  38.     mysql_close ($pripojeninaDB); // Odpojíme se od databáze.
  39.    
  40.     }}
  41.  
  42. ?>

zobrazeni.php

Po implementaci zaznamenávání nějakou dobu počkejte, než se vám do databáze nachytají nějací odkazovatelé. Poté můžete spustit následující soubor.

  1. <?php
  2.  
  3. require_once "nastaveni.php";
  4. $adresa = $server.$_SERVER['REQUEST_URI'];
  5.  
  6. function zkrat_anchor_odkazu ($odkaz,$maximalni_delka = 20) {
  7. if(strlen($odkaz) > $maximalni_delka) { // pokud je délka odkazu větší než $maximalni_delka, zkrátíme ho
  8.  
  9. $zacatek = substr($odkaz,0,$maximalni_delka-5); // použijeme jen tak dlouhý začátek, aby nám 5 znaků zbylo na zakončení
  10. $konec = substr($odkaz,-5); // vezmeme posledních 5 znaků z URL
  11.  
  12. return $zacatek."...".$konec;
  13. } else return $odkaz; }
  14.  
  15. // Připojíme se k databázi.
  16. $pripojeninaDB = mysql_connect ("$db_server","$uzivatel","$heslo") or die ("Nepovedlo se připojit na databázový server");
  17. mysql_select_db("$databaze") or die ("Nepovedlo se otevřít databázi");
  18. mysql_query("SET CHARACTER SET utf8") or die ("Dotaz se nepodařilo provést."); // Nastavení znakové sady přenosu.
  19.  
  20. $dotaz = "SELECT http_referer,host FROM zpetne_odkazy WHERE autorizace=\"1\" ORDER BY pocet_pristupu DESC, last_mod ASC";
  21. $query = mysql_query($dotaz) or die("1-SQL dotaz nešlo provést");
  22.      
  23. if(mysql_num_rows($query)) while($radka = mysql_fetch_array($query))
  24.   echo "<a href=\"$radka[http_referer]\">".zkrat_anchor_odkazu($radka[host])."</a><br />";
  25.   else echo "V databázi není žádný autorizovaný odkaz.";
  26.  
  27. mysql_close ($pripojeninaDB); // Odpojíme se od databáze.
  28.  
  29. ?>

Ejhle! V databázi není žádný autorizovaný odkaz. Přesně tak, ještě vás čeká spuštění autorizačního bota.

kontrolni-bot.php

  1. <?php
  2.  
  3. require_once "nastaveni.php";
  4.  
  5. function najdi_url($web,$hledane_url) // vrátí 1 v případě, že nalezne URL ($hledane_url) na $web
  6. {
  7.  
  8.   if($drzak = fopen ($web,"r")) $fopen=1; // Vyzkoušíme funkčnost funkce fopen.
  9.   elseif($drzak = curl_init($web)) $curl=1; // Vyzkoušíme funkčnost funkce curl.
  10.  
  11. if($fopen) { // Pokud funguje fopen, projdeme řádek po řádku HTML kód a hledáme naše URL. Pokud ho nalezneme, nastavíme indikátor a ukončíme cyklus.
  12. while($radek = fgets($drzak)){if(ereg("href=\"".preg_quote($hledane_url), $radek)) {$indikator = 1; break;}}
  13. fclose($drzak);
  14. return $indikator;
  15. }
  16.  
  17. elseif($curl and !$fopen){ // Pokud funguje curl (ale neproběhlo předtím už fopen), načteme celý HTML kód a hledáme naše URL. Pokud ho nalezneme, nastavíme indikátor.
  18. curl_setopt ($drzak, CURLOPT_RETURNTRANSFER, 1); // Nastavení curl, tak aby se HTML zdroj nevypisoval.
  19. $stranka = curl_exec ($drzak); // Provedení curl fce.
  20.  
  21. if(ereg(preg_quote($hledane_url), $stranka)) $indikator = 1; // Projdeme HTML kód a hledáme naše URL. Pokud ho nalezneme, nastavíme indikátor.
  22.  
  23. curl_close($drzak);
  24. return $indikator;
  25. }
  26.  
  27. else return "Obávám se, že váš server nepodporuje ani fci. fopen() ani curl(). Můžete si to autorizovat ručně v databázi :o) (sloupec autorizace nastavit na 1).";
  28.  
  29. }
  30.  
  31. ?>
  32.  
  33. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  34. <html xmlns="http://www.w3.org/1999/xhtml" lang="cs">
  35.   <head>
  36.     <meta http-equiv="content-type" content="text/html; charset=ISO-8859-2" /> <!-- Používáme znakovou sadu ISO-8859-2, kvůli následnému odeslání na mail. (UTF8 dělá problémy)-->
  37.     <meta http-equiv="Content-Language" content="cs" />
  38.     <meta name="Language" content="czech" />
  39.    
  40.       <title>Validátor zpětných odkazů</title>
  41.    
  42.     <meta name="title" content="Validátor zpětných odkazů" />
  43.     <meta name="description" content="Validátor zpětných odkazů." />
  44.  
  45.     <meta http-equiv="cache-control" content="no-cache" />
  46.     <meta name="author" content="Antonín Daněk" />
  47.    
  48.     <style type="text/css">
  49.    
  50.     a {text-decoration: none; color: #5701C1;}
  51.    
  52.     .ano {color: #1CC117;}
  53.     .ne {color: #C1120F;}
  54.        
  55.     </style>
  56.    
  57.    
  58.   </head>
  59.   <body>
  60.  
  61. <?php
  62.  
  63. $format= "Y-m-d H:i:s";
  64. $datum=date($format); // Aktuální datum.
  65.  
  66. $hlaseni[] = "<h1>Nové zpětné odkazy</h1>"; // Do proměnné hlášení průběžně ukládáme výstup.
  67.  
  68. $pripojeninaDB = mysql_connect ("$db_server","$uzivatel","$heslo") or die ("Nepovedlo se připojit na databázový server");
  69. mysql_select_db("$databaze") or die ("Nepovedlo se otevřít databázi");
  70. mysql_query("SET CHARACTER SET utf8") or die ("Dotaz se nepodařilo provést."); // Nastavení znakové sady přenosu.
  71.  
  72. $dotaz ="SELECT http_referer,adresa FROM zpetne_odkazy WHERE autorizace=\"0\" ORDER BY id LIMIT 0,10"; // Vybere pouze 10 položek. Existuje-li jich více, budou vybrány při dalším spuštění skriptu. Jedná se o bezpečnostní limit - můžete ho zvětšit, pokud máte na serveru nastavenou dlouhou dobu provádění skriptu.
  73. $query = mysql_query($dotaz) or die("1-SQL dotaz nešlo provést.");
  74. if(mysql_num_rows($query)) while($radek=mysql_fetch_array($query)){ // Pokud existuje alespoň jeden záznam, provedeme cyklus.
  75. $nalezeno = najdi_url($radek[http_referer],$radek[adresa]); // Zavoláme funkci, která se pokusí na webu nalézt naši adresu.
  76. if($nalezeno) { // Pokud byl odkaz nalezen, autorizujeme ho a podáme o tom hlášení.
  77. $dotaz2 ="UPDATE zpetne_odkazy SET autorizace=\"1\" WHERE http_referer=\"$radek[http_referer]\" AND adresa=\"$radek[adresa]\"";
  78. $query2 = mysql_query($dotaz2) or die("2-SQL dotaz nešlo provést.");
  79.  
  80. $hlaseni[] = "<p>Zjistil jsem, že na stránku <a href=\"$radek[adresa]\">$radek[adresa]</a> odkazuje: <strong><a href=\"$radek[http_referer]\">$radek[http_referer]</a></strong> - zpětný odkaz <span class=\"ano\">autorizován</span>.</p>";
  81. } else { // Pokud nebyl odkaz nalezen, smažeme ho z databáze a podáme o tom hlášení.
  82. $dotaz2 ="DELETE FROM zpetne_odkazy WHERE http_referer=\"$radek[http_referer]\" AND adresa=\"$radek[adresa]\"";
  83. $query2 = mysql_query($dotaz2) or die("3-SQL dotaz nešlo provést.");
  84.  
  85. $hlaseni[] = "<p>Zjistil jsem, že na stránku <a href=\"$radek[adresa]\">$radek[adresa]</a> odkazuje: <strong><a href=\"$radek[http_referer]\">$radek[http_referer]</a></strong>, avšak odkaz jsem NENALEZL - zpětný odkaz <span class=\"ne\">smazán</span>.</p>";
  86. }
  87. unset($nalezeno);
  88. } else $hlaseni[] ="<p>Žádné nové zpětné odkazy.</p>";
  89.  
  90. $hlaseni[] = "<hr /><h1>Kontrola starých ($interval) odkazů</h1>";
  91.  
  92. $dotaz ="SELECT http_referer,adresa FROM zpetne_odkazy WHERE last_mod < date_sub(\"$datum\", INTERVAL $interval DAY)  LIMIT 0,10"; // Vybere ty odkazy, které jsou více jak $interval dní staré. Opět je zde bezpečnostní limit, který můžete změnit.
  93. $query = mysql_query($dotaz) or die("4-SQL dotaz nešlo provést.");
  94. if(mysql_num_rows($query)) while($radek=mysql_fetch_array($query)){ // Pokud existuje alespoň jeden záznam, provedeme cyklus.
  95. $nalezeno = najdi_url($radek[http_referer],$radek[adresa]); // Zavoláme funkci, která se pokusí na webu nalézt naši adresu.
  96. if($nalezeno) { // Pokud byl odkaz nalezen, autorizujeme ho a podáme o tom hlášení.
  97. $dotaz2 ="UPDATE zpetne_odkazy SET autorizace=\"1\", last_mod=\"$datum\" WHERE http_referer=\"$radek[http_referer]\" AND adresa=\"$radek[adresa]\"";
  98. $query2 = mysql_query($dotaz2) or die("5-SQL dotaz nešlo provést.");
  99.  
  100. $hlaseni[] = "<p>Zjistil jsem, že na stránku <a href=\"$radek[adresa]\">$radek[adresa]</a> odkazuje: <strong>$radek[http_referer]</strong> - zpětný odkaz <span class=\"ano\">autorizován</span>.</p>";
  101. } else { // Pokud nebyl odkaz nalezen, smažeme ho z databáze a podáme o tom hlášení.
  102. $dotaz2 ="DELETE FROM zpetne_odkazy WHERE http_referer=\"$radek[http_referer]\" AND adresa=\"$radek[adresa]\"";
  103. $query2 = mysql_query($dotaz2) or die("6-SQL dotaz nešlo provést.");
  104.  
  105. $hlaseni[] = "<p>Zjistil jsem, že na stránku <a href=\"$radek[adresa]\">$radek[adresa]</a> odkazuje: <strong>$radek[http_referer]</strong>, avšak odkaz jsem NENALEZL - zpětný odkaz <span class=\"ne\">smazán</span>.</p>";
  106. }
  107. unset($nalezeno);
  108. } else $hlaseni[] ="<p>Žádné staré zpětné odkazy.</p>";
  109.  
  110. echo iconv("UTF-8", "ISO-8859-2", implode("",$hlaseni)); //Data v databázi máme v utf8 (zvyk je železná košile). Jak jsem už psal, kvůli odeslání na mail je nutné použít kódování ISO-8859-2, proto tímto konvertujeme $hlaseni.
  111.  
  112. mysql_close ($pripojeninaDB); // Odpojíme se od databáze.
  113.  
  114. ?>
  115.  
  116. </body>
  117. </html>

1 komentář

Neváhejte napsat k článku komentář

Nevyplňujte:

  1. 1
    Antonín Daněk

    danek<zavináč>antonindanektečkacz

    Ukončil jsem AutoTrackbac na tomto blogu. Je to poměrně dobrá věc, ale stále vyžaduje jistou míru administrace (zakazovat některé URL, mazat duplicitní (jiná URL, stejný obsah)).