@cadusilva Isso parece ser um problema no parser, me manda o link do arquivo pra eu dar uma olhada como ele faz.
Em geral, você so precisa do spacey se você quiser pegar dados de contexto no meio de um texto natural. Ou seja, no meio de uma conversa qualquer sem nenhuma estrutura "perceber" que uma cidade foi citada, por exemplo. Se tiver uma estrutura textual para chamar o bot não vai precisar.
@cadusilva Foi mal, eu não prestei atenção na mensagem inicial, tu já esta usando só o bot e nome da cidade. Nesse caso, basta alterar a linha 114 de under_the_weather.py de:
places = [e for e in self.nlp(msg).ents if e.label_ == "LOC"]
Para
places = [msg]
Se funcionar, tu pode remover todas as referencias ao spacy do arquivo e remover ele da image.
@cadusilva Era o que e pensava mesmo. Tu tem algumas alternativas a depender de alguns fatores:
1) Se o bot só funciona com cidades BR seria possível fazer uma lista com todas e bater via regex a mensagem do usuário pra ver se esta citando alguma. Se for o mundo todo não da pra fazer isso.
2) Criar uma estrutura formal de mensagem para o bot responder, fora da qual ele não responde. Algo como "@bot "nome da cidade" ". Se a pessoa colocar qualquer coisa diferente dessa o estrutura o bot não vai entender.
Depois disso precisa alterar o parser. Atualmente ele recebe um array, por isso se tu passa uma string simples ele entende como um array de letras e chama pra cada uma. Mas isso é fácil de mudar.
@Kriptolix tem como capturar o erro "AttributeError: 'NoneType' object has no attribute 'raw'", como o código faz com erros 4xx, e responder o usuário em vez de falhar e o bot ser reiniciado?
@Kriptolix fiz o teste aqui e funcionou. Desde que o usuário informe só o nome da cidade, que pode ser "Cidade", "Cidade, UF", "Nome Composto", ele vai enviar tudo pra API do OWM e retornar as informações do clima.
Mas se o usuário adicionar mais texto, a API não vai encontrar a cidade e o bot nem sequer vai responder (vai dar erro no bastidor, o que é o comportamento esperado, sem um código para lidar com isso e responder "informe somente um nome de cidade")
@Kriptolix é isso mesmo. Tipo, o usuário vai e digita "qual o clima na cidade do Recife". Aí isso tudo vai ser passado integralmente para a API do OWM, e obviamente não existe uma cidade chamada "qual o clima na cidade do Recife", e a API vai retornar null.
@cadusilva Hahahah, não. Esse erro indica que alguma coisa que não deveria ir vazia esta indo vazia. Provavelmente na linha 128 de under_the_weather.py. O que tu tentou fazer que deu esse erro?
Se for o que eu acho que é, vai ter que adicionar uma verificação pra ver se msg está vazio, mas não tenho certeza, eu nunca tive que debugar um código via telefone sem fio antes, ahaha. Tanta isso na linha 115:
@Kriptolix obrigado! Vou brincar aqui com outros códigos como 406 (não aceitável), 417 (expectativa não atendida), 422 (entidade não-processável) e adicionar uma resposta do bot ao usuário :vilaozinho:
@cadusilva com 417 e não vai funcionar a não ser que exista um "if report == 417:" no under_the_weather.py no lugar certo. Eu usei o numero 400 pq lá ja tem um if que testa para os numeros 400, 401, 404 e 429.
Se não funcionar com 400 pode ser pq o erro anterior é fatal. Nesse caso ao invés de adicionar abaixo da linha 44:
if not location: return 400 # cidade inválida ou não encontrada
é preciso testar o valor antes, adicionando na linha anterior a 44:
if not city_name: return 400 # cidade inválida ou não encontrada.
Se não funcionar depois eu tento rodar esse bot aqui pra ver.