Mostrando las entradas con la etiqueta webless. Mostrar todas las entradas
Mostrando las entradas con la etiqueta webless. Mostrar todas las entradas

viernes, noviembre 20, 2009

webless prototipo final

si viste el post anterior encontraste un poco de codigo de mas, para que lo querria uno?

bue, la idea era hacer algo asi:

uno entra a una pagina, pone una url, escribe un poco de javascript/jquery, aprieta probar y nos trae la pagina de resultado renderizandola en el server en webkit y aplicando el codigo que le dimos.

si el snippet que hicimos nos es util lo podemos guardar y nos da una url que podemos usar para obtener el resultado de esa transformacion cada vez que queramos.

no entendes nada? un ejemplo?

* obtener solo los links de los resultados de la primera pagina de google al buscar X
* sacar la cotizacion del dolar de la pagina de algun diario

es interesante tenerlo limpito y nos puede interesar consumirlo periodicamente o usarlo como entrada a otro programa, incluso podemos combinar varias entradas y armar un mashup en una pagina usando los resultados de varios scripts.

todavia no se entiende? ok, vamos con un par de screenshots...

lo que hacemos es poner esta url: www.google.com/search?q=sublime
y este script:


var page = $("html");
page.html($(".l"));
$('.l').wrap('<li></li>');
page.wrapInner('<ul></ul>');


y darle test, el resultado es:



luego elegimos send y lo guarda y nos da una url permanente para accederlo, al hacerlo vemos lo siguiente:



si alguien tiene ganas de seguir jugando con esto o lo hostea en algún lado publico el código por ahí :D

inject fun

el post anterior lo escribi como calentamiento para este que es la realizacion de una idea que tuve hoy (y que se va a completar en el post siguiente).

ya hicimos un browser, ahora estaria bueno manosear el contenido de las paginas no?

la mejor forma que conozco en cualquier lenguaje de manipular html es jquery, asi que estaria bueno poder jugar con el en todas las paginas no? lastima que no todas lo incluyen...

pero si lo inyectamos si lo van a tener :)

entonces tenemos una pagina, un campo para poner codigo js y ejecutarlo y podemos modificar el contenido de la pagina, algo asi:



por si no se ve corri el siguiente script: $('a').html('lol');

ahora vamos a ver un uso mas interesante:



casi me olvido el codigo :)

import os
import sys
import gtk
# https://bugs.launchpad.net/bugs/480398
gtk.gdk.threads_init()
import webkit

class Webless(object):
def __init__(self, url=''):
self.view = webkit.WebView()
self.open(url)

def inject_file(self, path):
'''run a script in a file'''
if os.path.isfile(path) and os.access(path, os.R_OK):
self.inject_script(file(path).read())
return True

return False

def inject_script(self, script):
'''run a script'''
self.view.execute_script(script)

def get_code(self):
'''return the text of the widget'''
self.view.execute_script('oldtitle=document.title;document.title=document.documentElement.innerHTML;')
html = self.view.get_main_frame().get_title()
self.view.execute_script('document.title=oldtitle;')
return html

def open(self, url):
if not url.startswith('http://') and not url.startswith('https://'):
self.url = 'http://' + url
else:
self.url = url

self.view.open(self.url)

class Browserless(gtk.Window, Webless):
def __init__(self, url=''):
gtk.Window.__init__(self)
Webless.__init__(self, url)
self.add(self.view)

class Browser(gtk.Window, Webless):
def __init__(self, url=''):
gtk.Window.__init__(self)
Webless.__init__(self, url)
self.set_title('Browser')
self.set_default_size(640, 480)

scroll = gtk.ScrolledWindow()
scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
scroll.set_shadow_type(gtk.SHADOW_IN)

scroll.add(self.view)

vbox = gtk.VBox()
hbox = gtk.HBox()

entry = gtk.Entry()
entry.connect('activate', self._on_url_changed)

if self.url:
entry.set_text(self.url)

code = gtk.Entry()
code.connect('activate', self._on_run_code)

getcode = gtk.Button("html to clipboard")
getcode.connect('clicked', self._on_get_code)

hbox.pack_start(code, True, True)
hbox.pack_start(getcode, False)

vbox.pack_start(entry, False)
vbox.pack_start(scroll, True, True)
vbox.pack_start(hbox, False)
vbox.show_all()

self.add(vbox)

self.connect('delete-event', lambda *args: sys.exit(0))

def _on_get_code(self, button):
'''copy the content of the html window to the clipboard'''
code = self.get_code()
gtk.clipboard_get().set_text(code)

def _on_url_changed(self, entry):
'''called when the url changes'''
url = entry.get_text()
self.open(url)

def _on_run_code(self, entry):
'''called when the url changes'''
code = entry.get_text()
self.inject_script(code)

def process_events():
while gtk.events_pending():
gtk.main_iteration(True)

if __name__ == '__main__':
browser = Browser('www.google.com/search?q=emesene')

def inject_fun(view, frame):
browser.inject_file('js/jquery.js')
browser.inject_file('js/json2.js')

browser.view.connect('load-finished', inject_fun)

browser.show()

gtk.main()

Seguidores

Archivo del Blog