|  | <!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-fluid"> | 
        
          |  | <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 callback(event, className, e){ | 
        
          |  | console.log(event, e); | 
        
          |  | showAlert(className, event, e); | 
        
          |  | } | 
        
          |  |  | 
        
          |  | function setVkCallback( event, className) { | 
        
          |  | VK.addCallback(event, callback.bind(null, event, className)); | 
        
          |  | } | 
        
          |  |  | 
        
          |  | function onReady() { | 
        
          |  |  | 
        
          |  | // Слушать события предпросмотра виджета | 
        
          |  | setVkCallback('onAppWidgetPreviewFail', 'warning'); | 
        
          |  | setVkCallback('onAppWidgetPreviewCancel', 'info'); | 
        
          |  | setVkCallback('onAppWidgetPreviewSuccess', 'success'); | 
        
          |  |  | 
        
          |  | // События нажатия на кнопки | 
        
          |  | $('#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() | 
        
          |  | ; | 
        
          |  |  | 
        
          |  | VK.callMethod("showAppWidgetPreviewBox", type, code); | 
        
          |  | }); | 
        
          |  |  | 
        
          |  | } | 
        
          |  |  | 
        
          |  |  | 
        
          |  | function showAlert(className, header, text) { | 
        
          |  | var html = [ | 
        
          |  | '<div class="alert alert-dismissible alert-'+className+'" role="alert">', | 
        
          |  | '<h4 class="alert-heading">' + header + '</h4>', | 
        
          |  | text, | 
        
          |  | '<button type="button" class="close" data-dismiss="alert" aria-label="Close">', | 
        
          |  | '<span aria-hidden="true">×</span>', | 
        
          |  | '</button>', | 
        
          |  | '</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> | 
  
выдает ошибку
vk_api.exceptions.ApiError: [15] Access denied: app must be installed in group as community app
как установить приложение в группу?