Как создать виджет сообщества VK?

Доброго времени суток!

Недавно захотелось сделать свой виджет для сообщества, который бы сообщал небольшую статистику. В документации VK все описано достаточно сложно, без примеров, нежели как описали это для тех же ботов. Разобраться самостоятельно не удалось.
Поиск в интернете особо не дал результатов. Я нашел только одно решение, но почему-то это меня не спасло. Я сделал всё, как описано в ответе, но при клике на любую из двух кнопок, абсолютно ничего не происходит. Конечно же делаю это после добавления в iframe через само приложение. Страница запускается, но вот действия не происходят. Быть может есть у кого другое решение, либо готовый код для примера?
  • Вопрос задан
  • 12415 просмотров
Пригласить эксперта
Ответы на вопрос 2
sergiks
@sergiks Куратор тега ВКонтакте
♬♬
Простой способ
Есть готовое бесплатное приложение для Сообществ "LiveWidget" – там от вас требуется только код самого виджета составить. В вашем сообществе меню три точки - Управление сообществом - Приложения, листаете список предлагаемых приложений до LiveWidget, жмёте «Добавить»:
скрин
5af95de14a7d2991085711.png
Джедайский способ
В документации по созданию виджета для сообщества всё подробно описано. Вкратце:
  1. создать приложение – Встраиваемое приложение – Приложение сообщества
  2. адресом iframe укажите ваш сервер и папку, где лежит, например, такой HTML
  3. зайдите в ваше Сообщество – меню Управление сообществом – Приложения – выберите там ваше свежесозданное приложение
  4. дайте ему разрешение на добавление виджетов
  5. вставьте код вашего виджета и сделайте его предпросмотр – если в коде виджета нет ошибок, во всплывающем окошке покажут, как он выглядит и предложат установить его в сообщество.
Скрин приложения
5af9668c9208d318099967.png
Код приложения
<!DOCTYPE html>

<html lang="">
<head>
    <meta charset="utf-8">

    <title>Widgeteer</title>
    <meta name="description" content="Создание виджета для сообщества ВКонтакте">
    <meta name="keywords" content="Sergei Sokolov,ВК,виджет,конструктор">
    <meta name="robots" content="noindex,nofollow">
    
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" integrity="sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB" crossorigin="anonymous">
</head>

<body>
	<div class="container">
		<h3>Виджет для сообщества ВК</h3>
		
		<div id="b-alerts"></div>
		
		<div class="form-group">
			<button id="btn-permission" class="btn btn-primary" type="button">Дать разрешение</button>
		</div>

		<div class="form-group">
			<label for="in-type">Тип виджета:</label>
			<select class="form-control" id="in-type">
				<option value="text">text</option>
				<option value="list">list</option>
				<option value="table">table</option>
				<option value="tiles">tiles</option>
				<option value="compact_list">compact_list</option>
				<option value="cover_list">cover_list</option>
				<option value="match">match</option>
				<option value="matches">matches</option>
			</select>
		</div>
		
		<div class="form-group">
			<label for="in-code">Код виджета:</label>
			<textarea rows="7" class="form-control" id="in-code">return {
"title": "Цитата",
"text": "Текст цитаты"
};</textarea>
		</div>

		<button id="btn-preview" class="btn btn-primary" type="button">Предпросмотр виджета</button>
				
	</div><!-- /.container -->
	
	
	

	<!-- Bootstrap JavaScript -->
  <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
	<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js" integrity="sha384-smHYKdLADwkXOn1EmN1qk/HfnUcbVRZyYmZ4qpPea6sjB/pTJ0euyQp0Mk8ck+5T" crossorigin="anonymous"></script>
	<!-- /Bootstrap JavaScript -->
	
	<!-- main script -->
	<script>
		function onReady() {

			// Слушать события предпросмотра виджета 
			VK.addCallback('onAppWidgetPreviewFail', function(e){
				console.error('onAppWidgetPreviewFail', e);
				showAlert('warning', 'onAppWidgetPreviewFail');
			});
			
			VK.addCallback('onAppWidgetPreviewCancel', function(e){
				console.error('onAppWidgetPreviewCancel', e);
				showAlert('info', 'onAppWidgetPreviewCancel');
			});
			
			VK.addCallback('onAppWidgetPreviewSuccess', function(e){
				console.log('onAppWidgetPreviewSuccess', e);
				showAlert('success', 'onAppWidgetPreviewSuccess');
			});
			
			// События нажатия на кнопки
			$('#btn-permission').on('click', function(){
				console.log('showGroupSettings');
				VK.callMethod("showGroupSettingsBox", 64);
			});
			
			$('#btn-preview').on('click', function(){
				var type = $('#in-type').val(),
				  code = $('#in-code').val()
			  ;
				
				console.log('showAppWidgetPreviewBox', {type: type, code:code});
				VK.callMethod("showAppWidgetPreviewBox", type, code);
			});

		}


		function showAlert(className, text) {
			var html = [
				'<div class="alert alert-dismissible alert-'+className+'" role="alert">',
					text,
				'</div>',
			].join('\n');
			$('#b-alerts').append(html);
		}
	</script>
	<!-- /main script -->
	

	<!-- VK scripts -->
	<script src="https://vk.com/js/api/xd_connection.js?2"  type="text/javascript"></script>
	
	<script type="text/javascript">
	  VK.init(function() {
	     // API initialization succeeded
	     onReady();
       
	  }, function() {
	     // API initialization failed
	     // Can reload page here
	     console.error('VK init error', arguments);
		}, '5.74');
	</script>
	<!-- /VK scripts -->

</body>
</html>


Какие бывают типы виджетов см. на странице документации по объекту appWidget.

Какой конкретно шаг в этом сценарии у вас не получился?
Ответ написан
@romanovcmc
Это решение тоже не работало. Урезал файл vk_height.js до вот такого кода и заработало
$(document).ready( function(){
//Вызываем функцию регулировки высоты каждые пол секунды.
setInterval('autosize(607)', 500); 

$('#set-permission').on('click', function(e) {
e.preventDefault();

// запрос прав доступа для дальнейшего обновления данных посредством крона
// после запрса создается ключ, который можно посмотреть на странице управления сообществом
// его и нунжно будет применить для обновления данных в виджете через сервер
// дока прав тут https://vk.com/dev/permissions
// дока метода тут https://vk.com/dev/clientapi?f=3.+showGroupSettingsBox
VK.callMethod("showGroupSettingsBox", 64);
});

$('#set-widget').on('click', function(e) {
e.preventDefault();

// запрос установки виджета
// типы виджетов можно глянуть тут https://vk.com/dev/objects/appWidget
// как подключить виджет можно глянуть тут https://vk.com/dev/apps_widgets
VK.callMethod('showAppWidgetPreviewBox', 'text', 'return {' + 
'"title": "Цитата",' + 
'"text": "Текст цитаты"' + 
'};');

// типы событий, генерируемых после выполнения запроса на установку виджета можно глянуть тут https://vk.com/dev/apps_widgets
// работа с событиями вк https://vk.com/dev/Javascript_SDK?f=4.1.+VK.addCallback
VK.addCallback('onAppWidgetPreviewSuccess', function f(data){ 
alert("Виджет успешно добавлен"); 
});
});	

});
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы