Задать вопрос
Контакты
Местоположение
Россия, Санкт-Петербург и область, Санкт-Петербург

Достижения

Все достижения (6)

Наибольший вклад в теги

Все теги (30)

Лучшие ответы пользователя

Все ответы (50)
  • Как ВКонтакте узнает о поисковых запросах, по которым я искал в Яндексе?

    neluzhin
    @neluzhin
    Яндекс является рекламным партнером ВКонтакте и проталкивает в таргетинговую рекламу (которая под левым меню) собственные баннеры. Что примечательно, такие баннеры имеют другие и более мягкие ограничения по количеству символов в описании и названии, нежели те, что накладывает на вас ВКонтакте при создании объявления, а также подобные баннеры могут даже нарушать сами правила ВК. Например, ВКонтакте запрещает обращаться к пользователям в таргетинговой рекламе на "ты", но баннеры Яндекса этот момент частенько игнорируют. Таким образом нельзя исключать, что Яндекс имеет какие-то внутренние алгоритмы или договоренности с ВК, которые позволяют ему на основе одних лишь поисковых запросов составлять группу ретаргетинга.

    Собственно, подробнее о группе ретаргетинга. Владельцы сайтов устанавливают в разметке страницы "пиксели" (картинка размером 1 на 1 пиксель) в теге <img>, которые хостятся на серверах ВКонтакте. Когда юзер загружает эту картинку, то ВКонтакте с помощью cookies определяет ID пользователя и добавляет его в группу ретаргетинга. Затем этой группе можно будет показывать объявления.

    Нередко владельцы сайтов продают места для пикселей другим компаниям, чтобы те могли показывать более релевантные баннеры. Допустим, вы - владелец форума о пылесосах. Какая-нибудь торговая сеть, например МВидео или Юлмарт, может арендовать у вас размещение своего пикселя, который будет собирать для них базу ретаргетинга. И затем они будут показывать вашей аудитории рекламу своих товаров (пылесосов) во ВКонтакте.
    Ответ написан
    1 комментарий
  • Как добавить видео с помощью API VK?

    neluzhin
    @neluzhin
    Загружать видео можно только в том случае, если все запросы к VK API осуществляются с сервера. В документации написано, как загружать видео, но я расскажу поподробнее. Ход действий примерно такой:

    1. Загрузите видео на свой сервер.
    2. Вызовите метод video.save. Указывать какие-либо параметры не обязательно, но можете указать, например, ID группы, в которую будет добавлено видео, в параметре group_id и имя видеозаписи в параметре name.
    3. После того, как вы вызовете метод video.save, вы получите ссылку, куда надо будет загрузить вашу видеозапись. Выглядеть ответ от ВК будет примерно так:

      response: {
        upload_url: 'http://cs12129.vkontakte.ru/upload_video.php?act=add_video&mid=15748&oid=66748&vid=164322743&fid=0&tag=122517f2&hash=8bf2ea4bb66ca67d28fb&swfupload=1',
        vid: 164322743,
        owner_id: 66321,
        name: 'No name',
        description: '',
        access_key: 'e6822bfb86f90a149c'
      }

      По этому адресу методом POST отправьте видеозапись в поле video_file.

    4. В ответ на загрузку видеозаписи ВК вернёт вам ID видеозаписи:

      {
        "size":1234,
        "video_id":1234567
      }


    Это всё. Видеозапись должна будет появиться в указанном вами сообществе.

    Небольшой пример на PHP:

    <?php
    
    define('VK_ACCESS_TOKEN', '533bacf01e11f55b536a565b57531ac114461ae8736d6506a3');
    define('VK_API_VERSION', 5.53);
    
    // // //
    // Скачиваем видео с внешнего сервера на свой сервер
    // // //
    
    $ch = curl_init();
    				
    curl_setopt($ch, CURLOPT_URL, 'http://cache-spb07.cdn.yandex.net/kp.cdn.yandex.net/558075/kinopoisk.ru-L_odyss__233_e-311292.mp4');
    curl_setopt($ch, CURLOPT_HTTPGET, TRUE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE);
    
    $curl_result = curl_exec($ch);
    
    curl_close($ch);
    
    // Кладем видео в папку со скриптом
    $fp = fopen('kinopoisk.ru-L_odyss__233_e-311292.mp4', 'x');
    fwrite($fp, $curl_result);
    fclose($fp);
    
    // // //
    // Получаем адрес ссылки, куда загружать видео
    // // //
    
    $ch = curl_init();
    $parameters = http_build_query([
        'access_token' => VK_ACCESS_TOKEN, // access_token / ключ доступа
        'v'            => VK_API_VERSION, // версия API
        'name'         => 'Имя видеозаписи',
        'description'  => 'Исчерпывающее описание нашей первой видеозаписи.',
        'group_id'     => 125004421, // ID группы
        'no_comments'  => 0 // разрешаем комментирование
    ]);
    
    curl_setopt($ch, CURLOPT_URL, 'https://api.vk.com/method/video.save?' . $parameters);
    curl_setopt($ch, CURLOPT_HTTPGET, TRUE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    
    $curl_result = json_decode(curl_exec($ch), TRUE); // превращаем JSON-массив, который нам вернул VK, в обычный PHP-массив
    
    curl_close($ch);
    
    // // //
    // Загружаем видео на серверы ВК
    // // //
    
    $ch = curl_init();
    $parameters = [
        'video_file' => new CURLFile('kinopoisk.ru-L_odyss__233_e-311292.mp4')  // PHP >= 5.5.0
        // 'video_file' => '@kinopoisk.ru-L_odyss__233_e-311292.mp4' // PHP < 5.5.0
    ];
    
    curl_setopt($ch, CURLOPT_URL, $curl_result['response']['upload_url']);
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $parameters);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_SAFE_UPLOAD, TRUE); // если PHP < 5.5.0, то эту строку надо закомментировать
    
    $curl_result = json_decode(curl_exec($ch), TRUE);
    
    curl_close($ch);
    
    if (isset($curl_result['error'])) {
        exit('Строка ' . __LINE__ . ': Ошибка при загрузке видео на серверы ВК: ' . $curl_result['error'] . '.');
    }
    
    echo 'Видеозапись успешно загружена.';

    Кстати, параметр link метода video.save принимает только ссылки на популярные видеохостинги, вроде YouTube. О работе через этот параметр я писал в этом вопросе.
    Ответ написан
    4 комментария
  • Регулярка. Как определить наличие определенного фрагмента внутри [] и заменить его?

    neluzhin
    @neluzhin
    Предыдущий ответ, где вам порекомендовали регулярку, похожую на сиськи, от части верный, но только от части. Проблема в том, что в квадратных скобках может быть и не ссылка на группу, паблик, мероприятие или человека. Например, [x|test] в социальной сети не преобразуется в гиперссылку и отобразится плейн текстом, а вы создадите гиперссылку, ведующую на 404-ю страницу.

    Вы должны обрабатывать только гиперссылки, начинающиеся с club или id, и заканчивающиеся числом. В любом другом формате ВКонтакте гиперссылки не хранит. Правильное регулярное выражение выглядит примерно так:

    /\[((?:club|id)[0-9]+)\|(.+)\]/

    И вставить это добро можно так:

    <a href="//vk.com/$1">$2</a>

    Ну и наглядный пример на PHP для самых маленьких:

    $comment = preg_replace('/\[((?:club|id)[0-9]+)\|(.+)\]/', '<a href="//vk.com/$1">$2</a>', $comment);

    Следует отметить, что публичные страницы (паблики) и мероприятия (ивенты) в виде гиперссылок также имеют приставку club, а не public и event.
    Ответ написан
    Комментировать
  • Как установить более одной reCaptcha на странице?

    neluzhin
    @neluzhin
    Вы инициализируете капчу с помощью HTML, поэтому она рендерится всего один раз. Чтобы добавить их несколько на сайт, надо инициализировать капчу с помощью JavaScript.

    Для начала, подключайте API таким образом:

    <script src="https://www.google.com/recaptcha/api.js?onload=recaptchaCallback&render=explicit" async defer></script>

    Параметр render со значением explicit говорит, что капча будет инициализироваться не через HTML, а через JavaScript. А параметр onload содержит название JavaScript-функции, которая исполнится в момент загрузки страницы (в нашем случае это recaptchaCallback()).

    Теперь, собственно, надо написать какой-то JavaScript. Выглядеть он будет примерно так:

    var feedbackCaptcha;
    var authCaptcha;
    
    function recaptchaCallback() {
    	feedbackCaptcha = grecaptcha.render('feedback_captcha', {
    		'sitekey' : 'ваш_site_key',
    		'theme' : 'dark'
    	});
    	
    	authCaptcha = grecaptcha.render('auth_captcha', {
    		'sitekey' : 'ваш_site_key'
    	});
    }

    Тут мы создаем функцию recaptchaCallback(), при вызове которой будут рендериться две капчи: одна в элементе #feedback_captcha, а вторая - в #auth_captcha. У первой капчи будет тёмная тема.

    Разместим мы капчу на сайте примерно так:

    <form>
    	<!-- тут какие-то поля для оставления отзыва о сайте -->
    	<div id="feedback_captcha"></div>
    </form>
    <form>
    	<!-- тут какие-то поля для авторизации -->
    	<div id="auth_captcha"></div>
    </form>

    Для чего мы заключаем функции, которые рендерят капчу, в переменные? А нужно это для того, чтобы мы могли индивидуально для каждой капчи исполнять методы. Например, хорошо бы при каждой отправке AJAX-формы авторизации сбрасывать капчу. Сбрасывать мы будем ее так:

    grecaptcha.reset(authCaptcha)

    Также почитайте документацию: developers.google.com/recaptcha/docs/display
    Ответ написан
    3 комментария
  • VK api, не загружается фото на сервер?

    neluzhin
    @neluzhin
    Вы зачем-то передаете во ВК закодированный адрес изображения. Но должны вы передавать сам файл. Вы должны загрузить изображение на сервер, а затем переписать строчку

    curl_setopt($ch, CURLOPT_POSTFIELDS, array('photo' => $image_url));

    так, если у вас PHP меньше 5.5:

    curl_setopt($ch, CURLOPT_POSTFIELDS, array('photo' => '@path/to/image.jpg'));

    или если PHP больше или равен 5.5:

    curl_setopt($ch, CURLOPT_POSTFIELDS, array('photo' => new CURLFile('path/to/image.jpg')));

    Эту строку можно удалить:

    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data; charset=UTF-8'));

    Также используйте для обращения к API домен api.vk.com и не забывайте в своих запросах передавать версию API в параметре v.

    UPD: также, как подметили ранее, для загрузки фотографий на стену вы должны передавать фотографии в поле photo, а не file{...}.
    Ответ написан
    9 комментариев

Лучшие вопросы пользователя

Все вопросы (13)