Emlé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.
Ha a szolgáltató letiltotta a file_get_contents(URL)-t
akkor mit lehet kezdeni (vagy végezni) vele.
Tuby: akkor mondjuk egy fopen, fsockopen, vagy curl és ugyanazt kapod.
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
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:
Annyi még, hogy a css class-t a nálam külső url-re mutató linknél szokásosra cserélem.
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ő? 😉
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 🙂
öö, egy hülye kérdés, de nem vilagos szamomra, hogy akkor most hova kell ezt a kodot elhelyezni?
charlie: bárhova.
tehát direktbe be a témába?
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.
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
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:
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ó.
gondoltam egyértelmu, hogy wp-rol van szo (elvegre itt is az van, nem?)
koszonom!
aszondja, hogy:
Fatal error: Call to a member function GetTagsForPost() on a non-object in
holnap majd nekiesek megcsinalni…
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.
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)
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)
Pingback:WebMánia » LiveLinks 0.3
Itt lezárom a hozzászólásokat, Itt lehet folytatni: http://webmania.cc/livelinks-03/