Здравствуйте, давненько я не возвращался к 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('http://api.vkontakte.ru/api.php',PostVK);
PostVK.Free;
repeat
ListBox16.Items.Add(Utf8ToAnsi(Pars(LogVK,',' ',0)));
Delete(logVK,1,pos('',logVK)+length(''));
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('http://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('http://api.vkontakte.ru/api.php',PostVK);
PostVK.Free;
ShowMessage(logVK);
except
on e:Exception do
begin
PostVK.Free;
end;
end;
end;
Как видите здесь я не указал ни один из параметров, которые я описал Выше, в данном случае мне выведется результат в виде идентификатора моих вопросов (именно моих, так как я не указал конкретный идентификатор пользователя), ну и сам вопрос, а также дата его создания.
Напомню, что для работы с этими всеми 3 методами необходимо для приложения права с битовой маске не менее 64. Также не забывайте, если нужно, использовать методы преобразования кодировок (в нужную Вам), а также составлять подпись безопасности в алфавитном порядке.
Хочу заметить, что сейчас при устройстве на работу во многих организациях очень важно знать иностранный язык, так как требуется перевод и понимание технической документации на иностранном языке. А Бюро переводов в Москве поможет Вам перевести с самых популярных иностранных языков, а также любой сложности очень качественно и в срок. |
Исходник полного проекта качаем тут.
Метки: API, Idhttp, VK API, vkontakte, vkontakte API, вконтакте API
Ужас!
Постеснялись бы в таком виде код показывать. Уже только Button31Click отпугивает сразу же, а ListBox16 добивает выстрелом в голову. Вы сами-то как разбираетесь в этом нагромождении компонентов? Не говоря уже о том, что вся бизнес-логика находится в обработчике кнопки…
Ещё почитайте, как правильно использовать try..finally, чтоб не писать таких вот монстров:
try
PostVK:=TStringList.Create;
...
PostVK.Free;
except
on e:Exception do
begin
PostVK.Free;
end;
end;
Дальше. Что делает следующий код можно сказать, то помедитировав над ним пару минут, да и то это будут только догадки
Delete(logVK,1,pos('',logVK)+length(''));
repeat
ListBox16.Items.Add(Utf8ToAnsi(Pars(LogVK,'
until (pos('name',logVK)=0);
Пишите комментарии, а лучше выделите его в отдельную функцию, а к ней уже комментарий.
Ну и напоследок: уже 31-ая кнопка, вы сами-то не устали 31 раз писать:
sig:=md5(sig);
PostVK.Clear;
PostVK.Add('api_id=1918788');
PostVK.Add('sig='+sig);
PostVK.Add('v=3.0');
?
Сделайте хотя бы отдельную функцию, которая будет формировать параметры, общие для каждого запроса. А лучше, выделите уже всё это в отдельный класс. Не компонент, умоляю, не визуальный компонент тем более, а класс!
Проглядел остальные статьи — сейчас из них можно почерпнуть только названия команд, не более
2Lak спасибо, каждый напишет как себе хочет, я лишь привел пример как можно отправить нужные параметры в определенную функцию на сервер АПИ и получить ответ, это не рабочая программа, просто рабочий проект (который я нигде не использую).
Andrey53, покажите пример с капчей вконтакте, пожалуйста.
что именно показать, какая каптча?
Я про то, что когда я хочу написать сообщение на стену, то у меня выскакивает капча, потому что я не активировал аккуант по мобильнику, хотелось бы увидеть как сделать в программе, чтобы она капчу получала и отправляла контакту.
А то просто если не активировал аккуант, то из-за капчи многие функции программы будут недоступны.
сложнова-то мне будет, так как аккаунт у меня активирован, а посмотреть такой возможности нету, что и как выскакивает
http://vkontakte.ru/developers.....s%20needed
Я вот тут инструкцию нашел для капчи, получилось сделать, чтобы картинка отображалась в программе, но потом мне пишем некорректный пост и не добавляется сообщение.
Я вот так оформил, но ошибку выдает. Это обработчик на кнопку, которую жму если капча.
var
sig:string;
i:integer;
jpg:tjpegimage;
Stream:TStringStream;
begin
try
PostVK:=TStringList.Create;
captcha_sid:=pars(logvk,'
Stream:=TStringStream.Create(IdHTTP1.Get(captcha_img));
sig:=Pchar(LabelMid.Caption)+’captcha_sid=’+captcha_sid+’captcha_key=’+captcha_key+’api_id=1918788format=XMLmessage=’+AnsiToUtf8(Edit6.Text)+’method=wall.postowner_id=’+Edit5.Text+’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=wall.post’);
PostVK.Add(‘format=XML’);
postvk.add(‘captcha_sid=’+captcha_sid);
postvk.add(‘captcha_key=’+edit12.text);
PostVK.Add(‘message=’+AnsiToUtf8(Edit6.Text));
PostVK.Add(‘owner_id=’+Edit5.Text);
PostVK.Add(‘sid=’+Pchar(LabelSid.Caption));
logVK:=IdHTTP1.Post(‘http://api.vkontakte.ru/api.php’,PostVK); memo3.lines.add(logvk);
if pos(‘error_code’,logVK)=0 then
begin
Showmessage(‘Message send’);
end ;
if pos(’14’,logVK)0 then
begin
captcha_img:=pars(logvk,'
jpg:=TJPEGImage.Create;
jpg.LoadFromStream(Stream);
Image3.Picture.Assign(jpg);
jpg.Free;
Stream.Free;
end;
PostVK.Free;
except
on e:Exception do
PostVK.Free;
end;
end;
Эти поля у меня определяются в другой кнопки, которую использую без капчи когда, там так добавил.
captcha_sid:=pars(logvk,'
Stream:=TStringStream.Create(IdHTTP1.Get(captcha_img));
if pos(’14’,logVK)0 then
begin
captcha_img:=pars(logvk,'
jpg:=TJPEGImage.Create;
jpg.LoadFromStream(Stream);
Image3.Picture.Assign(jpg);
jpg.Free;
Stream.Free;
end;
я так понимаю, что надо сначала получить каптчу, а потом отправлять сообщение и еще результат капчти
Да мне 1 кнопка, на которую я жму сразу дает капчу через условие
captcha_sid:=pars(logvk,'
Stream:=TStringStream.Create(IdHTTP1.Get(captcha_img));
if pos(’14’,logVK)0 then
begin
captcha_img:=pars(logvk,’
jpg:=TJPEGImage.Create;
jpg.LoadFromStream(Stream);
Image3.Picture.Assign(jpg);
jpg.Free;
Stream.Free;
end;
А 2 кнопку жму, если надо с капчой, ее код тот выше который кинул.
так а ты отправляешь результат каптчи в запросе?
Да, отправляю, там в инструкции сказано, sid капчи и значение надо передать.
пока точно сказать не могу, так как с каптчей я пока что не сталкивался вконтакте, пока что API VK я подзабросил