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.

Share
Mi az az RSS és mi az a PayPal?

Ez a bejegyzés rrd billentyűzetéből potyogott ki 2007 február 19. napján 10:42:31-kor. Eddig 3,351 olvasást ért meg. A visszajelzéseket nyomonkövetheted ezzel az RSS feed-el. Véleményt nyilváníthatsz, vagy trackbackolhatsz a saját oldaladon.

Ugrás fel

JólMegMondjad!

19 vélemény

  1. Tuby
    2007 április 23. 10:55:09

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

  2. rrd
    2007 április 23. 12:30:52

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

  3. Tuby
    2007 április 26. 04:20:19

    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>
    ?>
    
  4. onkelTom
    2007 május 10. 21:07:27

    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.

  5. Tőzsde
    2007 augusztus 12. 12:57:24

    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ő? ;)

  6. rrd
    2007 augusztus 13. 07:06:52

    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 :)

  7. charlie
    2007 szeptember 9. 16:28:55

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

  8. rrd
    2007 szeptember 12. 11:27:30

    charlie: bárhova.

  9. charlie
    2007 szeptember 12. 16:13:56

    tehát direktbe be a témába?

  10. rrd
    2007 szeptember 12. 16:20:13

    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.

  11. charlie
    2007 szeptember 13. 11:23:15

    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

  12. rrd
    2007 szeptember 13. 11:33:29

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

  13. charlie
    2007 szeptember 13. 16:14:02

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

    koszonom!

  14. charlie
    2007 szeptember 13. 16:18:09

    aszondja, hogy:

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

    holnap majd nekiesek megcsinalni…

  15. rrd
    2007 szeptember 13. 16:33:23

    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.

  16. charlie
    2007 szeptember 14. 11:01:36

    hmm, én nem UTW-t hasznalok cimkezesre, hanem Simple Tagging-et (http://trac.herewithme.fr/project/simpletagging/)

    majd kiokoskodom, hogy az milyen valtozoba teszi a cimkeket (mert az volna a legjobb ha ugy keresne)

  17. Zimmy
    2008 október 20. 11:45:46

    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)

  18. WebMánia » LiveLinks 0.3
    2008 október 20. 12:49:37

    [...] hosszú idő telt el azóta, hogy elkészítettem a LiveLinks 0.1-es verzióját. Azóta sok víz lefolyt a google mosogatójában és a lefolyás érintette ezt a [...]

  19. rrd
    2008 október 20. 12:50:56

    Itt lezárom a hozzászólásokat, Itt lehet folytatni: http://webmania.cc/livelinks-03/

Switch to our mobile site