Estamos escrevendo um chat de bot para o VKontakte em python usando longpoll. Parte Dois Laços duplos, exceções e outras heresias

Saudações, Habr. Este artigo é uma continuação deste . Antes de ler, eu recomendo fortemente que você o leia se não tiver feito isso antes.

Hoje você aprenderá:

  1. Como obter mais de uma resposta, embora a fazenda coletiva
  2. Como conectar um tradutor Yandex a este
  3. E como escrever para o usuário que ele fez tudo errado

Tradutor de API Yandex


O tradutor Yandex tem uma boa API e nós a usaremos. Estudamos cuidadosamente a documentação e entramos em batalha. Mas aqui Yandex nos coloca um porco.
Requisitos para usar resultados de tradução
De acordo com a Licença para usar o Yandex.Translator, o texto Traduzido pelo serviço Yandex.Translator com um link ativo para a página translate.yandex.ru deve ser indicado acima ou abaixo do resultado da tradução.

Requisitos de layout de texto
O texto deve ser especificado:
na descrição do produto de software;
Ajuda para um produto de software
no site oficial do produto de software;
em todas as páginas ou telas em que os dados de serviço são usados.
Bem, não somos pessoas orgulhosas, vamos sobreviver.

Como isso funciona


O usuário nos escreve uma mensagem, perguntamos em que idioma ele deseja traduzir a frase. Depois pedimos que o texto seja traduzido e envie o resultado.

Implementação técnica


Obter a chave da API
Nós usamos esta biblioteca

from yandex_translate import YandexTranslate #  translate = YandexTranslate('  ') 

Nós chutamos longpoll como eu descrevi na 1ª parte.

 if event.text == '': #     "" if event.from_user: vk.messages.send( #  user_id=event.user_id, message='  ?   .\n :  - ru,  - en' #C  "  ?   .\n :  - ru,  - en".       ) elif event.from_chat: vk.messages.send( # ,    chat_id=event.chat_id, message='  ?   .\n :  - ru,  - en' ) flag = 0 #     2-  for event in longpoll.listen(): if event.type == VkEventType.MESSAGE_NEW and event.to_me and event.text: #     trTo = event.text #    if event.from_user: vk.messages.send( #  user_id=event.user_id, message=' ,    ' ) elif event.from_chat: vk.messages.send( # ,    chat_id=event.chat_id, message=' ,    ' ) for event in longpoll.listen(): if event.type == VkEventType.MESSAGE_NEW and event.to_me and event.text: #     trNormal = 1 #    try: #,     trFrom = translate.detect(event.text) #  trResult = translate.translate(event.text, trFrom + '-' + trTo) # except Exception as e: # -    trNormal = 0 #   print("Exception:", e) #   pass if trNormal == 1: #   if event.from_user: vk.messages.send( #  user_id=event.user_id, message='  «.» translate.yandex.ru\n' + str(trResult['text']) ) flag = 1 #  2-  break elif event.from_chat: vk.messages.send( # ,    chat_id=event.chat_id, message='  «.» translate.yandex.ru\n' + str(trResult['text']) ) flag = 1 break if trNormal == 0: #   if event.from_user: vk.messages.send( #  user_id=event.user_id, message='  ' #..    99%  - ,          ) flag = 1 #  2-  break elif event.from_chat: vk.messages.send( # ,    chat_id=event.chat_id, message='  ' ) flag = 1 break if flag == 1: #     2-  break 

O que são exceções e o que comem


Exceções - isso é algo que, em caso de erro, é executado e nos informa sobre isso. Para lidar com exceções, use a construção try - except.

Vamos tentar implementar nosso código sem essa construção.

-Translation
-Que linguagem? Indique em duas letras.
Por exemplo: russo - ru, inglês - en
-en
-Insira a frase que você deseja traduzir
-Oi Habr
- Traduzido pelo serviço Yandex.Translator translate.yandex.ru
['Oi Habr']

Bem, funciona, e por que precisamos de suas exceções?

Mas porque:
-Translation
-Que linguagem? Indique em duas letras.
Por exemplo: russo - ru, inglês - en
-abracadabra
-Insira a frase que você deseja traduzir
-Oi Habr
...

Enquanto isso, no console:

 Traceback (most recent call last): File "C:\Py_trash\habrex.py", line 112, in <module> main() File "C:\Py_trash\habrex.py", line 78, in main trResult = translate.translate(event.text, trFrom + '-' + trTo) File "C:\Users\Hukuma\AppData\Local\Programs\Python\Python37-32\lib\site-packages\yandex_translate\__init__.py", line 150, in translate raise YandexTranslateException(status_code) yandex_translate.YandexTranslateException: None 

E com exceções:

-Translation
-Que linguagem? Indique em duas letras.
Por exemplo: russo - ru, inglês - en
-Abracadabra
-Insira a frase que você deseja traduzir
-Oi Habr
- Idioma inserido incorretamente

Mais detalhadamente, examinarei a tentativa - exceto a construção:

 try: #sample code except Exception: #       

Vou dar um exemplo com a API da wikipedia:

  try: result = str(wikipedia.summary(event.text)) except wikipedia.exceptions.PageError: print('  ') except wikipedia.exceptions.DisambiguationError: print('') 

Como você entende, pode haver várias exceções.

Por isso digo adeus a você. Tudo de bom

Source: https://habr.com/ru/post/pt428790/


All Articles