Charkos0ff Опубликовано: 18 октября 2020 Опубликовано: 18 октября 2020 (изменено) Общая информация API (Application Programming Interface) - составляющая часть сервера, которая получает запросы и отправляет ответы. У VimeWorld'а тоже присутствует публичный апи. С помощью него мы можем просмотреть статистику любого игрока, стримы в данный момент, последние матчи на сервере, или например модераторов в сети. Подготовка Для создания бота в ВК присутствует несколько видов апи: CallBack (для PHP) и LongPool (для остальных языков). Основная разница в том, что CallBack будет отправлять нам события. А LongPool же сам обращается к серверам. В любом случае для работы бота нам нужен ключ доступа к сообществу. Получить его можно зайдя в настройки группы, и перейдя по этому пути: Настройки->Работа с API. После этого нужно кликнуть на кнопку "Создать ключ" и выдать ему все права. В этом гайде будет присутствовать 3 языка программирования: PHP, Python и JavaScript (NodeJS). Полезные ссылки Официальная документация к API VimeWorld - https://vimeworld.github.io/api-docs/ Json Formatter (красивый JSON в браузере) - https://chrome.google.com/webstore/detail/json-formatter/bcjindcccaagfpapjjmafapmmgkkhgoa Бесплатный хостинг (для PHP) - https://beget.com/ru/free-hosting Бесплатный хостинг (для Python и NodeJS) - https://heroku.com/ Python - https://www.python.org/downloads/ NodeJS - https://nodejs.org/en/ Изменено 30 августа 2021 пользователем Charkos0ff Новый стиль форума _Indifina_, Vlad_Cyphersky, I_Virus_I и 3 других 6
NoobTop2gg_ Опубликовано: 18 октября 2020 Опубликовано: 18 октября 2020 я в истории автор гей Charkos0ff 1
Imperatorbaz Опубликовано: 18 октября 2020 Опубликовано: 18 октября 2020 давайте еще ботов так 40 сделаем, а так тема полезная Charkos0ff 1
I_Virus_I Опубликовано: 18 октября 2020 Опубликовано: 18 октября 2020 Конечно это всё круто, но как думаешь, сколько людей хотя бы прочтут эту всю тему. Скорее всего твои старания уйдут в воздух. Удачи Charkos0ff 1
Charkos0ff Опубликовано: 18 октября 2020 Автор Опубликовано: 18 октября 2020 (изменено) Краткая информация: PHP - скриптовый язык программирования. Используется, в большей степени, для создания веб-приложений, и является самым популярным языком для разработки динамических веб-сайтов и генерации HTML. Подготовка: Для начала нам нужно создать файл с нашим ботом. Давайте назовем его "bot.php"?, а затем откроем с помощью любого текстового редактора (Например: Sublime Text 3, Atom, Nodepad++) и вставим теги начала и конца: <?php ?> Начинаем кодить: Для удобства, предложу сразу же задефайнить наш токен доступа и строку (строку можно получить в настройках CallBack API) define('confirmation_token', 'c6d0c6e4'); define('token', '086b5839bbd99ee025cf1ffee4436cicfab8addc98937cw6028190555b929871bb03b86098a59939212d8'); Теперь, можем начать писать и сам обработчик событий! Для получения обновлений, можно создать переменную data и просвоить ей значение: "json_decode(file_get_contents('php://input') , true)". После этого весь ваш код должен выглядеть так: <?php //Строка для подтверждения адреса сервера из настроек Callback API define('confirmation_token', 'c6d0c6e4'); //Токен доступа к сообществу define('token', '086b5839bbd99ee025cf1ffee4436cicfab8addc98937cw6028190555b929871aa03b86398a59939212d8'); //При отправке запроса на наш файл, пришедшие в него данные будут переведены в массив для дальнейшей работы $data = json_decode(file_get_contents('php://input') , true); ?> Мы можем начинать обрабатывать события, которые нам отсылает ВКонтакте. Для этого давайте создадим switch, перебирающий значение у массива, находящегося в переменной $data. switch ($data['type']){ case 'confirmation': break; case 'message_new': break; } Теперь можно написать действия для наших кейсов. В "confirmation" добавьте строку: echo confirmation_token; А в "message_new" просто скопируйте этот код: //айди чата, где был вызван бот $peer_id = $data['object']['peer_id'] ? : $data['object']['user_id']; //текст сообщения, разбитый на пробелы $text = explode(" ", $data['object']['text']); //1 часть текста, переведенная в формат, где все буквы - маленькие $text[0] = mb_strtolower($text[0]); switch ($text[0]){ case '/help': case '/хелп': case '/команды': send_message($peer_id, "Доступные команды:\n\n/stats <ник> - просмотр статистики игроков"); break; } echo ('ok'); header("HTTP/1.1 200 OK"); Он содержит несколько переменных для работы с сообщениями. А также простой обработчик сообщений. И также чтоб не сильно углубляться в строение ВК-API, вставьте эти функции в конец бота (перед ?>) function send_message($peer_id = null, $message = null, $forward_messages = null, $attach = null, $random_id = null) { api('messages.send', array( 'peer_id' => $peer_id, 'message' => $message, 'forward_messages' => $forward_messages, 'keyboard' => $keyboard, 'attachment' => $attach, 'random_id' => '0' )); } function api($method, $params) { $params['access_token'] = token; $params['v'] = '5.102'; $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => 'https://api.vk.com/method/' . $method, CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_POSTFIELDS => $params, CURLOPT_CUSTOMREQUEST => "POST" ]); $json = curl_exec($curl); curl_close($curl); $response = json_decode($json, true); return $response['response']; } Теперь ваш файлик должен выглядеть примерно так: <?php define('confirmation_token', 'c6d0c6e4'); define('token', '086b5839bbd99ee025cf1ffee4436cicfab8addc98937cw6028190555b929871aa03b86398a59939212d8'); $data = json_decode(file_get_contents('php://input') , true); switch ($data['type']){ case 'confirmation': echo confirmation_token; break; case 'message_new': $peer_id = $data['object']['peer_id'] ? : $data['object']['user_id']; $text = explode(" ", $data['object']['text']); $text[0] = mb_strtolower($text[0]); switch ($text[0]){ case '/help': case '/хелп': case '/команды': send_message($peer_id, "Доступные команды:\n\n/stats <ник> - просмотр статистики игроков"); break; } echo ('ok'); header("HTTP/1.1 200 OK"); break; default: echo ('Unsupported event'); break; } function send_message($peer_id = null, $message = null, $forward_messages = null, $attach = null, $random_id = null) { api('messages.send', array( 'peer_id' => $peer_id, 'message' => $message, 'forward_messages' => $forward_messages, 'keyboard' => $keyboard, 'attachment' => $attach, 'random_id' => '0' )); } function api($method, $params) { $params['access_token'] = token; $params['v'] = '5.102'; $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => 'https://api.vk.com/method/' . $method, CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_POSTFIELDS => $params, CURLOPT_CUSTOMREQUEST => "POST" ]); $json = curl_exec($curl); curl_close($curl); $response = json_decode($json, true); return $response['response']; } ?> Пожалуй, давайте зальем его на хостинг и проверим работоспособность, не забывая версию CallBack API и путь до бота на вашем сайте (смотрите спойлер). Важно! Если вы это ранее не сделали, то включите сообщения сообщества. Если вы все сделали правильно, то написав боту "/help" вы должны получить в ответ такое сообщение: Собственно, можем начать работать уже с самим API VimeWorld.ru Работа с API: Для получения информации об игроке мы будем использовать cURL. Давайте добавим новую команду - /stats. Для этого перейдем в кейс "message_new" и вставим под "/help" этот текст: case '/stats': case '/статс': case '/статистика': send_message($peer_id, "Тест"); break; И теперь, перед вызовом функции send_message добавим подключение к апи вайма: $ch = curl_init("https://api.vimeworld.ru/user/name/{$text[1]}"); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Access-Token: MY_TOKEN')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = json_decode(curl_exec($ch), true); curl_close($ch); Вместо "MY_TOKEN" вставьте свой токен разработчика (или удалите эту строчку, иначе будет ошибка). Далее, можно сделать обработчик ответа: //если айди не равен нулю if($response[0]['id']){ //создаем переменную с информацией о игроке $player = "Профиль игрока: {$response[0]['username']}\nРанг: {$response[0]['rank']}"; } //иначе else{ //создаем переменную с ошибкой $player = "Данного игрока не существует!"; } И не забываем изменить строчку с send_message на эту: send_message($peer_id, $player); Теперь давайте снова зальем этот скрипт и напишем боту "/stats barahag" Вывод ранга и ника - круто, но как насчет добавления новой информации в /stats? Давайте зайдем в официальную документацию к этому методу (ну, или под спойлер), и посмотрим, какую информацию предоставляет нам VimeWorld [ { "id": 134568, "username": "xtrafrancyz", "level": 5, "levelPercentage": 0.894, "rank": "ADMIN", "playedSeconds": 3023813, "guild": { "id": 401, "name": "Okssi наш друг", "tag": null, "color": "&f" } } ] Полезная для нас информация: гильдия, наигранное время, ранг, уровень и айди. Для гильдии можно написать простой обработчик: //если имя гильдии равно чему-то if($response[0]['guild']['name']){ //делаем переменную с ним $guild = $response[0]['guild']['name']; } //иначе else{ //переменную с ошибкой $guild = "Отсутствует"; } И также, стоило бы преобразовать наигранное время в человеческий вид: $days = number_format($response[0]['playedSeconds']/60/60/24,0,'.',''); $hour = number_format($response[0]['playedSeconds']/60/60%24,0,'.',''); $min = number_format($response[0]['playedSeconds']/60%60,0,'.',''); $sec = number_format($response[0]['playedSeconds']%60,0,'.',''); И в конце, давайте изменим значение переменной: $player = "Профиль игрока: {$response[0]['username']} Ранг: {$response[0]['rank']} Гильдия: {$guild} Проведено в игре: {$days} дн. {$hour} ч. {$min} мин. {$sec} сек."; Новые команды: Но зачем ограничиваться только статистикой? Давайте также добавим две новые команды: /staff и /streams. В отличие от "/stats", здесь мы должны подключиться один раз к апи и работать с информацией в цикле. /streams: $ch = curl_init("https://api.vimeworld.ru/online/streams"); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = json_decode(curl_exec($ch), true); curl_close($ch); $count = count($response); $s = -1; while($s != $count-1){ $s +=1; $time1 = $response[$s]['duration']/60/60/24; $time2 = $response[$s]['duration']/60/60%24; $time3 = $response[$s]['duration']/60%60; $time4 = $response[$s]['duration']%60; $time1 = number_format($time1,0,'.',''); $time2 = number_format($time2,0,'.',''); $time3 = number_format($time3,0,'.',''); $time4 = number_format($time4,0,'.',''); $c +=1; $template .= "{$response[$s]['title']}\nСтример: {$response[$s]['owner']} \nЗрителей: {$response[$s]['viewers']}\nСсылка: {$response[$s]['url']}\nСтрим идёт: {$time1} дн. {$time2} ч. {$time3} мин. {$time4} сек.\n"; } send_message($peer_id, "Стримы в данный момент:\n\n{$template}Всего стримов: {$count}"); /staff: $ch = curl_init("https://api.vimeworld.ru/online/staff"); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Access-Token: DVjvMiIi5cbHXuNvRheRM6XGoYB0tcG')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = json_decode(curl_exec($ch), true); curl_close($ch); $count = count($response); $m = -1; while($m != $count-1){ $m +=1; if($response[$m]['guild']['tag']){$guildtag = "<{$response[$m]['guild']['tag']}> ";}else{$guildtag = "";} if($response[$m]['rank'] == 'MODER'){$rank = '[Модер]';} if($response[$m]['rank'] == 'WARDEN'){$rank = '[Пр.Модер]';} if($response[$m]['rank'] == 'CHIEF'){$rank = '[Гл.Модер]';} $c +=1; $template .= "\n{$guildtag}{$rank} {$response[$m]['username']}. {$response[$m]['online']['message']}"; } send_message($peer_id, "Модераторы онлайн: \n{$template}\n\nВсего в сети: {$count}"); После добавления новых команд, весь ваш код должен выглядеть так: <?php define('confirmation_token', '50dc77d0'); define('token', 'aeb83497cbdbb6f2d2eadce6b474d2637b4c8350bdec4818acc237221513a257f7b016d3a415536664f91'); $data = json_decode(file_get_contents('php://input') , true); switch ($data['type']){ case 'confirmation': echo confirmation_token; break; case 'message_new': $peer_id = $data['object']['peer_id'] ? : $data['object']['user_id']; $text = explode(" ", $data['object']['text']); $text[0] = mb_strtolower($text[0]); switch ($text[0]){ case '/help': case '/хелп': case '/команды': send_message($peer_id, "Доступные команды:\n\n/stats <ник> - просмотр статистики игроков"); break; case '/stats': case '/статс': case '/статистика': $ch = curl_init("https://api.vimeworld.ru/user/name/{$text[1]}"); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Access-Token: DuraSymQufsZkVntQ6by3CgeZHufPEN')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = json_decode(curl_exec($ch), true); curl_close($ch); if($response[0]['id']){ if($response[0]['guild']['name']){ $guild = $response[0]['guild']['name']; } else{ $guild = "Отсутствует"; } $days = number_format($response[0]['playedSeconds']/60/60/24,0,'.',''); $hour = number_format($response[0]['playedSeconds']/60/60%24,0,'.',''); $min = number_format($response[0]['playedSeconds']/60%60,0,'.',''); $sec = number_format($response[0]['playedSeconds']%60,0,'.',''); $player = "Профиль игрока: {$response[0]['username']} Ранг: {$response[0]['rank']} Гильдия: {$guild} Проведено в игре: {$days} дн. {$hour} ч. {$min} мин. {$sec} сек."; } else{ $player = "Данного игрока не существует!"; } send_message($peer_id, $player); break; case '/moders': case '/модеры': $ch = curl_init("https://api.vimeworld.ru/online/staff"); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = json_decode(curl_exec($ch), true); curl_close($ch); $count = count($response); $m = -1; while($m != $count-1){ $m +=1; if($response[$m]['guild']['tag']){$guildtag = "<{$response[$m]['guild']['tag']}> ";}else{$guildtag = "";} if($response[$m]['rank'] == 'MODER'){$rank = '[Модер]';} if($response[$m]['rank'] == 'WARDEN'){$rank = '[Пр.Модер]';} if($response[$m]['rank'] == 'CHIEF'){$rank = '[Гл.Модер]';} $c +=1; $template .= "\n{$guildtag}{$rank} {$response[$m]['username']}. {$response[$m]['online']['message']}"; } send_message($peer_id, "Модераторы онлайн: \n{$template}\n\nВсего в сети: {$count}"); break; case '/streams': case '/стримы': $ch = curl_init("https://api.vimeworld.ru/online/streams"); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = json_decode(curl_exec($ch), true); curl_close($ch); $count = count($response); $s = -1; while($s != $count-1){ $s +=1; $time1 = $response[$s]['duration']/60/60/24; $time2 = $response[$s]['duration']/60/60%24; $time3 = $response[$s]['duration']/60%60; $time4 = $response[$s]['duration']%60; $time1 = number_format($time1,0,'.',''); $time2 = number_format($time2,0,'.',''); $time3 = number_format($time3,0,'.',''); $time4 = number_format($time4,0,'.',''); $c +=1; $template .= "{$response[$s]['title']}\nСтример: {$response[$s]['owner']}\nЗрителей: {$response[$s]['viewers']}\nСсылка: {$response[$s]['url']}\nСтрим идёт: {$time1} дн. {$time2} ч. {$time3} мин. {$time4} сек.\n"; } send_message($peer_id, "Стримы в данный момент:\n\n{$template}Всего стримов: {$count}"); break; } echo ('ok'); header("HTTP/1.1 200 OK"); break; default: echo ('Unsupported event'); break; } function send_message($peer_id = null, $message = null, $forward_messages = null, $attach = null, $random_id = null) { api('messages.send', array( 'peer_id' => $peer_id, 'message' => $message, 'forward_messages' => $forward_messages, 'keyboard' => $keyboard, 'attachment' => $attach, 'random_id' => '0' )); } function api($method, $params) { $params['access_token'] = token; $params['v'] = '5.102'; $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => 'https://api.vk.com/method/' . $method, CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_POSTFIELDS => $params, CURLOPT_CUSTOMREQUEST => "POST" ]); $json = curl_exec($curl); curl_close($curl); $response = json_decode($json, true); return $response['response']; } ?> Изменено 30 августа 2021 пользователем Charkos0ff Lucy, _Indifina_, Vlad_Cyphersky и 3 других 6
Charkos0ff Опубликовано: 18 октября 2020 Автор Опубликовано: 18 октября 2020 (изменено) Краткая информация:Python - это высокоуровневый язык программирования общего назначения, ориентированный на повышение производительности разработчика и читаемости кода. Подготовка:Прежде всего, нужно включить LongPool в вашей группе (смотрите спойлер). Теперь, давайте создадим проект/папку для нашего проекта. А в ней - bot.py Начинаем кодить:Для начала, давайте установим нужные нам пакеты.Библиотека для работы с ВК APIpython -m pip install vk_apiДля работы с интернетом:python -m pip install requestsВвести эти две команды можно в IDE, или консоле (cmd). Приступим к самому коду! Импортируем библиотекиimport requests import vk_api from vk_api.longpoll import VkLongPoll, VkEventTypeИ вставляем этот код, содержащий функцию отправки сообщения и авторизацию в Апиdef send_message(user_id, message): vk.method('messages.send', {'user_id': user_id, 'message': message, 'random_id': 0}) # Ключ доступа к сообществу token = "aeb83497cbdbb6f2d2eadce6b474d2637b4c8350bdec4818acc237221513a257f7b016d3a415536664f91" vk = vk_api.VkApi(token=token) data = VkLongPoll(vk) Далее, можем написать и обработчик команд. Состоять он будет из цикла, проверки новых событий и простого обработчика командfor event in data.listen(): # Если пришло новое сообщение if event.type == VkEventType.MESSAGE_NEW: if event.to_me: text = event.text text = text.split() if text[0] == "/help": send_message(event.user_id, "Доступные команды:\n/stats < ник > - просмотр статистики игроков") В итоге ваш код должен выглядеть так:import requests import vk_api from vk_api.longpoll import VkLongPoll, VkEventType def send_message(user_id, message): vk.method('messages.send', {'user_id': user_id, 'message': message, 'random_id': 0}) token = "aeb83497cbdbb6f2d2eadce6b474d2637b4c8350bdec4818acc237221513a257f7b016d3a415536664f91" vk = vk_api.VkApi(token=token) data = VkLongPoll(vk) for event in data.listen(): if event.type == VkEventType.MESSAGE_NEW: if event.to_me: text = event.text text = text.split() if text[0] == "/help": send_message(event.user_id, "Доступные команды:\n\n/stats < ник > - просмотр статистики игроков") Пожалуй, теперь стоит запустить этот Python файл Важно! Если вы это ранее не сделали, то включите сообщения сообщества! Если вы всё сделали правильно и вам не выдало никаких ошибок, то тогда давайте напишем нашему боту "/help". Собственно если вы получили такое сообщение, то можем начинать работать с самим API. Работа с API:Для получения информации об игроке мы будем использовать библиотеку requests. Давайте добавим новую команду - /stats. Для этого перейдем в обработчик команд и вставим под ифом с "/help" этот текст:#или если текст равен /stats elif text[0] == "/stats": send_message(event.user_id, "Тестовая команда") Теперь, можем наконец-то поработать с апи. Перед send_message добавим подключение к немуresponse = requests.get(f'https://api.vimeworld.ru/user/name/{text[1]}').json()[0]Но не стоит забывать, про обработку ответа от сервера. Поэтому, нужно создать условие:#если айди равен чему-то if response['id']: #создаем переменную с данными игрока player = f"Профиль игрока: {response['username']}\nРанг: {response['rank']}" #иначе else: #создаем переменную с ошибкой player = f"Такого игрока не существует!" Теперь переменная player является нашим текстом для ответа, поэтому изменяем строчку с send_message на эту:send_message(event.user_id, player)И в окончании данного этапа, давайте перезапустим бота (сохранив пред этим файлик) и напишем боту "/stats barahag" Теперь, как насчет добавления новой информации в нашу команду?Давайте зайдем в официальную документацию к апи (ну или под спойлер), и посмотрим, какую информацию предоставляет нам VimeWorld [ { "id": 134568, "username": "xtrafrancyz", "level": 5, "levelPercentage": 0.894, "rank": "ADMIN", "playedSeconds": 3023813, "guild": { "id": 401, "name": "Okssi наш друг", "tag": null, "color": "&f" } } ] Для гильдии можно написать простой обработчик:if response['guild']: guild = response['guild']['name'] else: guild = "Отсутствует" А так же как и в PHP, стоило бы преобразовать наигранное время в человеческий вид:days = str(response['playedSeconds']/60/60/24).split(".")[0] hour = str(response['playedSeconds']/60/60%24).split(".")[0] min = str(response['playedSeconds']/60%60).split(".")[0] sec = str(response['playedSeconds']%60).split(".")[0] В конце же, давайте изменим значение переменной:player = f"Профиль игрока: {response['username']}" \ f"\nРанг: {response['rank']}" \ f"\nГильдия: {guild}" \ f"\nПроведено в игре: {days} дн. {hour} ч. {min} мин. {sec} сек." Новые команды:Но зачем ограничиваться только статистикой? Давайте также добавим две новые команды: /staff и /streams. В отличие от "/stats", здесь мы должны подключиться один раз к апи и работать с информацией в цикле. /streams:elif text[0] == "/streams" or text[0] == "/стримы": response = requests.get(f'https://api.vimeworld.ru/online/streams').json() count = len(response) s = -1; if count > 1: while s != count: s += 1 time1 = str(response[s]['duration'] / 60 / 60 / 24).split(".")[0] time2 = str(response[s]['duration'] / 60 / 60 % 24).split(".")[0] time3 = str(response[s]['duration'] / 60 % 60).split(".")[0] time4 = str(response[s]['duration'] % 60).split(".")[0] streams = streams + f"{response[s]['title']}\nСтример: {response[s]['owner']} \nЗрителей: {response[s]['viewers']}\nСсылка: {response[s]['url']}\nСтрим идёт: {time1} дн. {time2} ч. {time3} мин. {time4} сек.\n" send_message(event.user_id, f"Стримы в данный момент:{streams}\nВсего стримов: {count}") else: send_message(event.user_id, f"Стримы в данный момент:\n\nВсего стримов: {count}") /staff:elif text[0] == "/staff" or text[0] == "/модеры": requests.get(f'https://api.vimeworld.ru/online/staff').json() count = len(response) moders = "" if count > 1: for i in range(0, count): if response[i]['rank'] == 'MODER': rank = '[Модер]' if response[i]['rank'] == 'WARDEN': rank = '[Пр.Модер]' if response[i]['rank'] == 'CHIEF': rank = '[Гл.Модер]' moders += f"\n{rank} {response[i]['username']}" send_message(event.user_id, f"Модераторы в сети:\n{moders}\n\nВсего Модераторов: {count}") else: send_message(event.user_id, f"На данный момент модерация в сети отсутствует") После добавления новых команд, весь ваш код должен выглядеть так:import requests import vk_api from vk_api.longpoll import VkLongPoll, VkEventType def send_message(user_id, message): vk.method('messages.send', {'user_id': user_id, 'message': message, 'random_id': 0}) token = "f4ce5c8726c30627e70c7f302c64bcd1e20615379ed0e7c571c3a3dbae5fbc15efe00d0163f94ec241462" vk = vk_api.VkApi(token=token) data = VkLongPoll(vk) for event in data.listen(): if event.type == VkEventType.MESSAGE_NEW: if event.to_me: text = event.text text = text.split() if text[0] == "/help": send_message(event.user_id, "Доступные команды:\n\n/stats < ник > - просмотр статистики игроков") elif text[0] == "/stats": response = requests.get(f'https://api.vimeworld.ru/user/name/{text[1]}').json()[0] if response['guild']: guild = response['guild']['name'] else: guild = "Отсутствует" days = str(response['playedSeconds']/60/60/24).split(".")[0] hour = str(response['playedSeconds']/60/60%24).split(".")[0] min = str(response['playedSeconds']/60%60).split(".")[0] sec = str(response['playedSeconds']%60).split(".")[0] if response['id']: player = f"Профиль игрока: {response['username']}" \ f"\nРанг: {response['rank']}" \ f"\nГильдия: {guild}" \ f"\nПроведено в игре: {days} дн. {hour} ч. {min} мин. {sec} сек." else: player = f"Такого игрока не существует!" send_message(event.user_id, player) elif text[0] == "/streams" or text[0] == "/стримы": response = requests.get(f'https://api.vimeworld.ru/online/streams').json() count = len(response) if count > 1: for i in range(0, count): time1 = str(response[i]['duration'] / 60 / 60 / 24).split(".")[0] time2 = str(response[i]['duration'] / 60 / 60 % 24).split(".")[0] time3 = str(response[i]['duration'] / 60 % 60).split(".")[0] time4 = str(response[i]['duration'] % 60).split(".")[0] streams = streams + f"{response[i]['title']}\nСтример: {response[i]['owner']} \nЗрителей: {response[i]['viewers']}\nСсылка: {response[i]['url']}\nСтрим идёт: {time1} дн. {time2} ч. {time3} мин. {time4} сек.\n" send_message(event.user_id, f"Стримы в данный момент:{streams}\nВсего стримов: {count}") else: send_message(event.user_id, f"Стримы в данный момент:\n\nВсего стримов: {count}") elif text[0] == "/staff" or text[0] == "/модеры": response = requests.get(f'https://api.vimeworld.ru/online/staff').json() count = len(response) moders = "" if count > 1: for i in range(0, count): if response[i]['rank'] == 'MODER': rank = '[Модер]' if response[i]['rank'] == 'WARDEN': rank = '[Пр.Модер]' if response[i]['rank'] == 'CHIEF': rank = '[Гл.Модер]' moders += f"\n{rank} {response[i]['username']}" send_message(event.user_id, f"Модераторы в сети:\n{moders}\n\nВсего Модераторов: {count}") else: send_message(event.user_id, f"На данный момент модерация в сети отсутствует") Поздавляю! Теперь у вас есть бот способный показывать модераторов, стримы и статистику игроков! Изменено 10 ноября 2020 пользователем Charkos0ff Vlad_Cyphersky, Helops, IDragonKingI и 2 других 5
Charkos0ff Опубликовано: 18 октября 2020 Автор Опубликовано: 18 октября 2020 (изменено) Краткая информация:NodeJS - кроссплатформенная среда с открытым исходным кодом для разработки серверных и сетевых приложений, с помощью неё можно написать бота, сайт и даже программу. Подготовка:Прежде всего, нужно включить LongPool в вашей группе (смотрите спойлер). Теперь, давайте создадим проект/папку для нашего проекта. А потом пропишем эту команду:npm initНачинаем кодить:Для начала, давайте установим нужные нам пакеты.Библиотека для работы с ВК API:npm install node-vk-bot-apiДля работы с интернетом:npm install axiosВвести эти две команды можно в IDE, или консоле (cmd). Приступим к самому коду! Подключаем библиотекиconst VkBot = require("node-vk-bot-api"); const axios = require('axios');И вставляем этот код, содержащий авторизацию в апи и простой обработчик сообщений //подключаемся к апи const bot = new VkBot("564b5073b1125c8ed10e368f092e077bfb5cf3f1aaa3fd1aec070c2d41b045a4d779a5c4d572627e495ef"); //если что-то произошло bot.on(async (ctx) => { //выводим сообщение в переменную let text = ctx.message.body; //и делим по пробелам let delim = text.split(" "); //перебираем команды switch(delim[0]){ case '/help': ctx.reply("Доступные команды:\n\n/stats < ник > - просмотр статистики игроков"); break; } }) bot.startPolling(); В итоге ваш код должен выглядеть так:const VkBot = require("node-vk-bot-api"); const axios = require('axios'); const bot = new VkBot("564b5073b1125c8ed10e368f092e077bfb5cf3f1aaa3fd1aec070c2d41b045a4d779a5c4d572627e495ef"); bot.on(async (ctx) => { let text = ctx.message.body; let delim = text.split(" "); switch(delim[0]){ case '/help': ctx.reply("Доступные команды:\n\n/stats < ник > - просмотр статистики игроков"); break; } }) bot.startPolling(); Пожалуй, теперь стоит запустить этот JavaScript файл Важно! Если вы это ранее не сделали, то включите сообщения сообщества! Если вам не выдало никаких ошибок, то тогда давайте напишем нашему боту "/help". Если вы получили такое сообщение, то можем начинать работать с самим API. Работа с API:Для получения информации об игроке мы будем использовать библиотеку axios. Давайте добавим новую команду - /stats. Для этого перейдем в обработчик команд и вставим под кейсом с "/help" этот текст:case '/stats': ctx.reply("Тестовая команда"); break; Теперь, можем наконец-то поработать с апи. Перед отправкой сообщения (ctx.reply) добавим подключение к немуvar response = await axios.get( `https://api.vimeworld.ru/user/name/${username}` ); Но не стоит забывать, что человек кроме валидного игрока может попросить не существующего. Поэтому давайте добавим простое условие с проверкой на ответ сервера:if(response.data[0]){ ctx.reply(`Профиль игрока: ${response.data[0].username}\nРанг: ${response.data[0].rank}`); } else { ctx.reply(`Данного игрока не существует`); } В окончании первого этапа работы с апи можно перезапустить бота и написать ему "/stats Lucy" Теперь, как насчет добавления новой информации в нашу команду?Давайте зайдем в официальную документацию к апи (ну или под спойлер), и посмотрим, какую информацию предоставляет нам VimeWorld [ { "id": 134568, "username": "xtrafrancyz", "level": 5, "levelPercentage": 0.894, "rank": "ADMIN", "playedSeconds": 3023813, "guild": { "id": 401, "name": "Okssi наш друг", "tag": null, "color": "&f" } } ] Для гильдии можно создать переменную такого типа:let guild = (response.data[0].guild !== null) ? `${response.data[0].guild.name}` : `Отсутствует`;И аналогично предыдущим ЯП стоило бы преобразовать наигранное время в человеческий вид:let days = Math.floor(response.data[0].playedSeconds/60/60/24); let hour = Math.floor(response.data[0].playedSeconds/60/60%24); let min = Math.floor(response.data[0].playedSeconds/60%60); let sec = Math.floor(response.data[0].playedSeconds%60);В конце изменим отправляемый текст:ctx.reply(`Профиль игрока: ${response.data[0].username}` + `\nРанг: ${response.data[0].rank}` + `\nГильдия: ${guild}` + `\nПроведено в игре: ${days} дн. ${hour} ч. ${min} мин. ${sec} сек.`); Новые команды:Но зачем ограничиваться только статистикой? Давайте также добавим две новые команды: /staff и /streams. В отличие от "/stats", здесь мы должны подключиться один раз к апи и работать с информацией в цикле. /streamscase '/streams': case '/стримы': var response = await axios.get( `https://api.vimeworld.ru/online/streams` ); var streams = ""; let count = response.data.length; if(count > 1){ for (let i = 0; i != count; i++) { let time1 = Math.floor(response.data[i].duration/60/60/24); let time2 = Math.floor(response.data[i].duration/60/60%24); let time3 = Math.floor(response.data[i].duration/60%60); let time4 = Math.floor(response.data[i].duration%60); streams += `\n${response.data[i].title}\nСтример: ${response.data[i].owner} \nЗрителей: ${response.data[i].viewers}\nСсылка: ${response.data[i].url}\nСтрим идёт: ${time1} дн. ${time2} ч. ${time3} мин. ${time4} сек.\n`; } ctx.reply(`Стримы в данный момент:${streams}\nВсего стримов: ${count}`); } else{ ctx.reply(`Все стримеры спят`); } break; /staffcase '/staff': case '/модеры': var response = await axios.get( `https://api.vimeworld.ru/online/staff` ); var moders = ""; let count_m = response.data.length; if(count_m > 1){ for (let i = 0; i != count_m; i++) { if(response.data[i].rank == 'MODER'){rank = '[Модер]';} if(response.data[i].rank == 'WARDEN'){rank = '[Пр.Модер]';} if(response.data[i].rank == 'CHIEF'){rank = '[Гл.Модер]';} moders += `\n${rank} ${response.data[i].username}`; } ctx.reply(`Модераторы в сети:\n${moders}\n\nВсего Модераторов: ${count_m}`); } else{ ctx.reply(`Все модераторы спят`); } break; После добавления новых команд, весь ваш код должен выглядеть так: const VkBot = require("node-vk-bot-api"); const axios = require('axios'); const bot = new VkBot("564b5073b1125c8ed10e368f092e077bfb5cf3f1aaa3fd1aec070c2d41b045a4d779a5c4d572627e495ef"); bot.on(async (ctx) => { let text = ctx.message.body; let delim = text.split(" "); switch(delim[0]){ case '/help': ctx.reply("Доступные команды:\n\n/stats < ник > - просмотр статистики игроков"); break; case '/stats': var response = await axios.get( `https://api.vimeworld.ru/user/name/${delim[1]}` ); if(response.data[0]){ let guild = (response.data[0].guild !== null) ? `${response.data[0].guild.name}` : `Отсутствует`; let days = Math.floor(response.data[0].playedSeconds/60/60/24); let hour = Math.floor(response.data[0].playedSeconds/60/60%24); let min = Math.floor(response.data[0].playedSeconds/60%60); let sec = Math.floor(response.data[0].playedSeconds%60); ctx.reply(`Профиль игрока: ${response.data[0].username}` + `\nРанг: ${response.data[0].rank}` + `\nГильдия: ${guild}` + `\nПроведено в игре: ${days} дн. ${hour} ч. ${min} мин. ${sec} сек.`); } else { ctx.reply(`Данного игрока не существует`); } break; case '/streams': case '/стримы': var response = await axios.get( `https://api.vimeworld.ru/online/streams` ); var streams = ""; let count = response.data.length; if(count > 1){ for (let i = 0; i != count; i++) { let time1 = Math.floor(response.data[i].duration/60/60/24); let time2 = Math.floor(response.data[i].duration/60/60%24); let time3 = Math.floor(response.data[i].duration/60%60); let time4 = Math.floor(response.data[i].duration%60); streams += `\n${response.data[i].title}\nСтример: ${response.data[i].owner} \nЗрителей: ${response.data[i].viewers}\nСсылка: ${response.data[i].url}\nСтрим идёт: ${time1} дн. ${time2} ч. ${time3} мин. ${time4} сек.\n`; } ctx.reply(`Стримы в данный момент:${streams}\nВсего стримов: ${count}`); } else{ ctx.reply(`Все стримеры спят`); } break; case '/staff': case '/модеры': var response = await axios.get( `https://api.vimeworld.ru/online/staff` ); var moders = ""; var rank = ""; let count_m = response.data.length; if(count_m > 1){ for (let i = 0; i != count_m; i++) { if(response.data[i].rank == 'MODER'){rank = '[Модер]';} if(response.data[i].rank == 'WARDEN'){rank = '[Пр.Модер]';} if(response.data[i].rank == 'CHIEF'){rank = '[Гл.Модер]';} moders += `\n${rank} ${response.data[i].username}`; } ctx.reply(`Модераторы в сети:\n${moders}\n\nВсего Модераторов: ${count_m}`); } else{ ctx.reply(`Все модераторы спят`); } break; } }) bot.startPolling(); Поздавляю! Теперь у вас есть бот способный показывать модераторов, стримы и статистику игроков! Изменено 28 декабря 2020 пользователем Charkos0ff _Indifina_ и Vlad_Cyphersky 2
Anfisa Опубликовано: 18 октября 2020 Опубликовано: 18 октября 2020 Капец я думала бота афк-машину ultrashane, Fenixs2004 и Charkos0ff 2 1
Yamaniriun Опубликовано: 18 октября 2020 Опубликовано: 18 октября 2020 Вау, крутой гайд. Charkos0ff 1
ultrashane Опубликовано: 18 октября 2020 Опубликовано: 18 октября 2020 Вау, крутой гайд.но ты все равно ни ^_^ не понял Charkos0ff 1
KaLuSKiY_BaNd1T Опубликовано: 18 октября 2020 Опубликовано: 18 октября 2020 (изменено) Гайд мне очень понравился, но разве такую инфу разрешено сюда кидать? Изменено 18 октября 2020 пользователем KaLuSKiY_BaNd1T Charkos0ff и YT_Fintion_YT 2
I_Virus_I Опубликовано: 18 октября 2020 Опубликовано: 18 октября 2020 Гайд мне очень понравился, но разве такую инфу разрешено сюда кидать?Что тут запрещённого? Charkos0ff 1
_KoteMyrr_ Опубликовано: 18 октября 2020 Опубликовано: 18 октября 2020 (изменено) Гайд мне очень понравился, но разве такую инфу разрешено сюда кидать? ну эт не запрещено вроде француз в теме сидит жесть Изменено 18 октября 2020 пользователем _KoteMyrr_ Charkos0ff 1
Stylesheet Опубликовано: 18 октября 2020 Опубликовано: 18 октября 2020 Гайд мне очень понравился, но разве такую инфу разрешено сюда кидать?А почему нельзя? Charkos0ff 1
Charkos0ff Опубликовано: 29 октября 2020 Автор Опубликовано: 29 октября 2020 (изменено) Убрал ненужный хлам Изменено 16 февраля 2021 пользователем Charkos0ff
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВойти
Уже зарегистрированы? Войдите здесь.
Войти сейчас