Здравствуйте, давненько я не возвращался к VK API в Delphi. На этот раз хотел бы поговорить о вопросах, которые пользователи могут создавать на своей страничке. Если честно, мне никогда не приходилось на своей страничке создавать вопросы, но на этот раз придется, только уже на этот раз я создам вопросы из приложения Windows. Для того, чтобы создать новый вопрос необходимо определиться с его типом вначале. Вконтакте предоставляет 17 всевозможных типов вопросов. При создании вопроса обязательно необходимо выбрать его тип. Когда мы его будем создавать программного нам необходимо при отправке запроса, указать номер типа вопроса. Список типов вопросов я предоставлю ниже, их можно будет указать вручную, но также мы и рассмотрим, как получить список всех типов вопросов, а затем как добавлять вопрос конкретного типа. Кроме этого мы также рассмотрим, как получить список всех вопросов пользователя или пользователей (тут уже речь не о типах вопросов, а о вопросах, которые уже создали пользователи). Итак, начнем с того, что подготовим нашу форму в полном проекте. Я добавил еще одну вкладку (TabSheet) на компоненте TPageControl, в свойстве Caption которой написал Вопросы. Далее я добавил на данную вкладку TListBox, а также 3 кнопки (TButton). В TListBox мы будем отображать список всех типов вопросов, а по нажатию на кнопки мы будем: определять список всех типов вопросов, создавать вопрос, получать список вопросов конкретного пользователя. Теперь как и обещал публикую список типов вопросов, который поддерживает ВК:
- 0 Любые вопросы
- 1 Помощь по сайту
- 2 Автомобили
- 3 Карьера и бизнес
- 4 Кино и телевидение
- 5 Красота и здоровье
- 6 Кулинария и рестораны
- 7 Интернет и компьютеры
- 8 Литература и искусство
- 9 Любовь и секс
- 10 Музыка и эстрада
- 11 Наука и образование
- 12 Политика и общество
- 13 Развлечения и отдых
- 14 Семья и дом
- 15 Спорт
- 16 Юриспруденция
При создании вопроса, Вам необходимо будет указать тип, для этого, как Вы определитесь с типов, Вам необходимо будет не название в параметре указать, а идентификатор типа вопроса от 0 до 16 (всего 17). Но, существует функция ВК API, которая позволяет получить список всех типов вопросов и их идентификаторы. Идентификаторы мы получать не будет, так как они идут по порядку от 0 до 16, то мы просто-напросто загрузим в TListBox, с помощью функции ВК API, названия всех типов вопросов. А так как нумерация в TListBox начинается с 0, то мы будем отправлять номер строки, выделенной пользователем.
Итак, как я уже говорил, мы рассмотрим в этой статье 3 функции ВК API для работы с вопросами. Для каждой из них нам потребуется права (права для приложения) с битовой маской не меньше, чем 64. Первый метод, который мы рассмотрим — получение списка всех типов вопросов, который называется
- questions.getTypes
Нам тут повезло, так как не пришлось создавать подпись безопасности в алфавитном порядке, так как тут параметров вообще нету, нам необходимо только указать в подписи безопасности и в самом запросе только сам метод, а дальше мы получим ответ в виде: идентификатор типа вопроса, название типа вопроса.
Вот код, который я написал на событие OnCick кнопки, где мы получаем список всех типов вопросов
procedure TForm1.Button29Click(Sender: TObject);
var
sig:string;
begin
try
PostVK:=TStringList.Create;
sig:=Pchar(LabelMid.Caption)+'api_id=1918788format=XMLmethod=questions.getTypesv=3.0'+Pchar(LabelSecret.Caption);
sig:=md5(sig);
PostVK.Clear;
PostVK.Add('api_id=1918788');
PostVK.Add('sig='+sig);
PostVK.Add('v=3.0');
PostVK.Add('method=questions.getTypes');
PostVK.Add('format=XML');
PostVK.Add('sid='+Pchar(LabelSid.Caption));
logVK:=IdHTTP1.Post('https://api.vkontakte.ru/api.php',PostVK);
PostVK.Free;
repeat
ListBox16.Items.Add(Utf8ToAnsi(Pars(LogVK,'<name','</name>',0)));
Delete(logVK,1,pos('</name>',logVK)+length('</name>'));
until (pos('name',logVK)=0);
except
on e:Exception do
begin
PostVK.Free;
end;
end
Тут я также использую метод преобразования кодировок, так как в некоторых версиях Indy с кодировкой могут быть проблемы.
Итак, теперь мы приступим к созданию самого вопроса. К сожалению, при создании самого вопроса мы не сможем указать сразу варианты ответов для него, нам придется использовать для этих целей отдельный метод, но его мы рассмотрим в следующих статьях. Данный метод (метод создания вопроса) уже имеет 2 параметра и эти два параметры являются обязательными. Данный метод называется
- questions.add
Он имеет следующие 2 параметра
- text - текст вопроса, который вы создаете
- type - тип вопроса, который вы создаете
Как я уже говорил раньше, они являются обязательными, а значение параметра text имеет минимальную длину. В документации не написано, какая именно минимальная длинна данного параметра, но, по крайней мере, я отправлял значение test (4 символа) мне выдало ошибку о том, что очень короткое название вопроса. В случае короткого названия у Вас появится ошибка с кодом 130 Question text is too short — что означает то, что Вы создали очень короткий вопрос (название самого вопроса очень короткое). Далее на событие Onclick кнопки, по нажатию на которую мы добавляем наш вопрос, я написал следующий код
procedure TForm1.Button30Click(Sender: TObject);
var
sig:string;
begin
try
PostVK:=TStringList.Create;
sig:=Pchar(LabelMid.Caption)+'api_id=1918788format=XMLmethod=questions.addtext=Simply create a test questiontype='+IntToStr(ListBox16.ItemIndex)+'v=3.0'+Pchar(LabelSecret.Caption);
sig:=md5(sig);
PostVK.Clear;
PostVK.Add('api_id=1918788');
PostVK.Add('sig='+sig);
PostVK.Add('v=3.0');
PostVK.Add('method=questions.add');
PostVK.Add('type='+IntToStr(ListBox16.ItemIndex));
PostVK.Add('text=Simply create a test question');
PostVK.Add('format=XML');
PostVK.Add('sid='+Pchar(LabelSid.Caption));
logVK:=IdHTTP1.Post('https://api.vkontakte.ru/api.php',PostVK);
PostVK.Free;
ShowMessage(logVK);
except
on e:Exception do
begin
PostVK.Free;
end;
end;
end;
При необходимости можно использовать также метод преобразования кодировок. В случае успешного добавления вопроса, метод возвратит идентификатор, созданного нами вопроса. По данному идентификатору мы сможем смотреть подробную информацию данного вопроса. Ну и на сегодня, в данной статье, рассмотрим последний метод, с помощью которого мы сможем получать список вопросов, созданные пользователем. Он называется
- questions.get
У данного метода достаточно параметров, но к радости ни один не является обязательным, что не может не радовать. Итак, все параметры данного метода
- uids - идентификаторы пользователей, которых необходимо получить список вопросов. Если их несколько, то перечисляем через запятую, если посмотреть для себя, то данный параметр вообще не надо указывать.
- qid - идентификатор вопроса (то, что возвращал нам метод questions.add), для которого необходимо посмотреть подробную информацию. Если указан данный параметр, то не учитывается предыдущий параметр, то есть uids.
- sort - сортировка результата (0 — по дате обновления, 2 — по дате создания и оба в порядке убывания, 1 — по дате создания в порядке возрастания)
- need_profiles - данный параметр определяет то, что необходимо ли выводить краткую информацию о авторе вопроса. Может принимать значения от 0 до 3. Поля об авторе вопроса могут быть следующими: name - имя автора вопроса, photo — аватарка автора вопроса, online - определяет находится ли данный пользователь сейчас в сети, если 0 — то нет, если 1 — то да. Чем выше значение данного параметра, тем выше качество аватарки Вы получите.
- name_case - определяет падеж склонения имени пользователя (автора вопроса). Именительный — nom, родительный — gen, дательный — dat, винительный -acc, творительный — ins, предложный — abl. По умолчанию стоит именительный падеж (nom).
- count - количество вопросов, которое необходимо получить
- offset - смещение для выборки определенного подмножества вопросов.
Итак, с параметрами мы познакомились, теперь сам код, который я написал на событие OnClick кнопки
procedure TForm1.Button31Click(Sender: TObject);
var
sig:string;
begin
try
PostVK:=TStringList.Create;
sig:=Pchar(LabelMid.Caption)+'api_id=1918788format=XMLmethod=questions.getv=3.0'+Pchar(LabelSecret.Caption);
sig:=md5(sig);
PostVK.Clear;
PostVK.Add('api_id=1918788');
PostVK.Add('sig='+sig);
PostVK.Add('v=3.0');
PostVK.Add('method=questions.get');
PostVK.Add('format=XML');
PostVK.Add('sid='+Pchar(LabelSid.Caption));
logVK:=IdHTTP1.Post('https://api.vkontakte.ru/api.php',PostVK);
PostVK.Free;
ShowMessage(logVK);
except
on e:Exception do
begin
PostVK.Free;
end;
end;
end;
Как видите здесь я не указал ни один из параметров, которые я описал Выше, в данном случае мне выведется результат в виде идентификатора моих вопросов (именно моих, так как я не указал конкретный идентификатор пользователя), ну и сам вопрос, а также дата его создания.
Напомню, что для работы с этими всеми 3 методами необходимо для приложения права с битовой маске не менее 64. Также не забывайте, если нужно, использовать методы преобразования кодировок (в нужную Вам), а также составлять подпись безопасности в алфавитном порядке.