1 Ostatnio edytowany przez maw (2008-02-10 19:10:36)

Witam

Tak jakoś wyszło, że robię rss dla Kaz-a nie korzystając z dostępu do bazy tylko na podstawie danych przetworzonych a wyświetlanych z cms-a atari.online.pl.

Ponieważ moim "rodzimym" językiem obecnie jest as2/as3 miałem nadzieję, że bez problemu przeportuję "końcówkę" napisaną we flashu do php5 - no niestety, jak to zwykle bywa - przeliczyłem się :D - i piszę od zera.

Obecny wygląd skryptu jest taki:

<?php echo '<?xml version="1.0" encoding="iso-8859-2"?>'; ?>
<rss version="2.0">
<channel>
    <title>Newsy ATARI atari.online.pl</title>
    <link>http://atari.online/</link>
    <description>News-RSS maniaków atari...</description>
    
    <language>pl</language>
    <generator>generated from cuteNews 1.0</generator>
    <pubDate><?php
     echo date("D, d M Y h:i:s O",mktime());
     ?></pubDate>
<lastBuildDate><?php
     echo date("D, d M Y h:i:s O");
     ?></lastBuildDate>
    <copyright>Copyright 2008, atari.online.pl</copyright>
<?php
$fileContents=file_get_contents("news.txt");
//
$rsstext = substr($fileContents, strpos ($fileContents,"<BODY>")+6, strpos ($fileContents ,"<TABLE" )- strpos ($fileContents,"<BODY>")-6);
//
$rsstext = str_ireplace ("<A ", "<item>", $rsstext);
$rsstext = str_ireplace ("href=\"", "<link>", $rsstext);
$rsstext = str_ireplace ( "</A> z ", "</title><pubDate>", $rsstext);
$rsstext = str_ireplace ( " (", "</pubDate><comments>", $rsstext);
$rsstext = str_ireplace ( ")<BR>", "</comments></item>", $rsstext);
$rsstext = str_ireplace ( "\">", "</link><title>", $rsstext);//
echo $rsstext; 
?>
</channel>
</rss>

plik wzorcowy, z którego korzystam ma taką postać "wiersza":

<A 
href="news.php?subaction=showfull&id=1202511710&archive=&start_from=&ucat=1&number=20&template=Headlines&category=1">"?wiat 
Atari" u nas</A> z 09.02.2008 (6)<BR>

tutaj można go zassać w całości: http://www.flashfactory.ovh.org/show/atari/news.txt - jest to już wynik działania skryptu ze strony atari.online.pl, do którego linku bezpośredniego (położenia, ani nazwy i zmiennych)  - z oczywistego (myślę) powodu - nie mogę podać. I tak jego wywołanie poza serwisem jest wykrywane i blokowane.

Tak wygląda plik powyższy przeparsowany przez mój skrypt: http://www.flashfactory.ovh.org/show/at … _kopia.xml

Tutaj zaczyna się moja prośba o pomoc aktywnego pehapowca - obecnie zostaje tylko zmienić format daty na właściwy (na  <pubDate>Sun, 10 Feb 2008 06:55:53 +0100</pubDate> ) i (ewentualnie) w polu comments zmienić liczbę na link. Niestety, nie znalazłem w specyfikacji rss 2.0 jaka zmiana powoduje ponowne podświetlenie danego rekordu jako nieczytanego, jeżeli zmieniła się liczba komentarzy - jest to chyba zrozumiałe, że dla każdego biorącego udział tam w dyskusji będzie ważne (oprócz tego, czy są nowe newsy), czy pojawiła się nowa odpowiedź w komentowanym wpisie.

No i zapewne skrypt idzie zrobić lepiej - poszedłem 'najprostszą linią oporu' - proszę bardzo, można pozmieniać.

Co bym dodał ze swojej strony, to jeszcze buforowanie pliku wynikowego - tzn. np. automatyczną aktualizację i parsowanie tylko co godzinę przez pierwszego wchodzącego (jeżeli godzina pliku "buforowanego" nie różni się od bieżącej, to pobiera do odczytu ostatnio sparsowaną kopię).

No więc czekam na kontakt ze strony kogoś kompetentniejszego niż ja :)

Z góry dzięki. MaW

___
Press play on tape...

2

Zamiana daty:

function zamien_date ($data)
{
$temp=explode ('.',$data);
$time=mktime (0,0,0,$temp[1],$temp[0],$temp[2]);
$data2=date("r",$time);
return $data2;
}

Przykład działania

$stara_data='09.02.2008';
$nowa_data=zamien_date($stara_data);
echo $nowa_data;

>> Sat, 09 Feb 2008 00:00:00 +0100

3 Ostatnio edytowany przez maw (2008-02-10 22:24:49)

Dzięki, akurat tą metodę miałem pod nazwą str2date (identyczną!!). Niewyraźnie napisałem - chodziło mi bardziej o wymianę wielokrotnych wystąpień - walczyłem z eregi, ale chyba nie tędy droga - oto efekt końcowy (należy wstawić przed ostatnim echo - usunąć dublujące się):

function str2date ($data)
{
$temp=explode ('.',$data);
$time=mktime (0,0,0,$temp[1],$temp[0],$temp[2]);
$data2=date("r",$time);
return $data2;
}
//
$lastfinded = 0;
    do {
        $looked = strpos($rsstext,"<pubDate>",$lastfinded);
        if ($looked !== false) {
    $looked += 9;
    //
    $fixeddatetxt = substr($rsstext,0,$looked);
    $fixeddatetxt .= str2date (substr($rsstext,$looked+1, 10));
    $fixeddatetxt .= substr($rsstext,$looked+10);
    $rsstext = $fixeddatetxt;
    //
    $lastfinded = $looked;
        }
    } while ($looked !== false);
   //
echo $rsstext;

I tym sposobem jeszcze tylko kontakt z Zygą i będziemy mieli u Kaza Rss-a :D

PS. pozostaje kwestia buforowania...

PS2. Mój czytnik (thunderbird) ignoruje ustawienia kodowania i wyświetla treść zawsze latin-1 - nie wiem dlaczego :|

___
Press play on tape...

4

Kaz właśnie przekazał info od Zygi, znowu jestem trochę do przodu, jednakże weekend się skończył i wolny czas będę miał... najwcześniej we wtorek wieczorem.

Informacje jak wykonać buforowanie też do mnie przyszły (dzięks Burza za wskazanie), dodatkowo otrzymałem link do pełnej specyfikacji RSS2.0 - a więc będziecie mieli w czytniku informację o tym, czy są nowe komentarze w danym wpisie. Na razie taki wpis "nowo skomentowany" wyświetli się jako następna nowa pozycja o tej samej nazwie - ale myślę, że to niczemu nie przeszkadza.

Po stronie czytnika okres odświeżania (ponownego odczytu pliku rss) i uaktualnienia załatwiają dwa tagi: <TTL> i <guid> co też wykorzystałem/wykorzystam.

___
Press play on tape...

Ja sie nie wtracam, ale kibicuje :)

Kaz/Rohar
Prowadzę stronę dla obłąkanych: http://atari.online.pl/