diff --git a/LiteVkApi/__init__.py b/LiteVkApi/__init__.py index f682bc2..65386d4 100644 --- a/LiteVkApi/__init__.py +++ b/LiteVkApi/__init__.py @@ -1,32 +1,89 @@ -# ============================================================================= -# Придумал и разработал - MaMush (vk.com/maks.mushtriev2, t.me/Error_mak25) -# Гитхаб - github.com/Ma-Mush/LiteVKApi -# PypI - pypi.org/project/litevkapi/ - - -# Убрал chats кроме проверки сообщений, login токен и ид метами поменял, send_message, edit_message, аргументы в msg -# ============================================================================= try: import vk_api -except: raise ImportError( +except ImportError: raise ImportError( "Ошибка авторизации (login):\n =====\nНе установлена библиотека vk_api - pip3 install vk_api\n=====" ) from vk_api.utils import get_random_id -from vk_api.keyboard import VkKeyboard, VkKeyboardColor from vk_api.longpoll import VkLongPoll, VkEventType from vk_api.bot_longpoll import VkBotLongPoll from threading import Thread - -class _keybord_for_send_if_None(): # Так было проще всего, просто поверьте - def get_keyboard(*arg): - pass +from json import dumps +from dataclasses import dataclass class LiteVkApiError(Exception): pass -class Vk(object): +@dataclass +class Keyboard(object): + def __init__(self, permanent:bool=True, inline:bool=False, buttons:list=[]): + self.keyboard = self._dump({ + 'one_time': not permanent, + 'inline': inline, + 'buttons': buttons + }) + + def _dump(self, *args, **kwargs): + kwargs['ensure_ascii'] = False + kwargs['separators'] = (',', ':') + return dumps(*args, **kwargs) +class Button(object): + def text(label, color, callback=False, payload=None): + color = color.lower() + m = [ + ['positive', '3', 'зеленый'], + ['negative', '2', 'красный'], + ['secondary', '1', 'белый'], + ['primary', '0', 'синий'], + ] + for i in m: + if color in i: + return { + 'color': i[0].lower(), + 'action': { + 'type': "callback" if callback else "text", + 'payload': payload, + 'label': label, + } + } + + def url(label, link, payload=None): + return { + 'action': { + 'type': "open_link", + 'link': link, + 'label': label, + 'payload': payload, + } + } + + def open_app(app_id, owner_id, label, hash, payload=None): + return { + 'action': { + 'type': "open_app", + 'app_id': app_id, + 'owner_id': owner_id, + 'label': label, + 'hash': hash, + 'payload': payload, + } + } + + def vk_pay(hash, payload=None): + return { + 'action': { + 'type': "vkpay", + 'hash': hash, + 'payload': payload, + } + } + +class EmptyKeyboard(): + keyboard = "" + keyboard_close = '{"buttons":[],"one_time":true}' + +class Client(object): def __init__(self, vk, vk_session, key, server, ts): self.vk, self.vk_session, self.key, self.server, self.ts, self.event_msg = vk, vk_session, key, server, ts, "" @@ -61,38 +118,17 @@ def _upload_file(self, file_names, peer): ) attachment.append("doc{}_{}".format(mydoc["owner_id"], mydoc["id"])) return attachment - - def _color(self, keyboard, title, col, callback=False, payload=None): - col = col.upper() - m = [ - ["POSITIVE", "3", "ЗЕЛЕНЫЙ"], - ["NEGATIVE", "2", "КРАСНЫЙ"], - ["SECONDARY", "1", "БЕЛЫЙ"], - ["PRIMARY", "0", "СИНИЙ"], - ] - if not callback: - button = keyboard.add_button - else: - button = keyboard.add_callback_button - - for i in range(len(m)): - if col in m[i]: - button(title, color=getattr(VkKeyboardColor, m[i][0]), payload=payload) - return 0 - raise LiteVkApiError( - "Ошибка создания клавиатуры (new_keyboard):\n=====\nНеправильно указан цвет/указан специальный объект клавиатуры\n=====" - ) def login( - tok:str, + token:str, id_group:int=None, - userbot=False, + userbot:bool=False, my_key=None, my_server=None, my_ts=None, ): try: - vk_session = vk_api.VkApi(token=tok) + vk_session = vk_api.VkApi(token=token) except: raise LiteVkApiError( "Ошибка авторизации (login):\n=====\nНе действительный токен или указан id вместо токена\n=====" @@ -117,30 +153,28 @@ def login( "Ошибка авторизации (login):\n=====\nУкажите значения key, server, ts! Их можно сгененировать тут - https://vk.com/dev/groups.getLongPollServer \n=====" ) - return Vk(vk, vk_session, my_key, my_server, my_ts) # Я знаю, что это ужасно, но не хочу отходить от Vk.login() + return Client(vk, vk_session, my_key, my_server, my_ts) # Я знаю, что это ужасно, но не хочу отходить от Client.login() def get_session(self): return self.vk_session def give_session(session, my_key=None, my_server=None, my_ts=None): vk = session.get_api() - return Vk(vk, session, my_key, my_server, my_ts) + return Client(vk, session, my_key, my_server, my_ts) def msg( self, text:str, userid:int or str, - photo:list or tuple or set=[], + photos:list or tuple or set=[], files:list or tuple or set=[], - keyboard=None, + keyboard:Keyboard=EmptyKeyboard, reply_to:int=None ): - if photo != []: - photo = self._upload_photo(photo, userid) - if files != []: + if photos: + photos = self._upload_photo(photos, userid) + if files: files = self._upload_file(files, userid) - if keyboard == None: - keyboard = _keybord_for_send_if_None() try: return self.vk.messages.send( key=self.key, @@ -149,8 +183,8 @@ def msg( message=text, peer_id=userid, random_id=get_random_id(), - attachment=photo + files, - keyboard=keyboard.get_keyboard(), + attachment=photos + files, + keyboard=keyboard.keyboard, reply_to=reply_to) except: raise LiteVkApiError( @@ -164,9 +198,9 @@ def send_message( userid:int or str, photos:list or tuple or set=[], files:list or tuple or set=[], - keyboard=None, - reply_to:int=None - ): # Кому удобнее так, чем msg + keyboard:Keyboard=EmptyKeyboard, + reply_to:int=None + ): # Кому удобнее так, чем msg return self.msg(text=text, userid=userid, photos=photos, files=files, keyboard=keyboard, reply_to=reply_to) def edit_message( @@ -176,14 +210,12 @@ def edit_message( messid:int, photo:list or tuple or set=[], files:list or tuple or set=[], - keyboard=None + keyboard:Keyboard=EmptyKeyboard ): if photo != []: photo = self._upload_photo(photo, userid) if files != []: files = self._upload_file(files, userid) - if keyboard == None: - keyboard = _keybord_for_send_if_None() try: return self.vk.messages.edit( key=self.key, @@ -193,7 +225,7 @@ def edit_message( peer_id=userid, message_id=messid, attachment=photo + files, - keyboard=keyboard.get_keyboard(), + keyboard=keyboard.keyboard, ) except: raise LiteVkApiError( @@ -220,7 +252,13 @@ def check_new_msg(self, chat:bool=False): def get_event(self): return self.event_msg - def send_photo(self, file_names:list or set or tuple, userid:int or str, msg:str=None): + def send_photo( + self, + file_names:list or set or tuple, + userid:int or str, + msg:str=None, + keyboard:Keyboard=EmptyKeyboard + ): attachment = self._upload_photo(file_names, userid) try: return self.vk.messages.send( @@ -231,13 +269,20 @@ def send_photo(self, file_names:list or set or tuple, userid:int or str, msg:str message=msg, random_id=get_random_id(), attachment=attachment, + keyboard=keyboard.keyboard, ) except: raise LiteVkApiError( "Ошибка отправки фото (send_photo):\n=====\nНеправильно введен один из параметров отправки сообщений\n=====" ) - def send_file(self, file_names, userid, msg=None): + def send_file( + self, + file_names:list or set or tuple, + userid:int or str, + msg:str=None, + keyboard:Keyboard=EmptyKeyboard + ): attachment = self._upload_file(file_names, userid) try: return self.vk.messages.send( @@ -247,60 +292,20 @@ def send_file(self, file_names, userid, msg=None): peer_id=userid, message=msg, random_id=get_random_id(), - attachment=attachment + attachment=attachment, + keyboard=keyboard.keyboard, ) except: raise LiteVkApiError( "Ошибка отправки файла (send_file):\n=====\nНеправильно введен один из параметров отправки сообщений\n=====" ) - def new_keyboard(self, dicts:dict, perm:bool=True): - keyboard = VkKeyboard(one_time=(not perm)) - try: - for i in dicts.keys(): - if i == "new_line": - keyboard.add_line() - elif i == "vk_pay": - keyboard.add_vkpay_button(hash=dicts[i]) - elif i == "open_app": - for key, value in dicts[i].items(): - if key == "app_id": - app_id = value - elif key == "owner_id": - owner_id = value - elif key == "label" or key == "text": - label = value - elif key == "hash": - hash1 = value - keyboard.add_vkapps_button( - app_id, owner_id, label, hash1 - ) - elif i == "open_link": - for key, value in dicts[i].items(): - if key == "label" or key == "text": - label = value - elif key == "link": - link = value - keyboard.add_openlink_button(label, link) - elif i == "callback" or i == "inline": - payload = None - for key, value in dicts[i].items(): - if key == "label" or key == "text": - label = value - elif key == "color": - col = value - elif key == "payload": - payload = value - self._color(keyboard, label, col, True, payload) - else: - self._color(keyboard, i, dicts[i]) - except Exception: - raise LiteVkApiError( - "Ошибка создания клавиатуры (new_keyboard):\n=====\nНеправильно указан один из параметров клавиатуры\n=====" - ) - return keyboard - - def send_keyboard(self, keyboard, userid:int or str, msg:str="Клавиатура!"): + def send_keyboard( + self, + keyboard:Keyboard, + userid:int or str, + msg:str="Клавиатура!" + ): try: return self.vk.messages.send( key=self.key, @@ -309,7 +314,7 @@ def send_keyboard(self, keyboard, userid:int or str, msg:str="Клавиатур peer_id=userid, message=msg, random_id=get_random_id(), - keyboard=keyboard.get_keyboard() + keyboard=keyboard.keyboard ) except: raise LiteVkApiError( @@ -317,9 +322,11 @@ def send_keyboard(self, keyboard, userid:int or str, msg:str="Клавиатур (бот раньше не писал ему сообщения или не находится в беседе)\n=====" ) - def delete_keyboard(self, userid:int or str, msg:str="Клавиатура закрыта!"): - keyboard = VkKeyboard(one_time=True) - keyboard.keyboard["buttons"] = [] + def delete_keyboard( + self, + userid:int or str, + msg:str="Клавиатура закрыта!" + ): try: return self.vk.messages.send( key=self.key, @@ -328,7 +335,7 @@ def delete_keyboard(self, userid:int or str, msg:str="Клавиатура за peer_id=userid, message=msg, random_id=get_random_id(), - keyboard=keyboard.get_keyboard(), + keyboard=EmptyKeyboard.keyboard_close, ) except: raise LiteVkApiError( @@ -336,13 +343,21 @@ def delete_keyboard(self, userid:int or str, msg:str="Клавиатура за (бот раньше не писал ему сообщения или не находится в беседе)\n=====" ) - def mailing(self, text:str, userids:list or set or tuple, safe:list=[]): + def mailing( + self, + text:str, + userids:list or set or tuple, + safe:list=[], + photos:list or tuple or set=[], + files:list or tuple or set=[], + keyboard:Keyboard=EmptyKeyboard, + ): def r(text, userids): try: for i in userids: try: if i not in safe: - Vk.msg(self, text, i) + Client.msg(self, text, i, photos, files, keyboard) except: pass except: @@ -380,7 +395,7 @@ def get_all_message_data(self): def get_all_open_id(self, message_data=None): if message_data is None: - message_data = Vk.get_all_message_data(self) + message_data = self.get_all_message_data() ret = [] for i in message_data: ret.append(i["peer_id"]) diff --git a/README.md b/README.md index 030062e..992ada3 100644 --- a/README.md +++ b/README.md @@ -12,175 +12,292 @@ P.s. Если вы читаете это в PypI, то у вас могут не Для начала установите vk_api, если он не установлен - pip3 install vk_api Скрипт библиотеки написан в виде функций и различных переменных в классе, поэтому можно использовать несколько вариантов импорта: -Рекомендую - from LiteVkApi import Vk (будет описана здесь), import LiteVkApi (придется использовать LiteVkApi.Vk._), < один из предыдущих вариантов > as < название > (вместо названия импортированного модуля можно использовать свое имя) - -## Vk.Login(token, id_group=None, userbot=False, my_key=0, my_server=0, my_ts=0) * - -### Функция ВСЕГДА имеет объект Vk -Функция регистрирует вас на сервере ВКонтакте и с обновления 2.0 возвращает сессию в переменную. -Параметры: +Рекомендую - from LiteVkApi import Client (будет описана здесь), import LiteVkApi (придется использовать LiteVkApi.Client._), < один из предыдущих вариантов > as < название > (вместо названия импортированного модуля можно использовать свое имя) + +
====== +
Что нового в обновлении 2.4 + +- ### Переработка клавиатуры + Теперь она генерируется специальным классом Keyboard и по отдельны кнопкам (класс Button), подробнее читайте в соответсвующих разделах ниже. + +- ### Класс Vk теперь называется Client + Я все больше беру пример с библиотеки Telethon :) + +- ### Исправлены мелкие ошибки, переработаны некоторые части кода библиотеки + +- ### Переработа документация + + +
+======
+
+ + +# Классы + +## - Client - класс взаимодействия с Вк + +
Функции + +* ## Client.login(token, id_group, userbot, my_key, my_server, my_ts) * + ### Функция ВСЕГДА имеет объект Client + Функция регистрирует вас на сервере ВКонтакте и возвращает сессию в переменную. +
Параметры + + Название | Что это? + ------------- | ------------- + token | Токен сообщества в виде строки (например 'a244f42a6eaec65dbeh1ee13aab8ce7355311448868357e545c27cd648025c8a31ee66f4528a0a4ca98be') + id_group | id группы в числовом виде (например 200397283), если используется юзер-бот - любое число или None (нужен, только если вы используете токен группы) + userbot | Для страницы (а не для группы) вы используете бота? (True/False) По умолчанию False + get_session | Если True - возвращает сессию в переменную (для удобства использования вместе vk_api). По умолчанию False + ост. | Настройки для беседы, узать тут - https://vk.com/dev/groups.getLongPollServer + +
+ +* ## _.get_session() + Возвращает сессию Вконтакте, т.е. ели вы уже вошли через Client.login и вам надо пользоваться обычным vk_api, то вы можете использовать эту сессию, чтобы не входить снова. (Тоже самое на vk_api - vk_session = vk_api.VkApi(token = токен)) + +* ## Client.give_session(session) * + #### Функция ВСЕГДА имеет объект Client + Регистрирует вашу сессию Вк, но только если вы уже входили через другие api и передали ее в параметр session (для vk_api сессия получается через session = vk_api.VkApi(token = токен)) +
Параметры + + Название | Что это? + ------------- | ------------- + session | Сессия в Вк от vk_api + ост. | Настройки для беседы, узать тут - https://vk.com/dev/groups.getLongPollServer + +
+ +* ## _.msg(text, userid, photo, files, keyboard, reply_to) + Отправляет сообщение пользователю по ID / беседе по ее номеру с заданным текстом +
Параметры + + Название | Что это? + ------------- | ------------- + text | Текст сообщения + userid | ID пользователя/беседы для отправкии сообщеия + photo | Массив с путями до фотографий, которые нужно отправить + files | Массив с путями до файлов, которые нужно отправить + keyboard | Клавиатура, полученная с помощью Keyboard (подробнее - ниже) + reply_to | ID сообщения, на котороее нужно ответить + +
+ +* ## _.send_message(text, userid, photo, files, keyboard, reply_to) + То же самое, что и _.msg + +* ## _.edit_message(text, userid, messid, photo, files, keyboard) + Изменяет сообщение по ID +
Параметры + + Название | Что это? + ------------- | ------------- + text | Текст сообщения + userid | ID пользователя/беседы, куда было отправлено сообщение + messid | ID сообщения, которое нужно изменить + photo | Массив с путями до фотографий, которые нужно отправить + files | Массив с путями до файлов, которые нужно отправить + keyboard | Клавиатура, полученная с помощью Keyboard (подробнее - ниже) + +
+ +* ## _.check_new_msg(chat) + Используется для проверки новых сообщений (возвращает True / False) +
Параметры + + Название | Что это? + ------------- | ------------- + chat | Для беседы вы используете бота или нет (True / False)? По умолчанию False + +
+ +* ## _.get_event() + Возвращает данные о новом сообщении при его наличии. Основные параметры выданных данных - user_id / chat_id, text. Подробнее в документации vk_api. + +* ## _.send_photo(file_names, userid, msg, keyboard) + Отправляет фото с сообщением / без него пользователю/беседе. +
Параметры + + Название | Что это? + ------------- | ------------- + file_name | массив файлов в директории запущенного питон-файла или полный путь к нему + userid | ID пользователя/беседы для отправкии сообщеия + msg | Текст сообщения (по умолчанию без него) + keyboard | Клавиатура, полученная с помощью Keyboard (подробнее - ниже) + +
+ +* ## _.send_file(file_names, userid, msg, keyboard) + Отправляет файл с сообщением / без него пользователю/беседе. +
Параметры + + Название | Что это? + ------------- | ------------- + file_names | Массив файлов в директории запущенного питон-файла или полный путь к нему + userid | ID пользователя/беседы для отправкии сообщеия + msg | Текст сообщения (по умолчанию без него) + keyboard | Клавиатура, полученная с помощью Keyboard (подробнее - ниже) + +
+ +* ## _.send_keyboard(keyboard, userid, msg) + Отправляем пользователю созданнуб раннее клавиатуру +
Параметры + + Название | Что это? + ------------- | ------------- + keyboard | Клавиатура, созданная раннее + userid | Ид пользователя / беседы + msg | Сообщение при отправке клавиатуры (по умолчанию 'Клавиатура!') + +
+ +* ## _.delete_keyboard(userid, msg) + Удаляет клавиатуру у пользователя. +
Параметры + + Название | Что это? + ------------- | ------------- + userid | Ид пользователя / беседы + msg | Сообщение при удалении клавиатуры (по умолчанию 'Клавиатура закрыта!') + +
+ +* ## _.mailing(text, userids, safe) + Делает рассылку независимо от других действий (бот будет отвечать во время рассылки). +
Параметры + + Название | Что это? + ------------- | ------------- + text | Текст сообщения + userids | Массив с ID пользователей / бесед (например - [123456, 1234567, 12345678]) + safe | Массив с ID пользователей / бесед, которые отказались от рассылки, по умолчанию таких нет + +
+ +* ## _.get_all_message_data() + Возвращает массив со словарями с данными о последних сообщениях всех чатов, где находился бот (и ЛС, и беседы, и боты). Внимание! Функция достаточно долгая для ботов с большой аудиторией. Может занимать от долей секунды до нескольких минут. +
Что находится в словарях: + + Название | Что это? + ------------- | ------------- + date | Количиство секунд с 01.01.1970 00:00 UTC, также как time.time() + from_id | Id группы или пользователя, кто отправил последнее сообщение (может быть как и бот, так и пользователь) + id | Id этого сообщения + out | 0 / 1, 0 - последнее сообщение присали вам, 1 - последнее сообщение прислали вы + peer_id | Id чата - chat_id если это беседа, user_id если это Лс (ну или id группы если это бот) + random_id | Какой рандомный Id у сообщения (нужен для его отправки, фактически бесполезен) + text | Текст сообщения + attachments | Описание вложений (фото, видео, файлы, стикеры и тд.) последнего сообщения (если это просто текст - []) + admin_author_id | Если out=1 и писал не бот, а человек, то в этот параметр передается id админа, который писал сообщение + update_time | Если сообщение редактировали, то передается время редактирования в формате, как в date + conversation_message_id | Уникальный автоматически увеличивающийся номер для всех сообщений с этим peer + fwd_messages | Массив пересланных сообщений, если они есть (если нет - []) + important | В документации не нашел, скорее всего избарнный (важный) чат или нет (True/False) + is_hidden | В документации не нашел, скорее всего скрытое сообщение (удалено у меня) или нет (но это не точно) (True/False) + +
+ + +* ## _.get_all_open_id(message_data) + Возвращает в переменную массив с Id всех пользоватлей, которые когда-либо писали боту или id бесед, где он находится (куда ему можно писать - для рассылки) +
Параметры + + Название | Что это? + ------------- | ------------- + message_data | Данные, полученные с помощью get_all_message_data*, по умолчанию None, функция * вызывается автоматически + +
+ +* ## _.VkMethod(method_name, arg) + Возвращает в переменную данные, полученные в результате запроса с помощью Вк-метода. Создана для удобства, чтобы не имортировать vk_api и получать сессию) +
Параметры + + Название | Что это? + ------------- | ------------- + method_name | Назване Вк-метода (все методы тут - https://vk.com/dev/methods ) + arg | Параметры для метода в виде словаря + +
+ +
+ +## - Keyboard - класс для создания клавиатуры +
Описание + Название | Что это? ------------- | ------------- -token | Токен сообщества в виде строки (например 'a244f42a6eaec65dbeh1ee13aab8ce7355311448868357e545c27cd648025c8a31ee66f4528a0a4ca98be') -id_group | id группы в числовом виде (например 200397283), если используется юзер-бот - любое число (нужен, только если вы используете токен группы) -userbot | Для страницы (а не для группы) вы используете бота? (True/False) По умолчанию False -get_session | Если True - возвращает сессию в переменную (для удобства использования вместе vk_api). По умолчанию False -ост. | Настройки для беседы, узать тут - https://vk.com/dev/groups.getLongPollServer +permanent | При True - клавиатуру можно нажимать много раз, при False - пропадает после первого +inline | При True - клавиатура в сообщении, при False - как обычно, снизу экрана +buttons* | Двойной массив, заполенный массивами, в которых объекты - кнопки, полученные из класса Buttons (ниже) -p.s. Для бесед не тестировал, возможны ошибки) -## _.get_session() -Возвращает сессию Вконтакте, т.е. ели вы уже вошли через Vk.login и вам надо пользоваться обычным vk_api, то вы можете использовать эту сессию, чтобы не входить снова. (Тоже самое на vk_api - vk_session = vk_api.VkApi(token = токен)) + * Подробнее про праметр "buttons". Это двойной массив, имеет вид [[кнопка, кнопка], [кнопка]]. Как нетрудно догадаться - вложенные массивы подразумевают строки с кнопками. То есть, если вы хотите разместить 2 кнопки на первой строке, а еще 1 на второй - используйте конструкнию выше. При 3-ух кнопках по одной на строке - [[кнопка], [кнопка], [кнопка]]. +
-## Vk.give_session(session) * +## - Button - класс для создания кнопок для клавиатуры (Keyboard) +
Функции -#### Функция ВСЕГДА имеет объект Vk -Регистрирует вашу сессию Вк, но только если вы уже входили через другие api и передали ее в параметр session (для vk_api сессия получается через session = vk_api.VkApi(token = токен)) -Параметры: -Название | Что это? -------------- | ------------- -session | Сессия в Вк -ост. | Настройки для беседы, узать тут - https://vk.com/dev/groups.getLongPollServer +* ## Button.text(label, color, callback, payload) + Возвращает обычную кнопку с текстом +
Параметры + + Название | Что это? + ------------- | ------------- + label | Текст кнопки + color | Цвет (Синий - 'primary', '0', 'синий'; Белый - 'secondary', '1', 'белый'; Красный - 'negative', '2', 'красный'; Зелёный - 'positive', '3', 'зеленый') + callback | Коллбэк это кнопка или нет (True/False) + payload | Данные для старых клиентов ВК (я сам хз че это, в доке Вк так написано) -## _.msg(text, userid, photo=[], files=[], keyboard=None, reply_to=None) -Отправляет сообщение пользователю по ID / беседе по ее номеру с заданным текстом -Параметры: -Название | Что это? -------------- | ------------- -text | Текст сообщения -userid | ID пользователя/беседы для отправкии сообщеия -photo | Массив с путями до фотографий, которые нужно отправить -files | Массив с путями до файлов, которые нужно отправить -keyboard | Клавиатура, полученная с помощью _.new_keyboard() -reply_to | ID сообщения, на котороее нужно ответить - -## _.send_message(text, userid, photo=[], files=[], keyboard=None, reply_to=None) -То же самое, что и _.msg - -## _.edit_message(text, userid, messid, photo=[], files=[], keyboard=None) -Изменяет сообщение по ID -Параметры: -Название | Что это? -------------- | ------------- -text | Текст сообщения -userid | ID пользователя/беседы, куда было отправлено сообщение -messid | ID сообщения, которое нужно изменить -photo | Массив с путями до фотографий, которые нужно отправить -files | Массив с путями до файлов, которые нужно отправить -keyboard | Клавиатура, полученная с помощью _.new_keyboard() - -## _.check_new_msg(chat=False) -Используется для проверки новых сообщений (возвращает True / False) -Параметры: -Название | Что это? -------------- | ------------- -chat | Для беседы вы используете бота или нет (True / False)? По умолчанию False +
-## _.get_event() -Возвращает данные о новом сообщении при его наличии. Основные параметры выданных данных - user_id / chat_id, text. Подробнее в документации vk_api. -## _.send_photo(file_names, userid, msg=None) -Отправляет фото с сообщением / без него пользователю/беседе. -Параметры: -Название | Что это? -------------- | ------------- -file_name | массив файлов в директории запущенного питон-файла или полный путь к нему -userid | ID пользователя/беседы для отправкии сообщеия -msg | Текст сообщения (по умолчанию без него) +* ## Button.url(label, link, payload) + Возвращает кнопку с ссылкой +
Параметры -## _.send_file(file_names, userid, msg=None) -Отправляет файл с сообщением / без него пользователю/беседе. -Параметры: -Название | Что это? -------------- | ------------- -file_names | Массив файлов в директории запущенного питон-файла или полный путь к нему -userid | ID пользователя/беседы для отправкии сообщеия -msg | Текст сообщения (по умолчанию без него) + Название | Что это? + ------------- | ------------- + label | Текст кнопки + link | Ссылка, которая будет открыта при нажатии + payload | Данные для старых клиентов ВК -## _.new_keyboard(dict, perm=True) -Создание клавиатуры (возвращает данные в переменную для отправки) -Параметры: -Название | Что это? -------------- | ------------- -dict | Словарь с данными по кнопкам. -perm | Будет ли сохранятся клавиатура после нажатия (True / False)? По умолчанию True. (Лайфхак - False можно использовать вместо delete_keyboard при поэтапной выдаче клавиатур) +
-По кнопкам: +* ## Button.open_app(app_id, owner_id, label, hash, payload) + Возвращает кнопку для открытия указанного приложения VK mini apps +
Параметры -+ Словарь для обычной кнопки - {Текст:Цвет} (все цвета - ['POSITIVE', '3', 'ЗЕЛЕНЫЙ'], ['NEGATIVE', '2', 'КРАСНЫЙ'], ['SECONDARY', '1', 'БЕЛЫЙ'], ['PRIMARY', '0', 'СИНИЙ']). -+ Для переноса на новую линию - {"new_line":""}. -+ Для открытие перевода в VkPay - {"vk_pay":hash твоего кошелька}. -+ Для открытия мини-приложения Вконтакте - {"open_app":{"app_id":ид приложения, "owner_id":owner id приложения, "label":текст на кнопке, "hash":хэш приложения}} -+ Для открытия ссылки на любой ресурс - {"open_link":{"label":текст кнопки, "link":ссылка с http / https}} -+ Для создания callback (inline) кнопки - {"callback":{"label":текст кнопки, "color":цвет кнопки, "payload":данные для callback api (по умолчанию None)}} + Название | Что это? + ------------- | ------------- + app_id | ID приложения + app_hash | Хэш приложения + label | Текст кнопки + hash | Хэш + payload | Данные для старых клиентов ВК -## _.send_keyboard(keyboard, userid, msg='Клавиатура!') -Отправляем пользователю созданнуб раннее клавиатуру -Параметры: -Название | Что это? -------------- | ------------- -keyboard | Клавиатура, созданная раннее -userid | Ид пользователя / беседы -msg | Сообщение при отправке клавиатуры (по умолчанию 'Клавиатура!') +
-## _.delete_keyboard(userid, msg='Клавиатура закрыта!') -Удаляет клавиатуру у пользователя. -Параметры: -Название | Что это? -------------- | ------------- -userid | Ид пользователя / беседы -msg | Сообщение при удалении клавиатуры (по умолчанию 'Клавиатура закрыта!') +* ## Button.vk_pay(hash, payload) + Возвращает кнопку для открытия VK pay +
Параметры -## _.mailing(text, userids, safe=[]) -Делает рассылку независимо от других действий (бот будет отвечать во время рассылки). -Параметры: -Название | Что это? -------------- | ------------- -text | Текст сообщения -userids | Массив с ID пользователей / бесед (например - [123456, 1234567, 12345678]) -safe | Массив с ID пользователей / бесед, которые отказались от рассылки, по умолчанию таких нет + Название | Что это? + ------------- | ------------- + hash | Хэш аккаунта VK pay + payload | Данные для старых клиентов ВК -## _.get_all_message_data() -Возвращает массив со словарями с данными о последних сообщениях всех чатов, где находился бот (и ЛС, и беседы, и боты). Внимание! Функция достаточно долгая для ботов с большой аудиторией. Может занимать от долей секунды до нескольких минут. +
-Что находится в словарях: -Название | Что это? -------------- | ------------- -date | Количиство секунд с 01.01.1970 00:00 UTC, также как time.time() -from_id | Id группы или пользователя, кто отправил последнее сообщение (может быть как и бот, так и пользователь) -id | Id этого сообщения -out | 0 / 1, 0 - последнее сообщение присали вам, 1 - последнее сообщение прислали вы -peer_id | Id чата - chat_id если это беседа, user_id если это Лс (ну или id группы если это бот) -random_id | Какой рандомный Id у сообщения (нужен для его отправки, фактически бесполезен) -text | Текст сообщения -attachments | Описание вложений (фото, видео, файлы, стикеры и тд.) последнего сообщения (если это просто текст - []) -admin_author_id | Если out=1 и писал не бот, а человек, то в этот параметр передается id админа, который писал сообщение -update_time | Если сообщение редактировали, то передается время редактирования в формате, как в date -conversation_message_id | Уникальный автоматически увеличивающийся номер для всех сообщений с этим peer -fwd_messages | Массив пересланных сообщений, если они есть (если нет - []) -important | В документации не нашел, скорее всего избарнный (важный) чат или нет (True/False) -is_hidden | В документации не нашел, скорее всего скрытое сообщение (удалено у меня) или нет (но это не точно) (True/False) - -## _.get_all_open_id(message_data=None) -Возвращает в переменную массив с Id всех пользоватлей, которые когда-либо писали боту или id бесед, где он находится (куда ему можно писать - для рассылки) -Параметры: -Название | Что это? -------------- | ------------- -message_data | Данные, полученные с помощью get_all_message_data*, по умолчанию None, функция * вызывается автоматически +

-## _.VkMethod(method_name, arg) -Возвращает в переменную данные, полученные в результате запроса с помощью Вк-метода. Создана для удобства, чтобы не имортировать vk_api и получать сессию) -Параметры: -Название | Что это? -------------- | ------------- -method_name | Назване Вк-метода (все методы тут - https://vk.com/dev/methods ) -arg | Параметры для метода в виде словаря # Примеры ## Отправка сообщения с тем же текстом, тому же пользователю, что и прислали нам: ```python -from LiteVkApi import Vk -vk_session = Vk.login("твой токен", твой ид) +from LiteVkApi import Client +vk_session = Client.login("твой токен", твой ид) while True: if vk_session.check_new_msg(): event = vk_session.get_event() @@ -188,8 +305,8 @@ while True: ``` ## Простейший бот: ```python -from LiteVkApi import Vk -vk_session = Vk.login("твой токен", твой ид) +from LiteVkApi import Client +vk_session = Client.login("твой токен", твой ид) while True: if vk_session.check_new_msg(): event = vk_session.get_event() @@ -201,11 +318,9 @@ while True: ``` ## Создание, отправка и удаление клавиатуры: ```python -from LiteVkApi import Vk -vk_session = Vk.login("твой токен", твой ид) -kbrd = {'Клавиатура':"синий", 'new_line':"", 'Закрыть клавиатуру':'3', -'new_line':'', 'open_link':{'label':'Создатель библиотеки', 'link':'https://vk.com/maks.mushtriev2'}} -keyboard = vk_session.new_keyboard(kbrd) +from LiteVkApi import Client +vk_session = Client.login("твой токен", твой ид) +keyboard = Keyboard(True, False, [[Button.text("Клавиатура", "синий")], [Button.text("Закрыть клавиатуру", "синий")], [Button.url("Создатель библиотеки", "https://vk.com/maks.mushtriev2")]]) while True: if vk_session.check_new_msg(): event = vk_session.get_event() @@ -237,11 +352,11 @@ vk_session.mailing('Рассылка!', mass_ids) # Контакты -Что-то не работает, есть вопросы, пожелания? Пиши - vk.com/maks.mushtriev2, t.me/Error_mak25 +Что-то не работает, есть вопросы, пожелания? Пиши - [Telegram](https://t.me/Error_mak25), [VK](https://vk.com/maks.mushtriev2) -Мой блог - vk.com/mamush_blog +Мой блог - [Telegram](https://t.me/mamush_blog), [VK](https://vk.com/mamush_blog) -Донат - vk.cc/az7BQK (Киви) +Донат - [Киви, оплата кошельком/номером телефона/любой картой без комиссии (тык)](https://qiwi.com/n/NADEZNIEINVEST) ### Удачи! diff --git a/requirements.txt b/requirements.txt index 03a93d4..65674ee 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1 @@ -vk-api==11.9.1 \ No newline at end of file +vk-api==11.9.8 \ No newline at end of file diff --git a/setup.py b/setup.py index 22ae7dc..ac9e423 100644 --- a/setup.py +++ b/setup.py @@ -5,291 +5,19 @@ # LiteVkApi Бот в Вк? Легко! -Pypi - https://pypi.org/project/LiteVkApi/ - -# КРАТКАЯ ДОКУМЕНТАЦИЯ -Привет! Эта библиотека создана для быстрого написания ботов (преимущественно ЛС) в ВК. Мне захотелось, чтобы ботов писать было быстро и легко, поэтому я сделал удобную библиотеку с самыми популярными функциями vk_api. Сейчас я расскажу вам о ней! - -P.s. Если вы читаете это в PypI, то у вас могут некорректно отображаться таблички с пояснениями функций. На Гитхабе все хорошо - https://github.com/Ma-Mush/LiteVkApi/ - -# Внимание! - -### С обновления 2.0 структура библиотеки немного поменялась. - -Боты, написанные на версиях 1.x не будут работать на версиях 2.x. Чтобы они снова работали, достаточно записать в переменную Vk функцию Vk.login, вот так: -``` -Vk = Vk.login(параметры) -``` - -Теперь вы можете регистрировать одновременно сразу несколько ботов и использовать свои переменные в качестве объекта функции (в документации рассмотрена переменная Vk). - -Этот код: -```python -from LiteVkApi import Vk -Vk = Vk.login(твой ид, "твой токен") -while True: - if Vk.check_new_msg(): - event = Vk.get_event() - Vk.msg(event.text, event.user_id) -``` - -Будет работать абсолютно так-же, как и этот: -```python -from LiteVkApi import Vk -vk_session = Vk.login(твой ид, "твой токен") -while True: - if vk_session.check_new_msg(): - event = vk_session.get_event() - vk_session.msg(event.text, event.user_id) -``` - -### Обратите внимание, что не все функции должны принимать в качестве объекта Вашу переменную! -Так, функции Vk.login и Vk.give_session ВСЕГДА ДОЛЖНЫ БЫТЬ С "Vk" - - -## Импорты -Для начала установите vk_api, если он не установлен - pip3 install vk_api - -Скрипт библиотеки написан в виде функций и различных переменных в классе, поэтому можно использовать несколько вариантов импорта: -Рекомендую - from LiteVkApi import Vk (будет описана здесь), import LiteVkApi (придется использовать LiteVkApi.Vk._), < один из предыдущих вариантов > as < название > (вместо названия импортированного модуля можно использовать свое имя) - -## _.help() -Функция выведет в консоль информацию, которая описывает основное строение билиотеки, как с ней работать, что она может и так далее. Вообщем документация на минималках) - -## Vk.Login(id_group, token, userbot=False, chats=False, my_key=0, my_server=0, my_ts=0) * - -### Функция ВСЕГДА имеет объект Vk -Функция регистрирует вас на сервере ВКонтакте и с обновления 2.0 возвращает сессию в переменную. -Параметры: -Название | Что это? -------------- | ------------- -id_group | id группы в числовом виде (например 200397283), если используется юзер-бот - любое число -token | Токен сообщества в виде строки (например 'a244f42a676ec65dbod1e713aab88e735e311448868357u545c27cd64802tc8a31ee66e462 8a0a4ca98be') -userbot | Для страницы (а не для группы) вы используете бота? (True/False) По умолчанию False -get_session | Если True - возвращает сессию в переменную (для удобства использования вместе vk_api). По умолчанию False -chat | Для беседы вы используете бота или нет (True / False)? По умолчанию False -ост. | Настройки для беседы, узать тут - https://vk.com/dev/groups.getLongPollServer - -p.s. Для бесед не тестировал, возможны ошибки) - -## _.get_session() -Возвращает сессию Вконтакте, т.е. ели вы уже вошли через Vk.login и вам надо пользоваться обычным vk_api, то вы можете использовать эту сессию, чтобы не входить снова. (Тоже самое на vk_api - vk_session = vk_api.VkApi(token = токен)) - -## Vk.give_session(session) * - -#### Функция ВСЕГДА имеет объект Vk -Регистрирует вашу сессию Вк, но только если вы уже входили через другие api и передали ее в параметр session (для vk_api сессия получается через session = vk_api.VkApi(token = токен)) -Параметры: -Название | Что это? -------------- | ------------- -session | Сессия в Вк -ост. | Настройки для беседы, узать тут - https://vk.com/dev/groups.getLongPollServer - -## _.msg(text, userid chats=False) -Отправляет сообщение пользователю по ID / беседе по ее номеру с заданным текстом -Параметры: -Название | Что это? -------------- | ------------- -text | Текст сообщения -userid | ID пользователя/беседы для отправкии сообщеия -chat | Для беседы вы используете бота или нет (True / False)? По умолчанию False - -## _.check_new_msg() -Используется для проверки новых сообщений (возвращает True / False) -Параметры: -Название | Что это? -------------- | ------------- -chat | Для беседы вы используете бота или нет (True / False)? По умолчанию False - -## _.get_event() -Возвращает данные о новом сообщении при его наличии. Основные параметры выданных данных - user_id / chat_id, text. Подробнее в документации vk_api. - -## _.send_photo(file_name, userid, msg=None, chats=False) -Отправляет фото с сообщением / без него пользователю/беседе. -Параметры: -Название | Что это? -------------- | ------------- -file_name | имя файла в директории запущенного питон-файла или полный путь к нему -userid | ID пользователя/беседы для отправкии сообщеия -msg | Текст сообщения (по умолчанию без него) -chat | Для беседы вы используете бота или нет (True / False)? По умолчанию False - -## _.new_keyboard(dicts, perm=True) -Создание клавиатуры (возвращает данные в переменную для отправки) -Параметры: -Название | Что это? -------------- | ------------- -dicts | Масив со словарями, содержащими данные о кнопках. -perm | Будет ли сохранятся клавиатура после нажатия (True / False)? По умолчанию True. (Лайфхак - False можно использовать вместо delete_keyboard при поэтапной выдаче клавиатур) - -По кнопкам: - -Словарь для обычной кнопки - {Текст:Цвет} (все цвета - ['POSITIVE', '3', 'ЗЕЛЕНЫЙ'], ['NEGATIVE', '2', 'КРАСНЫЙ'], ['SECONDARY', '1', 'БЕЛЫЙ'], ['PRIMARY', '0', 'СИНИЙ']). - -Для переноса на новую линию - {"new_line":""}. - -Для открытие перевода в VkPay - {"vk_pay":hash твоего кошелька}. - -Для открытия мини-приложения Вконтакте - {"open_app":[{"app_id":ид приложения}, {"owner_id":owner id приложения}, {"label":текст на кнопке}, {"hash":хэш приложения}]} - -Для открытия ссылки на любой ресурс - {"open_link":[{"label":текст кнопки}, {"link":ссылка с http / https / www}]} - -## _.send_keyboard(keyboard, userid, msg='Клавиатура!', chats=False) -Отправляем пользователю созданнуб раннее клавиатуру -Параметры: -Название | Что это? -------------- | ------------- -keyboard | Клавиатура, созданная раннее -userid | Ид пользователя / беседы -msg | Сообщение при отправке клавиатуры (по умолчанию 'Клавиатура!') -chats | Для беседы вы используете бота или нет (True / False)? По умолчанию False - -## _.delete_keyboard(userid, msg='Клавиатура закрыта!', chats=False) -Удаляет клавиатуру у пользователя. -Параметры: -Название | Что это? -------------- | ------------- -userid | Ид пользователя / беседы -msg | Сообщение при удалении клавиатуры (по умолчанию 'Клавиатура закрыта!') -chats | Для беседы вы используете бота или нет (True / False)? По умолчанию False - -## _.send_file(file_name, userid, msg=None, chats=False) -Отправляет файл с сообщением / без него пользователю/беседе. -Параметры: -Название | Что это? -------------- | ------------- -file_name | имя файла в директории запущенного питон-файла или полный путь к нему -userid | ID пользователя/беседы для отправкии сообщеия -msg | Текст сообщения (по умолчанию без него) -chat | Для беседы вы используете бота или нет (True / False)? По умолчанию False - -## _.mailing(text, userids, safe=[], chats=False) -Делает рассылку независимо от других действий (бот будет отвечать во время рассылки). -Параметры: -Название | Что это? -------------- | ------------- -text | Текст сообщения -userids | Массив с ID пользователей / бесед (например - [123456, 1234567, 12345678]) -safe | Массив с ID пользователей / бесед, которые отказались от рассылки, по умолчанию таких нет -chat | Для беседы вы используете бота или нет (True / False)? По умолчанию False - -## _.get_all_message_data() -Возвращает массив со словарями с данными о последних сообщениях всех чатов, где находился бот (и ЛС, и беседы, и боты). Внимание! Функция достаточно долгая для ботов с большой аудиторией. Может занимать от 0.1 секунды до минуты. - -Что находится в словарях: -Название | Что это? -------------- | ------------- -date | Количиство секунд с 01.01.1970 00:00 UTC, также как time.time() -from_id | Id группы или пользователя, кто отправил последнее сообщение (может быть как и бот, так и пользователь) -id | Id этого сообщения -out | 0 / 1, 0 - последнее сообщение присали вам, 1 - последнее сообщение прислали вы -peer_id | Id чата - chat_id если это беседа, user_id если это Лс (ну или id группы если это бот) -random_id | Какой рандомный Id у сообщения (нужен для его отправки, фактически бесполезен) -text | Текст сообщения -attachments | Описание вложений (фото, видео, файлы, стикеры и тд.) последнего сообщения (если это просто текст - []) -admin_author_id | Если out=1 и писал не бот, а человек, то в этот параметр передается id админа, который писал сообщение -update_time | Если сообщение редактировали, то передается время редактирования в формате, как в date -conversation_message_id | Уникальный автоматически увеличивающийся номер для всех сообщений с этим peer -fwd_messages | Массив пересланных сообщений, если они есть (если нет - []) -important | В документации не нашел, скорее всего избарнный (важный) чат или нет (True/False) -is_hidden | В документации не нашел, скорее всего скрытое сообщение (удалено у меня) или нет (но это не точно) (True/False) - -## _.get_all_open_id(message_data=None) -Возвращает в переменную массив с Id всех пользоватлей, которые когда-либо писали боту или id бесед, где он находится (куда ему можно писать - для рассылки) -Параметры: -Название | Что это? -------------- | ------------- -message_data | Данные, полученные с помощью get_all_message_data*, по умолчанию None, функция * вызывается автоматически - -## _.VkMethod(method_name, arg) -Возвращает в переменную данные, полученные в результате запроса с помощью Вк-метода. Создана для удобства, чтобы не имортировать vk_api и получать сессию) -Параметры: -Название | Что это? -------------- | ------------- -method_name | Назване Вк-метода (все методы тут - https://vk.com/dev/methods ) -arg | Параметры для метода в виде словаря - -# Примеры -## Отправка сообщения с тем же текстом, тому же пользователю, что и прислали нам: -```python -from LiteVkApi import Vk -vk_session = Vk.login(твой ид, "твой токен") -while True: - if vk_session.check_new_msg(): - event = vk_session.get_event() - vk_session.msg(event.text, event.user_id) -``` -## Простейший бот: -```python -from LiteVkApi import Vk -vk_session = Vk.login(твой ид, "твой токен") -while True: - if vk_session.check_new_msg(): - event = vk_session.get_event() - eventxt, userid = event.text, event.user_id - if eventxt == 'Привет': - vk_session.msg(f'Привет, {userid}', userid) - elif eventxt == 'Как дела?': - vk_session.msg('Хорошо, а у тебя?', userid) -``` -## Создание, отправка и удаление клавиатуры: -```python -from LiteVkApi import Vk -vk_session = Vk.login(твой ид, "твой токен") -while True: - if vk_session.check_new_msg(): - event = vk_session.get_event() - if event.text == 'Клавиатура': - kbrd = [{'Клавиатура':"синий"}, {'new_line':""}, {'Закрыть клавиатуру':'3'}, -{'new_line':''}, {'open_link':[{'label':'Создатель библиотеки'}, {'link':'https://vk.com/maks.mushtriev2'}]}] - keyboard = vk_session.new_keyboard(kbrd) - vk_session.send_keyboard(keyboard, event.user_id, 'А вот и клавиатура!') - elif event.text == 'Закрыть клавиатуру': - vk_session.delete_keyboard(event.user_id, 'Теперь клавиатура закрыта!') -``` -## Отправка файла и фото: -```python -from LiteVkApi import Vk -vk_session = Vk.login(твой ид, "твой токен") -while True: - if vk_session.check_new_msg(): - event = vk_session.get_event() - try: - vk_session.send_photo(event.text, event.user_id, 'Отправляю фото...') - vk_session.send_file(event.text, event.user_id, 'Отправляю файл...') - except: - vk_session.msg('Не могу найти файл {} или указанный файл не является фотографией'.format(event.text), event.user_id) -``` -## Рассылка кому только можно -```python -from LiteVkApi import Vk -vk_session = Vk.login(твой ид, "твой токен") -mass_ids = vk_session.get_all_open_id() -vk_session.mailing('Рассылка!', mass_ids) -``` - -# Контакты - -Что-то не работает, есть вопросы, пожелания? Пиши - vk.com/maks.mushtriev2, t.me/Error_mak25 - -Мой блог - vk.com/mamush_blog - -Донат - vk.cc/az7BQK (Киви) - - -### Удачи! +Из-за некорректного отображения документации в PyPI, она была полностью перемещена на гитхаб - https://github.com/Ma-Mush/LiteVkApi/ """ setup( name="LiteVkApi", - version="2.1.1", - description="Библиотека для лекгого написания ботов ВК!", + version="2.4", + description="Библиотека для легкого написания ботов ВК!", packages=["LiteVkApi"], author_email="ma_mush@mail.ru", zip_safe=False, - python_requires=">=3.6", + python_requires=">=3.8", long_description=long_description, long_description_content_type="text/markdown", - install_requires= "vk-api==11.9.1" + install_requires= "vk-api==11.9.8" )