Utilisateur:EvHart/aRSS
Apparence
#!/usr/bin/ruby ################################################################################ # Wikitools: make RSS from wikimedian article # Copyright (C) 2006 EvHart under GPL License # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # version 26/05/2006 # author EvHart # ################################################################################ # Bugs: # - Comments links. # - Ftp commandline (use static var for publishFTP) # # Todo: # - Redesign. # - Use scan insted of match. # - Ftp commandline ################################################################################ require 'net/http' require 'tempfile' require 'net/ftp' require 'timeout' class WikimediaRSS @rss @host @title @desc def initialize(host,title,desc=nil) @host = host @title = title if(desc==nil) @desc = "RSS for #{title}" else @desc = desc end @rss = createRSS() end def publishFTP(host,login=nil,psw=nil,fileDest=nil) Tempfile.open("w+") do |file| file << @rss file.seek 0 Net::FTP.open(host) do |ftp| if(login != nil && psw != nil) ftp.login(login,psw) else ftp.login end if(fileDest == nil) fileDest = "rss.xml" end ftp.put(file.path,fileDest) end end end def save(file="rss.xml") File.open(file,"w+") do |file| file << @rss end end private # :( def createRSS() str = getArticle() str = "#{/\<ul id="pagehistory">\n*((.+\n)*).*\<\/ul\>\<input id="historysubmit"/.match(str)}" #Remove <!-- start content --> & <div class="printfooter"> str.sub!(/\<ul id="pagehistory"\>/,'') #Remove footer str.sub!(/\<\/ul\>\<input id="historysubmit"/,'') #Header rss = '<?xml version="1.0"?>' rss << '<rss version="2.0">' rss << ' <channel>' rss << ' <title>'+@title+'</title>' rss << ' <link>http://'+@host+'/w/index.php?title='+@title+'</link>' rss << ' <description>'+@desc+'</description>' str.each do |rssItem| #Remove unusefull things: rssItem.sub!(/\(.*\)\(.*\)(.*)*/,'') #Create Items rssItem.sub!(/<li>.*name="diff" \/\>/,'<item>') rssItem.sub!(/<\/li>/,'</item>') #Cleanup #autocomment rssItem.sub!(/\<span class="autocomment"\>.*"\>→<\/a\>/,'<i>Dans: </i>') rssItem.sub!(/\s+-\<\/span\>/,'...') #Create Title (date,author) #Select date date= "#{/\<item\> \<a href=.*\<span class='history-user'\>/.match(rssItem)}" date.sub!(/<.*"\>/,'') date.sub!(/<.*\>/,'') #Select author author = "#{/\<span class='history-user'\>.*\<span class='comment'\>/.match(rssItem)}" author.sub!(/\<span class="minor"\>m\<\/span\>/,'') author.sub!(/<span class='comment'\>/,'') author.sub!(/\<\/a\>\<\/span\>/,'') author.sub!(/\<span.*"\>/,'') rssItem.sub!(/\<span class='history-user'.*\>\<\/span\>/,'') #title rssItem.sub!(/\<item\>/,'<item><title>'+author+' ('+date+')</title>') #Create link rssItem.sub!(/\<a href="/,'<link>http://'+@host) rssItem.sub!(/" title=.*\<\/a\>/,'</link>') #Create description (use comments) rssItem.sub!(/\<span class="minor"\>m\<\/span\>/,'<description><b> [m] </b>') rssItem.sub!(/\)\<\/span\>/,'</description>') if( nil != /\<description\>/.match(rssItem)) rssItem.sub!(/\<span class='comment'\>\(/,'') else rssItem.sub!(/\<span class='comment'\>\(/,'<description>') end #fixing some bugs #Span: rssItem.sub!(/\<span\>/,'') rssItem.sub!(/\<\/span\>/,'') #description if( nil == /\<description\>/.match(rssItem)) rssItem.sub!(/\<\/link\>/,'</link> <description>') end if( nil == /\<\/description\>/.match(rssItem)) rssItem.sub!(/\<description\>/,' <description> none </description>') end #<li> rssItem.sub!(/\<li\>/,'') #Add to RSS ! rss << rssItem end #Footer rss << ' </channel>' rss << '</rss>' return rss end def getArticle() Net::HTTP.start( @host, 80 ) do |http| return ( http.get( '/w/index.php?title='+@title+'&action=history').body ) end end end ################### # Script # ################### # /!\ Just some test.... if ARGV.length < 3 || (ARGV[2] != '-f' && ARGV[2] != '-ftp' && ARGV[2] != '-s') puts "Article to RSS ©2006 EvHart under GNU/GPL License\n" puts "Usage : ruby ./ArticleRSS.rb host [article] [-f frequency > 0] [-s save] [-ftp [host] [login] [psw]]\n" exit(0) else host = ARGV[0] article = ARGV[1] end #Default values frequency = 0 fhost = login = psw = save = nil ################################# # Set ftp vars here # ################################# fhost = "" login = "" psw = "" ################################ # /!\ Just some test.... for i in (2..ARGV.length) if (ARGV[i] != nil) if (ARGV[i] == "-ftp") fhost= ARGV[i+1] if ARGV[i+2] != ("-f"||"-s") login=ARGV[i+2] i=i+1 end if ARGV[i+2] != ("-f"||"-s") psw=ARGV[i+3] i=i+1 end elsif (ARGV[i] == "-f") frequency = ARGV[i+1].to_i elsif (ARGV[i] == "-s") save = ARGV[i+1] end end end puts "Wikitools: RSS for wikipedia (aV0.1) Copyright (C) 2006 EvHart under GPL License" puts "---------------------------------------------------------------- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ---------------------------------------------------------------- " if frequency > 1 puts "Updating frequency set to #{frequency} sec... (press Ctrl-C to quit)" end i = 0 trap( 'SIGINT' ) do puts "---------------------------------------------------------------- " puts "RSS updated #{i+1} times" exit(0) end begin rss = WikimediaRSS.new(host,article) if(fhost != nil) puts "Updating RSS... ##{i} At #{Time.now}" rss.publishFTP(fhost,login,psw,save) elsif (save != nil) puts "Saving RSS... ##{i} At #{Time.now}" rss.save(save) end sleep(frequency) i=i+1 end until frequency < 1 ################### ###################