Отправка сообщения вконтакте на стену пользователя или группы через api

Так ребята кому не лень разбираемся))) Ниже процесс отправки сообщения на стену пользователя или группы вк.

Все хорошо но есть большое "но". Не получается выполнить метод 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
Теги:
photos.getWallUploadServer, photos.saveWallPhoto, wall.post
Добавлено: 08 Июня 2014 01:05:21 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Гость
04 Апреля 2024 14:47:29
Hello, did you receive my offer? from2325214cv https://google.com