Foros del Web » Programando para Internet » Python »

send to twitter

Estas en el tema de send to twitter en el foro de Python en Foros del Web. amigos, queria saber si podrian determinar porque el siguiente codigo no funciona, porque la verdad que no tiene logica, todo lo veo perfecto, no soy ...
  #1 (permalink)  
Antiguo 22/06/2011, 09:17
 
Fecha de Ingreso: marzo-2010
Mensajes: 34
Antigüedad: 14 años, 8 meses
Puntos: 0
send to twitter

amigos, queria saber si podrian determinar porque el siguiente codigo no funciona, porque la verdad que no tiene logica, todo lo veo perfecto, no soy tan experimentado en python, a ver si ustedes pueden ayudarme, de antemano muchas gracias.

Código Python:
Ver original
  1. import urllib.request
  2. import time
  3.  
  4. password="yourpass"
  5.  
  6. def send_to_twitter(msg):
  7.     password_manager = urllib.request.HTTPPasswordMgr()
  8.     password_manager.add_password("Twitter API",
  9.                    "http://twitter.com/statuses", "YourUsername", password)
  10.     http_handler = urllib.request.HTTPBasicAuthHandler(password_manager)
  11.     page_opener = urllib.request.build_opener(http_handler)
  12.     urllib.request.install_opener(page_opener)
  13.     params = urllib.parse.urlencode( {'status': msg} )
  14.     resp = urllib.request.urlopen("http://twitter.com/statuses/update.json", params)
  15.     resp.read()
  16.  
  17. def get_price():
  18.     page = urllib.request.urlopen("http://www.beans-r-us.biz/prices.html")
  19.     text = page.read().decode("utf8")
  20.     where = text.find('>$')
  21.     start_of_price = where + 2
  22.     end_of_price = start_of_price + 4
  23.     return float(text[start_of_price:end_of_price])
  24.  
  25. price_now = input("Do you want to see the price now (Y/N)? ")
  26.  
  27. if price_now == "Y":
  28.     send_to_twitter(get_price())
  29. else:
  30.     price = 99.99
  31.     while price > 4.74:
  32.         time.sleep(900)
  33.         price = get_price()
  34.     send_to_twitter("Buy!")

y aqui el error que me muestra el interprete


Traceback (most recent call last):
File "C:\Users\Marino\Documents\Pycode\hfprog_resources \Chapter 3\page108.py", line 28, in <module>
send_to_twitter(get_price())
File "C:\Users\Marino\Documents\Pycode\hfprog_resources \Chapter 3\page108.py", line 14, in send_to_twitter
resp = urllib.request.urlopen("http://twitter.com/statuses/update.json", params)
File "C:\Python32\lib\urllib\request.py", line 138, in urlopen
return opener.open(url, data, timeout)
File "C:\Python32\lib\urllib\request.py", line 364, in open
req = meth(req)
File "C:\Python32\lib\urllib\request.py", line 1052, in do_request_
raise TypeError("POST data should be bytes"
TypeError: POST data should be bytes or an iterable of bytes. It cannot be str.
  #2 (permalink)  
Antiguo 22/06/2011, 09:38
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: send to twitter

Y por eso este tipo de cosas es por las que no se debe de aprender python con las versiones mas recientes (3.x) por lo menos por un tiempo.

En python 3.x las cadenas no son bytes contrario a python 2.x

Tienes que convertir tu cadena usando algún tipo de encoding.

Ejemplos:
Código:
'Esto es un string (y no son bytes)'
b'esto son bytes (y no son string)'
'esto es un string'.encode() #Pero lo que devuelve encode son bytes
Así que tienes que debes de convertir de string a bytes parms (en la linea 14 de tu código de arriba).
  #3 (permalink)  
Antiguo 22/06/2011, 10:11
 
Fecha de Ingreso: marzo-2010
Mensajes: 34
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: send to twitter

y como se convierte en la linea 14?
  #4 (permalink)  
Antiguo 22/06/2011, 11:58
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: send to twitter

Ya te lo dije en la respuesta anterior, tercera linea de mi código.

Pero te pongo un ejemplo mas claro
Código:
estoSonBytes = 'esto es un string'.encode() #Opcionalmente le puedes agregar el tipo de encoding
  #5 (permalink)  
Antiguo 22/06/2011, 13:04
 
Fecha de Ingreso: marzo-2010
Mensajes: 34
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: send to twitter

Código Python:
Ver original
  1. resp = urllib.request.urlopen("http://twitter.com/statuses/update.json".encode(), params)

he hecho esto y no me funciona, no se si este bien, o si a eso te referias, de todos modos muchas gracias por tus respuestas amigo pythonense :)
  #6 (permalink)  
Antiguo 22/06/2011, 20:58
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: send to twitter

Algo mas o menos así.

Código Python:
Ver original
  1. import urllib.request
  2. import time
  3.  
  4. password="yourpass"
  5. username="yourUsername"
  6.  
  7. def send_to_twitter(msg):
  8.     password_manager = urllib.request.HTTPPasswordMgr()
  9.     password_manager.add_password("Twitter API",
  10.                    "http://twitter.com/statuses", username, password)
  11.     http_handler = urllib.request.HTTPBasicAuthHandler(password_manager)
  12.     page_opener = urllib.request.build_opener(http_handler)
  13.     urllib.request.install_opener(page_opener)
  14.     params = urllib.parse.urlencode( {'status': msg} )
  15.     params = params.encode()
  16.     resp = urllib.request.urlopen("http://twitter.com/statuses/update.json", params)
  17.     print("OK")
  18.     resp.read()
  19.  
  20. def get_price():
  21.     page = urllib.request.urlopen("http://www.beans-r-us.biz/prices.html")
  22.     text = page.read().decode("utf8")
  23.     where = text.find('>$')
  24.     start_of_price = where + 2
  25.     end_of_price = start_of_price + 4
  26.     return float(text[start_of_price:end_of_price])
  27.  
  28. price_now = input("Do you want to see the price now (Y/N)? ")
  29.  
  30. if price_now == "Y":
  31.     send_to_twitter(get_price())
  32. else:
  33.     price = 99.99
  34.     while price > 4.74:
  35.         time.sleep(900)
  36.         price = get_price()
  37.     send_to_twitter("Buy!")

Etiquetas: send, twitter
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:18.