Linux за българи: Форуми

Програмиране => Web development => Темата е започната от: kennedy в Aug 16, 2011, 19:49



Титла: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: kennedy в Aug 16, 2011, 19:49
Здравейте,
Търся скрипт с който мога да сваля списъка с непрочетените теми тук във форума и да си ги направя на RSS .
Някакви идеи за това как да стане?


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: b2l в Aug 16, 2011, 19:57
Здравейте,
Търся скрипт с който мога да сваля списъка с непрочетените теми тук във форума и да си ги направя на RSS .
Някакви идеи за това как да стане?

Защо трябва да използваш скрипт? Аз карам директно с Liferea.
(http://www.linux-bg.org/forum/index.php?type=rss;action=.xml)


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: kennedy в Aug 16, 2011, 21:56
Защото ми трябва списъка с моите обновени теми, не общите.
А няма как да го извадя с вгета защото трябва да се логна преди това.


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: b2l в Aug 17, 2011, 15:49
http://www.linux-bg.org/forum/index.php?action?board=72.0;sa=news;type=rss;action=.xml;u=[id]

Накрая ID го заменяш с твоето потребителското ID.

PS: пак не става... Моя грешка.

PS2: Оказва се, че самият RSS на форума не поддържа показване само на твоите теми. Дори и този за новините показва всички нови теми или теми в които е написан пост, без значение кой е автора.


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: kennedy в Aug 17, 2011, 17:37
аз затова питам дали някой си е играл с wget например да свали страница от сайт като мине през идентификацията. има описани разни хватки със запазване на куки и т.н.
Идеята ми е като изтегля списъка с обновените ми теми да го прекарам през един пхп  скрипт и той да го преформатира като рсс и да си го лепна на десктопа.
Всъщност гледах нещо такова с curl,  но там ми е безкрайно мътна история.


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: b2l в Aug 17, 2011, 17:42
Ами гледах POST заявката и има идин hidden параметър: hash_passwrd, който се изпраща и до тука съм стигнал, ама спрях понеже имам друга работа. Иначе гледах man-а на wget и на curl, но и на мен ми се видя малко мътна работа.


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: PhrozenCrew в Aug 18, 2011, 10:14
С wget  би трябвало да стане така (в момента няма как да го тествам):

wget -O - --save-cookies=cookies.txt --keep-session-cookies --auth-no-challenge --no-check-certificate --post-data "user=ПОТРЕБИТЕЛСКОТО_ИМЕ&passwrd=ПАРОЛАТА&hash_passwrd=" "http://www.linux-bg.org/forum/index.php?action=login2"

wget -O - --keep-session-cookies --load-cookies=cookies.txt "http://STRANICATA_KOIATO_TI_YTIABVA"

---------
Можеш да ползваш и някой автоматизатор за браузване в Web. Тук съм насъбрал няколко, можеш да си харесаш нещо по-лесно за работа: http://blog.nediko.info/web-mechanize-engines


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: b2l в Aug 18, 2011, 11:08
Да, при мен работи. Сега остава само парсъра.


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: PhrozenCrew в Aug 18, 2011, 13:14
И с curl би трябвало да няма проблем. Примерно през конзолата би трябвало да е така:
Код:
curl --cookie cfile --cookie-jar cfile --data "user=ПОТРЕБИТЕЛСКОТО_ИМЕ" --data "passwrd=ПАРОЛАТА" --data "hash_passwrd=" --location "http://www.linux-bg.org/forum/index.php?action=login2"

curl --cookie cfile --output NIAKAKYV_FILE.html "http://www.linux-bg.org/STRANICATA"
Ако и това работи, ще е много лесно конзолната версия да се прехвърли към PHP (ако му е зареден cURL).


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: VladSun в Aug 18, 2011, 13:26
Ами гледах POST заявката и има идин hidden параметър: hash_passwrd, който се изпраща и до тука съм стигнал, ама спрях понеже имам друга работа. Иначе гледах man-а на wget и на curl, но и на мен ми се видя малко мътна работа.

Да, но функцията за хеширане на паролата работи само при наличието на sha1_hex() функцията (която при мен FireBug я дава undefined), иначе паролата се предава некодирана.

Всъщност са се погрижили да може да се влиза във форума и с браузери без JS :)


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: PhrozenCrew в Aug 18, 2011, 19:15
Еххх, най накрая съм с биричка на машина с конзола, с php и нефилтриран интернет  ;D
Ей един вариант, който ми дойде на акъла:
Код
GeSHi (PHP):
  1. <?php
  2. function curl_get_links(){
  3. $ch = curl_init();
  4. curl_setopt($ch, CURLOPT_URL, 'http://www.linux-bg.org/forum/index.php?action=login2');
  5. curl_setopt ($ch, CURLOPT_POST, 1);
  6. curl_setopt ($ch, CURLOPT_POSTFIELDS, 'user=ПОТРЕБИТЕЛ&passwrd=ПАРОЛА');
  7. curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
  8. curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
  9. $store = curl_exec ($ch);
  10. curl_setopt($ch, CURLOPT_URL, 'http://www.linux-bg.org/forum/index.php?action=unread');
  11. $content = curl_exec ($ch);
  12. curl_close ($ch);
  13.  
  14. return $content;
  15. }
  16.  
  17. // ############################# Извличане на всички линкове
  18.  
  19. $html = curl_get_links();
  20. $links = array();
  21.  
  22. $dom = new DOMDocument();
  23. @$dom->loadHTML($html);
  24.  
  25. $xpath = new DOMXPath($dom);
  26. $hrefs = $xpath->evaluate("/html/body//a");
  27.  
  28. for ($i = 0; $i < $hrefs->length; $i++) {
  29.    $href = $hrefs->item($i);
  30.    $url = $href->getAttribute('href');
  31. if(preg_match('/\.0;topicseen$/',$url)){
  32. if(in_array($url, $links)) continue;
  33. $links[] = $url;
  34. }
  35. }
  36. foreach($links as $l) echo $l."\r\n";
  37. ?>
Това може да се вкара в някакъв аплет за десктопа примерно.


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: b2l в Aug 18, 2011, 19:30
Код
GeSHi (PHP):
  1. curl_setopt($ch, CURLOPT_URL, 'http://www.linux-bg.org/forum/index.php?action=unread');
Код
GeSHi (PHP):
  1. curl_setopt($ch, CURLOPT_URL, 'http://www.linux-bg.org/forum/index.php?action=unreadreplies');

Tака трябва да е за отговори на теми в които си писал или си постнал.


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: kennedy в Aug 19, 2011, 07:26
уау това проработи
Благодаря на всички !
Сега ще видя как ще го бодна на десктопа.


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: kennedy в Aug 20, 2011, 22:57
Еххх, най накрая съм с биричка на машина с конзола, с php и нефилтриран интернет  ;D
Ей един вариант, който ми дойде на акъла:
Код
GeSHi (PHP):
  1. <?php
  2. function curl_get_links(){
  3. $ch = curl_init();
  4. curl_setopt($ch, CURLOPT_URL, 'http://www.linux-bg.org/forum/index.php?action=login2');
  5. curl_setopt ($ch, CURLOPT_POST, 1);
  6. curl_setopt ($ch, CURLOPT_POSTFIELDS, 'user=ПОТРЕБИТЕЛ&passwrd=ПАРОЛА');
  7. curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
  8. curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
  9. $store = curl_exec ($ch);
  10. curl_setopt($ch, CURLOPT_URL, 'http://www.linux-bg.org/forum/index.php?action=unread');
  11. $content = curl_exec ($ch);
  12. curl_close ($ch);
  13.  
  14. return $content;
  15. }
  16.  
  17. // ############################# Извличане на всички линкове
  18.  
  19. $html = curl_get_links();
  20. $links = array();
  21.  
  22. $dom = new DOMDocument();
  23. @$dom->loadHTML($html);
  24.  
  25. $xpath = new DOMXPath($dom);
  26. $hrefs = $xpath->evaluate("/html/body//a");
  27.  
  28. for ($i = 0; $i < $hrefs->length; $i++) {
  29.    $href = $hrefs->item($i);
  30.    $url = $href->getAttribute('href');
  31. if(preg_match('/\.0;topicseen$/',$url)){
  32. if(in_array($url, $links)) continue;
  33. $links[] = $url;
  34. }
  35. }
  36. foreach($links as $l) echo $l."\r\n";
  37. ?>
Това може да се вкара в някакъв аплет за десктопа примерно.

а с тази магия как може да се извлече заглавието на темата?
абсолютно неразбираемо ми е как успява даже да извади баш на темите линковете   ??? ???


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: PhrozenCrew в Aug 21, 2011, 20:03
Ако решиш да ползваш DOM-модела, който за подобни случки ми се струва най-лек (и може би най-бърз, заради печения парсер на PHP), тогава извличаш името на линка с nodeValue. Примерно:
$title = $href->nodeValue;
Ам по-добре да видим целия код.

Код
GeSHi (PHP):
  1. <?php
  2. function curl_get_links(){
  3. $ch = curl_init();
  4. curl_setopt($ch, CURLOPT_URL, 'http://www.linux-bg.org/forum/index.php?action=login2');
  5. curl_setopt ($ch, CURLOPT_POST, 1);
  6. curl_setopt ($ch, CURLOPT_POSTFIELDS, 'user=ПОТРЕБИТЕЛ&passwrd=ПАРОЛА');
  7. curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
  8. curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
  9. $store = curl_exec ($ch);
  10. curl_setopt($ch, CURLOPT_URL, 'http://www.linux-bg.org/forum/index.php?action=unread');
  11. $content = curl_exec ($ch);
  12. curl_close ($ch);
  13.  
  14. return $content;
  15. }
  16.  
  17. // ############################# Извличане на всички линкове
  18.  
  19. $html = curl_get_links();
  20. $links = array();
  21.  
  22. $dom = new DOMDocument();
  23. @$dom->loadHTML($html);
  24.  
  25. $xpath = new DOMXPath($dom);
  26. $hrefs = $xpath->evaluate("/html/body//a");
  27.  
  28. for ($i = 0; $i < $hrefs->length; $i++) {
  29.    $href = $hrefs->item($i);
  30.    $url = $href->getAttribute('href');
  31.    $title = $href->nodeValue;
  32.  
  33. if(preg_match('/\.0;topicseen$/',$url)){
  34. if(in_array($url, $links)) continue;
  35. $links[] = $url;
  36. $titles[] = $title;
  37. }
  38. }
  39. foreach($links as $key=>$val){
  40. echo $val." - ".$titles[$key]."\r\n";
  41. }
  42. ?>

Малко е дървено потока да се разделя в 2 масива, но пък е по-лесно за четене. Единия масив  са ти линковете, а другия масив заглавията, така, че да могат лесно да се напасват за всякакви нужди.


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: VladSun в Aug 21, 2011, 21:18
Имам една малка забележка към скрипта, който иначе си е ОК за мен - ползваш in_array(), което би моглo да се замести доста по-ефективно с асоциативни масиви:

Код
GeSHi (PHP):
  1.  
  2. $href = $hrefs->item($i);
  3. $url = $href->getAttribute('href');
  4. $title = $href->nodeValue;
  5.  
  6. if(preg_match('/\.0;topicseen$/',$url))
  7. {
  8. if(isset($links[$url])) continue;
  9. $links[$url] = $title;
  10. }

Така и двата масива, които генерираш се предават с един масив при това с релацията помежду им.


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: PhrozenCrew в Aug 21, 2011, 21:41
Забележката е супер!  [_]3


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: kennedy в Aug 21, 2011, 22:44
добавям и кода за генериране на rss

Код
GeSHi (PHP):
  1. echo '<?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd">
  3. <rss version="0.91">
  4. <channel>
  5. <title>Linux за българи: Форум</title>';
  6.  
  7. foreach($links as $key=>$val){
  8. echo "<item><title>".$titles[$key]."</title><link>".$val."</link></item>\r\n";
  9. }
  10.  
  11. echo " </channel>
  12.  
  13. </rss>";
  14. ?>


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: kennedy в Aug 21, 2011, 22:45
ъъъъ всъщност след забележката на Влад, трябва ли нещо да променям в кога за генерация?


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: VladSun в Aug 21, 2011, 23:58
ъъъъ всъщност след забележката на Влад, трябва ли нещо да променям в кога за генерация?

Предполагам, че трябва да стане нещо от сорта на:

Код
GeSHi (PHP):
  1. <?php
  2. echo '<?xml version="1.0" encoding="utf-8"?>
  3. <!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd">
  4. <rss version="0.91">
  5. <channel>
  6. <title>Linux за българи: Форум</title>';
  7.  
  8. foreach($links as $url => $title){
  9. echo "<item><title>".$title."</title><link>".$url."</link></item>\r\n";
  10. }
  11.  
  12. echo " </channel>
  13.  
  14. </rss>";
  15. ?>


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: kennedy в Aug 23, 2011, 19:01
а ей това заклинание
Цитат
    if(preg_match('/\.0;topicseen$/',$url))
как трябва да се промени да хване последната страница на темата?


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: VladSun в Aug 23, 2011, 22:23
Малко не толковa PHP :)

rss.xsl
Код
GeSHi (XML):
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  3.  
  4. <xsl:output
  5. method="xml"
  6. omit-xml-declaration="no"
  7. doctype-public="//Netscape Communications//DTD RSS 0.91//EN"
  8. doctype-system="http://my.netscape.com/publish/formats/rss-0.91.dtd"
  9. indent="yes"
  10. />
  11.  
  12. <xsl:template match="/">
  13. <rss>
  14. <channel>
  15. <title>Linux за българи: Форум</title>
  16. <xsl:apply-templates select="/html/body//table/tr/td/table/tr[position() > 1]/td[position() = 3]/a[position() = 1]"/>
  17. </channel>
  18. </rss>
  19. </xsl:template>
  20.  
  21. <xsl:template match="a">
  22. <item>
  23. <title><xsl:value-of select="." /></title>
  24. <link><xsl:value-of select="../span/a[last()-1]/@href" /></link>
  25. </item>
  26. </xsl:template>
  27. </xsl:stylesheet>
  28.  

Код
GeSHi (PHP):
  1. ...
  2. $html = curl_get_links();
  3.  
  4. $dom = new DOMDocument();
  5. @$dom->loadHTML($html);
  6.  
  7. $xslDoc = new DOMDocument();
  8. $xslDoc->load("rss.xsl");
  9.  
  10. $proc = new XSLTProcessor();
  11. $proc->importStylesheet($xslDoc);
  12.  
  13. echo $proc->transformToXML($dom);
  14.  


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: kennedy в Aug 24, 2011, 12:30
тц, не става така, нещо се гелпи.


а ей това заклинание
Цитат
    if(preg_match('/\.0;topicseen$/',$url))
как трябва да се промени да хване последната страница на темата?


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: VladSun в Aug 24, 2011, 12:39
Кое, какво не става?

Не е точно, последната страница а последното менение:
Код
GeSHi (PHP):
  1. if(preg_match('/topic=\d+\.msg\d+;topicseen#new$/',$url))
  2.  


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: VladSun в Aug 24, 2011, 12:55
Намерих си един  бъг в XSLT-файла - при една страница, няма пейджър и дава празен линк.
Поправено:

Код
GeSHi (XML):
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  3.  
  4. <xsl:output
  5. method="xml"
  6. omit-xml-declaration="no"
  7. doctype-public="//Netscape Communications//DTD RSS 0.91//EN"
  8. doctype-system="http://my.netscape.com/publish/formats/rss-0.91.dtd"
  9. indent="yes"
  10. />
  11.  
  12. <xsl:template match="/">
  13. <rss>
  14. <channel>
  15. <title>Linux за българи: Форум</title>
  16. <xsl:apply-templates select="/html/body//table/tr/td/table/tr[position() > 1]/td[position()=3]/a[position()=1]"/>
  17. </channel>
  18. </rss>
  19. </xsl:template>
  20.  
  21. <xsl:template match="a">
  22. <item>
  23. <title><xsl:value-of select="." /></title>
  24. <link>
  25. <xsl:choose>
  26.  
  27. <xsl:when test="../span/a[last()-1]/@href">
  28. <xsl:value-of select="../span/a[last()-1]/@href" />
  29. </xsl:when>
  30.  
  31. <xsl:otherwise>
  32. <xsl:value-of select="./@href" />
  33. </xsl:otherwise>
  34.  
  35. </xsl:choose>
  36. </link>
  37. </item>
  38. </xsl:template>
  39. </xsl:stylesheet>
  40.  

Код
GeSHi (PHP):
  1. <?php
  2.  
  3. function getContent()
  4. {
  5. $ch = curl_init();
  6.  
  7. curl_setopt($ch, CURLOPT_URL, 'http://www.linux-bg.org/forum/index.php?action=login2');
  8. curl_setopt ($ch, CURLOPT_POST, 1);
  9. curl_setopt ($ch, CURLOPT_POSTFIELDS, 'user=USERNAME&passwrd=PASSWORD');
  10. curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
  11. curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
  12. $store = curl_exec ($ch);
  13. curl_setopt($ch, CURLOPT_URL, 'http://www.linux-bg.org/forum/index.php?action=unreadreplies');
  14. $content = curl_exec ($ch);
  15. curl_close ($ch);
  16.  
  17. return $content;
  18. }
  19.  
  20. $html = getContent();
  21.  
  22. $dom = new DOMDocument();
  23. @$dom->loadHTML($html);
  24.  
  25. $xslDoc = new DOMDocument();
  26. $xslDoc->load("rss.xsl");
  27.  
  28. $proc = new XSLTProcessor();
  29. $proc->importStylesheet($xslDoc);
  30.  
  31. header("Content-type: application/rss+xml; encoding=utf-8");
  32. echo $proc->transformToXML($dom);


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: kennedy в Aug 24, 2011, 14:39
Кое, какво не става?

Не е точно, последната страница а последното менение:
Код
GeSHi (PHP):
  1. if(preg_match('/topic=\d+\.msg\d+;topicseen#new$/',$url))
  2.  

това вади последните теми във форума .


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: VladSun в Aug 24, 2011, 15:03
Кое, какво не става?

Не е точно, последната страница а последното менение:
Код
GeSHi (PHP):
  1. if(preg_match('/topic=\d+\.msg\d+;topicseen#new$/',$url))
  2.  

?

T.e.?

http://www.linux-bg.org/forum/index.php?topic=41443.msg230753;topicseen#new ми вади тази страница с последият пост - "бившия" , де :)

това вади последните теми във форума .

Порблемът е, че не взима заглавието тъй като е друг линк :)
Може да се вземе лесно,обаче :)


Код
GeSHi (PHP):
  1. for ($i = 0; $i < $hrefs->length; $i++)
  2. {
  3.    $url = $hrefs->item($i)->getAttribute('href');
  4.    $title = $hrefs->item($i - 1)->nodeValue;
  5.  
  6. if(preg_match('/topic=\d+\.msg\d+;topicseen#new$/',$url))
  7. {
  8. if(!isset($links[$url]))
  9. {
  10. $links[$url] = $title;
  11. }
  12. }
  13. }
  14.  


Титла: Re: Скрипт за сваляне на списък с непрочетени теми от SMF форум (като линукс-бг)
Публикувано от: kennedy в Aug 24, 2011, 17:57
стана !
сега отива на последното мнение :)