Перейти к публикации

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


Charkos0ff

Рекомендованные сообщения

Опубликовано: (изменено)

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

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
Опубликовано: (изменено)

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

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

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

Изменено пользователем _KoteMyrr_
  • 2 недели спустя...

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
  • Сейчас на странице   0 пользователей

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