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

    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.

    Какой конкретно шаг в этом сценарии у вас не получился?
    Ответ написан
  • Как создать виджет сообщества в vk?

    @Gesparo Автор вопроса
    Fullstack разработчик
    Итак, задачу все же удалось решить. Опишу способ решения этой задачи для тех, кто подписался и для тех, кто столкнется с аналогичной задачей.

    Предварительные условия:
    Необходимо создать iframe приложение и добавить его в сообщество. Насколько я понял - это необходимо только для создания ключа ( чтобы можно было управлять виджетом на стороне сервера ) и первоначального добавления виджета на страницу.

    Iframe приложение должно "смотреть" на страницу где будет вот такой вот код:
    index.html:
    <!doctype html>
    <html lang="ru">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    
        <!-- Подключаем jquery -->
        <script src="https://code.jquery.com/jquery-1.12.4.min.js" defer></script>
        <!-- Подключаем VK -->
        <script src="https://vk.com/js/api/xd_connection.js?2"  type="text/javascript" defer></script>	
    	
        <!-- Подключаем скрипт регулировки высоты -->
        <script src="/vk_height.js" defer></script>
    	
    </head>
    <body style='text-align:center;padding-top:50px;' id='body'>
    	<a href="javascript:void(0)" id="set-permission">Создать ключ доступа к виждету сообщества</a>
    	<br>
    	<br>
    	<a href="javascript:void(0)" id="set-widget">Добавить виждет в сообщество</a>
    </body>
    </html>


    vk_height.js:
    // инициализация вк
    VK.init(, function() { 
         console.log('Init successful');
      }, function() { 
         console.log('Error init');
    }, '5.73'); 
    
    // функция дня изменения размера окна в зависимости от содержимого страницы
    function autosize(width) {
        //Проверяем элемент body на наличие.
        if (!document.getElementById('body')) {
            alert('error');
            return;
        }
        // Успешно ли подключен ВК скрипт
        if (typeof VK.callMethod != 'undefined') {
            /*
            Вызываем функцию vk js api для управления окном.
            VK.callMethod('функция', параметры)
            В данном случае у нас - VK.callMethod('изменение_размеров_окна', ширина, высота);
            Так же добавляем еще 60 пикселей что бы было небольшое расстояние.
            */
            VK.callMethod('resizeWindow', 840, document.getElementById('body').clientHeight + 60);
        } else {
            alert('error #2');
        }
    }
    
    $(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("Виджет успешно добавлен"); 
    		});
    	});	
    	
    });


    После создания данных страниц у вас появится возмжность создать ключ (который будет доступен из управления сообществом) и создание простого виджета

    Серверную часть я полностью описывать не буду и покажу только само тело запроса, главное запросить данные через culr по ссылке https://api.vk.com/method/ (Вот гайд)

    Сам запрос:
    $api = new \App\Api\Main\Vk(['access_token' => 'ключ_корый_мы_сгенерировали_первой_кнопкой']);
        $api->request(
            'appWidgets.update',
            [
                'type' => 'list',
                'code' => '
                    var users = API.users.get({"user_ids": [11111, 22222, 33333]});
                    
                    return { 
                      "title": "Конкурс за призы", 
                      "rows": [
                                  { 
                                      "title": users[0].first_name + " " + users[0].last_name, 
                                      "icon_id": "id11111",
                                      "descr" : "1 место - 2000 баллов",
                                      "button" : "Результаты конкурса",
                                      "button_url" : "https://vk.com/link"
                                  },
                                  { 
                                      "title": users[1].first_name + " " + users[1].last_name, 
                                      "icon_id": "id2222",
                                      "descr" : "2 место - 1890 баллов",
                                      "button" : "Правила и призы",
                                      "button_url" : "https://vk.com/link"
                                  },
                                  { 
                                      "title": users[2].first_name + " " + users[2].last_name, 
                                      "icon_id": "id22222",
                                      "descr" : "3 место - 1890 баллов",
                                      "button" : "Хочу на марафон",
                                      "button_url" : "https://vk.com/link"
                                  }
                             ]
                };'
            ]
        );


    Подробности о теле запроса можно узнать тут
    А как его правильно писать - тут

    Вышенаписанный php код можно добавить в крон, автоматизировать и наслаждаться жизнью. И на последок - вот пример рабочего кода в сообществе (сорян за стили, и некоторые замазанные части, мне лень было делать нормальный скрин):
    5a9e7f04c5275110898228.png
    Ответ написан
    5 комментариев