Ir para conteúdo
Fórum Script Brasil
  • 0

Enviar mensagem para o Twitter


Andre Paiva

Pergunta

Sou iniciante em Python e comecei seguindo um livro da coleção Head First .

No capítulo 3 há um exemplo de um programa que envia uma mensagem a uma conta no Twitter.

O usuário responde Y ou N e dependendo da resposta uma ação é tomada.

Caso Y, o programa busca um valor no site( valor do grão de café ) e manda uma mensagem imediatamente para o Twitter.

Caso N, o programa acessa o site a cada 15 minutos e mostrará uma mensagem apenas quando o valor do grão for menor que $4.74. Eles mostram uma imagem de uma

conta no Twitter que recebeu a mensagem sobre o valor do café. Porém comigo tem apresentado os erros abaixo.

Além destes erros, por mais que eu digite Y o programa nunca entra no if. Vai direto para o else. Não entendo porque.

Este é o código com os erros logo abaixo.

def get_price():    

    page = urllib.request.urlopen("http://beans.itcarlow.ie/prices-loyalty.html")

    text = page.read().decode("utf8")

    where = text.find('>$')

    start_of_price = where + 2

    end_of_price = start_of_price + 4

    return float(text[start_of_price:end_of_price])



def send_to_twitter():

    msg = "I am a message that will be sent to Twitter"

    password_manager = urllib.request.HTTPPasswordMgr()

    password_manager.add_password("Twitter API", 

                                  "http://twitter.com/statuses", "ARGInforma", "doe099do106")

    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)
 ( apresenta erro nesta linha )
    resp.read()

    

price_now = input("Digite Y/N ")

if price_now == "Y":    

    send_to_twitter()

else:

    current_price = 99.99    

    while current_price > 4.74:

        #time.sleep(900)

        current_price = get_price()

    send_to_twitter()
Na hora de postar está sem a identação. Mas o código está identado exatamente como no livro.
Traceback (most recent call last):

  File "E:\Java\Head_Python\src\Chapter_03\get_price_twitter.py", line 39, in <module>

    send_to_twitter()

  File "E:\Java\Head_Python\src\Chapter_03\get_price_twitter.py", line 28, in send_to_twitter

    resp = urllib.request.urlopen("http://twitter.com/statuses/update.json" ,"none", 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.

Obrigado pela atenção . Até mais.

Editado por kuroi
Adicionar tag CODE
Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0
Andre, use a tag post para formatar o código, do contrário fica impossível de ler e provavelmente ninguém vai responder.

na verdade, o nome da tag é CODE.

:blush:

Ainda bem que tem alguém que sabe o nome das tags para fazer estas importantíssimas, urgentíssimas e muito relevantes correções.

Editado por Kakao
Link para o comentário
Compartilhar em outros sites

  • 0
Andre, use a tag post para formatar o código, do contrário fica impossível de ler e provavelmente ninguém vai responder.

na verdade, o nome da tag é CODE.

:blush:

Ainda bem que tem alguém que sabe o nome das tags para fazer estas importantíssimas, urgentíssimas e muito relevantes correções.

Olá amigos.Sou novo no fórum e também resolvi estudar programação sem fazer nenhum curso. Durante algumas pesquisas que fiz resolvi comprar o livro "USE A CABEÇA - PROGRAMAÇÃO". Este livro ensina de forma bem didática os princípios da programação e utiliza como linguagem padrão o Python. Sei um pouco da situação que o colega nos mostrou no início deste tópico, pois eu também estou passando pela mesma. Ainda não sabemos exatamente usar os termos corretos da programação, mas a dúvida é a seguinte: Foi gerada uma situação onde nós precisamos enviar o valor do grão de café para o diretor de uma empresa que compra café via twitter já que ele está sempre viajando. Após toda a contrução, finalizamos o código da seguinte forma:

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","roddrigolago","230420389")
    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://www.beans-r-us.biz/prices.html")
    text = page.read().decode("utf8")
    where = text.find('>$')
    start_of_price = where + 2
    end_of_price = start_of_price + 4
    return float(text[start_of_price:end_of_price])

price_now = input("Do you want to see the price now(y/n)?")

if price_now == "y":
    send_to_twitter(get_price())
else:
    price = 99.99
    while price > 4.74:
        time.sleep(900)
        price = get_price()
    send_to_twitter("Buy!")

Feito isso, nós processamos o código para saber se estar tudo correto onde irá aparecer a seguinte pergunta: Do you want to see the price now?

Quando respondemos "y" uma mensagem deve ser enviada automaticamente para o twitter do diretor da empresa informando o valor atual do grão, mas na verdade está aparecendo o seguinte erro:

Traceback (most recent call last):

File "C:\Documents and Settings\Rodrigo\Desktop\Exercícios de programação Python\Capítulo 3\Enviando o preço através de mensagem via twitter", line 26, in <module>

send_to_twitter(get_price())

File "C:\Documents and Settings\Rodrigo\Desktop\Exercícios de programação Python\Capítulo 3\Enviando o preço através de mensagem via twitter", line 11, 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.

A dúvida é saber porque não estamos conseguindo enviar a mensagem para o twitter. Há algum erro no código? Ficarei grato se puderem ajudar.

OBS: Eu copiei e colei o código, mas não apareceram as indentações

Editado por kuroi
Adicionar tag CODE
Link para o comentário
Compartilhar em outros sites

  • 0
Andre, use a tag post para formatar o código, do contrário fica impossível de ler e provavelmente ninguém vai responder.

na verdade, o nome da tag é CODE.

:blush:

Ainda bem que tem alguém que sabe o nome das tags para fazer estas importantíssimas, urgentíssimas e muito relevantes correções.

Olá amigos.Sou novo no fórum e também resolvi estudar programação sem fazer nenhum curso. Durante algumas pesquisas que fiz resolvi comprar o livro "USE A CABEÇA - PROGRAMAÇÃO". Este livro ensina de forma bem didática os princípios da programação e utiliza como linguagem padrão o Python. Sei um pouco da situação que o colega nos mostrou no início deste tópico, pois eu também estou passando pela mesma. Ainda não sabemos exatamente usar os termos corretos da programação, mas a dúvida é a seguinte: Foi gerada uma situação onde nós precisamos enviar o valor do grão de café para o diretor de uma empresa que compra café via twitter já que ele está sempre viajando. Após toda a contrução, finalizamos o código da seguinte forma:

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","roddrigolago","230420389")

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://www.beans-r-us.biz/prices.html")

text = page.read().decode("utf8")

where = text.find('>$')

start_of_price = where + 2

end_of_price = start_of_price + 4

return float(text[start_of_price:end_of_price])

price_now = input("Do you want to see the price now(y/n)?")

if price_now == "y":

send_to_twitter(get_price())

else:

price = 99.99

while price > 4.74:

time.sleep(900)

price = get_price()

send_to_twitter("Buy!")

Feito isso, nós processamos o código para saber se estar tudo correto onde irá aparecer a seguinte pergunta: Do you want to see the price now?

Quando respondemos "y" uma mensagem deve ser enviada automaticamente para o twitter do diretor da empresa informando o valor atual do grão, mas na verdade está aparecendo o seguinte erro:

Traceback (most recent call last):

File "C:\Documents and Settings\Rodrigo\Desktop\Exercícios de programação Python\Capítulo 3\Enviando o preço através de mensagem via twitter", line 26, in <module>

send_to_twitter(get_price())

File "C:\Documents and Settings\Rodrigo\Desktop\Exercícios de programação Python\Capítulo 3\Enviando o preço através de mensagem via twitter", line 11, 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.

A dúvida é saber porque não estamos conseguindo enviar a mensagem para o twitter. Há algum erro no código? Ficarei grato se puderem ajudar.

OBS: Eu copiei e colei o código, mas não apareceram as indentações

Estou tendo o mesmo problema... não sei o codigo não funciona devido a auterações na estrutura do twitter ou se estamos fazendo algo errado. Seria necessario importar mais alguma lib? ou algum arquivo externo, tipo um plugin?

Bom, estamos no aguardo de algum help :blush:

Link para o comentário
Compartilhar em outros sites

  • 0

Olá pessoal! Que bom que achei outra seguidores do livro Use a Cabeça - Programação! É bom saber que não estou sozinho nesta.

Infelizmente, eu também parei no mesmo capitulo que pede que criemos este código para posta uma mensagem no Twitter, já procurei outros meios para estar solicitando ajuda, mas sem sucesso. Você já conseguiram algum coisa? Se sim, compartilha aqui, por favor. Vocês tem whatsapp? Querem montas um grupo? Vlw!

Link para o comentário
Compartilhar em outros sites

  • 0
import urllib.request
from email.mime.text import MIMEText
import smtplib

def precoDolar():
    priceFloat = 99.99
    while priceFloat > 4.74:
        # time.sleep(2)
        page = urllib.request.urlopen("https://www.cotacao.com.br/")
        text = page.read().decode("utf8")
        where = text.find('R$')
        inicio = where + 2
        final = where + 6
        price = text[inicio:final]
        price = price.replace(',', '.') #necessario trocar a virgula pelo ponto para converter para float
        priceFloat = float(price)
        return priceFloat

def send_email(msg):
    smtp = smtplib.SMTP('smtp.gmail.com', 587)
    smtp.starttls()

    smtp.login('email', 'senha')

    de = 'bugadoc3po@gmail.com'
    para = ['tiago.grand@gmail.com']
    assunto = "Cotação do Dollar para Hoje "

    mail = MIMEText(" Dollar custando R${}".format(msg))
    mail["To"] = de
    mail["Subject"] = assunto

    smtp.sendmail(de, para, mail.as_string())
    smtp.close()

preco_agora = input("Gostaria de saber o preço atual(Y/N)? ")

if preco_agora == 'Y':
    send_email(precoDolar())
else:
    price = 99.99
    while price > 4.74:
        price = precoDolar()
    print(send_email("Compre agora"))
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...