livelinksEmlékeztek még arra az időre amikor minden weblapon volt egy linkek rész? A keresők népszerűsödésével szépen lassan eltűntek az ilyen tipusú link oldalak. Felváltották őket a kapcsolódó linkek, melyek arra hivatottak, hogy egy-egy adott cikkhez kapcsolódó linkeket jelenítsenek meg. Ezeknek annyi korlátja van, hogy többnyire csak az adott weblapon belül kínálnak kapcsolódó linkeket. De mi van akkor ha én azt szeretném, hogy a kapcsolódó linkjeim más kapcsolódó témájú weblapokra is ajánljon linkeket? A megoldás a LiveLinks!A LiveLinks egy kicsi és egyszerű GPL licencű php osztály, mely egy Google háttérhívás segítségével élő kapcsolódó linkeket kínál a tartalmunkhoz.

Az elképzelés

Azon gondolkoztam, hogy hogyan tudnám megoldani azt, hogy a cikkeim / blog bejegyzéseim alján legyenek élő kapcsolódó linkek, melyek azonos vagy hasonló témákról szólnak magyarul más weblapokon. Arra a következtetésre jutottam, hogy a háttérben el kellen indítani egy google keresést és az ennek eredményeként jövő választ valahogy belesímítani az oldalamba. Maga a Google kínál is erre egy megoldást, de egyszerű ember lévén én valami egyszerűbb megoldást szerettem volna találni. Arra gondoltam, hogy egy egyszerű file_get_contents függvényhívással megcsinálom a google keresést.

A megoldás


Ehhez a következő dolgokat kellett előzetesen összeszednem.

  • A google a magyar kereséseknél az alábbi url-lel dolgozik: google.hu/search?hl=hu&meta=lr%3Dlang_hu&q=, és a q= után a keresőkifejezés következik. Ha több szóra keresünk, akkor azokat + jellel kell elválasztani, valahogy így: ajax+rrd.
  • A visszaadott eredményoldalon a találatok úgy jelennek meg, hogy van egy link a weblap title-lal, van egy kis kostoló a weblapon megtalált keresési kifejezéssel (ami ki van vastagítva), aztán szerepel az oldal url-je, valamint két link a googlen tárolt változatra és a hasonló oldalakra.
  • Ha ugyanazon weblapon több találat is van, akkor a kiegészítő találatokat a google beljebb húzza mint az első. Ez nekem egy jó jel volt, mert gondoltam, hogy más css stílust alkalmaz rájuk.

Megvizsgálva az oldal forrását a következőkre jutottam.

  • A generált oldal forrása egy sorba hozta ki az összes találatot. ez azt jelentette a számomra, hogy stringként kell kezelnem, és ebből a stringből kell kiszednem a találatokat.
  • Az első szintű találatok linkjei úgy néznek ki, hogy <a href=”link” class=”l”>title</a>, és a title részen belül a keresett szavak <b> és </b> elemek között ki vannak emelve. Ez a következő reguláris kifejezéssel illeszthető:

    <a href="[^>]*" class="*l"*>([^>]*<b>[^>]*</b<[^>]*)+</a>

Ezek után már nem is maradt más mint összerakni ezeket az alkatrészeket egy osztállyá.

<?php
class livelink{
  var $url = 'http://www.google.hu/';  //honnan kérjük a linekeket
  var $params = 'search?hl=hu&meta=lr%3Dlang_hu&q=';  //a kereséshez szükséges url paraméterek
  var $mintaLinkclass = 'class="*l"*';  //ha változik cseréljük itt egy sorral lejebb is
  var $mintaTitle = '|<a href="[^>]*" class="*l"*>([^>]*<b>[^>]*</b>[^>]*)+</a>|';  //hogyan néz ki a találat
  var $talalatok;  //a találatok egy tömbben

Az osztályunk ezeket az osztályváltozókat fogja használni. Értékük itt van meghatározva, hogy ha esetleg a google megváltoztatja az oldal felépítését, vagy az url-ben átadott paraméterek neveit akkor csak itt egy helyen kelljen módosítani.

Ezután a file_get_contents függvény segítségével megnyitjuk az oldalt, azaz lefuttatjuk a google keresést a $kifejezésre. Ha több szóra keresünk rá a $kifejezes-nek a szavakat + jelekkel elválasztva szóközök nélkül kell tartalmaznia (ajax+rrd).
A függvény második utasítása a preg_match_all függvénnyel a fent megadott reguláris mintára illeszkedő részeket teszi be a $this->talalatok tömbbe.

function livelink($kifejezes){
  //a $kifejezes-re keres rá a $url-en a $params-al
  $eredmeny = file_get_contents($this->url.$this->params.$kifejezes);
  preg_match_all($this->mintaTitle,$eredmeny,$this->talalatok);
  }

Ezek után már nem is maradt más dolgunk, mint a linkekből eltávolítani a google által használt css class definíciót.

function getLinks(){
  //vegyük ki a css formázásokat az eredményből
  $links = preg_replace('|'.$this->mintaLinkclass.'|','',$this->talalatok[0]);
  return($links);
  }
}
?>

Maga az osztályunk ilyen egyszerű és nyúlfarknyi, és a használata sem valami bonyolult. A magam részéről én itt ezen a weblapon az objektumnak a blog bejegyzés cimkéit adom át.

$livelink = new livelink('ajax+javascript+rrd');
$livelinks = $livelink->getLinks();
print '<h2>LiveLinks:</h2>';
print '<ul>';
foreach($livelinks[0] as $l){
  print '<li>'.$l.'</li>';
  }
print '</ul>';

HovaTovább

Jelen verzió az osztály 0.1-es verziója. Várom a javítási, fejlesztési ötleteket ide, vagy e-mailben.
Az osztály kódja letölthető innen.

LiveLinks 0.1
Cimke:             

19 thoughts on “LiveLinks 0.1

  • 2007. április 23. at 10:55:09
    Permalink

    Ha a szolgáltató letiltotta a file_get_contents(URL)-t
    akkor mit lehet kezdeni (vagy végezni) vele.

    Válasz
  • 2007. április 23. at 12:30:52
    Permalink

    Tuby: akkor mondjuk egy fopen, fsockopen, vagy curl és ugyanazt kapod.

    Válasz
  • 2007. április 26. at 04:20:19
    Permalink

    Kösz az info-t ez a “curl” bejött, ezt nem ismertem, itt az általam módosított fálj, csak még azt nem értem mért nem hoz minden linket át.
    Használjátok fel..
    Tuby

    getLinks();
    	print 'LiveLinks:';
    	print '';
    	foreach($livelinks as $l){
    		print ''.$l.'';
    		}
    	print '';
    */
    class livelink{
    	var $url = 'http://www.google.hu/';	//honnan kérjük a linekeket
    	var $params = 'search?hl=hu&meta=lr%3Dlang_hu&q=';	//a kereséshez szükséges url paraméterek
    	var $mintaLinkclass = '/class="*l*"*/';	//a google által meghatározott link class, ha változik cseréljük itt egy sorral lejebb is
    	var $mintaTitle = '|<a>]*" class="*l"*>([^>]*[^>]*[^>]*)+</a>|';	//hogyan néz ki a találati link
    	var $mintaKostolo = '|([^>]*<b>[^>]*</b>[^>]*)+([^>\s]*)|';	//hogyan néz ki a találati kostoló
    	var $talalatok;	//a találatok egy tömbben
    	
    function livelink($kifejezes){
    	//a $kifejezes-re keres rá a $url-en a $params-al
    	//több szó keresése esetén azokat + jellel kell elválasztani, urlkódolást nem kell alkalmazni
    	# $eredmeny = file_get_contents($this->url.$this->params.$kifejezes);
    	$ch=curl_init("$this->url$this->params$kifejezes");
    	curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        $eredmeny=curl_exec($ch);
        curl_close($ch);
        # $this->talalatok=$eredmeny;
        # print $eredmeny;
        preg_replace("|</a>|","</a>\n",$eredmeny);
    	preg_match_all($this->mintaTitle,$eredmeny,$this->talalatok);
    	print_r($this->talalatok[0]);
    	}
    //--------------------------------------------------------------
    
    function getLinks(){
    	//visszaadja a találati linkeket egy tömbként
    	//vegyük ki a css formázásokat az eredménybõl
    	$links = preg_replace("$this->mintaLinkclass",'',$this->talalatok[0]);
    	#$links = $this->talalatok[0];
    	print_r($links);
    	return($links);
    	}
    	
    function getKostolo(){
    	//visszadja a találati kostolókat egy tömbként
    	}
    }
    
    //mintaTitle: <a href="http://weblabor.hu/forumok/temak/10129" rel="nofollow">valami <b>AJAX</b> és Diszkrét <b>JavaScript</b> szakdolgozat </a>
    
    //mintaKostolo: blogmark. Kóstoljunk bele az <b>AJAX</b>-ba! <b>rrd</b>, 5 hét 2 nap. fórum téma. <b>Ajax</b> leírás/tutorial (akár magyarul) · <b>AJAX</b> leírás magyarul - <b>rrd</b> · naa - unregistered <b>...</b>weblabor.hu/tagok/4037/kovetes - 67k - <a href="http://209.85.129.104/search?q=cache:nuVaab5mCRMJ:weblabor.hu/tagok/4037/kovetes+ajax+javascript+rrd&hl=hu&ct=clnk&cd=2&gl=hu&lr=lang_en|lang_hu&client=firefox-a" rel="nofollow">Tárolt változat</a> - <a href="/search?hl=hu&lr=lang_en|lang_hu&client=firefox-a&rls=org.mozilla:en-US:official&hs=HxQ&q=related:weblabor.hu/tagok/4037/kovetes" rel="nofollow">Hasonló oldalak</a>
    ?>
    
    Válasz
  • 2007. május 10. at 21:07:27
    Permalink

    Ez tetszik, ráizgultam és már használom is. Csak egy kicsit átírtam – most OO helyett függvény alapú, és csak akkor fut le, ha a tárhelyen lehetséges a működése (allow_url_fopen, file_get_contents)
    Íme az én verzióm:

    function TP_LiveLinks($phrases)
    	{
    	if (ini_get("allow_url_fopen") != "1" || !function_exists("file_get_contents")
    		|| empty($phrases))
    		return FALSE;
    	
    	$url = "http://www.google.hu/"; //honnan kérjük a linkeket
    	$params = "search?hl=hu&meta=lr%3Dlang_hu&q="; //a kereséshez szüks. url paraméterek
    	$linkClass = 'class="*l"*'; //google találat title css class
    	$TitlePlattern = '|<a>]*" class="*l"*>([^>]*<b>[^>]*</b>[^>]*)+</a>|';
    	$results = array(); //találatok egy tömbben
    	//a $phrases-ra keres rá a $url-ben a $param-el
    	//több szó keresése esetén azokat + jellel kell elválasztani, url kódolás nem kell
    	$response = file_get_contents($url.$params.$phrases);
    	preg_match_all($TitlePlattern, $response, $results);
    	$livelinks = str_replace($linkClass, 'class="ext"', $results[0]);
    	$out = "";
    	if (is_array($livelinks) && count($livelinks) > 0){
    		$out = "Kapcsolódó linkek a témában:\n\n";
    		foreach($livelinks as $l){
    			$out .= "".$l."\n";
    		}
    		$out .= "\n";
    	}
    	return $out;
    	}
    

    Annyi még, hogy a css class-t a nálam külső url-re mutató linknél szokásosra cserélem.

    Válasz
  • 2007. augusztus 12. at 12:57:24
    Permalink

    Tényleg szép hagyomány volt anno, hogy egy weboldalnak voltak “Linkek” szekciói. Leginkább azokat szerettem, amelyek external linkeket tartalmaztak 🙂 Kár, hogy az ilyen oldalak letünőben
    vannak. A leírás alapján ez a Livelinks trükk tetszik. Tudtok mutizni egy élő példát. Működés közben megnézném. Vagy másoljam
    ki innen a forráskódot és kész? Szabadon vihető? 😉

    Válasz
  • 2007. augusztus 13. at 07:06:52
    Permalink

    Tőzsde: Itt az élő példa. Bármelyik oldalt itt megnézed ott lesz rajta a LiveLinks rész. Itt nincsenek kiszűrve a saját oldalra mutató hivatkozások, de azt se bonyolult hozzáadni az osztályhoz. Ha esetleg megcsinálod akkor kérlek postold el ide. Egyébként meg GPL licence, szóval vidd és használd. De ha ebből leszel gazdag akkor ne felejts el 🙂

    Válasz
  • 2007. szeptember 09. at 16:28:55
    Permalink

    öö, egy hülye kérdés, de nem vilagos szamomra, hogy akkor most hova kell ezt a kodot elhelyezni?

    Válasz
  • 2007. szeptember 12. at 11:27:30
    Permalink

    charlie: bárhova.

    Válasz
  • 2007. szeptember 12. at 16:20:13
    Permalink

    charlie: nem értem mi a gondod. ez egy php forráskód, az oldal generáló php fileba kell betenni. de ha ez nem világos akkor nem hiszem, hogy tudod majd használni.

    Válasz
  • 2007. szeptember 13. at 11:23:15
    Permalink

    Tisztába vagyok azzal, hogy mi ez.

    Mit értesz oldal generálo php file? Ez alatt a témát érted (ott valamelyik php fájl), vagy magában a wp-ben (tehát nem a témában, hanem a wordpress motorban)

    vagy inkább hagyjuk, majd kitalalom, hol a legjobb

    Válasz
  • 2007. szeptember 13. at 11:33:29
    Permalink

    charlie: ha az elején leírod, hogy wordpress-sel akarod használni akkor egyből arra válaszoltam volna. A magam részéről a használt template single.php filejába tettem egy ilyet:

    <div id="livelinks">
      <?php
        //utw plugin függőség!
          $tagok = $utw->GetTagsForPost($post->ID);
          foreach($tagok as $t){
            $atagok .= $t->tag . '+';
            }
          require('wp-content/plugins/livelink.php');
          $livelink = new livelink($atagok);
          $livelinks = $livelink->getLinks();
          print '<h3>LiveLinks:</h3>';
          print '<ul>';
          foreach($livelinks as $l){
            print '<li>'.$l.'</li>';
            }
          print '</ul>';
      ?>
    </div>
    

    Ezen felül a plugins könyvtárba tettem a fenti cuccot livelink.php néven. Persze ez nem igazi plugin, de így anno egyszerűbb volt és így nem csak wp-hez hanem bármihez használható.

    Válasz
  • 2007. szeptember 13. at 16:14:02
    Permalink

    gondoltam egyértelmu, hogy wp-rol van szo (elvegre itt is az van, nem?)

    koszonom!

    Válasz
  • 2007. szeptember 13. at 16:18:09
    Permalink

    aszondja, hogy:

    Fatal error: Call to a member function GetTagsForPost() on a non-object in

    holnap majd nekiesek megcsinalni…

    Válasz
  • 2007. szeptember 13. at 16:33:23
    Permalink

    charlie: igen, ott a kódban, hogy ha így akarod használni akkor függ a cucc az UTW wp plugintól. Ha ezt nem akarod használni, akkor $livelink = new livelink(‘ezekre+a+szavakra+keress+rá’); formában kell hívni. Én itt azt csinálom, hogy amit az UTW-nek megadok címkéket arra keressen rá. De ezt nem muszáj, bármilyen szavakat meg lehet neki adni + jellel elválasztva.

    Válasz
  • 2008. október 20. at 11:45:46
    Permalink

    Kipróbáltam, de nekem nem találja meg a linkeket, az $eredmeny még jó, de a talalatokban már semmi sincs (kéttagú üres tömb). Van valami tipped? (PHP 5)

    Válasz
  • Pingback:WebMánia » LiveLinks 0.3

Vélemény, hozzászólás?

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük