Писать будем используя Сallback api(отправляет каждое действие в сообществе по отдельности на сервер). Поэтому его тоже следует настроить. Переходим в
«Управление сообществом» →»Работа с API». Для работы бота нужно зарегистрировать ключ доступа. Нажимаете «Создать ключ» и выбираете необходимые права доступа, для этого бота нужны только права на сообщения. Подтверждаем номер телефона и сохраняем куда нибудь ключ доступа. Теперь переходим во вкладку Callback API.
Ставим свое название сервера и выбираем последнюю версию API(на данный момент она 5.80, и именно с ней ниже представленный бот будет работать 100%) . Во вкладке «Типы запросов» выбираем только входящие сообщения.
Настройка сервера
Теперь вам понадобится сервер для хостинга своего бота. Вы можете использовать бесплатные хостинги, например 000webhost.
Если вы будете использовать дешевые/бесплатные хостинги, то вероятнее всего на них будет отключен cURL(вы не сможете отправлять ботом медиа файлы, только текст), и его нельзя включить. У 000webhost все с этим нормально, можете использовать. Если у вас свой сервер или хороший купленный, то вам надо подключить cURL для полноценной работы бота из нашего примера.
Как узнать id Вконтакте: чужой, свой, с пк и телефона!
Как работает Callback API и keyboard
Проведу краткий экскурс как все работает. Сallback API отсылает на ваш сервер любое событие, которое происходит в группе виде JSON. Полный список событий можно посмотреть во вкладке «Сallback API» → «Типы событий». Вот так выглядит JSON запрос когда пользователь отправляет сообщение, в данном случае он нажал на кнопку:
Тут есть несколько интересных полей, которые можно обработать: id пользователя, текст сообщения(text), полезная нагрузка кнопки(payload).
Отправка сообщений пользователю происходит с помощью метода messages.send . Если вы отправляете клавиатуру, то после всех стандартных параметров вы добавляете параметр keyboard, который содержит json кнопок, вот как он выглядит:
Работа с библиотекой
Для работы бота мы используем самописную библиотеку на PHP. (Если ссылка не работает, то вот архив)вы можете найти документацию к библиотеке и скачать саму библиотеку. Вот короткий листинг готовых функций для написания бота, подробнее ищите по ссылке выше. Если вы хотите узнавать об изменениях в библиотеке, то напишите хотя бы одно сообщение нашему боту в ВК , через него мы будет вас оповещать об изменениях.
$vk = new vk_api(vk_key, version_api) — инициализация бота. Параметры: ключ сообщества(vk_key), версия API(version_api).
sendMessage(id, text) — функция отправки сообщений юзеру. Параметры: id пользователя(id), текст сообщения(text).
sendImage(id, patch) — функция отправки изображений. Параметры: id пользователя(id), путь до изображения(patch).
sendButton(id, text, buttons, one_time) — функция отправки сообщения с кнопками. Параметры: id пользователя(id), текст сообщения(не может быть пустым)(text), массив с кнопками(buttons), не обязательный параметр one_time, по дефолту false, если поставить true, то после нажатия на любую кнопку клавиатура скроется.
Как Узнать ID Своей Страницы в ВК на Компьютере в 2022 / Как Посмотреть АйДи Профиля в ВКонтакте
request(method, array_arguments) — универсальная функция работы с методами. Параметры: method — название метода из официального api, array_arguments — массив параметров.
sendOK() — Бета функция. Используется вместо echo «ok», помогает в тех случаях, когда время работы скрипта долгое, и бот начинает повторять сообщения по несколько раз.
ВАЖНО: есть использовать эту функцию, то у вас не будет отображаться вывод ошибок. Во время дебага заменяйте на echo «ok»
Полный код бота на PHP
Теперь перейдем собственно к коду, где прокомментирована почти каждая строка.
Данный код поддерживается на PHP 5.6+
В блоке CONFIG укажите свой ключ доступа сообщества, ключ для подтверждения сервера а так же выбранную вами версию API.
Полный код бота
«Fish»], «А какие бывают?», «blue»]; //Код кнопки «Fish» const BTN_BACK = [[«command» => «start»], » «Pink_salmon»], «Горбуша», «white»]; // Код кнопки «Горбуша» const BTN_GOLDFISH = [[«animals» => «Goldfish»], «Золотая рыбка», «blue»]; // Код кнопки «Золотая рыбка» const BTN_PLOTVA = [[«animals» => «Plotva»], «Плотва», «green»]; // Код кнопки «Плотва» $vk = new vk_api(VK_KEY, VERSION); // создание экземпляра класса работы с api, принимает ключ и версию api $data = json_decode(file_get_contents(«php://input»)); //Получает и декодирует JSON пришедший из ВК if ($data->type == «confirmation») < //Если vk запрашивает ключ exit(ACCESS_KEY); //Завершаем скрипт отправкой ключа >$vk->sendOK(); //Говорим vk, что мы приняли callback if (isset($data->type) and $data->type == «message_new») < //Проверяем, если это сообщение от пользователя $id = $data->object->from_id; //Получаем id пользователя, который написал сообщение $message = $data->object->text; if (isset($data->object->peer_id)) $peer_id = $data->object->peer_id; // Получаем peer_id чата, откуда прилитело сообщение else $peer_id = $id; if (isset($data->object->payload))< //получаем payload $payload = json_decode($data->object->payload, True); > else < $payload = null; >if (isset($payload[«command»]) or mb_strtolower($message) == «начать») < //Если нажата кнопка начать или sendButton($peer_id, «Хочешь посмотреть на рыбок?», []); //Отправляем кнопку пользователю >else < if ($payload != null) < // если payload существует switch ($payload[«animals»]) < //Смотрим что в payload кнопках case «Fish»: //Если это Fish $vk->sendButton($peer_id, «Вот такие, выбирай», [ //Отправляем кнопки пользователю , ]); break; case «Pink_salmon»: //Если это Горбуша $vk->sendMessage($peer_id, «Держи свою горбушу!»); //отправляем сообщение $vk->sendImage($peer_id, «img/pink_salmon.jpg»); //отправляем картинку break; case «Goldfish»: //Если это Золотая рыбка $vk->sendMessage($peer_id, «Она исполнит твои желания. «); $vk->sendImage($peer_id, «img/goldfish.jpg»); break; case «Plotva»: //Если это Плотва $vk->sendMessage($peer_id, «Ой, похоже картинку перепутали)»); $vk->sendImage($peer_id, «img/plotva.jpg»); break; default: break; > > > > ?>
//Подключаем библиотеку для работы с api vk
const VK_KEY = «your_key» ; //тот самый длинный ключ доступа сообщества
const ACCESS_KEY = «your_key» ; //например c40b9566, введите свой
const VERSION = «5.80» ; //ваша версия используемого api
const BTN_FISH = [ [ «animals» = > «Fish» ] , «А какие бывают?» , «blue» ] ; //Код кнопки «Fish»
const BTN_BACK = [ [ «command» = > «start» ] , » // Код кнопки » «Pink_salmon» ] , «Горбуша» , «white» ] ; // Код кнопки «Горбуша»
const BTN_GOLDFISH = [ [ «animals» = > «Goldfish» ] , «Золотая рыбка» , «blue» ] ; // Код кнопки «Золотая рыбка»
const BTN_PLOTVA = [ [ «animals» = > «Plotva» ] , «Плотва» , «green» ] ; // Код кнопки «Плотва»
$vk = new vk_api (VK_KEY , VERSION ) ; // создание экземпляра класса работы с api, принимает ключ и версию api
$data = json_decode (file_get_contents («php://input» ) ) ; //Получает и декодирует JSON пришедший из ВК
exit (ACCESS_KEY ) ; //Завершаем скрипт отправкой ключа
$vk -> sendOK () ; //Говорим vk, что мы приняли callback
$id = $data -> object -> from_id ; //Получаем id пользователя, который написал сообщение
$message = $data -> object -> text ;
if (isset ($data -> object -> peer_id ) )
$peer_id = $data -> object -> peer_id ; // Получаем peer_id чата, откуда прилитело сообщение
if (isset ($data -> object -> payload ) ) < //получаем payload
$payload = json_decode ($data -> object -> payload , True ) ;
if (isset ($payload [ «command» ] ) or mb_strtolower ($message ) == «начать» ) < //Если нажата кнопка начать или раздел разработчиков , Далее нажать создать приложение, в появившемся окне выбрать вкладку Вэб-сайт, так же вводим название вашего приложения, адрес вашего сайта и базовый домен.
Адресом будет — http://mysite.ru
Базовый домен — mysite.ru
mysite — адрес вашего сайта
После подтверждения номера телефона вы попадёте на страницу с информацией о вашем приложении, нужно нажать вкладку настройки и попадаем на страницу, где и лежит наш api id ВКонтакте.
Пользуйтесь на здоровье. Надеюсь вы получили для себя полезную информацию. До скорых встреч дорогие читатели.
Подписывайтесь на обновления блога, чтобы не пропустить выход новых статей.
С уважением С.Васильев
- Главная
- Веб-сервисы
- Отслеживание активности сообщества вконтакте. Как получить ВКонтакте Api ID
Похожие публикации
Популярные записи
- Аккумуляторы от бесперебойника
- Как я заряжал аккумуляторы UPS Восстановление свинцового аккумулятора ибп
- Как создать резервную копию всех Ваших писем Gmail (полное руководство)
- Как можно скачать фото из инстаграм Instagrab для скачивания фото из Инстаграм
- Почему экран iPhone постоянно включается сам и как это исправить?
Источник: tdelegia.ru
Peer id vk api
Заданный random_id используется для проверки уникальности за всю историю сообщений, поэтому используйте большой диапазон (до int64).
Для групповой беседы:
2000000000 + id беседы.
- photo — фотография;
- video — видеозапись;
- audio — аудиозапись;
- doc — документ;
- wall — запись на стене;
- market — товар.
- poll — опрос.
— идентификатор владельца медиавложения (обратите внимание, если объект находится в сообществе, этот параметр должен быть отрицательным).
— идентификатор медиавложения.
Параметр является обязательным, если не задан параметр message.
В случае, если прикрепляется объект, принадлежащий другому пользователю следует добавлять к вложению его access_key в формате _ _ , Например:
Играюсь с ботостроением и решил отправить сообщение в беседу, делаю такой код:
Но на выходе получаю:
Назначал группу администратором беседы, давал доступ к переписке полный, пробовал отправлять вместе с peer_id , пробовал без chat_id — результат один и тот же.
Не могу понять что за зверь такой этот peer_id
Сделал тестовую группу, отправляю ботом от нее сообщение и получаю такой объект сообщения:
Тут все логично, но как только пользователь отправляет сообщение группе, то peer_ >
Это такой баг или фича?
- Вопрос задан 07 июл. 2019
- 282 просмотра
peer_id — идентификатор назначения.
У вас не правильное понимание этого параметра:
from_id — тот кто совершил отправку сообщения(инициатор)
peer_id — в какой диалог было отправлено сообщение.
Вы получаете сообщения для сообщества, соответственно в peer_id хранится диалог сообщества с указанным пользователем/беседой.
Откройте свои диалоги в сообществе.
Там могут быть как беседы так и переписки с определенными пользователями.
Это и является peer_id
А вот кто отправил сообщение в диалог, тот уже from_id
from_id
Источник: teh-fed.ru
reply_to have to be message from same chat (Как боту ответить на сообщение?) #224
The text was updated successfully, but these errors were encountered:
Contributor
BrokenFG commented Jan 30, 2019
conversation_message_id это не тоже самое, что message_id, который нужен вам. Так же могу вас разочаровать, группы не получают message_id, для них его не хранят, тобишь в беседе вы никогда не сможете переслать какое-либо сообщение
Contributor
ALEXREDX commented Feb 3, 2019
python273 closed this as completed Feb 3, 2019
Lephin commented Aug 22, 2019
Как грустно все это. Хорошо, что нашел эту статью. А то я несколько дней искал и пытался понять, что я делаю не так. Спасибо!
muxui commented Feb 21, 2020
altbrace commented Apr 8, 2020
Год прошел, а проблема осталась.
dan0nchik commented Apr 22, 2020
2020 уже, а бот все еще не может отвечать в беседах
Sergey-Volchkov commented Apr 23, 2020
Не знаю с чем у вас проблема, ребят. Если пишете бота, работающего от имени группы, то нужно настроить везде доступы + сделать бота админом.
Если пишете бота, который отвечает от страницы пользователя, то сделайте отправку на peer_id
В видео пример корректного, рабочего кода: https://www.youtube.com/watch?v=gsSZ7VPlkKs
dan0nchik commented Apr 23, 2020
edwardgushchin commented Apr 23, 2020
Вместо user_id вставляйте peer_id беседы, и бот ответит в беседу
dan0nchik commented Apr 24, 2020
А бот может писать в беседе? У меня настроен везде доступ, админка ему дана в беседе, но отвечает в личные сообщения
Вместо user_id вставляйте peer_id беседы, и бот ответит в беседу
bxkr commented Sep 28, 2020
Хорошие новости, если мне правдиво ответили:
Ждём 5.125, или что-то в этом роде.
kirillbiktya commented Nov 29, 2021
Прошло больше года, а проблема так и не решена.
Библиотеку не использовал, на обычных requests, но сам факт.
Stirven13 commented Dec 25, 2021
До сих пор не исправили, сейчас проверил. Осталось месяц подождать до годовщины ошибки и будет два года.
DragonGamees commented May 14, 2022
Вроде как есть способ. По крайней мере у меня работает. В методе vk.messages.send есть метод forward, вот через него можно и переслать сообщение:
import vk_api import json from vk_api.bot_longpoll import VkBotLongPoll vk_session = vk_api.VkApi(token=’мой токен’) vk = vk_session.get_api() longpoll = VkBotLongPoll(vk_session, ‘айди моей группы’) for event in longpoll.listen(): if event.from_chat and event.obj.text.lower() == ‘Привет’: fwdmsg = vk.messages.send( chat_id=event.chat_id, random_id=get_random_id(), message=’Привет!’, forward=json.dumps(fwdmsg) )
Если нужно переслать сообщение, то «reply_to» ставим в 0. Тогда можно пересылать несколько сообщений.
owoPeef commented Aug 4, 2022
Уже прошло больше 2-х лет, а так и не сделали, но спасибо тебе за это! (сам пытался сделать через forward, вообще не получалось)
Den473321 commented Feb 12, 2023
пошло 4 года, интересно, решил ли он проблему?)
dan0nchik commented Feb 12, 2023
пошло 4 года, интересно, решил ли он проблему?)
лет через 10 пофиксят )
DragonGamees commented Feb 13, 2023 •
Скорее всего и не исправят, останется только тот способ, что я выше написал
DragonGamees commented Feb 19, 2023
Хах, мой код уже не умеет отвечать на сообщения, только пересылать их. VK очень классная контора.
Den473321 commented Feb 19, 2023
а как ты пересылаешь их? я так и не разобрался
DragonGamees commented Feb 19, 2023 •
Вот кусок кода, он по идее отвечает и пересылает на любое сообщение в беседе и в личном сообщении, но сейчас почему то он только пересылает. Версия API 5.95.
from random import randint from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType vk_session = vk_api.VkApi(token=’КЛЮЧ СООБЩЕСВА’) vk = vk_session.get_api() longpoll = VkBotLongPoll(vk_session, «ИД СООБЩЕСВА») for event in longpoll.listen(): if event.type == VkBotEventType.MESSAGE_NEW: vk.messages.send( peer_id=event.obj.peer_id, random_id=randint(-2147483648, 2147483647), message=’reply_to 1′, forward = json.dumps() ) vk.messages.send( peer_id=event.obj.peer_id, random_id=randint(-2147483648, 2147483647), message=’reply_to 0′, forward = json.dumps() )
Пример работы кода
Если нужно только в личных сообщениях, есть другой код, где все работает
Если нужно можешь обращаться
Den473321 commented Feb 20, 2023
Вот кусок кода, он по идее отвечает и пересылает на любое сообщение в беседе и в личном сообщении, но сейчас почему то он только пересылает. Версия API 5.95.
from random import randint from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType vk_session = vk_api.VkApi(token=’КЛЮЧ СООБЩЕСВА’) vk = vk_session.get_api() longpoll = VkBotLongPoll(vk_session, «ИД СООБЩЕСВА») for event in longpoll.listen(): if event.type == VkBotEventType.MESSAGE_NEW: vk.messages.send( peer_id=event.obj.peer_id, random_id=randint(-2147483648, 2147483647), message=’reply_to 1′, forward = json.dumps() ) vk.messages.send( peer_id=event.obj.peer_id, random_id=randint(-2147483648, 2147483647), message=’reply_to 0′, forward = json.dumps() )
Пример работы кода
Если нужно только в личных сообщениях, есть другой код, где все работает
Если нужно можешь обращаться
да, в личных сообщениях я умею, а вот пересылать не понял как. Спасибо
DragonGamees commented Feb 21, 2023
Все, я разобрался, мне тех поддержка помогла, в моем коде была ошибка froward принимает is_reply
Вот полностью рабочий код
from random import randint from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType vk_session = vk_api.VkApi(token=’КЛЮЧ СООБЩЕСВА’) vk = vk_session.get_api() longpoll = VkBotLongPoll(vk_session, «ИД СООБЩЕСВА») for event in longpoll.listen(): if event.type == VkBotEventType.MESSAGE_NEW: vk.messages.send( peer_id=event.obj.peer_id, random_id=randint(-2147483648, 2147483647), message=’is_reply 1′, forward = json.dumps() ) vk.messages.send( peer_id=event.obj.peer_id, random_id=randint(-2147483648, 2147483647), message=’is_reply 0′, forward = json.dumps() )
Вообще судя по всему использовать этот код, так как он работает и в личных и в беседах
Источник: github.com