LiveLinks 0.1

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.

19 thoughts on “LiveLinks 0.1

  1. 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>
    ?>
    
  2. 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.

  3. 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ő? 😉

  4. 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 🙂

  5. 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.

  6. 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

  7. 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ó.

  8. 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.

  9. 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)

  10. Pingback: WebMánia » LiveLinks 0.3

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

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöljük.