ruby, blogosfera March 22, 2006 11:35 pm (Save post)
Creare un feed con ruby è di una banalità disarmante, sia creando il file a mano sia utilizzando una delle varie librerie esistenti come RSS::Maker (parte della distribuzione), FeedTools eccetera.
Ma come qualsiasi blogger saprà, un feed che cade in una foresta vuota non fa’ rumore.
Il modo giusto per fare rumore è inviare un ping ai vari servizi di aggregazione/indicizzazione dei blog come Technorati, che è una cosa sorprendentemente semplice, e va fatta usando XMLRPC.
Stamattina mentre prendevo il caffé ho quindi messo insieme questo spezzone di codice che sembra funzionare:
require ‘xmlrpc/client’
Blog =Struct.new(:name, :url) do
Services= %w{
http://rpc.pingomatic.com/
http://ping.blo.gs/
http://rpc.weblogs.com/RPC2
http://ping.feedburner.com
http://api.feedster.com/ping.php
http://www.syndic8.com/xmlrpc.php
http://api.my.yahoo.com/RPC2
http://rpc.technorati.com/rpc/ping
}
def ping_all(services=Services)
services.map do |s|
ping(s)
end
end
def ping(service)
client= XMLRPC::Client.new2(service)
res = client.call( “weblogUpdates.ping”,name,url )
raise StandardError.new(res[‘message’]) if res[‘flerror’]
“ping sent to #{service} succesfully: #{res[’message’]}”
rescue Exception=>e
“Unable to ping #{service}: #{e.message}”
end
end
puts Blog.new(“Il figoso blog di Mario”, “http://mario.com”).ping_all
Il codice è semplice:
- Carica la libreria xmlrpc
- Crea una classe con due campi, nome del blog ed url. Piuttosto che scrivere la classse da me ho preferito usare Struct.new, che restituisce una classe con campi accessibili per ogni argomento, il corpo del blocco è come se fosse definito nella classe
- Crea una lista di servizi a cui inviare un ping, il literal %w{a b c} serve a creare un array i cui elementi sono le stringhe contenute tra i delimitatori ripulite dagli spazi di separazione
- Un client viene creato passando l’url del server
- vengono catturate le eccezioni, che possono essere errori generici o timeout, e si controlla che il messaggio ricevuto non contenga un error (xmlrpc usa codici di errore embedded )
Niente di strano, insomma, più difficile da spiegare che da scrivere.
Esempio di output:
ping sent to http://rpc.pingomatic.com/ succesfully: Pings being forwarded to 16 services! ping sent to http://ping.blo.gs/ succesfully: Succeeded. ping sent to http://rpc.weblogs.com/RPC2 succesfully: Thanks for the ping. ping sent to http://ping.feedburner.com succesfully: Ok ping sent to http://api.feedster.com/ping.php succesfully: Thanks for the ping. ping sent to http://www.syndic8.com/xmlrpc.php succesfully: Thanks for pinging Syndic8 ping sent to http://api.my.yahoo.com/RPC2 succesfully: OK ping sent to http://rpc.technorati.com/rpc/ping succesfully: Thanks for the ping
Ovviamente c’è il problema che i delay dei vari ping si sommano, la soluzione usando i thread è semplice ma è lasciata come esercizio per il lettore

