VK API
(меню)
Библиотеки
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
from vk_api.exceptions import ApiError
Факты
- id юзера больше 0, id группы меньше 0
- id чата больше 2000000000, id чата равно id юзера это личка
- action, payload, ответ если не равно None тогда они есть
Методы VK API
vk.messages.removeChatUser(chat_id=chat_id, member_id=member_id)
messages.getConversationsById
Получает информацию о чате создателя и админов. По создателю можно определить тип чата.
users.get
groups.getById
Получает информацию про группу
messages.send
vk.utils.resolveScreenName(screen_name="diodiodiodiodiodiodiodiodiodio")
vk.users.get(user_ids=[754256057, 816039462, 815994979], fields="sex")
vk.groups.getById(group_id=abs(from_id))
открепить vk.messages.unpin(peer_id=peer_id)
закрепить vk.messages.pin(peer_id=peer_id, conversation_message_id=sms_id)
аватарка(удалить) vk.messages.deleteChatPhoto(chat_id=chat_id)
сменить название vk.messages.editChat(chat_id=chat_id, title=title)
информация(участники) vk.messages.getConversationMembers(peer_id=peer_id, fields=fields)
информация(беседа) vk.messages.getConversationsById(peer_ids=peer_ids)
отправить простое сообщение vk.messages.send(peer_id=peer_id, random_id=0, message=message, attachment=attachment)
отправить сообщение с ответом
forward = {"peer_id": peer_id, "conversation_message_ids": sms_id, "is_reply": 0}
vk.messages.send(peer_id=peer_id, random_id=0, message=message, attachment=attachment, forward=json.dumps(forward))
удалить сообщение vk.messages.delete(peer_id=peer_id, cmids=sms_id, delete_for_all=1)
сообщение с кнопками vk.messages.send(peer_id=peer_id, random_id=0, message=message, keyboard=json.dumps(keyboard))
редактировать сообщение vk.messages.edit(peer_id=peer_id, conversation_message_id=sms_id, message=message)
сканировать сообщение vk.messages.getByConversationMessageId(peer_id=peer_id, conversation_message_ids=sms_id)
пользователь(информация) vk.users.get(user_ids=user_ids, fields=fields)
ссылка(сократить) vk.utils.getShortLink(url=url)
домен(сканировать) vk.utils.resolveScreenName(screen_name=screen_name)
vk.groups.getById(group_id=abs(from_id))[0]
vk.messages.isMessagesFromGroupAllowed(group_id=225327458, user_id=845322500)
vk.messages.getInviteLink(peer_id=peer_id)["link"]
vk.messages.getById(message_ids=[sms_id])
Полезная нагрузка
def PAYLOAD(payload):
Удаляем начальный и конечный теги "payload" из строки
payload = payload.replace('{"payload":"', '')
payload = payload.replace('"}', '')
Разбиваем строку на отдельные элементы
payload = payload.split()
Возвращаем полученный массив
return payload
Проверяем, не является ли payload None
if payload != None:
Если не None, то обрабатываем строку с помощью функции PAYLOAD
payload = PAYLOAD(payload)
Пример использования функции PAYLOAD
a = {"payload": "принять {from_id} {from_id}"}
Конвертируем словарь в строку JSON
a = json.dumps(a)
Простыми словами полезная нагрузка это тайная строка не видна взору человеческому внутри сообщения которое может распознать бот. Обычно в сообщении юзера оно может быть если он нажимает текстовую кнопку или в сообщении бота если он словарь конвертирует и передает методу
Кнопки
t = '{"payload": ' + f'"принять {from_id2} {from_id}"' + '}'
print(t)
keyboard = {}
keyboard["inline"] = True
keyboard["buttons"] = []
keyboardSTR = []
KEYBOARD = {}
KEYBOARD["action"] = {}
KEYBOARD["color"] = "secondary"
KEYBOARD["action"]["type"] = "text"
KEYBOARD["action"]["payload"] = t
KEYBOARD["action"]["label"] = "Принять"
keyboardSTR.append(KEYBOARD)
keyboard["buttons"].append(keyboardSTR)
prof = BINOPEN(f"DB/USERS/{from_id}/prof.bin")
prof2 = BINOPEN(f"DB/USERS/{from_id2}/prof.bin")
vk.messages.send(peer_id=peer_id, keyboard=json.dumps(keyboard), random_id=0, message=f"{prof2[2]} вам предлогает брак {prof[2]}", payload=json.dumps(p))
if rimuru == "монетка":
keyboard = {}
keyboard["inline"] = True
slovarik = {}
slovarik["action"] = {}
slovarik["action"]["type"] = "text"
slovarik["action"]["payload"] = '{"монетка": 100}'
slovarik["action"]["label"] = "Орел"
slovarik2 = {}
slovarik2["action"] = {}
slovarik2["action"]["type"] = "text"
slovarik2["action"]["payload"] = '{"монетка": 100}'
slovarik2["action"]["label"] = "Решка"
stroka = []
stroka.append(slovarik)
stroka.append(slovarik2)
slovarik3 = {}
slovarik3["action"] = {}
slovarik3["action"]["type"] = "text"
slovarik3["action"]["payload"] = '{"монетка": 100}'
slovarik3["action"]["label"] = "Оказаться от вызова"
stroka2 = []
stroka2.append(slovarik3)
button_stroka = []
button_stroka.append(stroka)
button_stroka.append(stroka2)
kkk = {
"inline": True,
"buttons": [
[
{
"action":{
"type":"text",
"payload":"{\"button\": \"1\"}",
"label":"Принять"
},
"color":"negative"
}
]
]
}
vk.messages.send(peer_id=peer_id, random_id=0, message="кнопка", keyboard=json.dumps(kkk))
Действие в чате
if action["type"] == "chat_invite_user" and from_id == action["member_id"]
action["type"] == "chat_invite_user" and from_id != action["member_id"]
vk.messages.send(peer_id=peer_id, random_id=0, message="Я ухожу")
vk.messages.removeChatUser(chat_id=chat_id, member_id=-225327458)
action["type"] == "chat_kick_user" and from_id == action["member_id"]
action["type"] == "chat_kick_user" and from_id != action["member_id"]
Добавьте условия и логику для других типов действий, таких как "chat_create", "chat_delete", "chat_edit", "chat_join_by_link" и т. д.
Извлекаем данные из event
message = event.obj.message
chat_id = event.chat_id
pprint.pprint(message)
print("\n")
peer_id = message["peer_id"]
from_id = message["from_id"]
sms_id = message["conversation_message_id"]
date = message["date"]
att = message["attachments"]
fwd_messages = message["fwd_messages"]
text = message["text"]
action = message.get("action")
reply_message = message.get("reply_message")
payload = message.get("payload")
Разное
text2.replace('<$mavan>', "Маван Туоминен")
forward = {"peer_id": peer_id, "conversation_message_ids": sms_id, "is_reply": 0}
vk.messages.send(peer_id=peer_id, random_id=0, message=p, disable_mentions=1, forward=json.dumps(forward))
c.sort(key=lambda x: x[0], reverse=True)
m = "📱" if o.get("online_mobile") == 1 else "💻"
vk.messages.getConversationsById(peer_ids=peer_id)
Проверка медиавложений
# Проверяем, есть ли вложения
if len(att) != 0:
for at in att:
# Проверяем тип вложения
if at['type'] == "photo":
# Получаем информацию о фотографии
photo_owner_id = at['photo']['owner_id']
photo_id = at['photo']['id']
photo_access_key = at['photo']['access_key']
# Выводим информацию о фотографии
print(f"Фотография: {photo_owner_id}, {photo_id}, {photo_access_key}")
elif at['type'] == "sticker":
# Получаем идентификатор стикера
print(f"Стикер: {at['sticker']['id']}")
elif at['type'] == "audio":
# Получаем файл аудиозаписи
audio_file = at['audio']['file']
# Выводим информацию о файле аудиозаписи
print(f"Аудиозапись: {audio_file}")
elif at['type'] == "audio_message":
# Получаем файл аудиосообщения
audio_file = at['audio_message']['file']
# Выводим информацию о файле аудиосообщения
print(f"Аудиосообщение: {audio_file}")
elif at['type'] == "video":
# Получаем файл видеофайла
video_file = at['video']['file']
# Выводим информацию о файле видеофайла
print(f"Видео: {video_file}")
elif at['type'] == "group_call_in_progress":
# Выводим информацию о групповом звонке
print("Групповой звонок в прогрессе")
elif at['type'] == "wall_reply":
# Получаем текст ответа на стену
reply_text = at['wall_reply']['text']
# Выводим информацию о тексте ответа на стену
print(f"Ответ на стену: {reply_text}")
elif at['type'] == "wall":
# Получаем текст записи в стену
wall_text = at['wall']['text']
# Выводим информацию о тексте записи в стену
print(f"Запись на стене: {wall_text}")
elif at['type'] == "poll":
# Получаем вопрос опроса
poll_question = at['poll']['question']
# Получаем ответы на опрос
poll_answers = at['poll']['answers']
# Выводим информацию о вопросе опроса и его ответах
print(f"Опрос: {poll_question}, ответы: {poll_answers}")
elif at['type'] == "link":
# Получаем URL ссылки
link_url = at['link']['url']
# Проверяем, является ли ссылка ссылкой на статью в EF STATA
if link_url.startswith("https://ef-stata.com"):
# Обрабатываем ссылку на статью в EF STATA
print(f"Ссылка на статью в EF STATA: {link_url}")
elif at['type'] == "doc":
# Получаем файл документа
doc_file = at['doc']['file']
# Выводим информацию о файле документа
print(f"Документ: {doc_file}")
Стартовый код
import vk_api from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType token = "" soob_id = vk_session = vk_api.VkApi(token=token) vk = vk_session.get_api() longpoll = VkBotLongPoll(vk_session, soob_id) while True: try: for event in longpoll.listen(): print(event) print("\n") if event.type == VkBotEventType.MESSAGE_NEW: #loading = threading.Thread(target=MESSAGE, args=(event,)) #loading.start() event_message(event) if event.type == VkBotEventType.WALL_POST_NEW: post_id = event.object.id group_id = event.group_id vk.messages.send(peer_id=2000000001, message='Просто тест', random_id=0, attachment=f'wall-{event.group_id}_{event.object.id}') vk.messages.send(peer_id=2000000001, message="Просто тест", random_id=0, attachment=f"photo-225327458_457239024") if event.type == "message_reaction_event": vk.messages.send(peer_id=2000000001, message="сучка поставила реакцию", random_id=0,) except Exception as e: print(f"Возникла ошибка: {e} ") continue message = event.obj.message chat_id = event.chat_id pprint.pprint(message) print("\n") peer_id = message["peer_id"] from_id = message["from_id"] sms_id = message["conversation_message_id"] date = message["date"] att = message["attachments"] fwd_messages = message["fwd_messages"] text = message["text"] action = message.get("action") reply_message = message.get("reply_message") payload = message.get("payload") if text.lower() == "пинг": vk.messages.send(peer_id=peer_id, random_id=0, message="типа пинг")
Упоминание
if "[id" in from_id and "|" in from_id and "]" in from_id:
from_id = from_id.split("|")[0][3:]
if from_id.isdigit():
return int(from_id)
return False
elif "[club" in from_id and "|" in from_id and "]" in from_id:
from_id = from_id.split("|")[0][5:]
if from_id.isdigit():
return -int(from_id)
return False
elif "https://vk.com/id" in from_id:
pass
elif "https://vk.com/club" in from_id:
pass
elif "vk.com/id" in from_id:
pass
elif "vk.com/club" in from_id:
pass
elif "https://vk.com/" in from_id:
screen_name = from_id[:15]
o = True
elif "vk.com/" in from_id:
screen_name = from_id[:7]
o = True
if user_id.isdigit():
return int(user_id)
if user_id.startswith("[id") and user_id.split("|")[0][3:].isdigit():
return int(user_id)
if user_id.startswith("[club") and user_id.split("|")[0][5:].isdigit():
return int(user_id)
if user_id.startswith("https://vk.com/club") and user_id[19:].isdigit():
return int(user_id[19:])
if user_id.startswith("https://vk.com/id") and user_id[17:].isdigit():
return int(user_id[17:])
if user_id.startswith("vk.com/club") and user_id[11:].isdigit():
return int(user_id[11:])
if user_id.startswith("vk.com/id") and user_id[9:].isdigit():
return int(user_id[9:])
nick = "DBBINOPEN"
return f"[id{nick[1]}|{nick[0]}]" if nick[2] == True else nick[0]
Факты про ВКонтакте
- Простая беседа лимит 1000 участников
- Чат сообщества лимит 7000 участников
- Команда это текст из слов. По сути текст.
- В командах могут быть параметры в виде слов символов ссылок и упоминаний. Текст приходят в сообщениях которые хранят и медиа плюс время дату.
- Команды бывают простые без параметром и с параметрами.
- Бот распознает символы, слова и строки.
- Команды могут иметь доступ команд а могут и не иметь.
- Вк очень кривое приложение и поэтому люди часто используют иные которые не имеют полного функционала да и на сайтах разнобой полный и вот проблемы. Приложения ВК могут быть не у всех как и кнопки меню сообществ. Так-же не у всех могут быть кнопки или работать они в полной мере. Поэтому самая примитивная основа бота это текст и картинки.
- По своей сути админы техподдержки могут быть не нужны они создают проблемы сами многое не знают и очень много агресируют портя имидж бота примеры бы я привел но смысла нет.
- Боты есть общего характера и узкие. Они все хорошие в боте много чего можно запихнуть но вот мое мнение. Облики команд множество синонимов или сложные комбинации команд и прочее. Меня сбили с мыслей. В общем чем проще и доступнее бот тем лучше и скажу так со смайликами тоже аккуратнее их не все могут видеть корректно и это портит вид сообщения создавая колхозный вид.
- Многие команды однотипны но потребляют колоссальное количество места а вот тут уже думать надо стоит ли.
- Перенасыщение бота командами не всегда лучше его сложнее настроить иногда лучше разделить бота на ботов.
- Способы оплаты помните что не всегда можно это автоматизировать или сделать оплату для иной валюты например тенге.
- Помните в ВК о том что пользовательский контент несет опасность поэтому надо ограничить свободу людям или создать громадную команду контроля над всем что не возможно.
- Помните что профиль привязан к человеку и к чату то есть бота могут заблокировать и айди бесед потеряют актуальность нужно придумать как обходить это но в основном люди придумал группы представители для расширения возможностей или же закрепляют чат за профилем создателя или применяю бота по типу ID фиксации.
- Бот может менять хостинг поэтому нужно думать над аккуратным переносом данных. И нельзя допускать мусорного засорения данными место не резиновое.
Виды диалогов
- Лс - личный диалог с человеком
- Простой чат - там создатель человек
- Чат сообщества - там создатель сообщество
Надо думать над нагрузкой на бота, полным управлением ботов из лс разрабочика, о месте на сервере, типы команд.
Действие в чате
Боты ВК
1. Викторина https://vk.com/club170763395
2. Фреш https://vk.com/club203003740
3. Сот https://vk.com/club205747591
4. Ада https://vk.com/club178947124
5. Мафия https://vk.com/club182711509
6. Су https://vk.com/club219622329
7. Цитатник https://vk.com/club212178194
8. Пхолли https://vk.com/club182977390
9. Ирис https://vk.com/club174105461
10. Бандит https://vk.com/club166948584
11. Леся https://vk.com/club158861435
12. Оповещение https://vk.com/club131851952
13. Бибка https://vk.com/club203899337
14. Пума https://vk.com/club201538565
15. Покер https://vk.com/club151782797
16. Леонардо https://vk.com/club98301621
17. Крокодил https://vk.com/club186820032
18. Писька https://vk.com/club193557157
19. Жекабот https://vk.com/club159666458
20. Админ бот https://vk.com/club170175796
21. Бот нищий https://vk.com/club221392393
22. Амазинг бот https://vk.com/club174864680
23. Чатменеджер https://vk.com/club153955265
24. Неон https://vk.com/club193964540
25. Гранд https://vk.com/club188905432
26. Жои https://vk.com/club147845431
27. Аст https://vk.com/club197183074
28. Стар https://vk.com/club222139436
29. Элиан https://vk.com/club190262722
30. Лион https://vk.com/club137057280
31. Алукард https://vk.com/club185158200
32. Немо https://vk.com/club208086471
33. Джина https://vk.com/club204518165
34. Едал https://vk.com/club217049045
35. Слип https://vk.com/club183768928
36. Карман https://vk.com/club201657154
37. Конверс https://vk.com/club188869211
38. Чат менеджер https://vk.com/club171475621
39. Рп бот https://vk.com/club218437381
40. Фокс https://vk.com/club186882763
41. Чижик https://vk.com/club216030681
42. Россия https://vk.com/club208627372
43. Акула https://vk.com/club224298844
44. Тукан
45. Клубника
46. Рп бот https://vk.com/club197687978
47. Мишка
48. Гризли
49. Кай https://vk.com/club170393012
50. Савик
51. Strawberry
52. Neko Bot