Console for bot
This commit is contained in:
parent
b2a8178275
commit
ccced85b2b
|
@ -23,7 +23,7 @@
|
||||||
* **!debug *game*** — бот отправляет всю статистику по игре !game
|
* **!debug *game*** — бот отправляет всю статистику по игре !game
|
||||||
* **!access *all/owner*** — позволяет в беседе установить уровень доступа к командам *!midnight*, *!subscribe* и *!debug*. *all* - все могут пользоваться. *owner* - только вы. Доступно только вам
|
* **!access *all/owner*** — позволяет в беседе установить уровень доступа к командам *!midnight*, *!subscribe* и *!debug*. *all* - все могут пользоваться. *owner* - только вы. Доступно только вам
|
||||||
* **!turnoff** — даёт боту команду на выключение. Доступно только вам
|
* **!turnoff** — даёт боту команду на выключение. Доступно только вам
|
||||||
* **!admin_mode** — если чат, в которой активируется команда, является беседой и в ней у бота есть полномочия администратора, то бот переходит в режим модерации. Пока что он может только кикать людей за @all и @online. Введите ещё раз, чтобы выключить режим модерации. Доступно только вам
|
* **!admin_mode** — если чат, в которой активируется команда, является беседой и в ней у бота есть полномочия администратора, то бот переходит в режим модерации. Пока что он может только кикать людей за @all и @online, реагировать на приход/уход участника беседы. Введите ещё раз, чтобы выключить режим модерации. Доступно только вам
|
||||||
# Установка и запуск бота
|
# Установка и запуск бота
|
||||||
Лучшим решением будет иметь платный аккаунт на [pythonanywhere](https://www.pythonanywhere.com/) чтобы запускать бота, как Always-on task и использовать MySQL базу данных. Можно, конечно, не использовать БД и запускать бота в консоли, но pythonanywhere может выключить вашу консоль, если вы долго не будете посещать её.
|
Лучшим решением будет иметь платный аккаунт на [pythonanywhere](https://www.pythonanywhere.com/) чтобы запускать бота, как Always-on task и использовать MySQL базу данных. Можно, конечно, не использовать БД и запускать бота в консоли, но pythonanywhere может выключить вашу консоль, если вы долго не будете посещать её.
|
||||||
## Основа
|
## Основа
|
||||||
|
@ -69,6 +69,12 @@ mysql_db = 'pythonanywhere_nickname$default' # Название вашей БД.
|
||||||
Если аккаунт бесплатный: в bash консоли переходим в директорию бота и прописываем `python3 dan63047bot.py`. Консоль можно оставить в покое, но лучше раз в день проверять её чтобы консоль не отключили
|
Если аккаунт бесплатный: в bash консоли переходим в директорию бота и прописываем `python3 dan63047bot.py`. Консоль можно оставить в покое, но лучше раз в день проверять её чтобы консоль не отключили
|
||||||
## Другие варианты запуска бота
|
## Другие варианты запуска бота
|
||||||
Скорее всего, вы можете найти где-нибудь VPS или огранизовать всё на своём компьютере. Там вы просто скачиваете и устанавливаете Python последней версии, настраиваете конфиг бота и запускаете его.
|
Скорее всего, вы можете найти где-нибудь VPS или огранизовать всё на своём компьютере. Там вы просто скачиваете и устанавливаете Python последней версии, настраиваете конфиг бота и запускаете его.
|
||||||
|
# botconsole.py
|
||||||
|
Если вы введёте команду `pyhton3 botconsole.py`, то запустится консоль бота. Она пока находится в разработке и не может управлть именно ботом, скорее вы просто будете выполнять действия от лица бота. Вот список поддерживаемых команд:
|
||||||
|
* **help** — выводит список доступных команд
|
||||||
|
* **exit** — завершает работу консоли
|
||||||
|
* **message *peer_id* *message*** — отправляет *message* в переписку *peer_id* от имени сообщества
|
||||||
|
* **msg_history *peer_id* *count*** — возвращает историю переписки, последние *count* сообщений. Если *count* не указано, то последние 20 сообщений
|
||||||
# Использованные библиотеки
|
# Использованные библиотеки
|
||||||
* [vk_api](https://github.com/python273/vk_api) — модуль для создания скриптов для социальной сети Вконтакте
|
* [vk_api](https://github.com/python273/vk_api) — модуль для создания скриптов для социальной сети Вконтакте
|
||||||
* [pyowm](https://github.com/csparpa/pyowm) — модуль для получения погоды через OpenWeather API
|
* [pyowm](https://github.com/csparpa/pyowm) — модуль для получения погоды через OpenWeather API
|
||||||
|
|
|
@ -0,0 +1,116 @@
|
||||||
|
import vk_api
|
||||||
|
import datetime
|
||||||
|
import time
|
||||||
|
import requests
|
||||||
|
import logging
|
||||||
|
import pyowm
|
||||||
|
import random
|
||||||
|
import json
|
||||||
|
import threading
|
||||||
|
import pymysql
|
||||||
|
import vk_api
|
||||||
|
import wikipediaapi as wiki
|
||||||
|
import config
|
||||||
|
from pymysql.cursors import DictCursor
|
||||||
|
from pyowm.utils.config import get_default_config
|
||||||
|
from collections import deque
|
||||||
|
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
|
||||||
|
|
||||||
|
root_logger = logging.getLogger()
|
||||||
|
root_logger.setLevel(logging.INFO)
|
||||||
|
try:
|
||||||
|
log_path = f'logs/console_log{str(datetime.datetime.now())}.log'
|
||||||
|
handler = logging.FileHandler(log_path, 'w', 'utf-8')
|
||||||
|
except:
|
||||||
|
log_path = 'console.log'
|
||||||
|
handler = logging.FileHandler(log_path, 'w', 'utf-8')
|
||||||
|
handler.setFormatter(logging.Formatter('%(message)s'))
|
||||||
|
root_logger.addHandler(handler)
|
||||||
|
|
||||||
|
def log(warning, text):
|
||||||
|
if warning:
|
||||||
|
msg = "[" + str(datetime.datetime.now()) + "] [WARNING] " + text
|
||||||
|
logging.warning(msg)
|
||||||
|
print(msg)
|
||||||
|
else:
|
||||||
|
msg = "[" + str(datetime.datetime.now()) + "] " + text
|
||||||
|
logging.info(msg)
|
||||||
|
print(msg)
|
||||||
|
|
||||||
|
log(False, "Script started")
|
||||||
|
try:
|
||||||
|
vk = vk_api.VkApi(token=config.vk_group_token)
|
||||||
|
longpoll = VkBotLongPoll(vk, config.group_id)
|
||||||
|
log(False, "VK API Group token: OK")
|
||||||
|
except Exception as e:
|
||||||
|
log(True, "Can't connect to longpull: "+str(e))
|
||||||
|
exit(log(False, "[SHUTDOWN]"))
|
||||||
|
|
||||||
|
def cycle():
|
||||||
|
active = True
|
||||||
|
print("Welcome to dan63047bot console\nEnter command:")
|
||||||
|
while active:
|
||||||
|
command = input(">")
|
||||||
|
logging.info("[" + str(datetime.datetime.now()) + "] Entered command: " + command)
|
||||||
|
command = command.split(' ', 1)
|
||||||
|
if command[0] == "exit":
|
||||||
|
print("Bye")
|
||||||
|
active = False
|
||||||
|
elif command[0] == "help":
|
||||||
|
print("Console in development")
|
||||||
|
print("help - command list")
|
||||||
|
print("exit - shutdown console")
|
||||||
|
print("message [peer_id] [message] - send message in vk from bot to peer_id")
|
||||||
|
print("msg_history [peer_id] [count] - return message history in 'count' last messages with peer_id")
|
||||||
|
elif command[0] == "message":
|
||||||
|
try:
|
||||||
|
command[1] = command[1].split(' ', 1)
|
||||||
|
except:
|
||||||
|
log(True, "No arguments")
|
||||||
|
continue
|
||||||
|
random_id = random.randint(-9223372036854775808, 9223372036854775807)
|
||||||
|
try:
|
||||||
|
m = vk.method('messages.send', {'peer_id': command[1][0], 'message': command[1][1], 'random_id': random_id})
|
||||||
|
log(False, f'message_id: {m}, peer_id: {command[1][0]}, random_id: {random_id}')
|
||||||
|
except Exception as e:
|
||||||
|
log(True, f'Failed to send message: {str(e)}')
|
||||||
|
elif command[0] == "msg_history":
|
||||||
|
try:
|
||||||
|
command[1] = command[1].split(' ', 1)
|
||||||
|
except:
|
||||||
|
log(True, "No arguments")
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
if 1 in command[1]:
|
||||||
|
m = vk.method('messages.getHistory', {'count': command[1][1], 'peer_id': command[1][0]})
|
||||||
|
else:
|
||||||
|
m = vk.method('messages.getHistory', {'peer_id': command[1][0]})
|
||||||
|
log(False, f"That dialogue have {m['count']} messages ({len(m['items'])} in response)")
|
||||||
|
for i in m['items']:
|
||||||
|
if str(i['from_id']) == "-"+str(config.group_id):
|
||||||
|
f = "You"
|
||||||
|
else:
|
||||||
|
user_info = vk.method('users.get', {'user_ids': i["from_id"], 'fields': 'verified,last_seen,sex'})
|
||||||
|
f = f'{user_info[0]["first_name"]} {user_info[0]["last_name"]}'
|
||||||
|
datetime_time = datetime.datetime.fromtimestamp(i['date'])
|
||||||
|
date = datetime_time.strftime('%d.%m.%Y в %H:%M:%S')
|
||||||
|
msg = f"{f} {date}: {i['text']}"
|
||||||
|
if i['attachments']:
|
||||||
|
for m in i['attachments']:
|
||||||
|
if m['type'] == "sticker":
|
||||||
|
msg += f" [sticker_id{m[m['type']]['sticker_id']}]"
|
||||||
|
elif m['type'] == "wall":
|
||||||
|
msg += " [" + m['type'] + str(m[m['type']]['from_id']) + \
|
||||||
|
"_" + str(i[m['type']]['id']) + "]"
|
||||||
|
elif m['type'] == "link":
|
||||||
|
msg += " [" + m['type'] + " " + m[m['type']]['title'] + "]"
|
||||||
|
else:
|
||||||
|
msg += " [" + m['type'] + str(m[m['type']]['owner_id']) + \
|
||||||
|
"_" + str(m[m['type']]['id']) + "]"
|
||||||
|
print(msg)
|
||||||
|
except Exception as e:
|
||||||
|
log(True, f'Failed to get history: {str(e)}')
|
||||||
|
else:
|
||||||
|
log(True, "Unknown command. Type 'help' for command list")
|
||||||
|
|
||||||
|
cycle()
|
|
@ -813,6 +813,8 @@ def bots():
|
||||||
elif i['type'] == "wall":
|
elif i['type'] == "wall":
|
||||||
atch += i['type'] + str(i[i['type']]['from_id']) + \
|
atch += i['type'] + str(i[i['type']]['from_id']) + \
|
||||||
"_" + str(i[i['type']]['id']) + " "
|
"_" + str(i[i['type']]['id']) + " "
|
||||||
|
elif i['type'] == "link":
|
||||||
|
atch += i['type'] + " " + i[i['type']]['title'] + " "
|
||||||
else:
|
else:
|
||||||
atch += i['type'] + str(i[i['type']]['owner_id']) + \
|
atch += i['type'] + str(i[i['type']]['owner_id']) + \
|
||||||
"_" + str(i[i['type']]['id']) + " "
|
"_" + str(i[i['type']]['id']) + " "
|
||||||
|
|
Loading…
Reference in New Issue