What's wrong with the function of sending messages to twitter?

1
import urllib.request
import time

def send_to_twitter(msg):
    password_manager = urllib.request.HTTPPasswordMgr()
    password_manager.add_password("Twitter API","http://twitter.com/statuses","usuário","senha")
    http_handler = urllib.request.HTTPBasicAuthHandler(password_manager)
    page_opener = urllib.request.build_opener(http_handler)
    urllib.request.install_opener(page_opener)
    params = urllib.parse.urlencode( {'status':msg} )
    resp = urllib.request.urlopen("http://twitter.com/statuses/update.json",params)
    resp.read()

def get_price():
    page = urllib.request.urlopen("http://beans-r-us.appspot.com/prices-loyalty.html")
    text = page.read().decode("utf8")
    where = text.find('>$')
    start_of_price = where + 2
    end_of_price = start_of_price + 4
    return(text[start_of_price : end_of_price])

escolha = input("Precisa do valor imediatamente? ")

if escolha == 'y':
    send_to_twitter(get_price())
else:
    if escolha == 'n':
        price = 99.99
        while price > 4.74:
            price = float(get_price())
            time.sleep(3)
        send_to_twitter('BUY!')
    else:
        print("Voce nao escolheu nada")

Error message:

Traceback (most recent call last):
  File "(livro)programa_com_escolha_cafe.py", line 25, in <module>
    send_to_twitter(get_price())
  File "(livro)programa_com_escolha_cafe.py", line 11, in send_to_twitter
    resp = urllib.request.urlopen("http://twitter.com/statuses/update.json",params)
  File "/usr/lib/python3.5/urllib/request.py", line 163, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib/python3.5/urllib/request.py", line 464, in open
    req = meth(req)
  File "/usr/lib/python3.5/urllib/request.py", line 1183, in do_request_
    raise TypeError(msg)
TypeError: POST data should be bytes or an iterable of bytes. It cannot be of type str.
    
asked by anonymous 29.12.2016 / 18:46

1 answer

1

You have to send POST data in bytes:

...
params = urllib.parse.urlencode( {'status':msg} ).encode("utf-8")
...

.encode("utf-8") is used to encode a 'utf-8' string to bytes

More information here

    
29.12.2016 / 18:53