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

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

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

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

    neluzhin
    @neluzhin
    Это называется "цифровая подпись". Это когда вы можете быть уверены, что переданные вам данные являются подлинными. Вы знакомы с односторонним шифрованием, типа MD5, SHA1, SHA256 и т.п.? Это процесс, когда вы шифруете данные так, что их невозможно будет расшифровать. Единственное, что можно делать с зашифрованными данными - это проводить сверку. Допустим, когда вы качаете файл с торрент-треккера, там указывают хэш-сумму файла. Когда вы скачиваете файл, вам по хорошему стоит проверить, совпадает ли хэш на треккере с хэшем закаченного вами файла. Если не совпадает, значит, файл повредился в процессе закачки, короче он не соответствует оригиналу. Вот примерно аналогично работают цифровые подписи во ВКонтакте, платежных системах и во многих других сервисах.

    Прежде, чем отдать вам "параметры запуска" (ID пользователя, ID группы, откуда запустили, и т.п.), ВКонтакте считает цифровую подпись, подмешивая в неё секретный ключ приложения. Не зная секретного ключа приложения, никто не сможет сгенерировать валидную цифровую подпись. ВКонтакте в приведенном вами примере кода показывает, каким образом они генерируют у себя цифровую подпись, чтобы вы поняли как это вообще работает. Вы должны по этому же алгоритму сгенерировать подпись на сервере и при запуске приложения проверять, соответствует ли сгенерированная вами подпись той, что отдает вам ВКонтакте. Если соответствует, значит, пользователь не подделывал параметры запуска. Если не соответствует, значит, можно закрыть доступ к некоторым функциям вашего приложения или отбросить какую-нибудь HTTP-ошибку, например, 400 или 401.
    Ответ написан
    Комментировать
  • Как разделить комментарии ВК?

    neluzhin
    @neluzhin
    Атрибут id подразумевает уникальность элемента, следовательно, на странице не может быть два элемента с одинаковыми ID. Метод VK.Widgets.Comments() первым параметром принимает именно этот самый ID элемента. Вам надо сделать что-то вроде такого:

    Первый блок комментариев:
    <div id="vk_comments_1"></div>
    <script type="text/javascript">
      VK.Widgets.Comments("vk_comments_1", {redesign: 1, limit: 20, width: "1060", attach: "*"});
    </script>


    Второй блок комментариев:
    <div id="vk_comments_2"></div>
    <script type="text/javascript">
      VK.Widgets.Comments("vk_comments_2", {redesign: 1, limit: 20, width: "1060", attach: "*"});
    </script>


    Также, если вы хотите разместить несколько блоков комментариев на странице, чтобы в них были разные комментарии, вам надо будет в метод VK.Widgets.Comments() передать третий параметр с уникальным ID, иначе ВК будет в обоих виджетах отображать одинаковые комментарии. Например, у первого виджета можно поставить число 1, а у второго - число 2 Что это такое и зачем это нужно я отвечал вот здесь: Как сделать чат из комментариев ВК? (см. комментарии к ответу).
    Ответ написан
    5 комментариев
  • VK API Не отправляет кириллицу?

    neluzhin
    @neluzhin
    У вас, наверное, PHP-файл в кордировке отличной от UTF-8.

    Также используйте более современные инструменты, например, cURL:

    <?php
    
    function send($id, $message) {
    	$ch = curl_init();
    	$parameters = http_build_query([
    		'user_id'      => $id,
    		'message'      => $message,
    		'access_token' => 'fa0mfbc2b13c3104f48fd2g75e0a770b34119c89f0e16f75e1502f03e9346413c10b8ad428737496f5602',
    		'v'            => '5.59'
    	]);
    
    	curl_setopt($ch, CURLOPT_URL, 'https://api.vk.com/method/messages.send');
    	curl_setopt($ch, CURLOPT_POST, TRUE);
    	curl_setopt($ch, CURLOPT_POSTFIELDS, $parameters);
    	curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    	curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
    	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
    	curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    
    	// Результат запроса к API
    	$result = curl_exec($ch);
    
    	curl_close($ch);
    }
    Ответ написан
  • HTML скрипт подтверждения Предлагаемых новостей в группе ВК?

    neluzhin
    @neluzhin
    С такими запросами вам следует обращаться на фриланс-биржи. Тостер - ресурс для людей, которые хотят понять и научиться. Такие "HTML-скрипты" пишутся на самой начальной стадии изучения любого языка программирования, особенно если этот язык программирования - это какой-нибудь PHP.
    Ответ написан
  • Как вывести последние комментарии ВК на сайте?

    neluzhin
    @neluzhin
    На вашем скриншоте самый обычный официальный виджет комментариев.
    Ответ написан
    Комментировать
  • Как лучше решить (PHP, VK API)?

    neluzhin
    @neluzhin
    Я бы не сказал, что cron с этим не справится. На cron какие только велосипеды не писались, поэтому стоит попробовать.

    Но давайте отбросим костыли и попробуем сначала все сделать по фэншую. Вы сообщения принимаете от пользователей в ЛС сообщества? Если да, то Callback API - ваш верный друг. Используя эту штуку, ВК сам будет сообщать POST-запросами вашему скрипту, когда вам написали в ЛС сообщества. А вы уже там сможете сразу текст для ответа подобрать и стандартными методами API ответить на него.

    Если вы принимаете сообщения со страницы пользователя, то готовьтесь собирать велосипед из крона. По хорошему вам следует запускать 2 скрипта: первый с интервалом в ~5 секунд будет добавлять сообщения пользователей в базу данных, а второй с интервалом в секунду будет проверять эту базу данных и отвечать на эти сообщения. Для красоты можно это все через метод execute реализовать, чтобы хоть как-то обойти ограничение на 3 обращения к API в секунду.

    UPD.
    Также посмотрите на Long Poll. Сам никогда не работал с этой фичей, но, возможно, это то, что вам нужно.
    Ответ написан
    Комментировать
  • Можно ли через VK API спарсить список ID с кем переписывался определенный ID?

    neluzhin
    @neluzhin
    Как и в любой другой нормальной социальной сети - нельзя. Возможность узнать, с кем общается тот или иной человек, явно идет в разрез с таким понятием как "приватность".
    Ответ написан
    Комментировать
  • Какой символ перевода строки для ВКонтакте?

    neluzhin
    @neluzhin
    \n же, как и везде. Не забудьте про двойные кавычки.

    $message = "Сегодня я съем\nэти вкусные печеньки.";
    Ответ написан
    Комментировать
  • Почему когда offset ставлю больше 1000, то перестает искать варианты?

    neluzhin
    @neluzhin
    С помощью данного метода можно получить только 1000 первых сообществ независимо от того, что указано в параметре offset. Цитата со страницы метода groups.search:

    Обратите внимание — даже при использовании параметра offset для получения информации доступны только первые 1000 результатов.
    Ответ написан
    Комментировать
  • Как проверить валидность токена VK?

    neluzhin
    @neluzhin
    Уже отвечал на этот вопрос вот тут: Как проверить информацию по токену через API ВКонтакте?

    Также почитайте комментарии к ответу.
    Ответ написан
    Комментировать
  • Можно ли использовать пользователей IFrame приложения ВКонтакте на основном сайте?

    neluzhin
    @neluzhin
    Согласно правилам размещения приложений, вы имеете полное право хранить ID пользователей только в том случае, если эти ID будут использоваться только в рамках вашего приложения (пп 2.1). Это значит, что вы не можете использовать эти ID для создания какой-то логики в другом вашем приложении или сайте. Даже создание рекламной базы ретаргетинга из этих ID может считаться нарушением правил.

    Также советую взглянуть на пп 1.6.
    Ответ написан
    Комментировать
  • Есть ли софт для форматирования исходного кода вики-страниц ВКонтакте?

    neluzhin
    @neluzhin
    Никакой магии и софта. Чуваки, наверное, за пару часов сверстали вики-шаблон и сделали сайт, на котором есть форма с хреновой тучей полей. Вводят данные в эти поля и информация автоматически подставляется в этот самый шаблон, а затем средствами VK API создаются или обновляются вики-страницы. Такой подход всяко удобнее работы непосредственно с разметкой.

    Таким подходом пользовался бы я и, вероятно, все остальные разработчики, если бы перед ними встала подобная задача.
    Ответ написан
    Комментировать
  • Получить Access_token для Standalone-приложения VK на JS?

    neluzhin
    @neluzhin
    Получить токен standalone-приложения методами JS нельзя. Этот тип приложений должен использоваться десктопными, мобильными приложениями или расширениями для браузеров, которые поддерживают функции, с помощью которых можно будет вытащить токен из адресной строки.
    Ответ написан
  • Как оставить запись на стене группы Вконтакте от лица авторизованного пользователя средствами API VK?

    neluzhin
    @neluzhin
    Честно говоря, я не очень понял сути вопроса, поэтому пройдусь сразу по всем возможным пунктам.

    К сожалению в StandAlone можно через АПИ отправлять записи только от имени владельца приложения.

    Через standalone-приложения можно отправлять записи от имени любого пользователя, который авторизовался через ваше приложение.

    Таким образом пытался отправить сообщение (в итоге надо запись на стену, но смысл не меняется)

    Пользоваться методами messages.* можно только через standalone-приложения. Для веб-сайтов и iFrame-приложений постинг через метод wall.post доступен только через окно подтверждения, а для standalone-приложений - без каких-либо проблем.

    Ловлю ошибку:
    [error_code] => 15
    [error_msg] => Access denied: no access to call this method .

    Вы забываете передать параметр scope при получении токена. Смотрите подробнее о правах доступа вот тут.

    И еще: вы не сможете работать с сообщениями пользователя, если вы работаете с пользователем через веб-сайт. Данные методы поддерживаются только standalone-приложениями, которые необходимо использовать в десктопных и мобильных приложениях или в браузерных расширениях. Авторизовать пользователя в standalone-приложении через браузер получится, а вот токен вы получить ни через PHP, ни через JavaScript не сможете, если только не попросите пользователя скопировать токен вручную, что противоречит основам UX, т.к. на странице получения токена написано, чтобы пользователь его не копировал, ибо не безопасно.
    Ответ написан
  • Как обновить фото на обложке сообщвества в vk.com автоматизированно?

    neluzhin
    @neluzhin
    Шаг действий для автоматизации задуманного вами процесса будет примерно таким:
    1. Скачиваете изображение карты с помощью API Яндекса. В данном API я ничего подсказать не смогу - не имел опыта.
    2. Создаете в своем сообществе альбом.
    3. В этот альбом загружаете изображение с карт, которое вы скачали в первом шаге. В документации написано, как загружать картинки в альбом.
    4. После загрузки изображения вы получите его ID. Во ВКонтакте объект photo имеет такой формат: photo*owner*_*id*. Соответственно, чтобы получить объект загруженной вами фотографии, просто подставьте свои данные. *owner* - это ID владельца (у сообществ ай-ди отрицательный), а *id* - ай-ди загруженной картинки. Допустим, ай-ди вашего сообщества - 108671097, а ай-ди загруженной картинки - 425093800. Итого объект photo у вас будет выглядеть так: photo-108671097_425093800.
    5. Теперь вам надо создать шаблон вашей вики-странички. Вот пример на PHP:

      /* переменная $photo_object задается, допустим, после загрузки картинки */
      $template = "==Карта пробок в Санкт-Петербурге==\n[[" . $photo_object . "|607x448px;noborder|Карта пробок в Санкт-Петербурге]]";

    6. Ну а дальше шаблон отправляем в метод pages.save. Таким образом мы будем просто каждый раз переписывать вики-страничку.


    И это все нужно засунуть в крон для автоматизации. Так-то все. Еще можете читать неофициальную документацию по вики-разметке ВКонтакте.

    А вообще, без базовых знаний программирования такое написать не получится. Попробуйте на фриланс-биржу обратиться, скрипт получится несложным, рублей за 500-1000 вам напишут.
    Ответ написан
    Комментировать
  • Как отправить запрос с клиента, а не с сервера для API в вконтакте?

    neluzhin
    @neluzhin
    По сабжу о работе с API со стороны клиента:
    • Если вы имеете собственный сайт, то вам нужно Open API.
    • Если вы создаете iFrame-приложение (приложение внутри ВКонтакте), то тогда вам нужен JavaScript SDK.

    Также я не понимаю, что у вас за проблемы с работой с API через PHP. Вы уверены, что передаете правильный ID записи в метод? ID должен иметь формат 12345_5432, где 12345 - это ID профиля, а 5432 - ID записи. Если записи необходимо получить из группы, то ID группы указывается отрицательный, например -76421_5432.
    Ответ написан
    Комментировать
  • Как получить событие получение нового сообщения в вк js sdk для irfame приложения?

    neluzhin
    @neluzhin
    Никак. Доступ к методам messages.* доступен только standalone-приложениям. iFrame-приложения и вебсайты получить доступ к сообщениям не могут.

    Также список всех событий в JavaScript SDK перечислен тут - ничего связанного с сообщениями там нет.
    Ответ написан
    Комментировать
  • Как добавить видео с помощью 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 комментария