Añadiendo datos automáticamente

Buenas noches a todos!

Llevo un rato probando y probando, y ni San Google ni los cientos de
cafés que he tomado ya, me han hecho encontrar la solución a estre
problema que tengo delante. Si alguno pudiera aconsejarme con lo que
hacer, estaría eternamente agradecido.

La cuestión es la siguiente, tengo un pequeño codigo que coje los datos
de un RSS y los presenta en pantalla (un muy simple lector RSS). La
cuestión es que me gustaría que automáticamente cada cierto tiempo, o
almenos cada vez que accediera al action, tomara los datos del RSS
(título y contenido) y los agregara a la base de datos, exactamente a la
tabla news (id, title, content).

El codigo del lector es el siguiente:

def index
feed_url = ‘<![CDATA[Portada // elmundo]]>
output = “

My RSS Reader


open(feed_url) do |http|
response = http.read
result = RSS::Parser.parse(response, false)
result.output_encoding = “iso-8859-1”
output += “Feed Title: #{result.channel.title}

result.items.each_with_index do |item, i|
output += “

#{i+1}. #{item.title}
#{item.description}

” if i < 10
end
end
render_text output
end

Supongo que para hacerlo, es tomar las strings de item.title y de
item.description de cada post y irlas guardando progresivamente. Lo que
sucede con esto, es que no se como aplicarlo, ahora mismo tengo un
enorme “cacao” en la cabeza que no me deja ni razonar.

Gracias a todos por la ayuda y el tiempo que podais tomar al leer esto.

Saludos,
Coquito.

El Sábado, 30 de Diciembre de 2006 01:44, Coquito Z. escribió:

almenos cada vez que accediera al action, tomara los datos del RSS
result = RSS::Parser.parse(response, false)
Supongo que para hacerlo, es tomar las strings de item.title y de
item.description de cada post y irlas guardando progresivamente. Lo que
sucede con esto, es que no se como aplicarlo, ahora mismo tengo un
enorme “cacao” en la cabeza que no me deja ni razonar.

No conozco el resto de tu aplicación, así que la solución que se me
ocurre a
lo mejor no la puedes llevar a cabo en tu caso. Pero bueno, espero que
te
sirva.

Yo empezaría por crear un par de modelos Feed y FeedItem (que supongo
que tú
ya tienes algo parecido). El primero representa una fuente RSS (un feed)
y el
segundo cada elemento que podamos leer.

El siguiente paso sería simplificar el controlador, quitando el código
referente a la lectura de los RSS. ¿Dónde lo ponemos? Pues siguiendo la
propuesta[1] de Jamis B. y Michael Koziarsky, podríamos crear una
clase
FeedImporter (que pondríamos en lib/). Así, el modelo Feed sería algo
como:

class Feed < ActiveRecord::Base
has_many :feed_items

def import!
FeedImporter.import!(self)
end
end

La clase FeedImporter se encargará de instanciar los nuevos FeedItem
según sea
necesario. Si quieres, puedes prescindir de esta clase (FeedImporter) e
implementar esta funcionalidad en Feed, pero el enfoque de Koziarsky y
Jamis
hace que tus modelos permanezcan simples.

En cuanto al controlador, podrías hacer algo como:

app/controllers/feed_controller.rb

def view_feed
@feed = Feed.find(params[:id])
@feed.import!
@items = feed.items
end

Y en la vista, sólo tienes que recorrer los elementos (@items):

app/feeds/view_feed.rhtml:

<%= render :partial => “item”, :collection => @items %>

app/feeds/_item.rhtml

<%=h item.title %>
<%=h item.body %>

Gracias a todos por la ayuda y el tiempo que podais tomar al leer esto.

Espero que te haya servido de algo.

Saludos,

Un saludo.

[1] http://www.therailsway.com/2006/12/18/importing-files

Por lo que entiendo lo que quieres es leer el feed para ver si hay post
nuevos… yo hice esto con crontab, ejecutando cada cierto tiempo un
método
de una clase ruby.

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /usr/bin/ruby script/runner ’
Notice.cargar_feeds’ -e development

este código era de mi crontab, corría cada 5 minutos y ejecutaba el
método
cargar_feeds de la clase Notice mientras estaba en desarrollo.

Aquí [1] hay algo de info sobre esto.

espero que te sirva.
saludos,

[1]
http://ryandaigle.com/articles/2005/12/21/1135178266137.html#comments

El día 30/12/06, Imobach González Sosa [email protected] escribió:

On 30/12/06, Coquito Z. [email protected] wrote:

Buenas noches a todos!

La cuestión es la siguiente, tengo un pequeño codigo que coje los datos
de un RSS y los presenta en pantalla (un muy simple lector RSS). La
cuestión es que me gustaría que automáticamente cada cierto tiempo, o
almenos cada vez que accediera al action, tomara los datos del RSS
(título y contenido) y los agregara a la base de datos, exactamente a la
tabla news (id, title, content).

Hola,

para persistir los ítems y los feeds en base de datos, como te han
comentado, basicamente solo tienes que crear los modelos
correspondientes y luego importar con un cron y una estructura
elegante.

Ahora, si vas a manejar varios feeds tienes q tener en cuenta un poco
como enfocar el tema. Yo creo que lo ideal para cualquier cosa que no
sea muy pequeña es crear dos aplicaciones independientes: un agregador
y un lector. El lector solo hace vistas de tus feeds e ítems, y
cualquier operación adicional (comentarios, etc.). El agregador se
encarga de la recolección de ítems y de la gestión (CRUD) de feeds.

Después tienes que tener en cuenta que a menos que el agregador vaya a
ser realmente mínimo tienes que tener en cuenta varios temas
importantes. Por ejemplo,

  • el encoding de los feeds (Latin-1/utf-8 basicamente)
  • la gestión de ancho de banda con GET condicional
  • los distintos tipos de feeds (atom/rss1/rss2)
  • la gestión de códigos HTTP (como mínimo atender a los 301,302 y 404,410)
  • el cacheado de ítems
  • la gestión de ítems duplicados (un problema curiosamente de muy mala
    solución para lo simple que se plantea)

Lo mejor es que prescindas de algo escrito por tí a tan bajo nivel y
utilices alguna librería de sindicación. Tienes varias opciones entre
las que se pueden destacar:

  • En Ruby, Feedtools. Aunque a mi personalmente me parece que tienen
    un rendimiento bastante malo. Lo bueno es que están pensadas para
    integrarse en Rails.

  • En Python, el Universal Feed Parser de los maestros Mark Pilgrim y
    Sam Ruby, lo mejorcito.

  • En PHP, el clásico Magpie y una un poco más reciente, SimplePie que
    está bastante curiosa.

Me da pereza recolectar URLs, pero Google te dará acceso inmediata a
cada nombre.

Es un tema muy chulo, suerte.


Manuel
http://linkja.com * un agregador de tendencias
http://simplelogica.net
simplelogica.net

Coquito Z. wrote:

almenos cada vez que accediera al action, tomara los datos del RSS
result = RSS::Parser.parse(response, false)
Supongo que para hacerlo, es tomar las strings de item.title y de
item.description de cada post y irlas guardando progresivamente. Lo que
sucede con esto, es que no se como aplicarlo, ahora mismo tengo un
enorme “cacao” en la cabeza que no me deja ni razonar.

Gracias a todos por la ayuda y el tiempo que podais tomar al leer esto.

Saludos,
Coquito.

Salute Coquito,

Te cuento, yo tengo in-progress una aplicación que es un planet hecho
en Rails, no se si es exactamente lo que estas buscando pero creo que
soluciona varios de los problemas que planteas.

Yo lo que hago es chequear los feeds cada X horas a través de un script
en el Cron y guardar las nuevas entradas en una BBDD local. Lo hago por
horas porque lo tengo puesto en un server en producción que tiene un
ancho de banda limitado pero podes establecer los periodos que quieras,
claro está.
Uso FeedTools para la recogida de los feeds, es multiusuario, tiene una
mini panel de admin. para que cada usuario puede agregar más feeds,
borrar contenidos cacheados de cada feed o ponerse un avatar y tiene un
sistema de sign-up via web.
Si lo querés ver funcionando, está colgado en
http://planet.assl-site.net

Si te interesa te paso el código (es GPL) o lo cuelgo en algún lado.

Saludosss y Buen Año!

Mauro.

a mi me interesa mucho tu aplicación pero la web ya no existe por lo que
parece.

2006/12/30 Mauro P. [w3revolt.com] [email protected]:

Salute Coquito,

Te cuento, yo tengo in-progress una aplicación que es un planet hecho
en Rails, no se si es exactamente lo que estas buscando pero creo que
soluciona varios de los problemas que planteas.

Yo lo que hago es chequear los feeds cada X horas a través de un script
en el Cron y guardar las nuevas entradas en una BBDD local. Lo hago por
horas porque lo tengo puesto en un server en producción que tiene un
ancho de banda limitado pero podes establecer los periodos que quieras,
claro está.
Uso FeedTools para la recogida de los feeds, es multiusuario, tiene una
mini panel de admin. para que cada usuario puede agregar más feeds,
borrar contenidos cacheados de cada feed o ponerse un avatar y tiene un
sistema de sign-up via web.
Si lo querés ver funcionando, está colgado en
http://planet.assl-site.net

Si te interesa te paso el código (es GPL) o lo cuelgo en algún lado.

Saludosss y Buen Año!

Mauro.

Muchas gracias a todos, de verdad! Vuestra ayuda me es muy útil :smiley: Lo
primero de todo, gracias Mauro por lo del planet, tu ejemplo de planet
es justo lo que necesito para desarrollar mi idea, me iría realmente
bien que me pasaras el código o lo colgases en algun sitio (si quieres
puedo colgarlo yo). Aparte de eso tengo una duda en general acerca del
tema de params[].

Si tengo el código de aquí abajo, como puedo hacer para que el
item.title y el item.description se introduzcan en el params[], para ser
posteriormente guardado en la database? He estado probando con varios
ejemplos y llevo horas intentando no daros la tabarra de nuevo con
preguntas como esta, pero la verdad es que no he conseguido hacer nada
que no estubiera ya hecho.

El código es el siguiente:

require ‘rss/2.0’
require ‘open-uri’

class RssfeedController < ApplicationController

def index
feed_url = ‘<![CDATA[Portada // elmundo]]>
output = “

My RSS Reader


open(feed_url) do |http|
response = http.read
result = RSS::Parser.parse(response, false)
result.output_encoding = “iso-8859-1”
output += “Feed Title: #{result.channel.title}

result.items.each_with_index do |item, i|
output += “

#{i+1}. #{item.title}
#{item.description}

” if i < 10

    #Qué coloco aquí?

    @news = New.new(params["Y aquí?"]
    @news.save
  end
end
render_text output

end
end

El modelo de la aplicación se llama New, y los campos de la tabla “news”
son “title” y “content”. Disculpar las molestias y el tiempo perdido con
un paleto como yo :wink:

Saludos,
Coquito.