Здравствуйте, в этой новости хотел бы поговорить о том, как можно отправить сообщение из своего приложения другу. Тут были проблемы с кодировкой отправляемых сообщений, то есть если просто отправлять, то сообщения пользователю приходили иероглифами, но это проблема решаема. Дальше также хочу заметить, что в документации ВК по данному методу, также версия 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
Похожие записи
Метки: API, VK API, vkontakte, vkontakte API, вконтакте API
Не помогает мне AnsiToUtf8. :((
Ни в моей программе, ни в этом примере.
Постоянно возвращается ошибка о неправильной сигнатуре.
Дельфи 2010.
Так Вы попробуйте без AnsiToUtf в Delphi 2010 другая версия Инди, там с кодировкой может будет итак все нормально
Хех… Пробовал. И просто пробовал отправить, и кодировал строку по всякому — ничего не помогло.
Как только русские буквы или в сообщении, или в заголовке — Error 4:incorrect signature
А вот просто post запросом на «http://m.vkontakte.ru/write?to=» отправляется без проблем. Идаже с русским текстом (после AnsiToUTF8).
Правда, запрос приходится не в StringList лист формировать, а в TStringStream — индюшка его в таком случае не перекодирует.
это нормально что у меня в 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.