Здравствуйте, в этой новости хотел бы поговорить о том, как можно отправить сообщение из своего приложения другу. Тут были проблемы с кодировкой отправляемых сообщений, то есть если просто отправлять, то сообщения пользователю приходили иероглифами, но это проблема решаема. Дальше также хочу заметить, что в документации ВК по данному методу, также версия API была записана как 2.0, хотя на самому деле необходимо использовать 3.0, такие замечательные методы, а информация по ним какая-то устаревшая. Ну для отправки сообщений в ВК существует отличный метод

  • messages.send

Давайте пройдемся по параметрам данного метода

  • api_id — идентификатор приложения
  • sig - подпись безопасности
  • v - версия API (в документации ВК записана как 2.0, но необходимо 3.0)
  • uid - идентификатор пользователя, которому необходимо отправлять сообщение (по умолчанию текущий пользователь)
  • message - текст сообщения
  • title - заголовок сообщения
  • type - 0 — обычное сообщение, 1 — сообщение из чата
  • format - XML или JSON
  • test_mode - если равен 1, то разрешает тестовые запросы к данным приложения.

Первые 5 параметров являются обязательными. Все идет по стандарту, создаем нашу подпись безопасности, тут не забудьте создать ее в алфавитном порядке, иначе будете получать сообщение об ошибки, что подпись не верна. Я добавил на вкладку «Сообщение»

  • TEdit
  • TButton

Ну TEdit для того, чтобы Вы смогли  написать сообщение, которое необходимо отправить. Также сообщения отправляются id-пользователю тому, id, который записан в Edit1, который находится на вкладке «Профиль«, то есть Вы можете авторитизироваться получить список сообщений и в TListBox выбрать, тот id, которому Вы хотите отправить сообщение затем написать данное сообщение и нажать на кнопку «Отправить«, после этого сообщение будет доставлено успешно. На TButton события OnClick я написал следующий код

procedure TForm1.Button12Click(Sender: TObject);
var
 sig:string;
begin
   try
    PostVK:=TStringList.Create;
    sig:=Pchar(LabelMid.Caption)+'api_id=1918788format=XMLmessage='+AnsiToUtf8(Edit4.Text)+'method=messages.senduid='+Edit1.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=messages.send');
    PostVK.Add('uid='+Edit1.Text);
    PostVK.Add('format=XML');
    PostVK.Add('message='+AnsiToUtf8(Edit4.Text));
    PostVK.Add('sid='+Pchar(LabelSid.Caption));
    logVK:=IdHTTP1.Post('http://api.vkontakte.ru/api.php',PostVK);
    if pos('error_code',logVK)=0 then
     ShowMessage('Message Send Ok')
    else
     ShowMessage('Not message send');
    PostVK.Free;
   except
    on e:Exception do
     PostVK.Free;
   end;
end;

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

Сейчас очень главное иметь на своей машине качественные диски и Шины. Потому что от этого зависит устойчивость Вашей же машины на дороге, а это влияет на Вашу безопасность. Так что, позаботьтесь о том, чтобы на Вашей любимой машине стояли только лучшие и качественные шины.

Полный исходник проекта можно скачать тут

Автор статьи - Andrey53

Метки: , , , ,




К записи “Проект VK API в Delphi. Отправка сообщений” оставлено комментариев: 5.

  1. FeanaR:

    Не помогает мне AnsiToUtf8. :((
    Ни в моей программе, ни в этом примере.
    Постоянно возвращается ошибка о неправильной сигнатуре.
    Дельфи 2010.

  2. Andrey53:

    Так Вы попробуйте без AnsiToUtf в Delphi 2010 другая версия Инди, там с кодировкой может будет итак все нормально

  3. FeanaR:

    Хех… Пробовал. И просто пробовал отправить, и кодировал строку по всякому — ничего не помогло. :(
    Как только русские буквы или в сообщении, или в заголовке — Error 4:incorrect signature

  4. FeanaR:

    А вот просто post запросом на «http://m.vkontakte.ru/write?to=» отправляется без проблем. Идаже с русским текстом (после AnsiToUTF8).
    Правда, запрос приходится не в StringList лист формировать, а в TStringStream — индюшка его в таком случае не перекодирует.

  5. дима:

    это нормально что у меня в LabelMid.Caption такой текст ipt type=»text/javascript «>parent.onError(‘??????????? ??????’) ??
    и в LabelSid.Caption LabelSecret.Caption тоже. сообщение не отправляется.

    исходник:
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
    IdHTTP, StdCtrls, IdHashMessageDigest;

    type
    TForm1 = class(TForm)
    EditLogin: TEdit;
    EditPass: TEdit;
    Button1: TButton;
    IdHTTP1: TIdHTTP;
    LabelMid: TLabel;
    LabelSid: TLabel;
    LabelSecret: TLabel;
    Button2: TButton;
    Edit1: TEdit;
    Button3: TButton;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;
    PostVK:TStringList;
    htmlVK:WideString;
    logVK,app_nash:String;

    implementation

    {$R *.dfm}

    function Pars(str:String;str_begin:String;str_end:String;count:integer):String;
    begin
    Delete(str,1,pos(str_begin,str)+length(str_begin));
    Delete(str,pos(str_end,str)-count,length(str));
    Pars:=str;
    end;

    function md5(st: string): string;
    begin
    Result:=»;
    with TIdHashMessageDigest.Create do
    begin
    Result:=LowerCase(HashStringAsHex(st));
    end;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    try
    logVK:=IdHTTP1.Get(‘http://vkontakte.ru/login.php?app=xxxxxxxx&layout=popup&type=browser&settings=15615′);
    PostVK:=TStringList.Create;
    PostVK.Clear;
    PostVK.Add(‘act=login’);
    PostVK.Add(‘app=xxxxxxx’);
    PostVK.Add(‘app_hash=’+Pars(logVK,’app_hash = ‘,’;’,1));
    PostVK.Add(‘email=’+EditLogin.Text);
    PostVK.Add(‘pass=’+EditPass.Text);
    PostVK.Add(‘permanent=1′);
    logVK:=IdHTTP1.Post(‘http://login.vk.com/’,PostVK);
    PostVK.Clear;
    PostVK.Add(‘s=’+Pars(logVK,’value=’,’/>’,2));
    PostVK.Add(‘act=auth_result’);
    PostVK.Add(‘m=4′);
    PostVK.Add(‘parmanent=1′);
    PostVK.Add(‘expire=»»‘);
    PostVK.Add(‘app=xxxxxxx’);
    PostVK.Add(‘app_hash=’+Pars(logVK,’app_hash» value=’,’»‘,0));
    logVK:=IdHTTP1.Post(‘http://vkontakte.ru/login.php’,PostVK);
    LabelSid.Visible:=True;
    LabelMid.Visible:=True;
    LabelSecret.Visible:=True;
    LabelMid.Caption:=Pars(logVK,’mid»‘,’,’,0);
    edit1.Text:=Pars(logVK,’mid»‘,’,’,0);
    LabelSid.Caption:=Pars(logVK,’sid»:’,’»,’,0);
    LabelSecret.Caption:=Pars(logVK,’secret»:’,’»,’,0);
    PostVK.Free;
    except
    on e:Exception do
    PostVK.Free;
    end;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    var
    sig:string;
    begin
    try
    PostVK:=TStringList.Create;
    sig:=Pchar(LabelMid.Caption)+’api_id=xxxxxxxformat=XMLmessage=’+AnsiToUtf8(edit2.Text)+’method=messages.senduid=’+edit1.Text+’v=3.0′+Pchar(LabelSecret.Caption);
    sig:=md5(sig);
    PostVK.Clear;
    PostVK.Add(‘api_id=xxxxxxx’);
    PostVK.Add(‘sig=’+sig);
    PostVK.Add(‘v=3.0′);
    PostVK.Add(‘method=messages.send’);
    PostVK.Add(‘uid=’+Edit1.Text);
    PostVK.Add(‘format=XML’);
    PostVK.Add(‘message=’+edit2.Text);
    PostVK.Add(‘sid=’+Pchar(LabelSid.Caption));
    logVK:=IdHTTP1.Post(‘http://api.vkontakte.ru/api.php’,PostVK);
    if pos(‘error_code’,logVK)=0 then
    ShowMessage(‘Message Send Ok’)
    else
    ShowMessage(‘Not message send’);
    PostVK.Free;
    except
    on e:Exception do
    PostVK.Free;
    end;
    end;

    end.

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

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

*