VK Widget

x330122

Участник
Сообщения
357
Реакции
152
Привет народ, в этом гайде я вам расскажу как сделать виджет для группы вконтакте наподобии такого:
9KitDgCkDpE.jpg
Для создания сей чуда я использовал Python 2.7 и VK Api.
Что вам надо:
Python 2.7
VK Api
pip
Linux сервер (для хостинга)
LiveWidget в группе ВК

Установка:
Для начала надо подготовить питон для получения данных с сервера.
Выполните следующие команды: pip install python-valve pip install vk
Как все будет установлено, создаем .py файл и вставляем код(он будет ниже).
(Желательно)Установить все это детище на любой хостинг.
Принцип работы:
Виджет парсит статус с профиля вконтакте и передает его пользователю, следовательно работал я через выставление онлайна в статус профиля.

Подготовим ВК для работы со скриптом:
  • Для начала необходимо создать приложение в ВК(тут)
    • Платформу выберите Standalone приложение
    • В настройках приложения переключите статус на Включено
    • Далее скопируйте ID приложения и запишите его куда либо.
    • Далее необходимо получить токен для изменения статуса профиля
    • В адресную строку напшите эту строку:
    • C-подобный:
      oauth.vk.com/authorize?client_id=<ИД ПРИЛОЖЕНИЯ>&display=page&scope=status,offline&response_type=token&v=5.84&state=123456
    • Затем в адресной строке у вас будет токен для изменения статуса профиля.
    • Всё, его можно скопировать в блокнот на время чтобы вставить в .py скрипт
Настраиваем скрипт python:
C-подобный:
import requests
import json
import time
import valve.source
import valve.source.a2s
import valve.source.master_server
playersnum = ""
import vk
import time
session = vk.Session(access_token='ТУТ ТОКЕН')
api = vk.API(session)
with valve.source.master_server.MasterServerQuerier() as msq:
    try:
            address = ("<ИП АДРЕСА>", <ПОРТ>)
            with valve.source.a2s.ServerQuerier(address) as server:
                info = server.info()
                players = server.players()
                playersnum = "{player_count}/11".format(**info)
                print(playersnum)
    except valve.source.NoResponseError:
        print "Master server request timed out!"

def infinity():
    while True:
        yield
for _ in infinity():
        with valve.source.master_server.MasterServerQuerier() as msq:
                    try:
                            address = ("46.174.52.18", 27237)
                            with valve.source.a2s.ServerQuerier(address) as server:
                                info = server.info()
                                players = server.players()
                                playersnum = "{player_count}/11".format(**info)
                                print(playersnum)
                    except valve.source.NoResponseError:
                        print "Master server request timed out!"        
        api.status.set(text=playersnum, version="5.84")
        time.sleep(35)
  1. Возьмите код из спойлера выше и вставьте его в .py скрипт. Можно использовать IDLE редактор и вставить код туда.
  2. Далее вставьте данные которые необходимы для работы скрипта, а именно: Токен из адресной строки,IP сервера,Порт сервера,id страницы профиля
  3. Далее запустите скрипт, после запуска в статус должно установится: кол-во игроков/11
  4. Если все работает, приступаем к настройке виджета.
Если что-то не запускается проверьте правильность ввода данных, IP и порта. порт должен быть написан без скобок.
Настраиваем виджет:
В администрировании сообщества, установите в нем LiveWidget.
После установки, на главной странице сообщества нажмите Открыть приложение
У вас откроется окно с типом виджета, там открываете Редактор кода туда вставьте код (ниже) и сохраните и опубликуйте:
C-подобный:
var gid = id вашей группы; // id группы
var wall = API.wall.get({ // Получаем стену группы
    owner_id: -gid,
    count: 1
}).items;
// Переделываем записи под ячейки таблиц
var i = wall.length;
var text = "";
var status = API.users.get({
user_ids: "ТУТ ID СТРАНИЦЫ",
fields: "status"
});
while (i) {
    i = i - 1;
    text = wall[i].text;
    if (!text) text = "";
    text = text.split("\n")[0].substr(0, 50); // Обрезаем текст по первой строке и 50 символов
    if (!text) text = "Нет текста";
    wall.splice(i, 1, [{
        text: text,
    }, {
    }]);
}
return {
    "title": "Наши сервера",
    "title_counter": 1,
    "rows": [{
        "title": "Заголовок",
        "button": "Играть",
        "button_url": "ссылка на кнопку",
        "descr": status[0]["status"] + " сейчас играют на сервере",
        "cover_id": "71072365_191117",
    }],
    "more": "Тут ссылка",
    "more_url": "Ссылка",
};

После публикации, сделайте виджет публичным, в настройках приложения сделайте видимость приложения: Для всех пользователей
Вроде все. Ссылки на скрипты выложу на пейстбин если будет проблема с табуляцией :pardon:
 
Последнее редактирование:

Paranoiiik

хачю клиентмод
Сообщения
2,047
Реакции
1,490
А есть вариант сделать такое/подобное, если есть только сам WEBxостинг, собственно, игровой сервер и группа VK?
Если да, видимо, я не шарю:ac:
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #3
Идея хорошая, но реализация оставляет желать лучшего.
Не у всех есть возможность запускать Python-скрипты, а ведь на том же PHP можно сделать тоже самое (правда частота обновления чуть реже будет).

@Paranoiiik, да, есть. Может как-нибудь составлю гайд и скрипт для PHP. Ибо тема интересная, надо развивать.
 

Paranoiiik

хачю клиентмод
Сообщения
2,047
Реакции
1,490
Идея хорошая, но реализация оставляет желать лучшего.
Не у всех есть возможность запускать Python-скрипты, а ведь на том же PHP можно сделать тоже самое (правда частота обновления чуть реже будет).

@Paranoiiik, да, есть. Может как-нибудь составлю гайд и скрипт для PHP. Ибо тема интересная, надо развивать.
Буду очень рад! Даже копеечку подкинем при возможности, если надо
 

Templar

Добрая душа
Сообщения
495
Реакции
62
Прикольно, а если не один сервер?
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #9
Всё равно полезно. Ибо одному лишь Аллаху известно, как сторонние приложения работают, и стабильно ли. А тут self-hosted решение.
 

iSe7en

Участник
Сообщения
209
Реакции
111
Круто) ещё бы способ реализации
К сожалению у меня слишком на сайте код завязан, поэтому смысла делиться нет. Но любой новичок со знаниями PHP сможет такое сделать, благо документация в вк вся есть.
 

xados

Участник
Сообщения
316
Реакции
32
К сожалению у меня слишком на сайте код завязан, поэтому смысла делиться нет. Но любой новичок со знаниями PHP сможет такое сделать, благо документация в вк вся есть.

Если не трудно скинь документацию пожалуйста
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #12
@xados, в Гугл вбей "Виджеты сообществ ВКонтакте разработчику". Выдаст всю инфу, включая виды виджетов.
 

pracc

Быть, а не казаться.
Сообщения
946
Реакции
541
Что-то у меня не завелось.
 

x330122

Участник
Сообщения
357
Реакции
152
Прикольно, а если не один сервер?
Можно сделать таблицу, а можно типа постеров.
В обложках можно второе поле сделать.
C-подобный:
return {
    "title": "Заголовок виджета",
    "title_url": "vk.com/title_url",
    "title_counter": 1,
    "rows": [{
        "title": "Заголовок блока #1",
        "button": "Кнопка блока #1",
        "button_url": "vk.com/rows0button_url",
        "descr": "Описание блока #1",
        "cover_id": "6232540_1977",
        "url": "vk.com/rows0url",
    }, {
        "title": "Заголовок блока #2",
        "button": "Кнопка блока #2",
        "button_url": "vk.com/rows0button_url",
        "descr": "Описание блока #2",
        "cover_id": "6232540_1977",
        "url": "vk.com/rows0url",
    }],
    "more": "Дополнительная ссылка",
    "more_url": "vk.com/more_url",
};
Что-то у меня не завелось.
Где именно ?
 

bonki

Участник
Сообщения
38
Реакции
10
меня глючит или тут вчера была ссылка на готовое решение? от мониторинга. удалили за рекламу что ли)
--- Добавлено позже ---
Сейчас еще хотел посмотреть а её уже нет)))
 
Сверху Снизу