GithubHelp home page GithubHelp logo

yuriscosta-zz / weather-bot Goto Github PK

View Code? Open in Web Editor NEW
4.0 1.0 0.0 1.64 MB

This Messenger bot shows some information about the current weather in the user shared location

Home Page: https://www.facebook.com/weather.info.bot

License: MIT License

Python 100.00%
chatbot-facebook flask python

weather-bot's Introduction

Weather Bot

This Messenger bot shows some information about the current weather in the user shared location. All the credits to this tutorial.

Installation

Clone this repository. Install the requirements.

pip install requirements.txt

Add this environments variables.

WEATHER_API_KEY # OpenWeatherMap.org api token
FB_VERIFY_TOKEN # Facebook Messenger webhook verify token (Webhook settings panel)
FB_ACCESS_TOKEN # Facebook Messenger access token

Run Flask web server.

python index.py

Built With

  • Python
  • Flask

Privacy Policy

This app do not store any data of any user in any server.

License

This project is licensed under the MIT License - see the LICENSE.md file for details

weather-bot's People

Contributors

mazuh avatar yurisalesc avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar

weather-bot's Issues

Seria interessante refatorar alguns "bad smells"

Em Python, indentação é muito importante. O código perde consideravelmente a portabilidade quando usa tabs ("/t") ao invés de quatro espaços (" "). Apesar de que, até o Python 2, o interpretador aceita misturar ambas as indentações, vai contra as convenções. Na maioria dos IDEs e editores de gente o padrão já vem por substituir a tecla Tab por quatro espaços mas, quando contrário, normalmente ele é configurável pra trocar (e ninguém precisar apertar realmente a tecla de espaço quatro vezes).

Por exemplo:
(tente selecionar com o mouse e perceba que a indentação do código de cima é diferente do código de baixo, pois a primeira é composta de um caracter atômico a cada nível de indentação, e seu tamanho irá variar visualmente de editor para editor, inclusive fazendo alguns trechos do código parecerem bizarros ao serem visualizados no GitHub)

if 'attachments' in message:
	if 'payload' in message['attachments'][0]:
		if 'coordinates' in message['attachments'][0]['payload']:

será diferente de

if 'attachments' in message:
    if 'payload' in message['attachments'][0]:
        if 'coordinates' in message['attachments'][0]['payload']:

que terá o mesmíssimo efeito que usar o operador lógico "e", que somente irá avaliar as operações da direita se a da esquerda retornar um valor conversível a True, sendo essa cascada desnecessária (o else dá a impressão de necessidade? daqui a um ou dois parágrafos há uma solução melhor).

Se o tamanho da linha lhe preocupar, novamente as convenções (que trazem uma dica a nível de programação) irão ajudar.

PS: esse aninhamento potencialmente tá aumentando a complexidade do código; não sei como o Python faz, mas provavelmente percorre todo o array até encontrar o valor. O acesso puro por variáveis é mais eficiente (já que ele encontra somando a posição da memória inicial com a posição do array e, assim, não percorre nada). Outra observação, é que o código parece não dever funcionar na ausência desses valores. Dito isso, talvez seria interessante substituir por um try-catch-finally que capture KeyError ou então use valor um default como None ao armazenar a variável e posteriormente cheque if my_variable is not None. (Se o Python fizer alguma mágica a baixo nível e o algoritmo de busca for não sequencial e o dicionário for pequeno, então desconsidere)

Por falar em KeyError, apenas tratar a superclasse Exception é uma terrível prática. Neste caso, o try-catch poderia estar sendo para direcionar melhor (ou seja, realmente tratar e não apenas engolir imprimindo o stack trace) exceções de IO e o próprio KeyError ao invés de simplesmente Exception. Leia aqui um ou dois truques dos velhos programadores Java.

A maioria dessas preocupações seriam melhor aproveitadas após um refatoramento do código pra modularizá-lo melhor. Quebrar funções em outras (exemplo, um função getter para que, caso entre no catch do keyerror, retorne None, mas se passar pelo try de boas retorne a string que você busca). E se esta modularização for ainda confusa por demais, quebre-a em modules e as importe quando convir. Reza a lenda:

Se um escopo atinge mais de 20 linhas, é porque ele faz "uma coisa" e "outra" e deve ser quebrado em funções menores de faca_coisa() e faca_outra_coisa().

Outras questões menores, é que em Python 2, o print não é método, logo print("Mensagem") vai contra as convenções do 2 (mas é obrigatório no 3). Sendo um statement, se comporta como um break, return, import etc., aí é desnecessário e anti-padrão usar parênteses redundantes em situações simples, talvez apenas usar print ("Mensagem") quando convir um uso mais complexo, pra deixar claro o que é método e o que é statement (em alguns trechos a documentação se confunde quanto a isso, no entanto).

Nome do repositório confere com o conteúdo?

Seria interessante fazer algum design prévio do bot. Ele deveria ser uma personificação do dono do repositório ou apenas um bot climático? Se for a primeira opção, já foi feito alguma especificação?; se for a segunda, uma mudança de nome seria interessante por que razão?

Falta aplicar gitignore a arquivos já commitados

Após a edição do gitignore, alguns arquivos já haviam sido commitados. Pra dizer ao git pra "desacompanhá-los" é só

git rm -r --cached .
git add .

E depois é só commitar as alterações.

Algumas soluções alternativas aqui (StackOverflow).

As pastas bin, local e include deve desaparecer, por exemplo. Caso contrário, algum usuário de sistema diferente do hospedado (que provavelmente é Linux, pela ausência de arquivos .bat) tente fazer a instalação, vai sofrer com conflitos desnecessários.

Eventualmente, quando for necessário repor esses arquivos arquivos, deixe que o próprio PyPI do sistema local lide com isso através do requirements.txt (desde que ele esteja atualizado rs):

pip install -r ./requirements.txt

Falta interação

Acredito que, apesar do foco da comunicação se focar em mensagens digitadas, seja vantajoso para a UX incluir alguns botões de texto. Desconheço sobre o alcance dessas possibilidades, mas sugiro pesquisar melhor na documentação e com casos anteriores documentados até mesmo em depoimentos:

"A primeira coisa que pensei foi que as pessoas não estão acostumadas a usar botões em chats, deve ser esse o problema.

Mas a realidade era outra."

Marcus Beckenkamp, Engenheiro de Software.
Texto de janeiro deste ano.
Disponível em: https://blog.mbeck.com.br/o-que-aprendi-publicando-um-chatbot-19f9ecc145e2

Não há resposta ao compartilhar localização ("alive")

Se "enviar" a localização, ele emite a resposta. Mas se "compartilhar" a localização, não.

Sintaticamente há diferença para o Facebook. O compartilhamento fica alive por 60min e depois cessa (não testei, mas acredito que se atualiza conforme você anda com o GPS ligado). Enquanto o envio fica lá, como um único ponto geográfico qualquer, permanente e passível de reenvio/redirecionamento.

O bot pede por compartilhamento, no entanto só responde para envio. Mas acredito que deveria funcionar para ambos os casos.

É importante salientar que, ao menos no Messenger Mobile para Android, a UX para o botão de "Localização" é totalmente voltada para o compartilhamento: é um botão centralizado, grande e com o texto "compartilhar" dentro; enquanto isso, "enviar" é apenas um ícone pequeno (sem comunicação verbal) no canto superior direito. Até eu mesmo, que já estou ciente disso, demorei pra me acostumar e desde ontem só aperto em "compartilhar" sem querer.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.