Python
pygtk threads subprocess
6 Nov 2009 | Escrito por: lopz | En: Python
pygtk threads subprocess commands
Hola
Después de mucho tiempo sin escribir nada paso a poner una breve nota sobre el uso de threads en pygtk, en google hay mucha información al respecto, inclusive en su página hay esto:
http://faq.pygtk.org/index.py?file=faq20.006.htp&req=show
Y bueno, escribà un pequeño trozo de código que será fácil entender si se lee el anterior link, en esta ocasión pasaré de escribir lÃnea a lÃnea el script xD
Code:import gtk
import os
import subprocess as sp
import time
import threading
gtk.gdk.threads_init()
#gobject.threads_init()
CMD = 'du -sh /home/lopz/'
class MainWin:
"""
Creates a main window object
"""
def __init__(self):
w = gtk.Window()
self.pb = gtk.ProgressBar()
box = gtk.HBox(False, 0)
self.btn_start = gtk.Button("Start")
self.btn_start.connect("clicked", self.btn_start_click)
box.pack_start(self.btn_start)
btn_test = gtk.Button("Test")
btn_test.connect("clicked", self.btn_test_click)
box.pack_end(btn_test)
self.btn_stop = gtk.Button("Stop")
self.btn_stop.connect("clicked", self.btn_stop_click)
self.btn_stop.set_sensitive(False)
box.pack_end(self.btn_stop)
box.pack_start(self.pb)
w.add(box)
w.show_all()
w.connect("destroy", self.quit)
def get_popen(self, cmd):
return sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.STDOUT)
def pulse(self):
while not self.quit:
time.sleep(0.1)
gtk.gdk.threads_enter()
self.pb.pulse()
gtk.gdk.threads_leave()
def exec_cmd(self):
self.popen = self.get_popen(CMD.split())
out = self.popen.stdout.read()
if out:
print out
self.terminate()
def terminate(self):
self.quit = True
os.kill(self.popen.pid, 9)
self.btn_stop.set_sensitive(False)
self.btn_start.set_sensitive(True)
print "Terminate threads"
def quit(self, widget):
gtk.main_quit()
self.terminate()
def btn_test_click(self, widget):
print "gtkMain thread"
def btn_stop_click(self, widget):
self.pb.set_text("Completed")
self.terminate()
def new_thread(self, method):
t = threading.Thread(target=method, args=())
t.start()
def btn_start_click(self, widget):
print "Start threads"
self.quit = False
self.btn_stop.set_sensitive(True)
widget.set_sensitive(False)
self.pb.set_text('Running')
self.new_thread(self.pulse)
self.new_thread(self.exec_cmd)
if __name__ == "__main__":
gui = MainWin()
gtk.gdk.threads_enter()
gtk.main()
gtk.gdk.threads_leave()
A grandes rasgos lo que hace el script es lo siguiente:
crea una ventana con unos 3 widgets dentro, un progressbar y 3 botones, el progressbar es para mostrar al usuario que aún se está realizando la tarea, el botón start pues empieza la tarea, el stop detiene todo y el test lo que hace simplemente es imprimir en consola.
Start: Lanzará 2 threads, en uno lo que hacemos es modificar los widgets, ahà puedes modificar cualquier parte de la interfaz mientras estás haciendo alguna tarea junto a este threads lanza otro donde se ejecutará nuestra tarea pesada, en este caso el comando du -sh /home/tu_user que lo que hace es mostrar el tamaño del directorio, como este comando tiende a tardar en mostrar el resultado al usuario le mostraremos una barra de progreso para que sea que aún se está realizando la tarea.
stop: lo que hace es terminar ambos hilos, el que muestra la barra de progreso y el que ejecuta el comando, en este caso matando el pid del comando y automáticamente sale del hilo.
test: este botón es una prueba que podemos usar nustra gui mientras ejecutamos tareas pesadas por debajo, y este solo imprime en consola desde el thread de main.
El botón salir de la ventana hace lo mismo que el botón Stop, para ambos threads y luego destruye la ventana del hilo principal, si no destruimos los hilos uno quedará pegado hasta que termine de ejecutarse nuestro comando, cosa que no queremos.
Creo que es todo, para ser un pequeño ejemplo para ayudar a un amigo va bien y de paso recordé un poco esto de python que lo tengo ya olvidado.
A continuación pasaré como siempre a pegar una pequeña captura de pantalla de la pequeña gui funcionando.

Espero que a alguien le sirva y deja algún comentario.
Igual se puede usar gobject.idle_add(mi_funcion) pero esto no toqué para nada.
tampoco he visto cual sea la manera correcta o la mejor de hacerlo.
Tu amigo programador de python+pygtk ¿Cómo solucionas este tipo de problemas?
Saludos!
3 Comentarios »
|
Sesiones+sessions+python
14 Abr 2009 | Escrito por: lopz | En: Python
Sesiones+sessions+python
Hola
No sé si el tÃtulo describa lo que explicaré a continuación, ya que no sé si es el correcto, pero en fin, para mà si lo es xD
En esta entrada aprenderemos a manejar sesiones http utilizando python, no sé por que pero me a dado por usar MUCHO la librerÃa httplib de python, según se en la que están basadas urllib, urllib2 y urllib3 esta última está en google code, y bueno se podrÃan usar estas otras que facilitan las cosas a la hora de manejar cookies con python, pero si las otras están basadas en esta entonces por que no se podrÃa implementar con esta librerÃa?
Bueno hace tiempo cuando estaba empezando en python siempre me llamaba la atención poder hacer tonterÃas con webs+python, osea, interactuar con ellas, realizar búsquedas en google, en otras páginas lo mismo, extraer datos de una y otra página, navegar por sus links, vamos, un crawler, spider o como le llamen ustedes todo funciona bien hasta que quieres automatizar alguna tarea en una página donde tienes que iniciar sesión con un user y pass para poder navegar por los demás links, aquà es donde entra el uso de sesiones, para realizar este tipo de cosas lo único que hay que hacer es "imitar" lo que hace el usuario en conjunto con su navegador, enviar los MISMOS parámetros que pide la web (request) entonces la página pensará que eres un navegador y te dará acceso como si lo harÃa un humano, vamos, hacer lo mismo pero con código escrito en cualquier lenguaje, pero como a mà me encanta python lo hice en este jeeeeje, para entender esto es necesario saber lo básico de como funciona un servidor http y un navegador y como dije solo queda imitarlo.
En esta entrada veremos como hacer esto con una página que encontré por ahà no fue suerte mas bien por pasar el rato escribiendo algo referente a ella sea de paso, la página es http://www.futbolreto.com ahora bien para poder probar nuestro pequeño robot necesitamos crearnos una cuenta en dicha página, no lleva más de 1 minuto.
Hagamos de cuenta que ya tienes un user y pass válido para la página, ahora solo quedará ingresar a la página con el navegador y como se han podido dar cuenta es un juego, una trivia donde hay que responder preguntas referentes al futbol y estas tienen un tiempo para responderlas, es una pregunta y son varias respuestas de las cuales solo una es válida y entonces lo que vamos a hacer es eso, simular todo, desde el login hasta poder recibir las trivias.
Ahora que he explicado como va la cosa estaremos listos para modificar el script con tu user y pass, configurar algunos datos: tu user y pass son urgentes, luego la categorÃa, y el número de trivias que tendremos resueltas por el robot.
No pasaré a hablar más del error de la página ya que este post no va para eso, si no para mostrar como mantener la sesión al navegar por diferentes links de la página como se puede notar en el script.
Ya, mucho blah blah y poca acción, empecemos por modificar el script como ya les habÃa indicado y lo ponen a correr y notarán que les imprime la pregunta y su respuesta correcta, todo esto manteniendo la sesión utilizando la COOKIE que es lo importante, como ve, primero realizo una request simple luego obtengo la cookie, y hago el POST enviado el user y pass y el servidor nos responderá con la cookie de nuestra sesión que es la que usaremos siempre para cualquier request.
Esto se puede hacer para cualquier página web, inclusive para las que tienen captchas, pero en este caso solo necesitas logearte con el navegador y coger la cookie que nos envÃa el server y utilizar esa para los demás request, es asà como hice esos bots para metroflog y fotologs, ya que estos utilizan captchas para iniciar sesión, pero todo eso fue para probar y distraerme un rato con los "amigos/as" que joden con que le firmen el puto metro que tienen, asà les llenas de spam los comentarios y les agotas sus comentarios y no joderán hasta el otro dÃa claro está jaja
Bueno me pasé a otro tema, siempre suelo ser asà jeje. ya, ahora paso a pastear el script que solo necesitan copiarlo a un fichero de texto y ponerlo a correr, como siempre digo los post que pongo aquà son para personas que ya tienen la idea de que es python, como ejecutar un script, etc, vamos, con algo de noción de informática.
Code:
#!/usr/bin/python
# -*- coding=UTF-8 -*-
# Copyright 2009 Jorge J. Lopez C. <lowlifebob[at]gmail.com>
#
# 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.
import httplib
USER = "tuuser" # username
PWD = "tupass" # password
CAT = "4"
"""
CAT: [option]
[options]:
1 = Colombiano
2 = Copa Mundo
3 = Alemania 2006
4 = Argentino
"""
RESP = 5 # Numero de trivias
def download(dom, url, params=None, ref=False,
cookie=None, ctype=False, clength=False):
headers = {
"User-Agent": "Mozilla/5.0 (X11; U; Linux i686; es-ES; \
rv:1.9.0.3) Gecko/2008092416 Firefox/3.0.3",
"Accept": "text/html,application/xhtml+xml,application/xml;q=\
0.9,*/*;q=0.8",
"Accept-Language": "es-es,es;q=0.8,en-us;q=0.5,en;q=0.3",
"Accept-Charset": "UTF-8,*",
"Keep-Alive": "300",
"Proxy-Connection": "keep-alive"
}
if ref:
headers["Referer"] = "http://www.futbolreto.com/trivia//index.php"
if cookie:
headers["Cookie"] = cookie
if ctype:
headers["Content-Type"] = "application/x-www-form-urlencoded"
if clength:
headers["Content-Length"] = len(params)
conn = httplib.HTTPConnection(dom, 80)
if params:
conn.request("POST", url, params, headers)
else:
conn.request("GET", url, params, headers)
resp = conn.getresponse()
return resp
def url_split(url):
slashes = url.find("://")
if slashes == -1:
slashe = url.find("/")
dom = url[:slashe]
url = url[slashe:]
return dom, url
else:
url = url[slashes + 3:]
return url_split(url)
def search_between(ini, end, html):
try:
html = html[html.index(ini) + len(ini):]
html = html[:html.index(end)]
return html
except:
return None
if __name__ == "__main__":
uri = "http://www.futbolreto.com/trivia//include/login.php"
params = "loginname=" + USER + "&pass=" + PWD + "&log=Ingresar"
dom, url = url_split(uri)
resp = download(dom, url)
cookie = resp.getheader("set-cookie")
cookie = cookie[:cookie.find(";")]
resp = download(dom, url, params, True, cookie, True, True)
url = "/trivia/index.php?open=aktiv"
download(dom, url, None, True, cookie)
url = "/trivia/index.php?open=secure"
download(dom, url, None, False, cookie)
url = "/trivia/cargaswf93669366dave.php"
params = "llama=1&onLoad=%5Btype%20Function%5D"
xml = download(dom, url, params, False, cookie, True, True).read()
daves = search_between("na=", "&&uids", xml)
url = "/trivia/cargadordepreg.php"
params = "categoria=categoria" + CAT +"&hsDaVeStOnE=" + daves
for i in range(RESP):
xml = download(dom, url, params, False, cookie, True, True).read()
# parsing
print ">", search_between("unta>", "</pregunta>", xml)
print search_between("esta1>", "</respuesta1>", xml)
Bueno, es todo el código, cabe destacar que es solo una prueba ya que ahà no capturo ningún error ni nada que pueda suceder, eso ya va para el que quiera usarlo en algún proyecto de verdad y no sea un chiste como esto.
Como siempre dejaré una pequeña SS del script funcionado.

Espero que a alguien le sirva para base de manejo de sesiones con python, y claro, la idea está hecha para poder divertirnos un rato con esa página jugando a lo informático jeje
Saludos!!
PD cualquier duda por favor un comment!
4 Comentarios »
|
extraer emails con python
3 Abr 2009 | Escrito por: lopz | En: Python
Extraer emails de una página web usando python
Hola
Bueno, mucha gente se pregunta como realizar un spider o crawler para obtener datos de una página web de forma automática y en realidad no es tan difÃcil, solo bastarÃa con ir navegando por las urls, pero en este caso mostraremos como obtener cierto tipo de datos que nos interesan de la web, y por ahora mostraremos como extraer los mails de una página web o lo mismo es válido para un fichero de texto donde tengas emails y quieras tenerlos algo mas organizado o hasta en una base de datos.
La idea de este script es solo mostrar con que facilidad se puede hacer esto usando python, no quiero incitar a la gente que haga spam ni nada parecido, tampoco que lo usen para esos fines, y bueno tampoco es que yo sea el primero en postear algo asÃ, y es que hay una cosa, cuando un usuario n00b quiere hacer spam, entonces este buscará un script que lo haga todo completo, y como este no es su fin osea que no le servirá, y si es un usuario avanzado el puede usarlo para estos fines, pero es obvio que el mismo podrÃa hacerse uno en cualquier lenguaje, a su gusto y mucho mejor que este, osea que de cualquier forma no molestará a nadie :D
Code:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#
# PyImg2Text.py
#
# Copyright 2009 Jorge J. Lopez C. <lowlifebob[arroba]gmail.com>
#
# 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.
import httplib
import re
const_dom = "www.nodo50.org"
const_url = "/cbc/lista.htm"
const_mailsrch = re.compile(r'[w-][w-.]+@[w-][w-.]+[a-zA-Z]{1,4}')
def download(dom, url):
headers = {
"User-Agent": "Mozilla/5.0 (X11; U; Linux i686; es-ES; \
rv:1.9.0.3) Gecko/2008092416 Firefox/3.0.3",
"Accept": "text/html,application/xhtml+xml,application/ \
xml;q=0.9,*/*;q=0.8",
"Accept-Language": "es-es,es;q=0.8,en-us;q=0.5,en;q=0.3",
"Accept-Charset": "UTF-8,*",
"Keep-Alive": "300",
"Proxy-Connection": "keep-alive",
}
# conectamos con el servidor
conn = httplib.HTTPConnection(dom, 80)
# hacemos la peticion
conn.request ("GET", url, None, headers)
resp = conn.getresponse()
return resp
def main():
mails = []
db = open('emails.txt', 'a')
xml = download(const_dom, const_url).read()
mails.extend(const_mailsrch.findall(xml))
for mail in mails:
db.write(mail + 'n')
print "Email:", mail
db.close()
if __name__ == '__main__':
main()
Como pueden ver hemos obtenido todos los emails de una página web y guardado en un fichero de texto plano, y como les decÃa, podÃamos hacerlo a una DB, etc
la página que elegà es al azar, osea que no digan que tengo algo contra los dueños de esos emails.
Y como siempre a continuación pongo un SS del script funcionando

PD me olvidaba de algo, aquà uso expresiones regulares para extraer los emails, y es una bien sencilla, funciona como debe ser, pero NO ES CORRECTA, osea pueden haber una y muchas excepciones donde habrá un error al poner un email como válido o inválido, si quieren pueden buscar las regex para validar un email y se asombrarán lo complicado que resulta validarlo.
Saludos!
2 Comentarios »
|
busquedas google python
2 Abr 2009 | Escrito por: lopz | En: Python
Búsquedas en google desde python o usando python
Hola
Estos últimos dÃas ando mirando código que tengo en mi HD y que lo escribà hace mucho tiempo, algunos mÃos otros modificados o usando partes de los ejemplos de las doc de python, pero hace unas semanas entró un usuario al canal de python-es en freenode a preguntar cómo podrÃa hacer búsquedas desde python en google, y el tenÃa un código para esta función pero que no servÃa, y como no era mi código no querÃa tocarlo ni mirarlo y recordaba que hace tiempo habÃa querido/necesitado hacer algo asÃ, entones busqué el código y no funcionaba, pero cambiando unas cuantas lÃneas otra ves funcionó y lo pegaré aquà para que no se me olvide y sobre todo para compartirlo con otras personas que buscan mucho este tipo de cosas y creen que es realmente difÃcil hacerlo, pero aquà se desmiente todo.
Bueno, sin mas aquà les pego este código que busca en google según la palabra que ingreses y te mostrará los links de los resultados.
Aquà les dejo el script y como siempre solo tienes que copiarlo, pegarlo a un fichero de texto y ponerle el nombre que quieran con extensión .py pero repito, el que lo use supongo que ya sabrá lo que es python y como usar un script.
Code:
# Copyright (C) 2009 Jorge J. Lopez C. <lowlifebob[at]gmail[point]com>
# weblog : http://www.lopz.org
import httplib
import re
from sgmllib import SGMLParser
const_dom = "www.google.com.bo"
const_url = "/search?as_q=%s&hl=es&num=%s&safe=off"
class atag(SGMLParser):
def reset(self):
SGMLParser.reset(self)
self.urls = []
def start_a(self, attrs):
href = [x for y, x in attrs if y=='href']
if href:
self.urls.extend(href)
def download(dom, url, query, num):
headers = {
"User-Agent": "Mozilla/5.0 (X11; U; Linux i686; es-ES; \
rv:1.9.0.3) Gecko/2008092416 Firefox/3.0.3",
"Accept": "text/html,application/xhtml+xml,application/ \
xml;q=0.9,*/*;q=0.8",
"Accept-Language": "es-es,es;q=0.8,en-us;q=0.5,en;q=0.3",
"Accept-Charset": "UTF-8,*",
"Keep-Alive": "300",
"Proxy-Connection": "keep-alive",
}
# conectamos con el servidor
conn = httplib.HTTPConnection(dom, 80)
# hacemos la peticion a la imagen
conn.request ("GET", url % (query, num), None, headers)
resp = conn.getresponse()
return resp
def get_links(dom, url, query, num):
query = query.replace(' ','+')
ident = re.compile("related:")
listalinks = []
#descargamos la pagina
resp = download(dom, url, query, num)
html = resp.read()
#extraemos todos los links
links = atag()
links.feed(html)
links.close()
for x in links.urls:
if ident.search(x):
url = x.replace("/search?hl=es&safe=off&q=related:","http://")
listalinks.append(url)
return listalinks
query = raw_input('Palabra a buscar :')
#num = raw_input('Numero de resultados: ')
links = get_links(const_dom, const_url, query, num=10)
for link in links:
print link
y bueno, como siempre un pequeño ss funcionando.

Saludos!!
PD, por cierto, esta función puedes ponerle a un bot de IRC, realizar un crawler, etc
0 Comentarios »
|
Plugins xchat en python
1 Abr 2009 | Escrito por: lopz | En: Python
Plugins para xchat en python
Hola, bueno, aquà hice un pequeño plugin en python para xchat, su función es trasladar lo que uno escribe a cualquier lenguaje que soporte google translate, ya que uso este motor para realizar el traslado de las palabras y frases completas, su función es bien simple y uso es bien simple, pasará a explicar a continucación como instalarlo y usarlo:
Primero bajamos el código de plugins y lo guardamos en el directorio de xchat, normalmente está en /home/TU_USER/.xchat2/ lo cuardamos con el nombre del pyTrans.py, luego si abrimos el xchat lo tendrÃa que cargar automáticamente, pero si no lo hace, podemos hacerlo nosotros escribiendo en la caja de entrada de texto del xchat el siguiente comando:
Code:/py load pyTrans.py
y nos tendrÃa que mostrar algo como:
pyTrans lang, loaded!!
Entonces ya habrá cargado el plugins si no lo hizo al iniciar el xchat, normalmente o siempre carga los plugins cuando se inicia.
Bueno, ahora es tan simple como poner "/t hola" (sin las comillas) en la entrada del xchat y el texto saldrá traducido al canal directo para que lo lean los usuarios, el plugins soporta la traducción de múltiples idiomas, tantos como soporta google translate, ya que usa este motor, por default el plugin está configurado para traducir del español al ingles, pero eso se puede configurar solo cambiando los valores de las variables a y b, también está la lista de lenguajes soportados, puedes realizar la combinación que desees.
Aquà dejaré el código pegado, lo que tienes que hacer es guardarlo con el nombre de pyTrans.py, o el nombre que quieras, pero recuerda que para cargarlo tienes que usar el mismo nombre /py loud nombre_script.py
Code:
# -*- coding: utf-8 -*-
# XChat translato spanish to english plugin
# Copyright (C) 2009 Jorge J. Lopez C. <lowlifebob[at]gmail[point]com>
# weblog : http://www.lopz.org
import xchat
import httplib
__module_name__ = "pyTransXchat"
__module_version__ = "1.0"
__module_description__ = "pyTrans lang"
# Lang. support
"""
sq : albanés
de : alemán
ar : árabe
bg : búlgaro
ca : catalán
cs : checo
zh-CN : chino
ko : coreano
hr : croata
da : danés
sk : eslovaco
sl : esloveno
es : español
et : estonio
fi : finlandés
fr : francés
gl : gallego
el : griego
iw : hebreo
hi : hindi
nl : holandés
hu : húngaro
id : indonesio
en : inglés
it : italiano
ja : japonés
lv : letón
lt : lituano
mt : maltés
no : noruego
pl : polaco
pt : portugués
ro : rumano
ru : ruso
sr : serbio
sv : sueco
tl : tagalo
th : tailandés
tr : turco
uk : ucraniano
vi : vietnamita
"""
a = "es"
b = "en"
const_dom_trans = "translate.google.es"
const_url_trans = "/translate_a/t?client=t&text=%s&sl=" + a + "&tl=" + b
def quote(s, safe = '/'):
""" quote('abc def') -> 'abc%20def' """
always_safe = ('ABCDEFGHIJKLMNOPQRSTUVWXYZ'
'abcdefghijklmnopqrstuvwxyz'
'0123456789' '_.-')
_safemaps = {}
cachekey = (safe, always_safe)
try:
safe_map = _safemaps[cachekey]
except KeyError:
safe += always_safe
safe_map = {}
for i in range(256):
c = chr(i)
safe_map[c] = (c in safe) and c or ('%%%02X' % i)
_safemaps[cachekey] = safe_map
res = map(safe_map.__getitem__, s)
return ''.join(res)
def download(dom, url, word=None):
if word:
headers = {
"User-Agent": "Mozilla/5.0 (X11; U; Linux i686; es-ES; \
rv:1.9.0.3) Gecko/2008092416 Firefox/3.0.3",
"Accept": "text/html,application/xhtml+xml,application/xml; \
q=0.9,*/*;q=0.8",
"Accept-Language": "es-es,es;q=0.8,en-us;q=0.5,en;q=0.3",
"Accept-Charset": "UTF-8,*",
"Keep-Alive": "300",
"Connection": "keep-alive"
}
# conectamos con el servidor
conn = httplib.HTTPConnection(dom, 80)
# hacemos la peticion a la imagen
conn.request ("GET", (url % word), None, headers)
resp = conn.getresponse()
return resp
else:
pass
def main(words, word_eol, userdata):
try:
words = " ".join(words[1:])
trans = download(const_dom_trans, const_url_trans, quote(words)).read()
resp = trans[1:-1]
xchat.command("msg %s %s" % (xchat.get_info("channel"), resp))
except:
xchat.prnt("use: /t words")
return xchat.EAT_ALL
xchat.hook_command("t", main, help="/t words")
xchat.prnt(__module_description__ + ", loaded!!")
Y aquà está el mismo code pero en otra página http://dpaste.com/22396/
algo coloreado y con mejor aspecto
Cualquier duda, sugerencia, etc, por favor un comentario, o si lanza algun error el plugin igual, para asà corregirlo, espero que a más de uno le sirva
Aquà una pequeña captura del plugin en funcionamiento, asà deberÃa ser la forma de enviarle el texto para que traduzca, caso contrario se usarÃa normalmente el xchat

Saludos!
3 Comentarios »
|
Imagen a texto PIL+python
24 Mar 2009 | Escrito por: lopz | En: Python
Imagen a texto PIL+python
Hola, el otro dÃa estaba jugando con una librerÃa para el tratamiento de imágenes en python, la cual se llama PIL, la verdad es que hasta donde he visto es fácil tratar las imágenes, aplicar filtros, etc, y bueno, para meterme algo más a fondo hice un pequeño script que toma de entrada una imágen en formato JPG o PNG, y que contenga algo, en este caso un número, que es el 1.
Estoy usando una imágen en blanco y negro para que haya resultado más fácil, si no, se habrÃa tenido que limpiar el ruido del fondo de la imágen, etc, ya para eso hacÃamos un captcha break hehe.
Y bueno, como les decÃa, abre la imágen, la procesa, y el final te imprime en pantalla el número de la imágen pero con ceros y unos, cada pixel representarÃa un número, si es de baja luminosidad pones un 0, y si no, un 1, entonces el resultado quedarÃa de la siguiente forma, y como dicen, una imagen vale más que mil palabras
La imágen antes de ser tratada con script en python

Y este es el resultado.

y bueno, se podrÃa hacer un sistema de reconocimiento de caracteres en python usanro PIL, mapas de bits, y jugar con redes neuronales, en esto último me tengo que poner.
Espero que les haya servido de ejemplo y cualquier duda o comentarios dejar un comment y trataré de responder.
Aquà el código de script.
Code:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#
# PyImg2Text.py
#
# Copyright 2009 Jorge J. Lopez C. <lowlifebob[arroba]gmail.com>
#
# 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.
# Import library
import Image
__program__ = "PyImg2Text"
__author__ = "Jorge J. López C."
__version__ = "0.1"
im = Image.open("1.jpg")
x, y = im.size
def procImgRGB(im):
im_pxls = tuple(im.getdata())
resp = []
for i in range(len(im_pxls)):
r = im_pxls[i][0]
g = im_pxls[i][1]
b = im_pxls[i][2]
if ((r + g + b) / 3) < 50:
resp.append(1)
else:
resp.append(0)
return resp
matrix = procImgRGB(im)
def make_list(flist, long):
i = j = 0
list_ = []
while j < flist.__len__():
j += long
list_.append(flist[i:j])
i = j
return list_
matrixImg = make_list(matrix, x)
for i in matrixImg:
print str(i).replace(", ", "")
Ya no hay necesidad de decirles que copien y peguen esto en un fichero y luego python script.py, por que supongo que el que quiera probar este script ya estará al menos familiarizado con este lenguaje.
Saludos!
2 Comentarios »
|
Bajar imágenes de google
23 Mar 2009 | Escrito por: lopz | En: Python
Bajar, descargar imágenes de google imágenes
Hola
Bueno, después de unos dÃas sin postear aquà vengo con algo nuevo, resulta que un amigo mÃa tenÃa un programa hecho en processing el cual trabaja con imágenes, leyendo pixel a pixel y de acuerdo a su luminosidad de cada pixel lo pinta de otro color, en fin, eso es otro caso, el tema es que el me dijo que serÃa interesante poder bajar imágenes y trabajar con ellas, y bueno, que mejor que google para buscar imágenes y tratarlas con el programa de mi amigo, pero la cosa es que tenÃa que ser imágenes pequeñas, asà para que sea rápido el proceso de las imágenes, y como digo, que mejor que los thumbnails de google que te muestra, entonces la cosa era bajarlos y guardarlos en un directorio, y bueno, me pidió que haga algo, y que mejor para estas cosas sencillas usar python, y bueno, este es el resultado, un simple script que baja las miniaturas de google imágenes y las guarda en el disco, no explicaré que hace cada lÃnea, esto no es un tutorial ni algo parecido, simplemente querÃa compartir con ustedes este pequeño script, además aprender de el (para los nuevos como yo sirve)
y bueno, basta de blah blah y pego YA el script aquÃ, como ven solo uso una librerÃa para bajar tanto la página web como las imágenes, igual se podrÃa usar otras o hasta sockets si eres de los que le gusta escribir más código, por cierto cualquier duda, comentario, insulto será bienvenidos, entonces que esperan para comentar, eso si, menos spam coño!!
Code:#!/usr/bin/python
# -*- coding: UTF-8 -*-
#
# PyImgFetcher.py
#
# Copyright 2009 Jorge J. Lopez C. <lowlifebob[arroba]gmail.com>
#
# 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.
# Import library
import httplib
__program__ = "PyImgFetcher"
__author__ = "Jorge J. López C."
__version__ = "0.1"
# Configuration
const_dom_img = "tbn2.google.com"
const_url_img = "q=tbn:%s"
const_dom_google_img = "images.google.com.bo"
const_url_google_img = "hl=es&q=%s"
def download(dom, url, query):
# connect to server
conn = httplib.HTTPConnection(dom, 80)
# GET!!
conn.request ("GET", "/images?" + url % (query))
resp = conn.getresponse()
return resp
def save_img(name_img, resp):
# open or create the image
img = file(name_img + ".jpg", "wb" )
# saving image
img.write(resp.read())
# close image
img.close()
def main():
print "Downloader images thumbnails for google images by:lopzn"
query = raw_input("Query: ")
count_name_img = 0
r = download(const_dom_google_img, const_url_google_img, query)
l = r.read().split(':"')
for i in l:
p = ("").join(i)
code = p[p.rfind('"')+1:]
if code[code.rfind("M"):] == "M":
resp = download(const_dom_img, const_url_img, code)
name_img = "glitch_" + str(count_name_img)
save_img(name_img, resp)
count_name_img += 1
print "saving image name", name_img
print "nfinish downloading images!!!"
if __name__ == "__main__":
main()
y aquà dejaré una url para ver el script a colores y bonito
http://dpaste.com/18284/
Bueno, espero que a más de uno le sirva
PD, por cierto, es un script hecho a la rápida, como ven, no capturo errores ni nada parecido, ahhh otra cosa que lo sé, mi ingles apesta xDD
Saludos!
1 Comentario »
|
Seleccionar file TreeView
8 Dic 2008 | Escrito por: lopz | En: Python
Hola, después de mucho tiempo regreso a postear, ahora en este nuevo dominio, si, lo sé, suelo cambiar de dominio como de mujer jaja
En fin, en este blog suelo poner tonterÃas, y ahora pondré de nuevo otra tonterÃa jiji, siempre que quiero poner un post pienso que si realmente vale la pena ponerlo, osea si será interesante para alguien y al final decido no ponerlo por que me parece no interesante y ahora en adelante empezaré a poner recortes de código de todo tipo, para ayudar a alguien que necesite algo asÃ, y para no olvidarme y tenerlo aquà como pastebin, jeje
En esta oportunidad estaba buscando como seleccionar una fila en un TreeView, en pygtk y he encontrado una solución que seguro que a más de uno se servirá como a mÃ
Code: treeselection = MiTreeView.get_selection()
model = MiTreeView.get_model()
iter = model.get_iter((1, 0))
treeselection.select_iter(iter)
Saludos!
2 Comentarios »
|
Bot para MetroFlog
10 Jun 2008 | Escrito por: lopz | En: Python
Bot para metroflog
Hola
Ya tengo unos días que no pongo nada en mi blog, es que no tenía nada interesante que poner y poco me gusta hacer copy/paste de otros blogs, etc, siempre trato de poner cosas técnicas, aunque ya hablaré de mi vida personal un día de estos...
Pues a lo que va el post, resulta que a mi mail me suelen llegar invitaciones para que vea sus feos metroflog's de algunos amigos y personas que no conozco, como es de esperarse estaba aburrido sin saber que hacer y peor que un tío me viene y me ofrece un bot para postear en los fotologs, pero necesitaba para los metros, además claro, me lo quería vender a un precio elevadísimo y no tengo pasta para nada, peor para pagar algo que yo mismo podía hacer o por lo menos intentar y de ahí a salido este pequeño bot que no hace mas que joder al dueño del bot jeje, no es algo ético pero me parece divertido jiji
¿Qué es lo que hace?
Pues nada del otro mundo, le pasas el link del metro y le envía comentarios hasta saturar sus pocos y míseros comentarios, que son 20, joder, qué poco... y tiene otras opciones para hacer lo mismo con sus "favoritos" y como no, darles un regalito a tus amiguetes que te ponen un ___on haha, igual es una araña por que hace lo mismo con los amigos, y amigos de los amigos, etc, algo de nunca acabar... un verdadero desastre
¿El code?
pues aquí lo tengo, no pienso postearlo para que le den mal uso al menos los spammers pero eso si, si están interesados en el, envíen un privado o mail y vemos en que quedamos.
¿y?
La verdad es que nunca pensé que fuese tan fácil poder hacer este tipo de cosas, robots que te automaticen la tarea diaria, en este caso, responderle a tus amiguetes con lo que piden.... que les dejes el _____on (rayón) y se lo dejas bien dejado.
Este metroflog utiliza un sistema de seguridad que es un envío máximo de 2 mensajes y tienes que esperar 5 minutos para el nuevo envío... pero esto el bot se lo pasa por el forro, en fin.. un post mas sin importancia alguna, ya que el que lo lea no obtendrá nada, pero a ver si se animan y hacen el suyo. Estoy pensando en hacer un pequeño ejemplo de robot para que tengan una base para hacer los suyos, pero en la red hay un montón de ejemplos y uso de las librerías en diferentes lenguajes.
Ya, creo que eso es todo el post por ahora.
Saludos!
PD: Ya sabe, si les interesa el code envíen un mail y charlamos.
1 Comentario »
|
exeCmd
10 Jun 2008 | Escrito por: lopz | En: Python
exeCmd - ejecutar comandos del sistema con python
Hola
Que nombre más original que le puse jeje, pero esto viene de la petición de un tío que quería ejecutar comandos en otro PC y recibir los datos desde donde los envía.
Hice unos pequeños scripts para esa tarea, le puse de nombre exeCmd. Ya creo que eso lo dice todo, son 2 script que uno es como un servidor y el otro cliente.
este código lo guardas con el nombre de shellinv.py.
¿Puedo guardarlo con otro nombre?
NO
¿por que?
ya chaval, deja de preguntas y guárdalo como te salga del forro.
Code:#!/usr/bin/env python
# encoding: utf-8
#Copyright 2008 Jorge J. López C. <lowlifebob (at) gmail.com>
import socket
import commands
port = 4545
server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_sock.bind((socket.gethostname(), port))
server_sock.listen(1)
print "Waiting for connection on port: %d" % port
client_sock, client_info = server_sock.accept()
print "Accepted connection from ", client_info
while True:
data = client_sock.recv(1024)
if len(data) == 0: break
cmd_resp = commands.getoutput(data)
if cmd_resp == '':
client_sock.send("OK")
else:
print "execute command: [%s] and sending resp." % data
client_sock.send(cmd_resp)
client_sock.close()
server_sock.close()
Ahora este otro, lo guardas con el nombre de exeCmd.py
su nombre lo dice todo, tendrías que ser retrasado mental para no entender.
Code:
#!/usr/bin/env python
# encoding: utf-8
#Copyright 2008 Jorge J. López C. <lowlifebob (at) gmail.com>
import socket
port = 4545
ip = "127.0.0.1"
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((ip, port))
while True:
user1 = raw_input("command exucute: ")
sock.send(user1)
resp = sock.recv(1024)
print "Resp: ", resp
sock.close()
Ahora les dejo una captura de pantalla en acción, por cierto, ahí dice: "exucute", es error de dedo, y me dio pereza sacar una nueva jeje
"puedes probar los comandos que ves en la captura de pantalla" pero OJO, solo si sabes lo que hacen :cry:
Saludos!!
PD, joder, se me olvidaba la captura de pantalla que tanto la mencioné xDD

0 Comentarios »
|
|