Так ребята кому не лень разбираемся))) Ниже процесс отправки сообщения на стену пользователя или группы вк.
Все хорошо но есть большое "но". Не получается выполнить метод photos.getWallUploadServer при попытке прикрепить фото.
Возвращает ошибку:
{"error":{"error_code":5,"error_msg":"User authorization failed: no access_token passed.","request_params":[{"key":"oauth","value":"1"},{"key":"method","value":"photos.saveWallPhoto"}]}}
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdIOHandler,
IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, Data.DBXJSON, idMultiPartFormData,RegExpr;
type
TForm1 = class(TForm)
Button1: TButton;
IdHTTP1: TIdHTTP;
IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
Button2: TButton;
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Label4: TLabel;
ListBox1: TListBox;
Memo1: TMemo;
Button_Images_Attach: TButton;
procedure Auth(); // Авторизация
procedure AttachPhoto(); // Загружаем и прикрепляем фото
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Button_Images_AttachClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
access_token:string; // Получаем токен
photos_getProfileUploadServer:string;
upload_photo:string;
upload_mid:string;
upload_hash:string;
upload_message_code:string;
upload_profile_aid:string;
implementation
{$R *.dfm}
uses Unit2;
procedure TForm1.Auth; // Авторизация в приложении
begin
Form2.Show;
Form2.Caption:='Авторизация';
Form2.WebBrowser1.Navigate('https://oauth.vk.com/authorize?client_id=3994998&scope=friends,photos,pages,status,wall,groups,offline&redirect_uri=https://oauth.vk.com/blank.html&display=popup&v=5.21&response_type=token');
end;
procedure TForm1.AttachPhoto; // Загружаем и прикрепляем фото
var
list:TStringList;
json_server:string;
LJsonObj:TJSONObject;
LRows:TJSONValue;
upload_server:string;
upload_photo:string;
upload_mid:string;
upload_hash:string;
photo_list:string;
save_result:string;
FileName:string;
formData: TIdMultiPartFormDataStream;
RegExp: TRegExpr;
begin
list:=TStringList.Create;
// Получаем адрес сервера для загрузки
begin
list.Add('access_token='+access_token);
list.Add('v=5.21');
json_server:=IdHTTP1.Post('https://api.vk.com/method/photos.getWallUploadServer',list);
LJsonObj := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(json_server),0) as TJSONObject;
try
LRows:=LJsonObj.Get('response').JsonValue;
upload_server:=TJSONObject(LRows).Get('upload_url').JsonValue.Value; // Парсим адрес сервера для загрузки фото
finally
LJsonObj.Free;
end;
ListBox1.Items.Add('Полный адрес сервера: '+upload_server); // Показываем адрес сервера для загрузки
list.Free;
end;
RegExp := TRegExpr.Create; // Работаем с регулярками
// Грузим фаил на сервер
begin
FileName := '1.jpg';
RegExp.InputString := upload_server;
// ^http://(.*?).vk.com/upload.php?act=do_add&mid=32364982&aid=-14&gid=0&hash=0ed7e894a615b6f665bc75a68fd589a9&rhash=562a34153a9bfcb116488e56f9fa08b0&swfupload=1&api=1&wallphoto=1$
RegExp.Expression := '^http:\/\/(.*?).vk.com\/upload.php\?act=do_add&mid=(.*?)&aid=(.*?)&gid=(.*?)&hash=(.*?)&rhash=(.*?)&swfupload=(.*?)&api=(.*?)&wallphoto=(.*?)$';
if RegExp.Exec then
begin
formData := TIdMultiPartFormDataStream.Create;
formData.AddFile('photo',fileName,'application/image');
formData.AddFormField('act','do_add'); // act
formData.AddFormField('mid',RegExp.Match[2]);
formData.AddFormField('aid',RegExp.Match[3]);
formData.AddFormField('gid',RegExp.Match[4]);
formData.AddFormField('hash',RegExp.Match[5]);
formData.AddFormField('rhash',RegExp.Match[6]);
formData.AddFormField('swfupload',RegExp.Match[7]);
formData.AddFormField('api',RegExp.Match[8]);
formData.AddFormField('wallphoto',RegExp.Match[9]);
photo_list := idhttp1.Post('http://'+RegExp.Match[1]+'.vk.com/upload.php',formData); // Запрос на сервер
formData.Free;
ListBox1.Items.Add('Сервер: http://'+RegExp.Match[1]+'.vk.com'); // Адрес сервера
ListBox1.Items.Add('act: do_add');
ListBox1.Items.Add('mid: '+RegExp.Match[2]);
ListBox1.Items.Add('aid: '+RegExp.Match[3]);
ListBox1.Items.Add('gid: '+RegExp.Match[4]);
ListBox1.Items.Add('hash: '+RegExp.Match[5]);
ListBox1.Items.Add('rhash: '+RegExp.Match[6]);
ListBox1.Items.Add('swfupload: '+RegExp.Match[7]);
ListBox1.Items.Add('api: '+RegExp.Match[8]);
ListBox1.Items.Add('wallphoto: '+RegExp.Match[9]);
//memo1.Lines.Add(photo_list);
LJsonObj := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(photo_list),0) as TJSONObject;
try
//LRows:=LJsonObj.Get('response').JsonValue;
upload_server:=TJSONObject(LJsonObj).Get('server').JsonValue.Value;
upload_photo:=TJSONObject(LJsonObj).Get('photo').JsonValue.Value;
upload_hash:=TJSONObject(LJsonObj).Get('hash').JsonValue.Value;
finally
LJsonObj.Free;
ListBox1.Items.Add('Результат загрузки фото!');
ListBox1.Items.Add('server: '+upload_server);
ListBox1.Items.Add('photo: '+upload_photo);
ListBox1.Items.Add('hash: '+upload_hash);
end;
end;
// Сохраняем фото
begin
list:=TStringList.Create;
list.Add('user_id=32364982');
list.Add('photo='+upload_photo);
list.Add('server='+upload_server);
list.Add('v=5.21');
list.Add('access_token='+access_token);
save_result:=IdHTTP1.Post('https://api.vk.com/method/photos.saveWallPhoto',list);
list.Free;
list.Add('Фото загружено успешно!');
memo1.Lines.Add(save_result);
end;
end;
RegExp.Free;
end;
procedure TForm1.FormShow(Sender: TObject); // Авторизируем пользователя при запуске
begin
Auth; // Проходим авторизацию
end;
procedure TForm1.Button1Click(Sender: TObject); // Авторизируем пользователя вручную
begin
Auth; // Проходим авторизацию
end;
procedure TForm1.Button_Images_AttachClick(Sender: TObject); // При клике загружаем и прикрепляем фото
begin
AttachPhoto; // Загружаем и прикрепляем фото
end;
// Отправка сообщения на стену
procedure TForm1.Button2Click(Sender: TObject);
var
a: TStringList;
b: string;
begin
a:= TStringList.Create;
a.Add('owner_id=32364982');
a.Add('message='+Edit1.Text);
a.Add('attachments=photo-8830155_315008324');
a.Add('v=5.21');
a.Add('access_token='+access_token);
b:=IdHTTP1.Post('https://api.vk.com/method/wall.post',a);
Label1.Caption:= b;
end;
end.
Кто шарит ткните носом что не так.
Исходник:
http://progerson.ru/wall.post.zip