Перейти к публикации
View in the app

A better way to browse. Learn more.

VimeWorld - Форум

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[Гайд] Создание ботов для ВКонтакте, а также работа с API VimeWorld

Featured Replies

Опубликовано:

Общая информация

API (Application Programming Interface) - составляющая часть сервера, которая получает запросы и отправляет ответы.

У VimeWorld'а тоже присутствует публичный апи. С помощью него мы можем просмотреть статистику любого игрока, стримы в данный момент, последние матчи на сервере, или например модераторов в сети.

 

Подготовка

Для создания бота в ВК присутствует несколько видов апи: CallBack (для PHP) и LongPool (для остальных языков). Основная разница в том, что CallBack будет отправлять нам события. А LongPool же сам обращается к серверам.

В любом случае для работы бота нам нужен ключ доступа к сообществу. Получить его можно зайдя в настройки группы, и перейдя по этому пути: Настройки->Работа с API. После этого нужно кликнуть на кнопку "Создать ключ" и выдать ему все права.

 

5FFFjQJ.png

Bx15QFx.png

 

В этом гайде будет присутствовать 3 языка программирования: PHP, Python и JavaScript (NodeJS).

 

Полезные ссылки

 

Изменено пользователем Charkos0ff
Новый стиль форума

Опубликовано:

Конечно это всё круто, но как думаешь, сколько людей хотя бы прочтут эту всю тему. Скорее всего твои старания уйдут в воздух. Удачи

Опубликовано:
  • Автор

aLJxNO4.png

 

Краткая информация:

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 и путь до бота на вашем сайте (смотрите спойлер).

 

xdbUbiU.gif

 

Важно! Если вы это ранее не сделали, то включите сообщения сообщества.

 

Если вы все сделали правильно, то написав боту "/help" вы должны получить в ответ такое сообщение:

 

0hSqHKF.png

 

Собственно, можем начать работать уже с самим 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"

 

 

Rcfr3ow.png

 

Вывод ранга и ника - круто, но как насчет добавления новой информации в /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'];

}

?>  

 

 

Изменено пользователем Charkos0ff

Опубликовано:
  • Автор

A9AeH2X.png

Краткая информация:

Python - это высокоуровневый язык программирования общего назначения, ориентированный на повышение производительности разработчика и читаемости кода.

 

Подготовка:

Прежде всего, нужно включить LongPool в вашей группе (смотрите спойлер).

zN81CX8.gif

 

Теперь, давайте создадим проект/папку для нашего проекта. А в ней - bot.py

 

Начинаем кодить:

Для начала, давайте установим нужные нам пакеты.

Библиотека для работы с ВК API

python -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".

FVmsGVe.png

 

 

Собственно если вы получили такое сообщение, то можем начинать работать с самим 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"

5vKwRnU.png

 

Теперь, как насчет добавления новой информации в нашу команду?

Давайте зайдем в официальную документацию к апи (ну или под спойлер), и посмотрим, какую информацию предоставляет нам 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"На данный момент модерация в сети отсутствует")

 

Поздавляю! Теперь у вас есть бот способный показывать модераторов, стримы и статистику игроков!

Изменено пользователем Charkos0ff

Опубликовано:
  • Автор

sOJXWkJ.png

Краткая информация:

NodeJS - кроссплатформенная среда с открытым исходным кодом для разработки серверных и сетевых приложений, с помощью неё можно написать бота, сайт и даже программу.

 

Подготовка:

Прежде всего, нужно включить LongPool в вашей группе (смотрите спойлер).

zN81CX8.gif

 

Теперь, давайте создадим проект/папку для нашего проекта. А потом пропишем эту команду:

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".

Rl1qWAQ.png

 

 

Если вы получили такое сообщение, то можем начинать работать с самим 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"

7SGSIz6.png

 

 

Теперь, как насчет добавления новой информации в нашу команду?

Давайте зайдем в официальную документацию к апи (ну или под спойлер), и посмотрим, какую информацию предоставляет нам 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", здесь мы должны подключиться один раз к апи и работать с информацией в цикле.

 

/streams

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;

/staff

case '/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(); 

 

 

Поздавляю! Теперь у вас есть бот способный показывать модераторов, стримы и статистику игроков!

 

Изменено пользователем Charkos0ff

Опубликовано:

Гайд мне очень понравился, но разве такую инфу разрешено сюда кидать?

Изменено пользователем KaLuSKiY_BaNd1T

Опубликовано:

Гайд мне очень понравился, но разве такую инфу разрешено сюда кидать?

ну эт не запрещено вроде

француз в теме сидит жесть

Изменено пользователем _KoteMyrr_

  • 2 недели спустя...
Гость
Эта тема закрыта для дальнейших сообщений.

Сейчас на странице 0

  • Нет пользователей, просматривающих эту страницу.

Account

Navigation

Поиск

Поиск

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.