Задать вопрос
  • VK API: php-скрипт возвращает ошибку. В чем проблема?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    "message" надо с маленькой буквы.

    У вас сейчас "Message" => $text,
    Ответ написан
    Комментировать
  • Как создать виджет сообщества 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.

    Какой конкретно шаг в этом сценарии у вас не получился?
    Ответ написан
  • Что не так с php-скриптом для VK API?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Разбирайте ответ от ВК, вполне возможно, что там содержится описание ошибки.

    Вместо
    printf('Success');
    exit;


    надо что-то типа
    $decoded = json_decode($query);
    if(!$decoded) {
      printf("ВК вернул невообразимую фигню: %s", $query);
    }
    else if( $decoded->error) {
      printf("Ошибка %d: %s\n", $decoded->error->error_code, $decoded->error->error_msg);
    } else if( $decoded->response) {
      printf("Пост опубликован с id %s\n", $decoded->response);
    }
    exit();


    Upd. возможно, дело в размещаемом сообщении и сurl. Попробуйте вместо CURLOPT_POSTFIELDS => array( ...
    сделать так:
    CURLOPT_POSTFIELDS     =>  http_build_query( array( ... ))
    Ответ написан
    Комментировать
  • Как сделать круговой счетчик чисел на js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Наверное, вам понадобится имитировать движение: без этого смотреться будет как медленно щелкающие значения.
    Для имитации движения нужно создавать размытие движения (motion blur) – в любой отдельный кадр видно не четкое значение, а размытое вдоль вектора движения.

    Отображаемые на экране кадры как бы идут слишком медленно, чтобы уместить все происходящие события, поэтому на один кадр накладывается несколько событий: число появилось вверху, проехало расстояние X, исчезло внизу, появилось следующее число, успело проехать пол-экрана. Всё это "засвечивает" всего один отображаемый кадр, на котором числа выглядят размазнно. Первое просто оставляет след во всю высоту, второе в пол-высоты.

    Как я понял, вам потребуется создать серию таких состояний:
    1. все смазано
    2. смазанно, но видно более ли менее значение 1 из 3
    3. все смазано
    4. смазанно, но читается значение 2 из 3
    5. все смазано
    6. смазанно, но читается значение 3 из 3

    Кадры для "всё смазано" можно заготовить заранее. Кадры с видимостью определённых значений генерить заранее наложением на полностью смазанные нескольких близких положений видимого числа.
    Ответ написан
    Комментировать
  • Как в JS преобразовать число 9.75e-8 в нормальное 0.000000975?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Например, так:
    function noExp(n){
        var data= String(n).split(/[eE]/);
        if(data.length== 1) return data[0]; 
    
        var  z= '', sign= this<0? '-':'',
        str= data[0].replace('.', ''),
        mag= Number(data[1])+ 1;
    
        if(mag<0){
            z= sign + '0.';
            while(mag++) z += '0';
            return z + str.replace(/^\-/,'');
        }
        mag -= str.length;  
        while(mag--) z += '0';
        return str + z;
    }
    
    noExp(n) // String "0.0000000975"

    via
    Ответ написан
    Комментировать
  • Почему ВК api возвращает ошибку Error 5: User authorization failed: no access_token passed?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Стоит ознакомиться с API ВКонтакте по их статье.

    Ваше сообщение об ошибке однозначно указывает на её причину: User authorization failed: no access_token passed. – не авторизовать пользователя, выполняющего запрос по причине отсутствия access_token'а (ключа доступа).

    Для выполнения friends.get() требуется ключ ("access_token") либо сервисный – из настроек созданного вами Приложения ВК; либо пользователя – полученный в результате диалога авторизации пользователя.

    Также обязательно стало указывать используемую версию API, параметр v. Сейчас актуальная версия 5.74

    Чтобы просто попробовать, создайте приложение типа standalone и скопируйте из его Настроек значение Сервисного ключа:
    скрин
    5af6a32ecd7c0965325530.png

    В итоге ваш запрос будет выглядеть примерно так:
    https://api.vk.com/method/friends.get?user_id=babegone&v=5.74&access_token=supersecretsupersecret
    Ответ написан
    6 комментариев
  • Что лучше использовать для авторизации пользователей cookie или сессии?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Сессии чаще всего держатся на cookie: с каждым запросом браузер передает куку с идентификатором сессии, и php вытаскивает из своего хранилища – файлов, Redis, базы данных, как настроете – сессионные данные для этого id.

    Т.е. различие в том, где хранить сами данные сессии: на сервере или на клиенте.

    Всё, что приходит с клиента можно подделать. Поэтому лучше использовать сессии.
    Ответ написан
    3 комментария
  • Как в результат массива foreach добавить число?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Из исходного массива взять только значения ключей, добавить туда $Element, после этого отсортировать и вывести:
    <?php
    $Element = 400;
    $keys = array_keys(
      $arResult['DISPLAY_PROPERTIES']['OTHER_COLORS']['LINK_ELEMENT_VALUE']
    );
    
    array_push($keys, $Element);
    
    sort($keys, SORT_NUMERIC);
    
    foreach($keys AS $intCurColorKey) {
    	echo( $intCurColorKey);
    }
    Ответ написан
    Комментировать
  • Различие в конечных автоматах НКА ДКА?

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    Основное отличие ДКА и НКА состоит в том, что ДКА в процессе работы может находится только в одном состоянии, а НКА в нескольких состояниях одновременно.

    — пост «Регулярные выражения изнутри» на Хабре неплохо объясняет суть конечных автоматов.
    Ответ написан
  • Как сделать что-то типа калькулятора, только из изображений?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Дизайнер вам пусть отрисует послойные картинки, где выбираемые элементы будут PNG слоями с прозрачностью. JavaScript'ом вы просто включаете/выключаете видимость слоёв бутерброда.

    В приведённом примере так и сделано. См., например, слой с одними только воротами - с прозрачным фоном.
    Ответ написан
    5 комментариев
  • Как принудительно обновить js-скрипт у клиента?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Варианты:
    1. не париться. Посидит несколько часов с устаревшей версией - разве это критично?
    2. если изменения в новой версии идут в компании с breaking changes в backend, то есть смысл версии API закладывать в пути: скрипт версии x.y будет обращаться к бэкенду по адресу api/x.y/method Так параллельно смогут жить и работать несколько версий скрипта+API.
    3. нынешний вариант не так и плох для некоторых случаев. Особенно, если ajax запросы в меру регулярны.
    4. на таймер раз в X секунд поставить вызов серверного метода проверки версии, и при обнаружении обновления сохранять данные и перегружать страницу.
    Ответ написан
    3 комментария
  • Автоматическое ежедневное изменение базы данных?

    Пара вариантов:
    a) по cron'у запускать скрипт, который обновит записи;
    b) хранить только дату регистрации пользователя. Его доход на любой момент времени вычисляется из числа дней с регистрации.
    Ответ написан
  • Что я делаю не так в регулярке?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Может, не нужно проверять всю строку? Если все линки правильные-авитные, то проверять только окончание строки – можно реверснуть строку .split('').reverse().join('') и проверять только начало /^\d{4,}_/

    Вот одной регуляркой под ваше требование:
    var re = new RegExp('^https?://(\\w+\\.)?avito\\.ru/([^/]+/)+([a-z_]+(?!_\\d{4,}))$');
    
    var t1 = 'https://www.avito.ru/moskva/odezhda_obuv_aksessuary/magazin_pizham_kigurumi_na_lubyanke_56545';
    var t2 = 'https://www.avito.ru/moskva/kvartiry/snimu';
    
    re.test(t1) // false
    re.test(t2) // true
    Ответ написан
    5 комментариев
  • Почему ВК api возвращает ошибку Error 121: invalid hash?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Проверьте, что вы правильно следуете инструкции по загрузке фотографий на стену ВК.
    Ответ написан
  • Как сделать другой post_type?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Фильтрация по типу доступна в методе не wall.getById(), а wall.get(): надо добавить параметр filter=suggests

    Такой вызов доступен только с передачей токена, полученного Создателем, Админом (и может, Редактором) группы.
    Ответ написан
    Комментировать
  • Какие дисклеймеры должны быть на сайте?

    Посмотрите посты на Хабре про GDPR – General Data Protection Regulation (Regulation (EU) 2016/679), вступает в силу 25 мая 2018 года. Актуально для работающих с персональными данными граждан ЕС сайтов и магазинов.
    Ответ написан
    Комментировать
  • Почему ф-я не возвращает значение?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Уберите лишнее.
    const test = (arg) => {
      return arg
    };
    
    const final = (arg) => test(arg)
    
    final("test");
    /*
    test
    */
    Ответ написан
    Комментировать
  • Как добавить часть одной страницы PHP в другую?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Изолируйте получение таблицы в отдельный файл / класс / функцию.

    Например:
    Пусть будет функция, на выходе которой html готовой таблицы. Файл getDataFromAPI.php содержит одноименную функцию getDataFromAPI().

    И в index.php и в new.php включайте этот файл:
    require_once('getDataFromAPI.php');
    Получайте html таблицы и вставляйте в нужном месте документа:
    <?php
    $table_html = getDataFromAPI();
    echo $table_html;
    ?>


    Ещё б кэшировать, наверное, хорошо.
    Ответ написан
    Комментировать
  • Как по задумке работает авторизация в vk.com API?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    1. пользователь устанавливает себе приложение
    2. ВК задаёт пользователю вопрос: приложение k...mobile хочет доступ к вашим данным – имени, телефону, номеру банковского счёта, паролю от онлайн банка и т.п. – перечисляет запрашиваемые права
    3. пользователь соглашается или отказывается
    4. если согласился, в приложении оказывается именно его access_token, с которым доступ есть только к данным пользователя (и чужим публичным данным)


    Это считается безопасным.

    Если у ВК появятся подозрения в зловредной деятельности приложения, они его "отключают" – все выданные пользователями этому приложению разрешения разом аннулируются, оно не сможет более выполнять запросы к API ВК.
    Ответ написан
    8 комментариев