Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Newsy z kanalów RSS
Forum PHP.pl > Forum > PHP
Nightstalker
Cześć! Nigdy nie robiłem nic przy RSS, a tu nagle wyskakuje takie zlecenie... Musze napisać skrypt który będzie wyświetlać na stronie treść newsa z jakiegoś kanału RSS ( np. z onetu ) Dajcie mi jakieś namiary na tutoriale czy artykuły o tym zagadnieniu... W RSS jestem kompletnie zielony! mad.gif :|
Nightstalker
Dobra, bez nerwów, po prostu rozpytuje wszędzie zeby dowiedziec sie jak najwięcej! No i zalezy mi na czasie. Może ktoś coś takiego pisał i uda mi sie kontakt z takim kimś nawiązać, po to ten post ! Mam do każdego PW pisać czy jak ? tongue.gif

Zresztą... Nie ważne, bo wiem juz jak to zrobić.

Poprawka : dalej nic nie wiem... Poczytałem co suie dalo o rss i udało mi się napisać prosty czytnik, ale... W kanałach RSS nie przesyła się treści newsa, tylko link, tytul i jakies tam krótkie info exclamation.gif! A mnie potrzebna właśnie ta treść ;/ Temat dalej otwarty...
MOże dało by się jakoś przejść na strone z linka i po tagach html'a z tej strony jakoś wyciać ten text ? No nie wiem... Nie mam pomysłów jak to zrobić...
Bastion
jesli kanal rss nie udostepnia newsa w calosci to nici z tego wiecej nie uzyaksz, mozesz sprobowac pobrac skryptem strone i wydzielic newsa ze strony, ale wad takiego rozwiazania jest od groma
Nightstalker
Dobra... Cały wieczór się męczyłem, ale wreszcie działa ! Czytam sobie linki z kanalu RSS przy pomocy wyrazen regularnych. Potem sobie sciągam zawartosc tego co w linku i kroje przy pomocy wyrazen regularnych a nastepnie zapisuje sobie do bazy. Potem odczytuje z bazy gotowe newsy. Zapis do bazy robi sie co jakis czas i troch etrwa, ale dzieki temu same newsy na stronei laduja sie blyskawicznie juz z bazy... Trzeba jescze dodac tytul itp, ale to po prostu z RSS wyciagne... Calosc idzie mniej wiecej tak ( jakby komus bylo to potrzebne ) :

  1. <?php
  2. $readFile = file_get_contents( 'http://wiadomosci.onet.pl/10%2ckategoria.rss' );
  3.  
  4. $preg = "#<guid isPermaLink=\"false\">(.*?)</guid>#is";
  5.  
  6. $o = preg_match_all( $preg, $readFile, $out );
  7.  
  8. foreach ( $out[ 1 ] as $w )
  9. {
  10. $arrContent = file_get_contents( $w );
  11. $preg = "#<DIV class=a2b style=\"margin-bottom:10px\">(.*?)<BR class=a2 clear=all>#is";
  12. $o = preg_match_all( $preg, $arrContent, $out );
  13.  
  14.  $news = $out[0][0];
  15.  $news=stripslashes($news);
  16.  $news=strip_tags($news);
  17. $news=str_replace("'","",$news);
  18.  $zapytanie = "INSERT INTO newsy
  19.  
  20. VALUES (0, '$news')";
  21.  
  22. if(@mysql_query ($zapytanie)) {
  23.  
  24. print '<p>ok</p>';
  25.  
  26. } else {
  27.  
  28. print "<p>Nie ok ponieważ:<b>" . mysql_error() . "</b></p>";
  29.  
  30. }
  31.  
  32.  
  33. }
  34. ?>


WIem ze kod jest napsiany bardzo niedbale ale jestem juz zmęczony i nie chce mi sie narazie tego poprawiac. NA serwerze skorzystam z crona i zawsze o 3 w nocy np bedzie uruchamial skrypt zeby podkrasc troche newsow z jakiejs strony.

Ps. We wszystkim pomogl mi strife z tego forum ;] Thx exclamation.gif!
free
wkleilem ten kod i wyskakuje
"Nie ok ponieważ:No database selected"
w kodzie jest odnsnik do bazy danych @mysql_query ($zapytanie)
domyslam sie ze baze trzeba jeszcze zainicjowac. To ma byc moja baza ?
O cochodzi w tym ?
LBO
mysql_connect" title="Zobacz w manualu php" target="_manual

Musisz stworzyć jeszcze z MySQL tabelę o newsy takiej samej strukturze jaką ma Nightstalker (zapytaj go, może ci ją udostepni).
free
Tak jak przypuszczalem trzeba dodac jeszcze kontakt z baza poprzez mysql_connect.

czy ten skrypt obsluguje kanaly RSS takze z innych serwisow ?

Cytat
NA serwerze skorzystam z crona
Jak sie korzysta z krona ?
nospor
Cytat
Jak sie korzysta z krona ?
A jak sie korzysta z wyszukiwarki i google?
http://www.google.com/search?hs=h1D&hl=pl&...ukaj&lr=lang_pl
oraz skorzystaj z wyszukiwarki forum
Nightstalker
No dzisiaj dopracowalem troche skrypt :

Struktura tabeli w bazie ( u mnie nazwa bazy to newsy_rss ) :

  1. CREATE TABLE `newsy` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `txt` text NOT NULL,
  4. PRIMARY KEY (`id`)
  5. ) TYPE=MyISAM AUTO_INCREMENT=0;


Plik rss.php :

  1. <?php
  2.  
  3. /*
  4. +-------------------------------------------------------
  5. | Zlodziej newsow
  6. +-------------------------------------------------------
  7. | version: 1.1
  8. +-------------------------------------------------------
  9. | author: nightstalker / www.php.xfree.pl
  10. +-------------------------------------------------------
  11. */ 
  12.  
  13. class system { // przekleilem sobie z mojego cms'a - lenistwo tongue.gif
  14.  
  15. function db_connect ( $host, $user, $pass ) {
  16.  
  17. if ($dbc = @mysql_connect ( $host, $user, $pass ) ) {
  18.  
  19. } else {
  20.  
  21. die ('<p>Nie można połaczyć się z bazą danych poniweaż<b>' . mysql_error() .'</b></p>');
  22.  
  23. }
  24.  
  25. }
  26.  
  27. function db_select ( $database ) {
  28.  
  29. if (!@mysql_select_db ( $database )) {
  30.  
  31. die ('<p>Nie można wybrać bazy danych ponieważ:<b>' . mysql_error() . '</b></p>');
  32.  
  33. }
  34.  
  35. }
  36.  
  37. }
  38.  
  39. system::db_connect ('localhost','root','krasnal'); // wiadomo co 
  40. system::db_select( 'newsy_rss' ); // nazwa bazy danych
  41.  
  42.  
  43. $akcja=$_GET['akcja'];
  44.  
  45. switch($akcja) {
  46.  
  47. case 'czytaj':
  48.  
  49. {
  50.  
  51. $readFile = file_get_contents( 'http://wiadomosci.onet.pl/2,kategoria.rss' ); // sciagamy zawartosc kanalu
  52.  
  53. $preg = "#<guid isPermaLink=\"false\">(.*?)</guid>#is"; // definiujemy wyrazenie regularne dla linku do strony z newsem
  54.  
  55. $o = preg_match_all( $preg, $readFile, $out ); // wycinamy linki
  56.  
  57. foreach ( $out[ 1 ] as $w ) // przejscie petli po wszsytkich linkach
  58.  
  59. {
  60.  
  61. $arrContent = file_get_contents( $w ); // sciagamy zawartosc strony z newsem
  62.  
  63. /* 
  64.  * Teraz definiujemy wyrazenie regularne dla newsa, to najtrudniejsza czesc, 
  65.  * bo na roznych stronach roznie sie newsy zapisuje... 
  66.  * Najlepiej jak strona jest w 100% zgodna z xhtml, bo wtedy latwo zdefiniowac wyrazenie i wszystko odczytac
  67.  */ 
  68.  
  69. $preg = "#<DIV class=a2b style=\"margin-bottom:10px\">(.*?)<BR class=a2 clear=all>#is"; // to bedzie dzialac tylko na onecie
  70.  
  71. $o = preg_match_all( $preg, $arrContent, $out ); // znowu wycinka
  72.  
  73. // teraz wypada wyczyscic tresc newsa z znakow ktore maga zepsuc zapytanie sql
  74.  
  75. $news = $out[0][0]; 
  76. $news=stripslashes($news);
  77. $news=strip_tags($news);
  78. $news=str_replace("'","",$news);
  79.  
  80. // banalne zapytanie ktore zapobiega zapisywaniu tych samych newsow
  81.  
  82. $zapytanie = "SELECT * FROM newsy WHERE txt='$news'";
  83.  
  84. @mysql_query ($zapytanie);
  85.  
  86. if (mysql_affected_rows() > 0) {
  87. print '<p>W bazie jest juz taki news.. pomijam...</p>'; // jak news juz jest to nie zapisujemy go drugi raz...
  88. } else {
  89.  
  90. // jak go jeszcze nie ma to zapisujemy
  91.  
  92. $zapytanie = "INSERT INTO newsy VALUES (0, '$news')";
  93.  
  94. if(@mysql_query ($zapytanie)) {
  95.  
  96. print '<p>Tresc newsa zostala zapisana do bazy...</p>'; // to sie wyswietli jak wszystko bedzie ok 
  97.  
  98. } else {
  99.  
  100. print "<p>Nie mozna zapisac newsa do bazy ponieważ:<b>" . mysql_error() . "</b></p>"; // a to jak ni ebedize ok :)
  101.  
  102. }
  103.  
  104. }
  105.  
  106. }
  107.  
  108. print '<p><a href="'.$_SERVER['PHP_SELF'].'?akcja=pokaz">Pokaz newsy</a></p>';
  109.  
  110. break;
  111. }
  112.  
  113. case 'pokaz':
  114.  
  115. {
  116.  
  117. // tu chyba nie trzeba nic opisywac... wypisujemy wszystko z tabeli newsy
  118.  
  119. $zapytanie = "SELECT * FROM newsy ORDER BY id ASC";
  120.  
  121. if ($r = mysql_query ($zapytanie)){
  122.  
  123. while ($news = mysql_fetch_array ($r)) {
  124.  
  125. print '<p>'.$news['txt'].'</p>';
  126.  
  127. }
  128.  
  129. } else {
  130.  
  131. print '<p>Nie mozna odczytac informacji o komentarzach ponieważ:<b>' .mysql_error() . '</b></p>';
  132.  
  133. }
  134.  
  135. break;
  136. }
  137.  
  138. default:
  139.  
  140. print '<p><a href="'.$_SERVER['PHP_SELF'].'?akcja=czytaj">Odczytaj newsy z onetu i zapisz do bazy</a></p>';
  141. print '<p><a href="'.$_SERVER['PHP_SELF'].'?akcja=pokaz">Pokaz newsy z bazy</a></p>';
  142.  
  143. }
  144.  
  145. ?>


Najgorsze jest to ze na niektorych stronach jest straszny balagan i ciężko wyciąć treść newsa z kodu... najlepiej jak strona będzie w czystym xhtml to wtedy odczytamy wszystko, tresc, tytul, autora - bez problemów smile.gif No ale w związku z tym ze większość ludzi olewa standardy ( tak jak i ja do niedawna, o czym swiadczy moja nie zaktualizowana do xhtml strona domowa tongue.gif ) jest jak jest i trzeba się męczyć... No mam nadzieje że komus sie przyda to co napisałem... Jeszcze raz dzięki dla Strife'a, bo mi duzo wyjasnil winksmiley.jpg
Athlan
Osobiście robie tak:

  1. <?php
  2. $query = "SELECT * FROM news WHERE active='1' ORDER BY id DESC LIMIT 0, $limit_news";
  3. $do = mysql_query($query);
  4. while($seq = mysql_fetch_array($do)) {
  5.  <item>
  6. <title>'.$seq['title'].'</title>
  7. <pubDate>'.$seq['add_author'].'</pubDate>
  8. <description><![CDATA['.$seq['note_short'].' '.$seq['note_long'].']]></description>
  9. <author>'.$seq['add_date'].'</author>
  10.  </item>
  11. ';
  12. }
  13.  
  14. ?>


przykład z mojego kanału http://freerun.nowiny.pl/rss.php - działa smile.gif

Poza tym, nie musisz robić nowej bazy na newsy z RSS, możesz je pobrać z tabeli głównej newsów wg swoich warunków, np. dodać rząd RSS int(1) i gdy 1 to wyświetla w RSS, a gdy 0 nie smile.gif Zapytanko: SELECT * FROM news WHERE active='1' AND rss='1' ORDER BY id DESC LIMIT 0, $limit_news

W powyższym przykładzie zmienna active to aktywacja newsa przez admina. Proste smile.gif
Hacker
Kod
  <item>
    <title>'.$seq['title'].'</title>
    <pubDate>'.$seq['add_author'].'</pubDate>
    <description><![CDATA['.$seq['note_short'].' '.$seq['note_long'].']]></description>
    <author>'.$seq['add_date'].'</author>
   </item>

A nie
Kod
  <item>
    <title>'.$seq['title'].'</title>
    <pubDate>'.$seq['add_date'].'</pubDate>
    <description><![CDATA['.$seq['note_short'].' '.$seq['note_long'].']]></description>
    <author>'.$seq['add_author'].'</author>
   </item>

questionmark.gif
Jak tak to popraw też na swojej stronie
Athlan
Hacker dzieki... nie wiedzialem dlaczego sypie mi się autor tongue.gif
Nightstalker
Cytat(Athlan @ 2006-04-21 16:26:49)
Osobiście robie tak:

  1. <?php
  2. $query = "SELECT * FROM news WHERE active='1' ORDER BY id DESC LIMIT 0, $limit_news";
  3. $do = mysql_query($query);
  4. while($seq = mysql_fetch_array($do)) {
  5.  <item>
  6. <title>'.$seq['title'].'</title>
  7. <pubDate>'.$seq['add_author'].'</pubDate>
  8. <description><![CDATA['.$seq['note_short'].' '.$seq['note_long'].']]></description>
  9. <author>'.$seq['add_date'].'</author>
  10.  </item>
  11. ';
  12. }
  13.  
  14. ?>


przykład z mojego kanału http://freerun.nowiny.pl/rss.php - działa smile.gif

Poza tym, nie musisz robić nowej bazy na newsy z RSS, możesz je pobrać z tabeli głównej newsów wg swoich warunków, np. dodać rząd RSS int(1) i gdy 1 to wyświetla w RSS, a gdy 0 nie smile.gif Zapytanko: SELECT * FROM news WHERE active='1' AND rss='1' ORDER BY id DESC LIMIT 0, $limit_news

W powyższym przykładzie zmienna active to aktywacja newsa przez admina. Proste smile.gif

No tak Athlan, ale nie zrozumiałes tematu... W kanałach RSS nie przesyła się zwykle całej treści wiadomosci. Czasem treść jest ( tak jak w Twoim kanale), ale nie zawsze, a w przypadku tych stron z których ja chce podkradac newsy w RSS przesyła się tylko tytuł i link do newsa. Mój skrypt wchodzi na strone z linka sciąga zawartość i wycina sobie tylko treść. Troche długo trwa taka operacja, dlatego wyciągam newsy raz na jakiś czas i przechowuje wszystko w bazie, a nie robie tego "na żywo". Jeszcze raz zaznaczam - problem był w wyciągnięciu treści newsa ze strony do której prowadzi link w RSS, a nie z samego kanału. Tyle winksmiley.jpg
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.