Продолжаем разбираться с API ВКонтакте. За время, прошедшее с последней публикации на эту тему, пообщался с несколькими людьми по поводу работы как API Vk в общем, так и использования REST Client Library в Delphi в частности. Простенькие вопросы типа проблем с кодировками текста в сообщениях решились на форуме или в комментариях к статьям. Один вопрос остался на данный момент открытым и именно его сегодня и рассмотрим, а именно: как скачать музыку ВКонтакте? В принципе, вопрос достаточно актуальный, одновременно, интересный. Для порядка рассмотрим весь процесс работы с аудио-записями в ВК, начиная с получения списка альбомов пользователя до загрузки и проигрывания отдельных композиций. Итак, вооружаемся Delphi XE5/XE7 c REST Client Library, документацией к API и начинаем работу.
Так как это уже третья статья на тему использования API ВКонтакте, то здесь я не буду рассказывать про то, как авторизовать пользователя VK, а просто дам ссылку на статью где про это рассказывается — вот она. Отмечу только, что
Для разнообразия, сегодня в работе я буду использовать VCL. Итак, авторизация в ВК прошла успешно, у вас в руках токен доступа к данным пользователя с правом доступа к аудиозаписям. Что дальше? Дальше открываем список методов API и смотрим на методы в разделе «Аудиозаписи». В этом разделе находятся методы, которые и пригодятся нам для того, чтобы скачать музыку из ВКонтакте.
Получение списка альбомов пользователя
Для начала научимся читать список альбомов, которые пользователь создал у себя в аккаунте. Для этого мы должны использовать метод audio.getAlbums, который имеет следующие параметры:
- owner_id (целое число) — идентификатор пользователя или сообщества, у которого необходимо получить список альбомов с аудио. По умолчанию будет равен идентификатору текущего пользователя.
- offset (целое положительное число) — смещение, необходимое для выборки определенного подмножества альбомов.
- count (целое положительное число) — количество альбомов, которое необходимо вернуть. По умолчанию — 50, максимально — 100.
В результате запроса сервер вернет нам массив элементов, каждый из которых будет представлять из себя один альбом пользователя. Сам объект альбома содержит всего три параметра:
- id — идентификатор альбома;
- owner_id — идентификатор владельца альбома;
- title — название альбома.
Теперь посмотрим как запросить список альбомов пользователя в Delphi. У меня в приложении компоненты REST Client Library вынесены в отдельный TDataModule:
В этом же модуле содержится метод получения списка альбомов, который выглядит следующим образом:
const API_VERSION = '5.25'; function TAPI.Album_Get(AOwnerID: cardinal): TJSONObject; begin Result:=nil; VKRequest.Resource:='audio.getAlbums'; VKRequest.Method:=TRESTRequestMethod.rmGET; VKRequest.Params.Clear; with VKRequest.Params.AddItem do begin name:='v'; Value:=API_VERSION; Options:=[poDoNotEncode]; end; with VKRequest.Params.AddItem do begin name:='count'; Value:='100'; Options:=[poDoNotEncode]; end; VKRequest.Execute; if VKRequest.Response.StatusCode=200 then Result:=VKResponse.JSONValue as TJSONObject else raise Exception.Create(VKResponse.ErrorMessage); end;
Этот метод написан в качестве примера и не учитывает то, что пользователи бывают всякие, а именно то, что у пользователя может быть и 1 и 10 и 200 альбомов. Максимум, что я получу из аккаунта — это 100 альбомов. Теперь надо разобрать полученный ответ. Смотрим, что нам вернет сервер:
С использованием нынешних возможностей Delphi разобрать такой JSON-объект — дело пяти минут. Пусть у нас в программе каждый альбом храниться в отдельном объекте, имеющем следующее описание:
TVKAlbum = class private FID: cardinal; FOwnerID: cardinal; FTitle: string; public constructor Create(AJSONObject: TJSONObject); destructor Destroy;override; procedure Parse(AJSONObject: TJSONObject); property ID: cardinal read FID; property OwnerID: cardinal read FOwnerID; property Title: string read FTitle; end;
В метод Parse будет передаваться JSON-объект с описанием альбома, а сам метод будет выглядеть следующим образом:
procedure TVKAlbum.Parse(AJSONObject: TJSONObject); const cPairs: array [0..2]of string = ('id','owner_id','title'); var Enums: TJSONPairEnumerator; begin if not Assigned(AJSONObject) then Exit; Enums:=AJSONObject.GetEnumerator; try while Enums.MoveNext do begin case StrIndex(Enums.Current.JsonString.Value,cPairs) of 0:Fid:=TJSONNumber(Enums.Current.JsonValue).AsInt64;//'id' 1:FOwnerId:=TJSONNumber(Enums.Current.JsonValue).AsInt64;//'owner_id' 2:FTitle:=Enums.Current.JsonValue.Value;//'title' end; end; finally Enums.Free; end; end;
То есть здесь я вначале получаю перечислитель всех пар в JSON-объекте (Enums: TJSONPairEnumerator), а затем прохожу по каждой паре, определяю её индекс в массиве cPairs и, в зависимости от полученного значения заполняю уже поля Delphi-объекта.
Почему так «сложно»? В принципе, т.к. мы знаем перечень пар, которые содержит JSON-объект альбома, мы могли бы обойтись и без перечислителя, выполняя что-то типа:
FId:=AJSONObject.Get('id').Value;
И этот код прекрасно бы работал в текущей версии API. Но, имея некоторый опыт работы с различными API онлайн-сервисов, в последнее время я использую перечислители полей и константы-массивы по той простой причине, что в любой момент и название пар в JSON-объекта и их количество может измениться, причем значительно (достаточно посмотреть на перечень изменений в API Vk). В итоге, если API меняется и, например, пара идентификатора альбома станет называться album_id , то на строке:
FId:=AJSONObject.Get('id').Value;
мы получим законный AV, избежать который мы можем, используя конструкции if…then, каждый раз проверяя есть ли пара в объекте или нет. Если пар в JSON много, то мы просто устанем при каждом серьезном изменении API читать нагромождения if’ов, а потом добавлять ещё и новые. А код функции выше изменяется просто — добавляем новый элемент массива, дописываем нужные значения в case..of и все работает как надо.
Итак, как разбирать JSON-объект альбома разобрались. Для тех, кто теряется в JSON поясню картинкой. Сейчас мы научились читать вот эту часть ответа сервера:
Добраться до массива «items», до массива items в JSON можно, например, так:
var JArray: TJSONArray; JValue: TJSONValue; I: Integer; A: TVKAlbum; begin if not Assigned(AJSON) then Exit; JValue:=AJSON.GetValue('response');//в этой строке вы можете получить ошибку, т.к. метод GetValue появился в Delphi XE6 if not Assigned(JValue) then Exit; //получили ответ? JArray:=(JValue as TJSONObject).Values['items'] as TJSONArray;//нашли массив {проходим по каждому элементы и создаем объекта альбомов} for I := 0 to JArray.Count-1 do begin A:=TVKAlbum.Create(TJSONObject(JArray.Items[i])); {заносим объект в список, массив и т.д.} end; end;
Получив список альбомов мы сможем в своей программе мы можем запрашивать аудиозаписи из конкретного альбома. Посмотрим как получаются аудиозаписи из ВК.
Получение списка аудиозаписей пользователя
Для получения списка аудиозаписей пользователя мы должны использовать метод audio.get. Этот метод имеет следующие параметры:
- owner_id (целое число) — идентификатор владельца аудиозаписей (пользователь или сообщество)
- album_id (целое число) — идентификатор альбома с аудиозаписями
- audio_ids (список положительных чисел, разделенных запятыми) — идентификаторы аудиозаписей, информацию о которых необходимо вернуть
- need_user (1 или 0) — 1 — возвращать информацию о пользователях, загрузивших аудиозапись
- offset (положительное число) — смещение, необходимое для выборки определенного количества аудиозаписей. По умолчанию — 0.
- count (положительное число)- количество аудиозаписей, информацию о которых необходимо вернуть. Максимальное значение — 6000.
Здесь сразу стоит прояснить некоторые моменты по работе метода, чтобы в будущем не получить «сюрприз».
Во-первых, ни один из параметров метода не является обязательным. Если отправить на сервер запрос без параметров, то сервер попытается вернуть вам весь список аудиозаписей текущего пользователя, начиная с самой первой записи.
Во-вторых, метод имеет ограничение — 6000 записей максимум. Это значит, что как бы вы не старались и что бы не предпринимали, сервер может вам вернуть только список из первых 6000 записей. Если вы захотите получить 6001-й элемент списка и установите такие параметры запроса:
- count=1
- offset = 6000
то сервер вам вернет пустой массив. Вот такое неприятное для нас ограничение. Но с этим ничего не поделаешь. Теперь как реализовать работу с аудиозаписями пользователя ВК в Delphi. Получение списка аудиозаписей ничем принципиально не отличается от получения альбомов, т.е. метод фактически 1 в 1 повторяет Album_Get (конечно же для примера — в реальном приложении такого жесткого копипаста лучше избегать):
function TAPI.Audio_Get(AOwnerID: cardinal): TJSONObject; begin Result:=nil; VKRequest.Resource:='audio.get'; VKRequest.Method:=TRESTRequestMethod.rmPOST; VKRequest.Params.Clear; with VKRequest.Params.AddItem do begin name:='v'; Value:=API_VERSION; Options:=[poDoNotEncode]; end; with VKRequest.Params.AddItem do begin name:='owner_id'; Value:=AOwnerID.ToString; Options:=[poDoNotEncode]; end; VKRequest.Execute; if VKRequest.Response.StatusCode=200 then Result:=VKResponse.JSONValue as TJSONObject; end;
Возвращаемый сервером JSON-объект выглядит точно так же как и предыдущий, т.е. содержит пары «response», «items» и т.д., но только в массиве уже содержатся JSON-объекты аудиозаписей. Выглядит ответ сервера вот так:
Каждый JSON-объект аудиозаписи содержит следующие пары:
- id — идентификатор аудиозаписи
- owner_id — идентификатор владельца аудиозаписи
- artist — исполнитель
- title — название композиции
- duration — длительность аудиозаписи в секундах
- url — ссылка на mp3
- lyrics_id — идентификатор текста аудиозаписи
- album_id — идентификатор альбома, в котором находится аудиозапись (если присвоен)
- genre_id — идентификатор жанра из списка аудио жанров.
Как видите, в этом объекте есть всё, что нам необходимо — прямая ссылка на mp3-файл, название, исполнитель и т.д. Объект в Delphi можно определить такой:
type TVKAudio = class private Fid: cardinal; FOwnerId: cardinal; FArtist: string; FTitle: string; FDuration: cardinal; FUrl: string; FLyricsId: cardinal; FAlbumId: cardinal; FGenreId: word; public constructor Create(AJSONObject: TJSONObject); destructor Destroy;override; procedure Parse(AJSONObject: TJSONObject); property id: cardinal read FId; property OwnerId: cardinal read FOwnerId; property Artist: string read FArtist; property Title: string read FTitle; property Duration: cardinal read FDuration; property Url: string read FURL; property LyricsId: cardinal read FLyricsId; property AlbumId: cardinal read FAlbumId; property GenreId: word read FGenreId; end;
Соответственно, метод Parse может быть таким:
procedure TVKAudio.Parse(AJSONObject: TJSONObject); const cPairs: array [0..8]of string = ('id','owner_id','artist','title','duration','url','lyrics_id','album_id','genre_id'); var Enums: TJSONPairEnumerator; begin if not Assigned(AJSONObject) then Exit; Enums:=AJSONObject.GetEnumerator; try while Enums.MoveNext do begin case StrIndex(Enums.Current.JsonString.Value,cPairs) of 0:Fid:=TJSONNumber(Enums.Current.JsonValue).AsInt64;//'id' 1:FOwnerId:=TJSONNumber(Enums.Current.JsonValue).AsInt64;//'owner_id' 2:FArtist:=Enums.Current.JsonValue.Value;//'artist' 3:FTitle:=Enums.Current.JsonValue.Value;//'title' 4:FDuration:=TJSONNumber(Enums.Current.JsonValue).AsInt;//'duration' 5:FUrl:=Enums.Current.JsonValue.Value;//'url' 6:FLyricsId:=TJSONNumber(Enums.Current.JsonValue).AsInt;//'lyrics_id' 7:FAlbumId:=TJSONNumber(Enums.Current.JsonValue).AsInt;//'album_id' 8:FGenreId:=TJSONNumber(Enums.Current.JsonValue).AsInt;//'genre_id' end; end; finally Enums.Free; end; end;
Опять же как хранить список объектов аудиозаписей — личное дело каждого, а мы двигаемся далее.
Как скачать музыку ВКонтакте?
Думаю, что после того как мы получили список всех аудиозаписей пользователя и разобрали его по отдельным элементам вопроса о том как скачать песню из ВК возникнуть не должно. Есть прямая ссылка на mp3, есть Delphi. В Delphi есть Indy с компонентом idHTTP — берем компонент, выполняем метод GET на URL mp3-файла в ВК и сохраняем ответ в файл с расширением .mp3. Всё. Более мне добавить тут нечего.
Как слушать музыку из ВКонтакте в своей программе?
А вот этот вопрос уже по-интереснее. Можно, конечно, сохранять сначала музыку из VK на диск, а потом открывать в проигрывателе, но это не наш метод — лучше играть сразу с сервера. Как можно реализовать потоковое воспроизведение аудио в Delphi?
Хорошую наводку на решение дал автор блога devdelphi.ru — использовать библиотеку BASS. По ссылке находится небольшая статья на тему реализации интернет-радио с использованием bass.dll. Здесь я не буду копипастить код с другого блога, просто скажу, что точно таким же способом, как рассказано в статье, можно реализовать и проигрывание музыки из ВКонтакте. Лучше приведу полезные ссылки, которые могут вам пригодиться:
- Официальный сайт библиотеки BASS. Здесь вы найдете как саму bass.dll, так и готовые модули Delphi для работы с библиотекой
- BASS Simple. Сайт для тех кому BASS «из коробки» покажется сложным. Здесь автор разрабатывал свои собственные классы для удобной работы с bass.dll. Довольно интересные решения для работы с bass.dll
Заключение
Сегодня мы научились получать список аудиозаписей пользователя ВКонтакте и рассмотрели вопросы, касающиеся скачивания музыки из ВК и её потокового воспроизведения в Delphi. У API есть ограничение по количеству запрашиваемых записей, но с этим пока ничего не поделаешь. Теперь можете начинать свои «качалки» музычки из ВКонтактика.
Будут вопросы — пишите. Постараюсь ответить.
[…] REST Client Library: использование API ВКонтакте #3 […]
Здравствуйте, прошу помочь) уже 4 дня не могу сделать Ютуб аплодер по REST.
https://developers.google.com/youtube/v3/docs/videos/insert
вот тут не знаю как эти параметры передать:(
Заранее ОГРОМНОЕ СПАСИБО!
Здравствуйте!
Есть ли эта библиотека под лазарус? Если нет то, что посоветуете для лазаруса попроще.
Под лазарус — не знаю, т.к. давно с ним не работал. Я бы Synapse в нем использовал для HTTP.
StrIndex — в каком юните описана данная функция?
function StrIndex(const AStr: string; AStrArray: array of string): integer;
var I: Integer;
begin
Result:=-1;
for I := Low(AStrArray) to High(AStrArray) do
if SameText(AStr, AStrArray[i]) then
Exit(I)
end;
Чво то не выходит каменный цветок….не подскажете, какое значение должна получить переменная на этом этапе?
Result:=VKResponse.JSONValue as TJSONObject;
У меня почему-то получает значение true.
Павел Буньков, а у вас точно написано
Result:=VKResponse.JSONValue AS TJSONObject;
а не
Result:=VKResponse.JSONValue IS TJSONObject;
Потому как при использовании AS ну никаким боком True не выходит
Благодарю за скорый ответ (3 день попыток пошел):)
Result:=RESTResponse1.JSONValue as TJSONObject;
это CTRL+V=CTRL+C строки из проекта
вот собственно скрин: https://yadi.sk/i/-CpKLFXVfAbbz
P.S. Заранее извиняюсь и честно Вам признаюсь, до конца принцип алгоритма еще не понял…
Точнее даже, я наверное не совсем корректно сформулировал вопрос: в RESTRResponse1 есть Fcontent, где собственно нужные мне данные от сервера, должен ли он передать это поле(?) в переменную Result? Если и не должен, то не могли бы ткнуть носом в логику дальнейшей обработки ответа?
Очень интересная статья. Но я что то не могу сделать по вашему примеру Если можно то выложите исходник.
Помогите пожалуйста. Всю голову сломал.
Ответ от VK:
response: {
count: 728,
items: [351961467, 253351710, 144210474, 21409157, 178966701, 56289905, 273377665, 139189891, 16219740, 44196204]
}
Как мне занести значения из items в массив?
Если версия >Delphi XE7, то используем System.JSON.
1. Сначала создаем объект TJsonObject
2. Пару Intems читаем из объекта как массив TJsonArray
3. Используем свойство TJSONArray.Count и в цикле проходим по всем элементам этого массива
Более подробно про JSON в Delphi можно почитать здесь: http://www.webdelphi.ru/2011/10/rabota-s-json-v-delphi-2010-xe2/ Статья для более старых версий Delphi (поэтому я и сказал вначале про модуль System.JSON), но принципы работы с объектами остались те же самые
С JSON я более менее разобрался (во всяком случае работает)))).
А вот с записью каждого элементов в массив проблема.
Если использовать статический массив, нужно же заранее объявить количество элементов в нём, незнаю как это сделать.
Если использовать динамический, всё время вылетает ошибка. Так же из-за того, что я как то неправильно задаю количество элементов.
Код бы ваш посмотреть где у вас ошибка с массивом — тогда подскажу, что делать и где именно ошибаетесь. Так…на вскидку:
var DynArray: array of integer;
JSONArray: TJsonArray;
begin
//Тут получаем объект JSONArray из JSON-документа
...
//теперь устанавливаем длину динамического массива
SetLength(DynArray, JSONArray.Length);
работаем с массивом, JSONArray и т.д.
end;
В delphi xe 8 я новичок , пытаюсь получить данные альбома , но не получается ,
Enums:=AJSONObject.GetEnumerator;
Enums:=-1 , не дает не id не название альбома, авторизация прошла успешно, userid получен ,предыдущая статья авторизация, как посмотреть что лежит в AJSONObject ? если компонент для просмотра ?
Пробовал через IDHTTP там приходит название альбома и список файлов в этом альбоме , но URL для скачивания у меня пустой там использовал uLkJSON v1.07 ,вот решил перейти на библиотеку REST Client Library
procedure TVKAlbum.Parse(AJSONObject: TJSONObject);
const
cPairs: array [0..2]of string = (‘id’,’owner_id’,’title’);
var Enums: TJSONPairEnumerator;
begin
if not Assigned(AJSONObject) then Exit;
Enums:=AJSONObject.GetEnumerator;
try
while Enums.MoveNext do
begin
case StrIndex(Enums.Current.JsonString.Value,cPairs) of
0:Fid:=TJSONNumber(Enums.Current.JsonValue).AsInt64;//’id’
1:FOwnerId:=TJSONNumber(Enums.Current.JsonValue).AsInt64;//’owner_id’
2:FTitle:=Enums.Current.JsonValue.Value;//’title’
end;
end;
finally
Enums.Free;
end;
end;
в этой процедуре получаю что Enums=-1 , и название альбома я не получаю ,как проверить что находиться в AJSONObject , можно ли визуально просмотреть что находится в этом объекте,
procedure TForm1.Albom_Parse(JSN: TJSONObject);
const
cPairs: array [0..2]of string = (‘id’,’owner_id’,’title’);
var
Enums: TJSONPairEnumerator;
FID: string;
FOwnerID:string;
FTitle: string;
JS : TJSONObject;
JSAr : TJSONArray;
begin
if not Assigned(JSN) then Exit;
JSN := TJSONObject.ParseJSONValue(JSN.GetValue(‘response’).ToString) as TJSONObject;
JSAr := TJSONObject.ParseJSONValue(JSN.GetValue(‘items’).ToString) as TJSONArray;
JSN := TJSONObject.ParseJSONValue(JSAr.Items[0].ToString) as TJSONObject;
Enums:=JSN.GetEnumerator;
try
while Enums.MoveNext do
begin
case StrIndex(Enums.Current.JsonString.Value,cPairs) of
0:Fid:=TJSONNumber(Enums.Current.JsonValue).Value;//’id’
1:FOwnerId:=TJSONNumber(Enums.Current.JsonValue).Value;//’owner_id’
2:FTitle:=Enums.Current.JsonValue.Value;//’title’
end;
end;
finally
Enums.Free;
end;
ALbomName:=FTitle;
end;
Cделал так заработало.
Вопрос такой еще .
как осуществить поиск по названию на всем сайте VK?
как можно получить размер файла и время без скачивания его ?
Вопрос решил ,получаю все файлы с альбома , теперь стал вопрос как искать файлы или альбомы по названию во всем сайте VK ? может кто подскажет ?
По-моему, никак. Можно попробовать искать по всем альбомам друзей (если у них альбомы открыты), но поиск по всем пользователям врядли
не могу распарсить данные user , получить имя фамилию и ссылку на фото, строку получаю в Json, там это есть. с музыкой маленько разобрался пока не добавил эти 3 строки ,с фото не работает дает сразу ошибку в первой строке, если без них ,то ничего не находит. JSN := TJSONObject.ParseJSONValue(JSN.GetValue(‘response’).ToString) as TJSONObject; JSAr := TJSONObject.ParseJSONValue(JSN.GetValue(‘items’).ToString) as TJSONArray; JSN := TJSONObject.ParseJSONValue(JSAr.Items[0].ToString) as TJSONObject; —————————————————————————————————————— {«response»:[{«id»:470557163,»first_name»:»\u0410\u043D\u0430\u0442\u043E\u043B\u0438\u0439″,»last_name»:»\u0413\u0440\u0438\u0431\u043E\u0432″,»photo_max»:»https:\/\/pp.vk.me\/c636528\/v636528163\/f60c\/p-tUZ6WIAPk.jpg»}]} вот строка которую получаю , procedure TForm1.Foto_Parse(JSN: TJSONObject); const Pairs: array [0..3]of string = (‘id’,’first_name’,’last_name’,’foto_max’); var Enums: TJSONPairEnumerator; JS : TJSONObject; JSAr : TJSONArray; I: Integer; APairName: string; L:INTEGER; vJSONArray: TJSONArray; vJSONScenario: TJSONValue; JValue: TJSONValue; Pair:… Подробнее »
Если у вас Delphi XE8 и выше, то вместо
JSN := TJSONObject.ParseJSONValue(JSN.GetValue(‘response’).ToString) as TJSONObject;
Правильнее будет
JSN := TJSONObject.ParseJSONValue(JSN.GetValue(‘response’).ToJson) as TJSONObject;
И в других местах кода тоже вместо
ToString
использоватьToJson
спасибо за помощь , да у меня XE8. буду разбираться дальше. Но вопросов еще очень много.
JSN := TJSONObject.ParseJSONValue(JSN.GetValue(‘response’).ToJson) as TJSONObject;
Все равно дает ошибку, может как то по другому можно распарсить этот об]ект JSN.
А что за ошибка-то?) Скопируйте её сюда — разберемся. И может, тогда уже сделать так:
JSN:=TJSONObject.ParseJSONValue('СЮДА_ВСТАВЛЯЕМ_СТРОКУ_ОТВЕТА_СЕРВЕРА') as TJSONObject;
Тогда, если вы получаете в ответе сервера именно JSON-объект, то ваш JSN будет не nil. Ну, а дальше — парсите
invalid class typicast.
все спасибо заработало так. код привожу может кому поможет. procedure TForm1.Foto_Parse(JSN: TJSONObject); const Pairs: array [0..3]of string = (‘id’,’first_name’,’last_name’,’foto_max’); var Enums: TJSONPairEnumerator; Fid: cardinal; FOwnerId: cardinal; FArtist: string; FTitle: string; FDuration: cardinal; FUrl: string; FLyricsId: cardinal; FAlbumId: cardinal; FGenreId: word; JS : TJSONObject; JSAr : TJSONArray; I: Integer; APairName: string; L:INTEGER; vJSONArray: TJSONArray; vJSONScenario: TJSONValue; JValue: TJSONValue; Pair: TJSONPair; ntime:string; fam,imya,fotourl:string; s,s1:string; list:TstringList; begin if not Assigned(JSN) then Exit; JSAr := TJSONObject.ParseJSONValue(JSN.GetValue(‘response’).ToString) as TJSONArray; L:= JSAr.Count; for i:=0 to L-1 do begin JSN := TJSONObject.ParseJSONValue(JSAr.Items[i].ToString) as TJSONObject; Enums:=JSN.GetEnumerator; try while Enums.MoveNext do begin case StrIndex(Enums.Current.JsonString.Value,Pairs) of 0:Fid:=TJSONNumber(Enums.Current.JsonValue).AsInt;//’id’ 1:Fam:=Enums.Current.JsonValue.Value; 2:imya:=Enums.Current.JsonValue.Value; 3:fotourl:=Enums.Current.JsonValue.Value;… Подробнее »
была не большая ошибка тут еще не находил ссылку на фото,Имя и Фамилию находил
было так
Pairs: array [0..3]of string = (‘id’,’first_name’,’last_name’,’foto_max’);
а надо так
Pairs: array [0..3]of string = (‘id’,’first_name’,’last_name’,’photo_max’);
Вопрос такой еще ,поиск композиций сделал , но работает только на английском языке в основном нормально ,и находит только 280 композиций ,как сделать сдвиг дальше , вот описание с АПИ
offset
смещение, необходимое для выборки определенного подмножества аудио записей. По умолчанию: 0.
(положительное число)
куда это ставить и как присвоить значение сдвига , пока не понятно ?
нужно наверно русский текст переводить в UTF8 и отправлять на сервер ?
Так offset — это параметр. Вставляете его также, как и параметр v — версия API, т.е. он должен передаваться непосредственно в URL, типа http://vk.com/method?v=5.43&offset=400
function TAPI.Audio_search(stext:string): TJSONObject;
begin
Result:=nil;
VKRequest.Resource:=’audio.search’;
VKRequest.Method:=TRESTRequestMethod.rmPOST;
VKRequest.Params.Clear;
with VKRequest.Params.AddItem do
begin
name:=’v’;
Value:=API_VERSION;
Options:=[poDoNotEncode];
end;
with VKRequest.Params.AddItem do
begin
name:=’q’;
Value:=stext;
Options:=[poDoNotEncode];
end;
with VKRequest.Params.AddItem do
begin
name:=’offset’;
Value:=’400′;
Options:=[poDoNotEncode];
end;
VKRequest.Execute;
if VKRequest.Response.StatusCode=200 then
Result:=VKResponse.JSONValue as TJSONObject;
end;
не ищет композиции на русском , например задаёшь ( мираж ) ,или ошибка вылетает ,или находит то что не соответствует ,как это можно исправить .?
Спасибо за помощь.
русские песни находит если задаёшь названия певца английскими буквами пример
пугачева (pugacheva) , а если руcкими буквам набираешь вылетает ошибка(Access violation at address) , как сделать что бы находил композиции на русском ?
В каком месте AV выскакивает? Покажите код
нашел ошибку, как вы и писали раньше что нужно заменить ToString на ToJson .
все теперь ошибки нет при поиске композиций с русскими символами.
Если у вас Delphi XE8 и выше, то вместо
JSN := TJSONObject.ParseJSONValue(JSN.GetValue(‘response’).ToString) as TJSONObject;
Правильнее будет
JSN := TJSONObject.ParseJSONValue(JSN.GetValue(‘response’).ToJson) as TJSONObject;
И в других местах кода тоже вместо ToString использовать ToJson
Спасибо за помощь.
Не за что. А AV был из-за того, что вы обращались к объекту TJsonObject, который из-за использования ToString вместо ToJson просто не создавался
Вопрос такой ,по поиску композиция , если я задаю поиск например (мираж) то он находит композиции но не соответствуют запросу ,приходят композиции разные , есть на русском названия ,но слова (мираж) там нету ,но и сами композиции не соответствуют критерию поиска, хотя если задать на английском то все нормально, находит композиции названия на английском ,но сами композиции соответствуют критерию поиска, такое ощущение что проблема с русскими символами при отправке на сервер запроса по поиску композиций , на не могу понять почему он находит не то что я задал , функция (function TAPI.Audio_search(stext:string): TJSONObjec ) поиска написана чуть выше в этом… Подробнее »
Нашёл в чем была проблема в этой строке заменил rmPOST на rmGet
VKRequest.Method:=TRESTRequestMethod.rmPOST;
на
VKRequest.Method:=TRESTRequestMethod.rmGet
и все теперь находит русские композиции с русским названием файла
Спасибо за помощь
Нашёл в чем была проблема в этой строке заменил rmPOST на rmGet
VKRequest.Method:=TRESTRequestMethod.rmPOST;
на
VKRequest.Method:=TRESTRequestMethod.rmGet
и все теперь находит русские композиции с русским названием файла
Спасибо за помощь
Вот можете скачать то что написал[http://telecentor.ucoz.ru/load/vkdonloadmaster/1-1-0-19] ,не знаю можно ли давать ссылку.
Ссылку давать в комментариях можно, но только одну. При большем количестве ссылок комментарий автоматом отправляется в спам
Ясно Спасибо.
Вопрос такой : Как можно выйти из VK не нашел в API ?
API Vk не предоставляет такую возможность. Единственный вариант, чтобы выйти из аккаунта в своем приложении — почистить куки браузера.
ясно, Спасибо.
Вопрос такой еще , но это уже поиск Видео , что возвращает сервер индификаторы видео,
files-ссылка на файл ,тут пусто ,player,
но есть еще другие, mp4_240, mp4_320, mp4_480,mp4_720,
как правильно описать индификаторы при их поиске в response ?
Спасибо.
Да еще вопрос , какое расширение файла должно быть , есть название и есть ссылка на файл
какой файл я сохраняю ,не вижу, конечно можно поставить принудительно типа avi или mp4,
но это не правильно.
Kак получить расширение файла?
Как получить прямою ссылку на файл ,что бы можно было скачать видео, а то получаю ссылки на плеер в ютубе или в vk ?
вот ссылки которые я получил.
https://rutube.ru/play/embed/8710924?__ref=vk.api
https://out.pladform.ru/player?pl=21469&videoid=101146178&__ref=vk.api
https://out.pladform.ru/player?pl=21469&videoid=101793862&__ref=vk.api
никак не получить прямую ссылку на видео-файл для этих роликов. Видео в вк добавлялось как ССЫЛКА — вот вам вк и выдает ССЫЛКУ на другой сервер.
Спасибо за помощь и ответы.
Как с помощью REST Client Library загрузить картинку из интернета в TImage
Когда пишу вот так «VKRequest.Method:=TRESTRequestMethod.rmGET;» то в «TRESTRequestMethod.» выдает ошибку, что делать?
Какую ошибку выдает? Кусок кода хотя бы покажите
Добрый день!
Можно попросить исходники полностью?