Страницы

Поиск по вопросам

Показаны сообщения с ярлыком вконтакте. Показать все сообщения
Показаны сообщения с ярлыком вконтакте. Показать все сообщения

понедельник, 13 апреля 2020 г.

Картинка приложения для постинга ссылок

#сервисы #интеграция #разметка #вконтакте

                    
Столкнулся со следующей проблемой. Для того, чтобы ссылки на мой сайт красиво отображались
в социальных сетях, создал специальную картинку - лого. Вот, например, как выгладит
ссылка на facebook:



Картинки слева смотрятся отлично.
Но возникла проблема с контактом. Вот какая ерунда получается:
     

Чтобы картинка появлялась на фэйсбуке, я указал специальный мета-тэг. Существует
ли такой тэг чисто для Контакта (тогда я просто укажу там другую картинку)? Может есть
другие решения? Желательно без скриптов JS, а то на мобильных браузерах это может стать
проблемой.
    


Ответы

Ответ 1



Эврика!!! Чисто как говориться "на шару" (но я это называю методом научного тыка), ввёл такой url: http://vk.com/share.php?image=http://example.com/webpages/images/logovk3.png&url=http://example.com/news/32 т.е. тот, который содержит ключ IMAGE. И всё работает!!! Надеюсь, кому-то в будущем поможет. Я потратил на поиск решения целых 2 часа.

Ответ 2



ВКонтакте полагается на тот же Open Graph протокол, что и FaceBook. Упоминание нашлось в дебрях вконтактовских док: для видео картинку надо указывать через знакомый

суббота, 11 апреля 2020 г.

Как получить имя и фамилию пользователя VK без дополнительного запроса?

#вконтакте #vkontakte_api #oauth

                    
Возник такой вопрос: сделать так, чтобы vk при авторизации через oauth 2, помимо
id, сразу возвращал имя и фамилию пользователя?
Попробовал в настройках указать первый запрос к api:
users.get?user_id={viewer_id}&v=5.25
Но, похоже, с oauth это не работает. Есть другие варианты, не делая дополнительный
запрос к api со стороны сервера, заставить vk возвращать вместе с id имя и фамилию?    


Ответы

Ответ 1



Я так понимаю, что приемлемо сделать правильный первый запрос к API, раз есть id пользователя: $.ajax({ url: "https://api.vk.com/method/users.get", data: { user_ids: '1', v: "5.26" }, dataType: "jsonp", success: function (e) {alert(e.response[0].first_name + ' ' + e.response[0].last_name);} });

четверг, 9 апреля 2020 г.

Хранение авторизации Vkontakte в android приложении

#android #android_sdk #vkontakte_api #вконтакте

                    
Необходима авторизация через Вконтакте в приложении. Как лучше всего хранить полученный
токен авторизации в приложении и как подставлять его автоматически если он еще не устарел?
SharedPreference и SQLite небезопасны. Есть возможность хранить во внешней MySQL базе.
    


Ответы

Ответ 1



SharedPreference с MODE_PRIVATE http://developer.android.com/reference/android/content/Context.html#MODE_PRIVATE будет доступно только для текущего приложения Если это кажется недостаточно безопасным можно использовать реализацию с шифрованием https://github.com/scottyab/secure-preferences

воскресенье, 15 марта 2020 г.

Как реализован счётчик лайков ВКонтакте?

#javascript #jquery #вконтакте


При нажатии на лайк ВКонтакте число, отображающее количество уже поставленных лайков,
медленно прокручивается на 1 (или больше) вперёд. То есть, если уже есть 555 лайков,
то последняя цифра будет двигаться вниз, а на её место сверху придёт шестёрка.

При этом в коде число 555 не разбивается на цифры, вставленные в div'ы или span'ы,
а отображается в блоке post_like_counter целиком.

Каким образом это реализовано? 
    


Ответы

Ответ 1



У вас вопрос построен на неверном предположении, что число не разбивается на цифры. А оно разбивается. Взгляните на DOM в момент перехода. Вот скриншот из Chrome Dev Tools посреди перехода из 13 в 14. counter_const для цифры 1, которая осталась неподвижной. классы counter_anim_* для цифр 3 и 4, участвующих в анимации. Как убедиться? Chrome Dev Tools это штука довольно продвинутая. Найдя элемент DOM, в котором должны произойти изменения, можно щёлкнуть на нём правой кнопкой мыши и установить на нём "Break on" > "Subtree modifications". Тогда любые изменения в этом поддереве приведут к останову всех процессов на странице и запуску JS-отладчика (хотя в данном случае это вторично).

пятница, 6 марта 2020 г.

Где можно найти документацию по VK Streaming API?

#vkontakte_api #вконтакте


С лета этого года ВКонтакте ужесточает лимиты на вызов методов newsfeed.search, wall.search
и wall.get и предлагает использовать их новый Streaming API для интерактивного получения
данных по этим методам, но нигде нет информации по использованию этого API. Кто знает
где можно почитать документацию по Streaming API (в разделе для разработчиков у них
пока ничего нет)?

Также интересуют данные по новым лимитам. Пока есть информация по количественному
ограничению вызова метода newsfeed.search (до 100.000 запросов в сутки) с 07.06.2017.
Кто-нибудь знает про другие ограничения?

Судя по новостям, разработчики VK планируют выпустить несколько версий Streaming
API (основную и "расширенную"). Кто знает чем они будут отличаться (сейчас есть только
информация, что "расширенная" версия будет выдавать "100% данных")?

Сама новость в Roadmap:
https://vk.com/dev/data_limits
    


Ответы

Ответ 1



Появилась документация по Streaming API: https://vk.com/dev/streaming_api_docs Но там реально жесть, в базовой версии максимальное количество запросов (правил), по которым поступают данные = 10 штук, в ответе выдается 1% от всей доступной информации (говоря русским языком не выдается практически ничего)). Также сервер должен держать постоянное соединение через WebSockets, которое сервер может произвольно разорвать по прошествии определенного времени (в общем, это весьма неудобно). Из текущего, с 21.06.2017 начинают действовать следующие ограничения по методам newsfeed.search, wall.search и wall.get: метод newsfeed.search можно вызывать не более 25000 раз в сутки; метод wall.search можно вызывать не более 2500 раз в сутки; метод wall.get можно вызывать не более 500000 раз в сутки. Из личной переписки с разработчиками стало ясно, что в итоге сильно урежут суточное количество запросов, будет гораздо ниже вышеуказанных. Пока не ясно, будут ли вводить review (ручную модерацию) приложений по типу instagram, но в свете "борьбы со злоупотреблениями обхода ограничений" мне это видится единственным реальным шагом со стороны разработчиков VK, чтобы эти "злоупотребления" прекратить.

понедельник, 24 февраля 2020 г.

Авторизация пользователя vk с помощью cURL (PHP)

#php #вконтакте #curl #авторизация


Добрый день.

Необходимо авторизировать пользователя vk с помощью PHP скрипта и библиотеки cURL. 
Были рассмотрены следующие решения:


https://forum.antichat.ru/threads/426901/
http://sauron.org.ua/post/938


На основе решений были составлены следующие скрипты.

Получение значений lg_h и ip_h (работает, получает):

$url = 'http://vk.com';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT
6.1)");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'content-type: application/x-www-form-urlencoded',
        'origin: http://vk.com',
        'referer: http://vk.com/',
));
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

$content = curl_exec($ch);

preg_match_all("/name=\"ip_h\" value=\"(.*?)\" \\//s", $content, $ip_h);
preg_match_all("/name=\"lg_h\" value=\"(.*?)\" \\//s", $content, $lg_h);


Отправка запроса авторизации вида:

http://login.vk.com/?
act=login&
role=al_frame&
_origin=http://vk.com&
ip_h=$ip_h&
lg_h=$lg_h&
email=&
pass=


Сам скрипт:

$url = 'http://login.vk.com/?act=login';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:42.0)
Gecko/20100101 Firefox/42.0");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_POST, true);

$data = array(
    'act' => 'login',
    'role' => 'al_frame',
    '_origin' => 'http://vk.com',
    'ip_h' => $ip_h[0][1][0],
    'lg_h' => $lg_h[0][1][0],
    'email' => '',
    'pass' => ''
);

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'content-type: application/x-www-form-urlencoded',
    'origin: http://vk.com',
    'referer: http://vk.com/',
));

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

curl_setopt($ch, CURLOPT_COOKIEJAR, '/home//Development/vk/cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, '/home//Development/vk/cookie.txt');

echo curl_exec($ch);


На выходе получаю следующее содержимое страницы:




В свою очередь куки принимают следующие значения:

Set-Cookie: remixmid=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com
Set-Cookie: remixsid=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com
Set-Cookie: remixsid6=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com
Set-Cookie: remixgid=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com
Set-Cookie: remixemail=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com
Set-Cookie: remixpass=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com
Set-Cookie: remixapi_sid=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/;
domain=.vk.com
Set-Cookie: remixpermit=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com
Set-Cookie: remixsslsid=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com


Смею предположить, что не удается передать значение email, т.к. в коде JS именно
на это и ошибка. При ручном составлении URL и перехода по нему — успешное возвращение
хэша и содержимое страницы следующее:




Авторизация проходит успешно. После доступен профиль пользователя.
    


Ответы

Ответ 1



Только что написал рабочий код авторизации во ВКонтакте — http://pastebin.com/5YecKuUs Только учтите, каптча не поддерживается, поэтому сами уже её добавьте. Тест успешно пройден на моём тестовом аккаунте ;)

Ответ 2



Есть рабочая библиотека для PHP, которая получает куку remixsid.

Ответ 3



По состоянию на июль 2018 это рабочий код. Авторизация через мобильную страницу т.к. проще. $email = "{ТЕЛЕФОН}"; $pass = "{ПАРОЛЬ}"; $auth_url = "https://m.vk.com"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $auth_url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); //файл для сохранения кукис - cookie.txt curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //получаем содержимое формы авторизации (URL атрибута action) $login_page = curl_exec($ch); curl_close($ch); //парсим страницу... $html = str_get_html($login_page); //..и узнаем урл авторизации (использовал библиотеку Simple PHP DOM Parser) $login_url = $html->find("form",0)->action; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $login_url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); //отправляем ПОСТ запрос curl_setopt($ch, CURLOPT_POST, 1); //следуем за редиректом curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); //данные запроса curl_setopt($ch, CURLOPT_POSTFIELDS, ["email"=>$email, "pass"=>$pass]); //СНАЧАЛА ЧИТАЕМ КУКИ полученные в первом запросе curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); //потом ДОБАВЛЯЕМ НОВЫЕ curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_exec($ch); curl_close($ch); //пользователь авторизован //далее тестируем $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://vk.com/groups?act=catalog"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); //только читаем куки curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $page = curl_exec($ch); curl_close($ch); //если ваш сервер работает на UTF-8, в отличие от VK (windows-1251) echo iconv('windows-1251','utf-8',$page);

Ответ 4



Попробуйте закодировать функцией urlencode

что VkNet - VkApi - проблема с заливанием картинки для MarketAlbum

#c_sharp #vkontakte_api #вконтакте


Есть простенький метод для заливания картинки под альбом Маркета в ВК:

private VkNet.Model.Attachments.Photo AttachPicToAlbum(string path)
{
    var uploadServer = VkApi.Photo.GetMarketAlbumUploadServer(_group.Id);

    var wc = new WebClient();
    var responseFile = Encoding.ASCII.GetString(wc.UploadFile(uploadServer.UploadUrl,
path));

    var response = VkApi.Photo.SaveMarketAlbumPhoto(_group.Id, responseFile);
    return response[0];
}


По факту response приходит пустым. 0 обьектов внути.

Url = "https://api.vk.com/method/photos.saveMarketAlbumPhoto?group_id=129372114&photo=eyJwaG90byI6IjEiLCJid2FjdCI6Im1hcmtldF9hbGJ1bSIsInNlcnZlciI6NjM3NzE5LCJtaWQiOjE5NDk4NDA2LCJfc2lnIjoiYzI4MmNmNzdkN2E2MDJjOTYzZTE5NjdlMzQ3MzlkODgifQ&server=999&hash=a7d3c00bf6f76b058f917dde50f26f77&v=5.53&access_token=472a2bc9170f98b701fb019a6c3e971ef3a72c79a1c045743b4e4776b391cf105b6269a65fe5d8d4b13cf";
            const string json =
                @"{
                    'response': []
                  }";


Точно такой же код у меня есть для атача картинок в сообщения. Там все работает.
А тут -- не пойму почему нет. =(
На всякий случай код атачча картинок

    private VkNet.Model.Attachments.Document AttachPicToMessage(string path)
    {
        var uploadServer = VkApi.Docs.GetUploadServer();

        var wc = new WebClient();
        var responseFile = Encoding.ASCII.GetString(wc.UploadFile(uploadServer.UploadUrl,
path));

        return VkApi.Docs.Save(responseFile, "png")[0];
    }


Ошибок никаких не выдает.

Есть ли у кого идеи?



Как подсказал RoboNoob есть бага:
https://vk.com/bugs?act=show&id=4717174_65
Но если бы это было через нее, то фикс был бы следующим: (редактирование кода самой
библиотеки):

    [ApiVersion("5.44")]
    public UploadServerInfo GetMarketAlbumUploadServer(long groupId)
    {
        var parameters = new VkParameters {
            { "group_id", groupId },
            { "https", 1 }// ДОБАВЛЕНА ДАННАЯ СТРОКА
        };

        return _vk.Call("photos.getMarketAlbumUploadServer", parameters);
    }


По факту фикс не сработал, проблема осталась как есть. Значит, делаю вывод что проблема
в другом.

Так же автор бага[и багфикса описаного] подтвердил что даная бага здесь не при чем.
    


Ответы

Ответ 1



В баг-трекере ВК есть информация о баге самого ВК по поводу заливания фоток на сервер по API https://vk.com/bugs?act=show&id=4717174_65

понедельник, 3 февраля 2020 г.

Получить видео VKontakte Api

#вконтакте #ios #vkontakte_api #видео


Привет всем) такая проблемка - не могу получить ссылку на видео.  Есть access_key,
vid, owner_id. Все это я получаю из newsfeed. Причем, на странице документации ВК,
если в поле для проверки запроса вписать просто owner_id, то без проблем выдает весь
список видеозаписей данного пользователя/группы, но если установить videos, то приходит
ответ типа

response: {
count: 1,
items: []
}

т.е., items - пустой. Причем я пробовал и с access_key и без него. 
Кто такое уже делал, подскажите, что у меня не так?    


Ответы

Ответ 1



Все, разобрался. В русской версии документации API неполное описание. Пользуйтесь английской версией!

Ответ 2



Обычно ВК не отдает прямой ссылки на видео Это потому-что используете заголовок запроса "User-Agent", если он пуст то тогда и будут прямые ссылки в files. Сделайте запрос типа: https://api.vk.com/method/video.get?videos=-53956136_169543800&access_token=%access_token% с пустым заголовком "User-Agent", выйдет: { 'response' : [1, { 'duration' : 1452, 'vid' : 169543800, 'views' : 4790, 'owner_id' : -53956136, 'player' : 'https://vk.com/video_ext.php?oid=-53956136&id=169543800&hash=06da65ec2f1a6d00', 'date' : 1408830421, 'link' : 'video-53956136_169543800', 'files' : { 'mp4_240' : 'https://cs543208.vk.me/u222975331/videos/fd8d6c3d4d.240.mp4?extra=d1xg726trlMQIwAZ4X8NTUJRI2kk-uw9TJ66bWZtq_odwiDxYverCALb8PNb_z-zjbPhvX07ftxnZRXZ-li8XiFKJZ_oEJnbrPVPqLrKUiFM9J1FfYFEEm3c5SfRXRDSSU29k7QTkS_7uTxg', 'mp4_720' : 'https://cs543208.vk.me/u222975331/videos/fd8d6c3d4d.720.mp4?extra=d1xg726trlMQIwAZ4X8NTUJRI2kk-uw9TJ66bWZtq_odwiDxYverCALb8PNb_z-zjbPhvX07ftxnZRXZ-li8XiFKJZ_oEJnbrPVPqLrKUiFM9J1FfYFEEm3c5SfRXRDSSU29k7QTkS_7uTxg', 'mp4_360' : 'https://cs543208.vk.me/u222975331/videos/fd8d6c3d4d.360.mp4?extra=d1xg726trlMQIwAZ4X8NTUJRI2kk-uw9TJ66bWZtq_odwiDxYverCALb8PNb_z-zjbPhvX07ftxnZRXZ-li8XiFKJZ_oEJnbrPVPqLrKUiFM9J1FfYFEEm3c5SfRXRDSSU29k7QTkS_7uTxg', 'mp4_480' : 'https://cs543208.vk.me/u222975331/videos/fd8d6c3d4d.480.mp4?extra=d1xg726trlMQIwAZ4X8NTUJRI2kk-uw9TJ66bWZtq_odwiDxYverCALb8PNb_z-zjbPhvX07ftxnZRXZ-li8XiFKJZ_oEJnbrPVPqLrKUiFM9J1FfYFEEm3c5SfRXRDSSU29k7QTkS_7uTxg' }, 'description' : 'Видео предоставлено группой [club53956136|AniZUR Аниме на любой вкус]

Следующая серия: http://vk.com/video-53956136_169543833', 'comments' : 5, 'title' : 'Hunter x Hunter Remake / Хантер x Хантер - 2 сезон 66 серия [Озвучка: Ancord]', 'image' : 'http://cs543208.vk.me/u222975331/video/m_1a4f8d0d.jpg', 'image_medium' : 'http://cs543208.vk.me/u222975331/video/l_7bbad3fc.jpg' } ] } Если нужен постоянный access_token(может быть опасно) вот: https://oauth.vk.com/authorize?client_id=3087106&scope=wall,offline&redirect_uri=http://api.vk.com/blank.html&display=page&response_type=token !Обновлено Новый ВК API теперь требует новый обязательный параметр: версию API: v=5.73(Актуальная на данный момент). И полная ссылка будет выглядеть примерно так: https://api.vk.com/method/video.get?videos=-53956136_169543800&access_token=%access_token%&v=5.73

Ответ 3



смотри, вот такой запрос: https://api.vk.com/method/video.get?v=5.12&videos=71057340_167884774_6e2f5cee5c04b2b898&access_token=myaccesstoken получаю такой ответ: { response = { count = 1; items = ( { comments = 4; date = 1395082963; description = "::::::\U0418\U041d\U0424\U041e\U0420\U041c\U0410\U0426\U0418\U041e\U041d\U041d\U0410\U042f \U0412\U041e\U0419\U041d\U0410:::::::\n:::::http://vkontakte.ru/club4121067:::::"; duration = 64; id = 167884774; "owner_id" = 71057340; "photo_130" = "http://cs540303.vk.me/u12911501/video/s_f1c9b9d6.jpg"; "photo_320" = "http://cs540303.vk.me/u12911501/video/l_074712cb.jpg"; player = "http://vk.com/video_ext.php?oid=71057340&id=167884774&hash=32fa35ec6b845a99"; title = "\U041e\U0442\U0434\U044b\U0445 \U0432 \U041a\U0440\U044b\U043c\U0443 - 2014 \U0423\U043a\U0440\U0430\U0438\U043d\U0430. "; views = 707; } ); }; } Обычно ВК не отдает прямой ссылки на видео, хотя иногда есть исключения (они в словаре files должны быть). В таком случае приходиться пользоваться ссылкой на плеер и открывать ее в браузере.

Ответ 4



Это потому-что используете заголовок запроса "User-Agent", если он пуст то тогда и будут прямые ссылки в files. На данный момент не работает. Доступ к секции "files" возможен лишь при авторизации как доверенное приложение, либо парсингом страницы https://vk.com/dev/video.get

Ответ 5



Возможно дело в owner_id видео. Параметр owner_id можно взять из данных newsfeed.get. То есть owner_id видео может отличаться от source_id поста, которому принадлежит видео, так как может быть перепост видео другой группой или пользователем.

пятница, 31 января 2020 г.

python загрузка файлов vk

#python #вконтакте #vkontakte_api


Подключил VK API. Необходимо сделать отправку файлов на сервер как о этом рассказано
на этой странице - http://vk.com/dev/upload_files
P.S. Загрузка файлов на стену пользователя

import vk
from time import sleep
import sys
import urllib.request
import urllib.parse
import base64
import requests

vkapi = vk.API(access_token='token', app_id='id')
sleep(0.5)

data = vkapi.photos.getWallUploadServer(user_id="72374405")
DATA_USER_ID = data['user_id']
DATA_ALBUM_ID = data['album_id']
DATA_UPLOAD_URL = data['upload_url']

#with open("1.jpg", "rb") as image_file:
    #fileD = base64.b64encode(image_file.read())


#files = {'1.jpg': open('1.jpg', 'rb')}
#r = requests.post(DATA_UPLOAD_URL, files=files)
#r.status_code == requests.codes.ok
#print(r)
#html = r.read().decode("utf-8")

#dataP = '1.jpg'
dataP = "photo=" + dataP#.encode("ASCII")
response = urllib.request.urlopen(DATA_UPLOAD_URL,dataP)
html = response.read().decode("utf-8")
print (html)


решеткой помечено то, что пробовал но не сработало, либо не подошло.

Вроде как корректно отработался вариант с 

files = {'1.jpg': open('1.jpg', 'rb')}
r = requests.post(DATA_UPLOAD_URL, files=files)
r.status_code == requests.codes.ok
print(r)
#html = r.read().decode("utf-8")


Однако в таком случае не работает вывод и тем самым я не могу понять, отработался
ли должным образом запрос.

В случае успешного завершения кода выхлоп таков: 

{"server":622624,"photo":"[]","hash":"8112ae8847b27fb1cdf678d3d168e6ae"}


То есть загрузка изображения провальная.

Может кто-либо смог или и так знает как загрузить файл на сервер ВК через POST на
Python3. Поделитесь опытом, советом, замечанием. Если что-то в коде непонятно - пишите;
отвечу.
    


Ответы

Ответ 1



Вот мой вариант размещения фотографии на стене сообщества от имени сообщества. Реализован алгоритм, описанный в официальной документации: # Импортируем необходимые модули import vk import requests # Задаём идентификатор группы, токен доступа, картинку и её описание group_id = 'my_group_id' access_token = 'my_access_token' filename = 'image.jpg' caption = 'Some text' # Авторизуемся в VK session = vk.Session(access_token=access_token) vk_api = vk.API(session) # Получаем адрес сервера для загрузки картинки upload_url = vk_api.photos.getWallUploadServer(group_id=group_id)['upload_url'] # Формируем данные параметров для сохранения картинки на сервере request = requests.post(upload_url, files={'photo': open(filename, "rb")}) params = {'server': request.json()['server'], 'photo': request.json()['photo'], 'hash': request.json()['hash'], 'group_id': group_id} # Сохраняем картинку на сервере и получаем её идентификатор photo_id = vk_api.photos.saveWallPhoto(**params)[0]['id'] # Формируем параметры для размещения картинки в группе и публикуем её params = {'attachments': photo_id, 'message': caption, 'owner_id': '-' + group_id, 'from_group': '1'} vk_api.wall.post(**params)

Ответ 2



Есть библиотека vk_api, у нее есть вспомогательный класс для загрузки файлов VkUpload, а у него есть нужный метод photo_wall. Добавляю пример использования (ссылка на полный скрипт с картинками): import vk_api from vk_api import VkUpload login, password = '', '' # Авторизация vk_session = vk_api.VkApi(login, password) vk_session.auth() upload = VkUpload(vk_session) # Для загрузки изображений # Загрузка картинок на сервера вк и получение их id photos = ['1.jpg', '2.jpg'] photo_list = upload.photo_wall(photos) attachment = ','.join('photo{owner_id}_{id}'.format(**item) for item in photo_list) # Добавление записи на стену vk_session.method("wall.post", { 'owner_id': None, # Посылаем себе на стену 'message': 'Test!', 'attachment': attachment, }) Вот так будет выглядеть запись на стене:

Ответ 3



Как-то разобрался :D import vk from time import sleep import sys import urllib.request import urllib.parse import base64 import requests import json vkapi = vk.API(access_token='token', app_id='app_id') sleep(0.5) data = vkapi.photos.getWallUploadServer(user_id="72374405") DATA_USER_ID = data['user_id'] DATA_ALBUM_ID = data['album_id'] DATA_UPLOAD_URL = data['upload_url'] r = requests.post(DATA_UPLOAD_URL, files={'photo': open('1.jpg',"rb")}) r.status_code == requests.codes.ok params = {'server': r.json()['server'], 'photo': r.json()['photo'], 'hash': r.json()['hash']} wallphoto = vkapi.photos.saveWallPhoto(**params) #attachments.append(wallphoto[0]['id']) photoID = wallphoto[0]['id'] params = {'attachments': 'photo' + '72374405_' + str(photoID), 'message': 'Test'} params['owner_id'] = '72374405' print(params) vkapi.wall.post(**params) Позже уже буду разбираться во всем этом коде и делать его более читаемым. Главное что он сейчас работает :)

Vkontakte API ошибка: error: invalid_client, error_description; client_id is incorrect

#android #вконтакте


Делаю авторизацию в вк по этому видео.

Постоянно выскакивает


  {error: invalid_client, error_description; client_id is incorrect}


На устройстве имеется официальный вк клиент. Там я авторизирован. Пробовал удалить
его - то же самое. 
Когда записал этот официальный клиент снова, там я уже не был авторизирован. При
этом в моем приложении тоже выплыло окно авторизации. 
Когда же авторизировался в офиц клиенте, то в моем приложении появилась та же ошибка.
    


Ответы

Ответ 1



Всем, у кого возникает проблема error invalid_client error_description client_id is incorrect, необходимо добавить в манифест в тег строку android:name=".ClassName ", где ClassName – название класса, который вы унаследовали от android.app.Application и в одном из методов которого происходит вызов VKSdk.initialize();

Ответ 2



У меня была такая проблема, потому что я не удалил двоеточия в sha1 ключе, когда регистрировал приложение в панели разработчика в vk.

воскресенье, 26 января 2020 г.

Как правильно использовать VK api?

#веб_программирование #ajax #вконтакте #javascript


Сразу хочу отметить, что являюсь разработчиком в другой, отличной от веба сфере,
поэтому мне могут быть неизвестны/непонятны некоторые базовые аспекты программирования
веб-приложений. Веб для меня непаханное поле.
Стоит задача:
Есть некоторый альбом в группе ВК, в котором пользователи группы размещают фотографии
и картинки. Надо каким бы то ни было образом отобрать/отобразить/дать ссылки на худой
конец на те фото, которые загрузили люди из определенного города (указанного в анкете
автора фото).
Вопрос:
Каким образом и какими средствами можно реализовать? Можно ли тупо исполнить код
в адресной строке, заюзав VK api и JS. Как мне видится, надо собрать данные на Клиенте,
обратится на Сервер, потом вернуть данные с Сервера на Клиент и обработать. Или можно
как-то иначе? 
Поделитесь, кто что знает, у кого какие соображения по данной задаче... Если у кого
есть мало-мальские примеры или еще что, буду рад.    


Ответы

Ответ 1



Всё можно и нужно делать на клиенте, если используется тип приложения Standalone. Я вижу решение задачи следующим образом: Получить список альбомов и определить ID по которому искать фотографии (метод photos.getAlbums) Получить и отфильтровать изображения, с определением ID пользователя, загрузившего изображение (метод photos.getAll) Получить информацию о местонахождении пользователя по его ID (метод users.get) Как завершающее действие - обработать все массивы данных и сформировать итоговый массив, содержащий нужную информацию. Следует обратить внимание на количество запросов, которое может делать приложение. Стоит ввести задержку при исполнении запросов. Как создать своё приложение можно найти на страницах документации. Ну и писать это всё на JavaScript.

пятница, 24 января 2020 г.

Вызов метода messages.removeChatUser - VK Android SDK

#android #android_sdk #vkontakte_api #вконтакте #запрос


В VK API существует такой метод как messages.removeChatUser, позволяющий как исключить
пользователя из беседы, так и покинуть беседу самому. Не могу разобраться, как сделать
запрос к этому методу.
Я начинаю запрос таким образом:

VKRequest request = VKApi.messages().


но после точки есть лишь часть методов и нет removeChatUser. На скриншотах видно,
что в wall их достаточно много, а в messages многие методы отсутствуют. Или я что-то
делаю не так?




Я также пытался сделать запрос к методу следующим образом:

VKRequest request = new VKRequest("messages.removeChatUser", VKParameters.from("chat_id",
2, "user_id", мой id));


Но, кажется, такой способ тоже не прошёл.
Помогите сделать запрос к vk.com/dev/messages/removeChatUser.
    


Ответы

Ответ 1



Может быть "капитаню", но первым делом нужно проверить есть ли доступ "Для вызова этого метода Ваше приложение должно иметь права: messages". Часть методов не реализованы в VK SDK Andoid, поэтому для их вызова необходимо делать запросы. Запрос у вас написан правильно. Пришлите код ошибки, который вам приходит

четверг, 23 января 2020 г.

ВКонтакте доступ к jQuery из UserJS

#javascript #вконтакте #userjs


Если открыть консоль браузера на странице ВКонтакте, то введя  

$


увидим в выводе объект jQuery, но если внедрить на страницу UserScript:  

function append() {
    console.log( $ );
};

window.setInterval( append, 1000 );


то ровно раз в секунду в консоль будет падать ошибка undefined.
В каком пространстве имен искать jQuery и как вообще такое может быть, ведь UserScript
исполняется в глобальном контексте и в том же контексте происходит работа, если напрямую
вводить команды в консоль ?
    


Ответы

Ответ 1



Команды из консоли выполняются в контексте window + доступно API самого браузера. То, что вы видите, это ссылка на один из методов API браузера. Подробно с API системой вы можете познакомиться в документации соответствующего браузера. Сам сайт ВКонтакте не использует в своей работе библиотеку jQuery.

Ответ 2



Возможно, не подключена jQuery, подключите сами: // @require https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js

WebView и получение токена

#android #java #webview #вконтакте #vkontakte_api


Здравствуйте, уважаемые знатоки! Наверное, у меня глупый вопрос, но все же.
Я пытаюсь в андроид-приложении прикрутить авторизацию Вконтакте с помощью WebView.
Мне нужно, чтобы при запуске приложения запускалась активити с WebView, где пользоавтель
мог ввести логин, пароль и после чего получить токен. 
Я делаю так: 
public class LoginActivity extends Activity {

    WebView webview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        webview = (WebView) findViewById(R.id.loginWebView);
        webview.getSettings().setJavaScriptEnabled(true);
        webview.clearCache(true);

        webview.setWebViewClient(new WebViewClient());
        CookieSyncManager.createInstance(this);

        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.removeAllCookie();

        String url = "https://oauth.vk.com/authorize?client_id=123&scope=65544"; 
        webview.loadUrl(url);
    }   
}

В итоге открывается активити, на ней WebView отображает диалог авторизации вконтакте.
А вот что делать дальше, я не знаю. ( Как получить этот токен из вебвью?    


Ответы

Ответ 1



@JuniorTwo, тебе нужно для своего WebView установить WebViewClient. У него есть метод-callback onPageStarted (WebView view, String url, Bitmap favicon). Как видишь, вторым параметром придёт ссылка, в которой будет указан токен. А вот выдрать токен из строки - это уже твоя задача. Сам URL будет типа http://REDIRECT_URI#access_token= 533bacf01e11f55b536a565b57531ad114461ae8736d6506a3&expires_in=86400&user_id=8492

VK SDK Серверные методы API как вызывать?

#java #android #c_sharp #вконтакте #windows_phone_8


Добрый вечер)
Пишу небольшое приложение с использованием VK SDK. Необходимы серверные методы API
secure.* (например secure.sendNotification). Для их вызова нужно получать другой token
с помощью специальной схемы, которая плохо описана в документации. 

'https://oauth.vk.com/access_token?client_id=' + CLIENT_ID + '&client_secret=' +
CLIENT_SECRET + '&v=5.50&grant_type=client_credentials'


где я вставляю свой client_id и client_secret. Только не знаю, как вызвать этот запрос
и получить обратно токен, чтобы его использовать в методах secure.* .

Может быть кто-то знает, как это сделать? Можно пример и на java и на C#.
    


Ответы

Ответ 1



Вот рабочий пример на Java с помощью либы OkHttp: Thread thread = new Thread() { @Override public void run() { try { OkHttpClient client = new OkHttpClient.Builder().build(); Request.Builder request = new Request.Builder(); String CLIENT_ID = "Цифры тут из настроек приложения в ВК"; String CLIENT_SECRET = "Секретный код из настроек приложения в ВК"; request.url("https://oauth.vk.com/access_token?client_id=" + CLIENT_ID + "&client_secret=" + CLIENT_SECRET + "&v=5.50&grant_type=client_credentials"); Response response = client.newCall(request.build()).execute(); String answer = response.body().string(); Log.e("LOG", answer); } catch (IOException e) { e.printStackTrace(); } } }; thread.start(); Выведет это: {"access_token":"sdfsdfsdfsdfsdf8sdfsdfsdfsdfsdfsdfsdf","expires_in":0} Так что вам надо лишь прочитать ответ ВК на ваш запрос. Вот тут есть ещё примеры Java кода по вытаскиванию инфы из ответа, получаемого по URL: тык Собственно, эту же строку-ответ ВК вы можете увидеть и просто вбив получившийся адрес в браузер.

Проблема с валидацией действий через VK API 5.0

#php #vkontakte_api #вконтакте


Здравствуйте, возникла проблема с валидацией действий через ВКонтакте. 
Дело в том, что  начиная с версии API 5.0 ввели новый метод валидации (ранее была
CAPTCHA, с которой отлично работалось).

Слегка не понял момент в документации:


  redirect_uri — специально составленный адрес, который необходимо открыть в браузере
для прохождения процедуры валидации.


Открыть его нужно со стороны пользователя, или со стороны сервера? Я попробовал оба
варианта. Получил ссылку, к примеру: 


  https://m.vk.com/login?act=security_check&api_hash=0449ff3ed0d1dc11


Перехожу на неё в браузере — всё как в документации, получаю после редиректа ссылку:


  https://oauth.vk.com/blank.html#success=1&access_token=мойтокен


Причём, токен не отличается от того, что был до этого, хотя в документации идёт речь
о новом токене. Но так или иначе, получили success=1, значит, всё должно работать?
Пробую вновь отправить запрос — аналогичная ситуация: возвращает ошибку и требует валидацию
пройти. 

Я уже попробовал и с сайта через file_get_contents+$_REQUEST получить запрос — ВК
не вернул ничего, хотя судя по документации "пользователь" сам открывает ссылку в браузере. 

Уже всё перепробовал раз 5. Отписал в поддержку социальной сети также, но возможно
я уже где-то ошибаюсь и кто-то встречался с этим. Заранее спасибо за ответы.

UPD:  Что странно, что ссылку в redirect_uri передает через мобильную версию, т.е.
через m.vk.com, хотя в документации просто через vk.com, и при попытке убрать с redirect_uri
m. и оставить ссылку формата vk.com, после того, как пытаешься перейти по ней в браузере
— попадаю на страницу ВКонтакте. 

Для отправки запроса использую file_get_contents, а не cURL. Попробую сейчас cURL.

UPD: Попробовал, никаких изменений: также m.vk.com. Скорее всего дело и не в этом. Код:

function callMethod($request, $params) {

    $c=curl_init();
    curl_setopt($c, CURLOPT_URL, $request);
    curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($c, CURLOPT_POST, true);
    curl_setopt($c, CURLOPT_POSTFIELDS, $params);
    curl_setopt($c, CURLOPT_CONNECTTIMEOUT, 10);
    curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0)
Gecko/20100101 Firefox/49.0');
    curl_setopt($c, CURLOPT_TIMEOUT, 30);
    curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
    $result = curl_exec($c);

    if($result === false) {
        $result = curl_error($c);
    }
    curl_close($c);

    return $result;
}


UPD: Проблема всё ещё не решена: от ВК нет ответа :(
Возможно найдется добрая душа, которая сделает вопрос конкурсным? У меня не хватает
репутации для минимального порога.
    


Ответы

Ответ 1



Была точно такая же проблема. ВК выдаёт такую ошибку, когда вы заходите из нового необычного места, и надо открывать ту ссылку именно из того места. Например, когда вы используете прокси и пытаетесь зайти в вк, то он попросит Вас подтвердить номер. Получается что мы получили токен с одного ip адреса (со стороны сервера), а использовать его пытаемся со стороны пользователя, у которого другой ip адрес. Я писал в тех. поддержку, увы ничем они не помогают: Ошибка появляется в двух случаях — либо если ip-адрес является «неожиданным» для того аккаунта, с которого ведется работа (собственно, поэтому ошибка и называется «вход из подозрительного места»), либо если речь идет о попытке использовать на сервере токен, который получен в клиентском приложении по схеме vk.com/dev/auth_mobile То есть теоретически когда мы делаем запрос повторно, вк просит подтвердить номер, но как это сделать с помощью API не понятно. Я решил проблему двумя путями: путем перевода приложения из стэндэлон в веб-сайт. использовал это - https://github.com/Yashko/vk-validation-node

среда, 22 января 2020 г.

Как правильно отвечать на запрос Captcha?

#php #vkontakte_api #вконтакте #captcha


Как правильно отвечать на запрос капчи?

error;

if(isset($_POST['enter_key']))
{
    $wall1 = file_get_contents("https://api.vk.com/method/users.get?captcha_sid=".$wall->captcha_sid."&captcha_key=".$key."&access_token=".$token);
    print_r($wall1);
}

?>
captcha_img."'>";?>
Я отправляю запрос users.get — в ответ получаю ошибку капчи. Потом отправляю запрос users.get + captcha_sid и captcha_key — в ответ приходит ошибка капчи и запрос опять ввести капчу. Вот пример: http://nicolaa.h1n.ru/1.php .


Ответы

Ответ 1



При отправке капчи вы запрашиваете новую капчу и зачем-то передаете её sid. То есть вы берете новый свежесгенерированный sid и передаете вместе с ним решение старой капчи (у которой другой sid). В принципе, я думаю, это единственная дырка в логике вашего скрипта. Но сама по себе ваша реализация ужасна: лишний запрос к API, неразборчивый код. Разумнее переписать его примерно так: $token, 'v' => '5.67' ]; // Если страницу открыли после отправки формы решения капчи, // то добавляем соответствующие параметры к запросу if (!empty($_POST['captcha_sid']) && !empty($_POST['captcha_key'])) { $parameters['captcha_sid'] = $_POST['captcha_sid']; $parameters['captcha_key'] = $_POST['captcha_key']; } $request = file_get_contents('https://api.vk.com/method/users.get?'.http_build_query($parameters)); $response = json_decode($request); // Если ВК вернул ошибку с капчей, то // показываем форму решения капчи if (isset($response->error->captcha_img)) { echo 'Captcha'; echo '
'; echo ''; echo ''; echo ''; echo '
'; }

воскресенье, 12 января 2020 г.

как получить по id vk имя и фамилию

#java #android #vkontakte_api #вконтакте


Получил user_id, но не знаю как по нему получить имя и фамилию пользователя

request.executeWithListener(new VKRequest.VKRequestListener() {
    @Override
    public void onComplete(VKResponse response) {
        super.onComplete(response);

        VKApiGetDialogResponse getDialogResponse = ((VKApiGetDialogResponse)response.parsedModel);
        final  VKList list= getDialogResponse.items;

        ArrayList messages = new ArrayList<>();
        ArrayList users = new ArrayList<>();
        for (VKApiDialog msg : list){

            users.add(String.valueOf(msg.message.user_id));
            messages.add(msg.message.body);
        }
        listView.setAdapter(new CustomAdapter(MainActivity.this,users,messages,list));
    }
});

    


Ответы

Ответ 1



Выполняете запрос users.get, в котором передаете id пользователя и получаете список результатов из которого выбираете первый.

пятница, 10 января 2020 г.

Постоянный токен vk api

#vkontakte_api #вконтакте


Здравствуйте!
Вот пишу приложение, работающее с vk api, и столкнулся с такой проблемой, что нужно
сделать в приложении авторизацию с получением токена (пока просто подставляю уже готовый
токен).
Собственно вопрос:
Обычно токены действуют 24 часа, после чего их снова надо менять. А можно ли получить
токен на более продолжительный срок, чтобы не было необходимости каждый день делать
новую авторизацию? По крайней мере другие приложения, работающие с vk api не требуют
ежедневной авторизации, а где-то хранят данные об авторизации. Как это организовано?     


Ответы

Ответ 1



В права доступа нужно добавить "offline" при получении токена для приложения и тогда, как говорит документация VKapi, "возможен доступ к API в любое время со стороннего сервера и токен является бессрочным "

Ответ 2



Для получения неограниченного по времени токена достаточно при авторизации добавить в scope значение offline. Пример: https://oauth.vk.com/authorize?client_id={ID приложения}&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=notifications,offline&response_type=token&v=5.52

воскресенье, 29 декабря 2019 г.

Авторизация Вконтакте не работает

#вконтакте #vkontakte_api




    aaa

    
".$obj['error'].":".$obj['error_description'].$obj['access_token']); echo("

code:".$_SESSION['code']); ?> Вот, это мой код для авторизации Вконтакте, я запрашиваю ключ, гет запросом его мне возвращают. Всё верно, ключ видно, всё работает. После этого я делаю запрос с ключем(джейсон) с целью получить токен. В случае если токен есть выводится токен на экран, если его нет выводится сообщение об ошибке. У меня не разу за весь день не получилось подцепить токен. Выдаёт следующее: invalid_grant:Code is invalid or expired. Что делать подскажите. Всё АПИ настроено, сайт зареган, секретный ключ получен. Что не так? Не понимаю


Ответы

Ответ 1



top.location.href='" . $dialog_url . "'"); } else { $token_url = 'https://api.vkontakte.ru/oauth/access_token?client_id='.$app_id.'&client_secret='.$app_secret.'&code='.$code.''; $params = json_decode(@file_get_contents($token_url)); print_r($params); $graph_url = 'https://api.vkontakte.ru/method/getProfiles?uid='.$params->user_id.'&access_token='.$params->access_token.'&fields=photo,nickname'; $user = json_decode(@file_get_contents($graph_url)); $userResponse = $user->response[0]; if ($userResponse->uid != '') { print_r($userResponse); echo ('Вы успешно авторизованны через вКонтакте'); } else echo('Ошибки авторизации!'); } ?>

Ответ 2



Не работает redirect_uri - который указываешь в приложении и в самом скрипте - адрес сайта - всё остаётся ответом на стороне вконтакте.