Många webbplatser erbjuder syndikeringsformat som RSS, JSON eller XML-baserade tjänster för att möjliggöra enkel leverans av innehåll. Men vad händer när en webbplats inte erbjuder någon av dessa tjänster? Hur syndikerar du innehållet från en webbplats som inte erbjuder ett nyhetsflöde? Detta är vad jag bestämde mig för att lösa.
Jag har nyligen fått ett projekt från en klient med en skiss och en kort beskrivning av webbplatsen och de mål de vill uppnå. Tillsammans med denna kort var anteckningar som indikerar att de var ett fastighetsbolag och skickade regelbundet fastigheter till en välkänd fastighetswebbplats och ville kunna syndikera innehållet på denna externa webbplats på sin egen webbplats utan att behöva uppdatera båda sidorna. Fångst: Den här kända fastighetssidan erbjöd inte en syndikeringstjänst eller API för utvecklare att komma åt sina listor.
Efter att ha skurit på internet upptäckte jag att de flesta lösningar på detta problem var ineleganta och de flesta av dem var webbläsarspecifika eller ineffektiva. Jag bestämde mig för att koda min egen lösning med det populära javascriptbiblioteket JQuery.
För att komma åt information från en annan webbplats behövde jag använda AJAX-funktionerna i JQuery-biblioteket.
Om du är bekant med JQuery bör ovanstående inte vara för svårt att förstå. Vi använder AJAX-belastningsfunktionen för att ladda en webbsida innehåll till ett element med id #content. Lösningen verkade för lätt, men tyvärr problemet, som du snart kommer inse, är att koden bara fungerar i Internet Explorer 6 eller 7. Orsaken till detta blev snart uppenbar - alla andra webbläsare blockerar inläsningen av webbplatser från alternativa domäner på grund av lokala säkerhetsinställningar. Detta innebar att vi bara kan läsa in relativa sidor, inte absoluta webbadresser.
Jag tittade på nätet för att lösa problemet och till min skräck var de flesta antingen intryckta att det inte gick att kringgå de flesta webbläsares lokala säkerhetsinställningar eller det var för komplicerat en uppgift så inte värt att göra. Det här är när jag upptäckte cURL-biblioteket.
cURL är ganska användbar genom att det låter dig kommunicera med andra servrar med webbadresser och standardwebprotokoll som HTTP, HTTPS eller SSL. Med hjälp av cURL kunde jag bygga en bypass till vårt lokala säkerhetsproblem genom att ladda in hela webbplatsen till en lokal URL-server-sida.
Den här koden initierar cURL-objekt från en extern webbadress. Fördelen att webbadressen är laddad på servern istället för på klienten. Serverens säkerhetsinställningar i PHP-miljön är mycket mer flexibla än de lokala säkerhetsinställningarna för de flesta moderna webbläsare. Efter att ha initierat cURL-objektet skriver vi helt enkelt hela innehållet i webbadressen. Om vi nu sparar detta dokument som "curl.php" på vår webbserver har vi nu en lokal fil som laddas i hela webbplatsens innehåll på vår externa URL.
Låt oss gå tillbaka till vår ursprungliga kod och lägga in våra ändringar:
Vårt skript stöder nu alla webbläsare och uppnås inte med hjälp av några oortodoxa lokala säkerhetshackar.
Nu kanske du undrar vilka fördelar med att arbeta med det här dokumentet i JQuery jämfört med att bara manipulera vårt dokument med PHP? Den främsta orsaken till mitt val när jag använder JQuery är möjligheten att använda sina CSS-styled selectors för att välja vilket innehåll på vår sida vi faktiskt vill syndikera, som följande:
I stället för att ladda in hela dokumentet laddar vi nu bara in innehållet i ett element med id #content. Vi kommer att få fördelarna med detta senare i artikeln.
Efter att ha spelat med det här lite kan du märka nästa stora problem. Även om vi har lyckats syndikera innehållet på externa webbplatser, fungerar alla relativa länkar och bilder inte längre. En annan anledning till att arbeta i JQuery. Med funktionen JQuery varje () kan vi skapa en slinga som går igenom alla och element som tar tag i nuvarande HREF- eller SRC-attribut och lägger ut den externa domänen på den.
Nu är problemet på den här tiden vi stöter på, var var integrerar vi vår nya kod i vår befintliga kod? Problemet som jag ursprungligen kom över var oavsett var du säger det, den externa märkningen laddades inte tillräckligt snabbt för att vår kod skulle ändra domänen för att träda i kraft efter det faktum. Lösningen innebär att de två kombineras med en ganska elegant JQuery-lösning.
$ ("dokument"). redo (funktion () $ ("# innehåll"). last ("curl.php #content", , funktion () $ ("a"). ) Var href = $ (detta) .attr ('href'); var new_href = domän + href; $ (detta) .attr ('href', new_href););
$ ("img"). Varje (funktion (i) var src = $ (detta) .attr ('src'); var new_src = domän + src; $ (detta) .attr ('src', new_src); ); ); );
Lastfunktionen har ytterligare två egenskaper som den kan ta, en är variabler som du vill skicka till din externa webbadress. Till exempel kan du försöka hämta data från resultatet av ett POST-formulär. Den andra egenskapen är en återuppringningsfunktion eller vad som ska göras när funktionen load () har slutförts. I vårt fall är detta perfekt - vi placerar vår kod i återuppringningsfunktionen som förhindrar att den körs tills vi laddar in helt på vår externa sida.
Som du kan se nu kan vi helt enkelt dra in något element på vårt sidinnehåll från en annan webbplats. Detta är mycket praktiskt
för att inte bara syndikera innehåll som nyhetsflöden utan alla dynamiskt uppdaterade innehåll.
Nu när vi kan ha dragit in i vårt innehåll visar nästa steg överlägsenheten i att använda den här koden över säger an
$ ("dokument"). redo (funktion () $ ("# innehåll"). ladda ("curl.php #content", , funktion ()
I det här fallet väljer vi bara en
Vi ska nu lägga till några stilar på vår sida med hjälp av CSS.
kropp, en font-family: 'Tahoma'; färg: #fff; bakgrundsfärg: # 000; fontstorlek: 12px; # innehåll bredd: 600px; #content liten, #content span, #content .more-link display: none; #content img float: left; marginal-höger: 5px; #innehåll h1
typsnittstorlek: 14px;
Denna CSS handlar mer om att visa några viktiga funktioner än att vara estetiskt tilltalande. Några viktiga saker att notera på denna punkt är att vi måste komma ihåg att tilldela stilar exakt till de taggar vi tittar på styling - I.E. Stil inte allt taggar - vi vill bara stila dem i #content En annan sak som vi kan göra för att vår news syndicator tar upp mindre utrymme på vår skärm är att ändra bilderna. Detta kan göras med hjälp av CSS, men i stället vill jag demonstrera med JQuery för att ändra bildkällan. Vi kommer att ändra vår JQuery för att använda funktionen attr () för att ändra källan till vår bild till en på vår egen server - en trevlig liten länkknapp. Nu kan vi ändra vår CSS något för att göra bilden snyggt vänster. Nu, genom att bara använda innehåll syndikerat från Net Tuts + hemsidan, har vi lyckats bygga en nyhetssyndikerare med helt annan styling till den ursprungliga webbplatsen. Vad du kanske märker när du använder den här koden är att det tar ett tag för JQuery att bearbeta och ladda den externa webbplatsen. En bra funktion att lägga till är en laddningsrad till #content Det enklaste sättet att göra vår laddningsrad är att placera en laddningsbarbild i vårt #content Vi har nu en bra liten applikation som visar en förladd bild tills vårt innehåll är redo att visas. Medan förladdaren är en bra funktion är det inte en ersättning för optimerad kod. I denna handledning använder vi JQuery för att välja vilka element vi ska välja eller inte när faktiskt den mest snabba optimala lösningen skulle vara att göra det i vår PHP-kod. Detta är dock utanför ramen för denna handledning. Där har vi det - en enkel lösning med JQuerys AJAX-funktioner och PHPs cURL-bibliotek som gör att vi kan syndikera externt innehåll. Det här är en enkel lösning om du behöver innehåll från en extern webbplats. Som jag redan har sagt, även om JQuys enkla syntax och CSS-väljare ger oss bekvämligheten med styling och väljer vad vi vill ha från kundsidan, är det inte snabbt optimerat. Det bästa skulle vara för oss att ta bort taggarna som vi inte vill använda regelbundna uttryck i PHP. Jag skulle också notera att ett av de vanligaste misstagen är att vara för specifik när styling; kom ihåg att du inte har någon kontroll över huruvida innehållsskaparen ändrar vilka taggar och klasser de använder, det är alltid bäst att utforma allmänna element som vanligtvis används. En annan sak som är värd att ta hänsyn till är att denna handledning är avsedd att generera en innehållssyndikator - den är inte avsedd att användas som en webbplatsinnehåll "skrapa". Om du ska genomföra detta i ett kommersiellt projekt, se till att du har tillstånd av upphovsrättsinnehavaren att använda innehållet på din sida. Ändra bilder med JQuery
... $ ("# content img"). Varje (funktion (i) var src = $ (detta) .attr ('src'); var new_src = domän + src; $ (detta) .attr ('href' new_src);); $ ("# content img"). attr ('src', 'link.png'); ); );
#content img float: left; marginal-höger: 5px;
preloader
...
Min Content Syndication Service
... Slutsats