Здравствуйте, давненько я не возвращался к 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. Также не забывайте, если нужно, использовать методы преобразования кодировок (в нужную Вам), а также составлять подпись безопасности в алфавитном порядке.

Хочу заметить, что сейчас при устройстве на работу во многих организациях очень важно знать иностранный язык, так как требуется перевод и понимание технической документации на иностранном языке. А Бюро переводов в Москве поможет Вам перевести с самых популярных иностранных языков, а также любой сложности очень качественно и в срок.

Исходник полного проекта качаем тут.

Метки: , , , , ,




К записи “Проект VK API в Delphi. Работы с вопросами” оставлено комментариев: 12.

  1. Lak:

    Ужас!
    Постеснялись бы в таком виде код показывать. Уже только Button31Click отпугивает сразу же, а ListBox16 добивает выстрелом в голову. Вы сами-то как разбираетесь в этом нагромождении компонентов? Не говоря уже о том, что вся бизнес-логика находится в обработчике кнопки…

    Ещё почитайте, как правильно использовать try..finally, чтоб не писать таких вот монстров:

    try
    PostVK:=TStringList.Create;
    ...
    PostVK.Free;
    except
    on e:Exception do
    begin
    PostVK.Free;
    end;
    end;

    Дальше. Что делает следующий код можно сказать, то помедитировав над ним пару минут, да и то это будут только догадки

    repeat
    ListBox16.Items.Add(Utf8ToAnsi(Pars(LogVK,' Delete(logVK,1,pos('',logVK)+length(''));
    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');

    ?
    Сделайте хотя бы отдельную функцию, которая будет формировать параметры, общие для каждого запроса. А лучше, выделите уже всё это в отдельный класс. Не компонент, умоляю, не визуальный компонент тем более, а класс!

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

  2. Andrey53:

    2Lak спасибо, каждый напишет как себе хочет, я лишь привел пример как можно отправить нужные параметры в определенную функцию на сервер АПИ и получить ответ, это не рабочая программа, просто рабочий проект (который я нигде не использую).

  3. Роман:

    Andrey53, покажите пример с капчей вконтакте, пожалуйста.

  4. Роман:

    Я про то, что когда я хочу написать сообщение на стену, то у меня выскакивает капча, потому что я не активировал аккуант по мобильнику, хотелось бы увидеть как сделать в программе, чтобы она капчу получала и отправляла контакту.

    А то просто если не активировал аккуант, то из-за капчи многие функции программы будут недоступны.

    • Andrey53:

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

  5. Роман:

    http://vkontakte.ru/developers.....s%20needed

    Я вот тут инструкцию нашел для капчи, получилось сделать, чтобы картинка отображалась в программе, но потом мне пишем некорректный пост и не добавляется сообщение.

    Я вот так оформил, но ошибку выдает. Это обработчик на кнопку, которую жму если капча.

    var
    sig:string;
    i:integer;
    jpg:tjpegimage;
    Stream:TStringStream;
    begin
    try

    PostVK:=TStringList.Create;
    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,' captcha_sid:=pars(logvk,' Stream:=TStringStream.Create(IdHTTP1.Get(captcha_img));
    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;

    Эти поля у меня определяются в другой кнопки, которую использую без капчи когда, там так добавил.
    if pos(’14’,logVK)0 then
    begin
    captcha_img:=pars(logvk,' captcha_sid:=pars(logvk,' Stream:=TStringStream.Create(IdHTTP1.Get(captcha_img));
    jpg:=TJPEGImage.Create;
    jpg.LoadFromStream(Stream);
    Image3.Picture.Assign(jpg);
    jpg.Free;
    Stream.Free;
    end;

    • Andrey53:

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

  6. Роман:

    Да мне 1 кнопка, на которую я жму сразу дает капчу через условие
    if pos(’14’,logVK)0 then
    begin
    captcha_img:=pars(logvk,’ captcha_sid:=pars(logvk,' Stream:=TStringStream.Create(IdHTTP1.Get(captcha_img));
    jpg:=TJPEGImage.Create;
    jpg.LoadFromStream(Stream);
    Image3.Picture.Assign(jpg);
    jpg.Free;
    Stream.Free;
    end;

    А 2 кнопку жму, если надо с капчой, ее код тот выше который кинул.

  7. Роман:

    Да, отправляю, там в инструкции сказано, sid капчи и значение надо передать.

    • Andrey53:

      пока точно сказать не могу, так как с каптчей я пока что не сталкивался вконтакте, пока что API VK я подзабросил

Оставить комментарий

Вы можете использовать следующие теги:

*