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

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

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

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

    Таким подходом пользовался бы я и, вероятно, все остальные разработчики, если бы перед ними встала подобная задача.
    Ответ написан
    Комментировать
  • Как правильно обновлять ресурсы сайта?

    neluzhin
    @neluzhin
    Вы можете просто делать что-то типа такого:

    <link rel="stylesheet" href="/assets/css/styles.css?modified=<?php echo filemtime(APPPATH . '../assets/css/styles.css'); ?>">

    Этот PHP-код проверяет дату последнего изменения файла и подставляет его в query файла. Алгоритм в других языках точно такой же. На выходе получается что-то вроде такого:

    <link rel="stylesheet" href="/assets/css/styles.css?modified=1471224794">

    Но это считается плохой практикой, т.к. некоторые кэширующие прокси-серверы не кэшируют статические ресурсы, содержащие query-строки (в нашем случае это ?modified=1471224794).

    Хорошая практика - это отдавать файлы примерно так:

    <link rel="stylesheet" href="/assets/css/7c624717f06078161d803fc4ea84fc23.css">

    Здесь название файла - это закодированная через MD5 дата последнего изменения. Но автоматизация подобной системы может занять некоторое количество сил и времени. Таким методом пользуются, например, Тостер и GitHub.
    Ответ написан
    Комментировать
  • 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 комментариев
  • Получить 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 метод messages.get. Что я делаю не так?

    neluzhin
    @neluzhin
    К методам messages.* получить доступ могут только standalone-приложения. Это приложения, работающие без помощи браузера. Например, клиенты (официальные приложения VK, Kate Mobile, Snapster и т.д.). А у вас тип приложения "веб-сайт".

    Вы ничего не сможете с этим поделать и заставить работать Open API с сообщениями не получится. Единственный выход - кидать пользователя на страницу получения токена в вашем standalone-приложении и просить скопировать его в форму на вашем сайте, а затем уже с сервера с этим токеном делать запросы. Но это плохо влияет на UX хотя бы потому, что на странице, откуда пользователь будет копировать этот самый токен, жирным написано, что копирование токена может быть небезопасным.
    Ответ написан
    2 комментария
  • Как отправить запрос с клиента, а не с сервера для 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 комментария
  • Как вывести 2 предложения отправить пост при нажатии на кнопку?

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

    Что-то типа такого:
    VK.api("wall.post", {"message": "Этот пост мне на стену!"}, function (data1) {
    	VK.api("wall.post", {"message": "А этот пост в группу!", "owner_id": -123456}, function (data2) {
    		alert("Вы отправили 2 записи!")
    	});
    });
    Ответ написан
    Комментировать
  • Как отправить пост на стену группы Вконтакте с картинкой средствами VK API JavaScript?

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

    Предположим, что у вас на сайте есть форма, где textarea и input[type=file]. Вы хотите сделать так, чтобы при отправке формы всё это добро постилось во ВКонтакте на стене вашей группы. Шаги будут примерно такие:
    1. После нажатия кнопки "Отправить" с помощью AJAX отправляйте изображение на ваш сервер.
    2. Получив изображение на сервере, согласно инструкции, загрузите его в альбом вашей группы ВК.
    3. После выполнения загрузки изображения ВК вернет вам его ID. Вы должны этот ID вернуть пользователю в ответ на загрузку изобржения, описанную в первом шаге.
    4. Приложите ID изображения как вложение к публикуемой записи. Пример кода:

      VK.api('wall.post', {
      	owner_id: '-GROUP_ID',
      	message: send_data,
      	attachments: 'photo' + photo_id // photo_id - это ID изображения
      }, function(data) {
      	if (data.response) alert('Успешно опубликовано в группе!');
      });


    Но если вы делаете какое-то подобие веб-админки для ваших сообществ, то я бы задумался о полном переезде на standalone-приложение, где все методы выполняются на стороне сервера.
    Ответ написан
    Комментировать
  • Можно ли получить id пользователя через openaApi без авторизации в приложении?

    neluzhin
    @neluzhin
    Насколько мне известно, нет легального способа узнать ID ВКонтакте случайного посетителя сайта.
    Ответ написан
    Комментировать
  • Как заставить работать board.deleteComment?

    neluzhin
    @neluzhin
    Права на доступ к группам даются через ключевое слово groups (вы букву потеряли).

    Если все же проблема не в опечатке, то проверьте, работает ли у вас удаление комментариев в обсуждении через консоль (форма внизу страницы).
    Ответ написан
    Комментировать
  • Vk API, загрузить изображение от имени группы?

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

    Если проводить загрузку фотографии методами photos.getWallUploadServer -> photos.saveWallPhoto, как вы и делаете, то в альбом фотографий со стены (vk.com/album-12345_00 - выделенное жирным поменять на ID вашего сообщества) загруженная фотография все же добавляется. И находится она там от имени сообщества. Предполагаю, что в данном случае надо методом photos.get получить ID последней фотографии и прикладывать ее к посту.
    Ответ написан
    2 комментария
  • Для создания небольшого обучающего портала лучше использовать какую-то CMS или фреймворк или быстрее написать с нуля?

    neluzhin
    @neluzhin
    Для начинающего веб-разработчика фреймворки типа Yii2 будут сложноваты, я думаю. Чтобы учить фреймворки, надо иметь хорошее представление и желательно хотя бы теоретические знания о всех возможностях языка.

    На вашем месте я бы с нуля такой несложный сайт сделал. Но если у вас дедлайн не поджимает и если вы верите в веру в свои силы, то можете попробовать осилить Yii2, хотя мне он давался ой как непросто. Но какой-нибудь фреймворк все равно рано или поздно стоит выучить. Один раз выучите и мир окрасится новыми красками.

    А использование CMS я стараюсь избегать любыми средствами.
    Ответ написан
    3 комментария
  • Как создать вики страницу вк через апи?

    neluzhin
    @neluzhin
    Не слушайте Андрея - создавать вики-страницы через VK API очень даже можно.

    Вам необходимо использовать метод pages.save и передать в нем параметр title, который будет являться названием созданной вами вики-страницы (в таком случае параметр page_id можно не передавать).

    После успешного выполнения данный метод вернет вам ID созданной страницы.
    Ответ написан
    Комментировать
  • Регулярка. Как определить наличие определенного фрагмента внутри [] и заменить его?

    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.
    Ответ написан
    Комментировать