From 1424c66fd4e149a798bbd58950075431187da382 Mon Sep 17 00:00:00 2001 From: dan63047 Date: Sun, 5 Apr 2020 17:41:33 +0300 Subject: [PATCH] New command !weather and stability --- README.md | 11 ++++++++--- dan63047bot.py | 46 +++++++++++++++++++++++++++++++++++----------- start.py | 2 +- 3 files changed, 44 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 84444b7..98dbc3b 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,15 @@ # Мой личный бот на python для ВК #### от dan63047 + +Этот бот просто отвечает на поддержваемые запросы в переписке с сообществом Для того, что бы бот работал, сначала нужно создать в папке бота файл `config.py`, который должен иметь следующее содержание: - import vk_api - token = "*токен вашего сообщества*" - vk = vk_api.VkApi(token=token) +```python +import vk_api +import pyowm +vk = vk_api.VkApi(token="vk_group_access_token") # Токен сообщества в ВК +own = pyowm.OWM('OpenWeather_api_key', language='ru') # Ключ OpenWeather API для функции погоды +``` Запустите `start.py`, что бы бот начал слушать сервер diff --git a/dan63047bot.py b/dan63047bot.py index 7d7c28c..41d8262 100644 --- a/dan63047bot.py +++ b/dan63047bot.py @@ -2,7 +2,8 @@ import vk_api import datetime import requests import logging -from config import vk +import pyowm +from config import vk, owm from bs4 import BeautifulSoup from vk_api.longpoll import VkLongPoll, VkEventType @@ -15,7 +16,7 @@ class VkBot: bot_logger.info("Создан объект бота!") self._USER_ID = peer_id - self._COMMANDS = ["!image", "!my_id", "!h", "!user_id", "!group_id", "!help"] + self._COMMANDS = ["!image", "!my_id", "!h", "!user_id", "!group_id", "!help", "!weather"] @staticmethod def _clean_all_tag_from_str(string_line): @@ -32,14 +33,24 @@ class VkBot: not_skip = True return result + def get_weather(self, place): + logger = logging.getLogger("dan63047bot.get_weather") + try: + weather_request = owm.weather_at_place(place) + except pyowm.exceptions.api_response_error.NotFoundError as i: + logger.warning("Ошибка OpenWeather API: "+str(i)) + return "Такого города нет, либо данных о погоде нет" + weather_answer = weather_request.get_weather() + logger.info("Результат поиска погоды через OpenWeather API: "+str(weather_answer)) + return "В городе "+place+" сейчас "+weather_answer.get_detailed_status()+", "+str(round(weather_answer.get_temperature('celsius')['temp']))+"°C" + def get_info_user(self, id): logger = logging.getLogger("dan63047bot.get_info_user") try: user_info = vk.method('users.get', {'user_ids': id, 'fields': 'verified,last_seen,sex'}) except vk_api.exceptions.ApiError as lol: - answer = "Пользователь не найден
"+str(lol) - logger.warning(answer) - return answer + logger.warning("Ошибка метода users.get: "+str(lol)) + return "Пользователь не найден
"+str(lol) logger.info("Результат метода API users.get: "+str(user_info)) if user_info[0]['is_closed']: @@ -82,9 +93,8 @@ class VkBot: try: group_info = vk.method('groups.getById', {'group_id': id, 'fields': 'description,members_count'}) except vk_api.exceptions.ApiError as lol: - answer = "Группа не найдена
"+str(lol) - logger.warning(answer) - return answer + logger.warning("Ошибка метода groups.getById: "+str(lol)) + return "Группа не найдена
"+str(lol) logger.info("Результат метода API groups.getById: "+str(group_info)) if group_info[0]['description'] == "": @@ -106,12 +116,26 @@ class VkBot: respond['text'] = "Ваш ид: "+str(self._USER_ID) elif message[0] == self._COMMANDS[2] or message[0] == self._COMMANDS[5]: - respond['text'] = "Я бот, призванный доставлять неудобства.
Команды:
!my_id - сообщит ваш id в ВК
!user_id *id* - сообщит информацию о этом пользователе
!group_id *id* - сообщит информацию о этой группе
!image - отправляет пока что только одну картинку (скоро планируется отправлять рандомную картинку из альбома)
!h, !help - справка
Дата последнего обновления: 04.04.2020 (перевод на python)
Проект бота на GitHub: https://github.com/dan63047/dan63047pythonbot" + respond['text'] = "Я бот, призванный доставлять неудобства.
Команды:
!my_id - сообщит ваш id в ВК
!user_id *id* - сообщит информацию о этом пользователе
!group_id *id* - сообщит информацию о этой группе
!image - отправляет пока что только одну картинку (скоро планируется отправлять рандомную картинку из альбома)
!weather *город* - отправляет текущую погоду в городе(данные из OpenWeather API)
!h, !help - справка
Дата последнего обновления: 05.04.2020
Проект бота на GitHub: https://github.com/dan63047/dan63047pythonbot" elif message[0] == self._COMMANDS[3]: - respond['text'] = self.get_info_user(message[1]) + try: + respond['text'] = self.get_info_user(message[1]) + except IndexError: + respond['text'] = "Отсуствует аргумент" elif message[0] == self._COMMANDS[4]: - respond['text'] = self.get_info_group(message[1]) + try: + respond['text'] = respond['text'] = self.get_info_group(message[1]) + except IndexError: + respond['text'] = "Отсуствует аргумент" + + elif message[0] == self._COMMANDS[6]: + try: + respond['text'] = respond['text'] = self.get_weather(message[1]) + except IndexError: + respond['text'] = "Отсуствует аргумент" + except AttributeError as lol: + respond['text'] = "Пайтон в ахуе: "+str(lol) return respond diff --git a/start.py b/start.py index 849353c..227d78d 100644 --- a/start.py +++ b/start.py @@ -29,7 +29,7 @@ for event in longpoll.listen(): bot = VkBot(event.peer_id) bot_answer = bot.new_message(event.text) - if bot_answer['text']: + if bot_answer['text'] or bot_answer['attachment']: write_msg(event.peer_id, bot_answer['text'], bot_answer['attachment']) logging.info(f'Ответ бота: {bot_answer}') \ No newline at end of file