Отправка картинки на стену группы ВК

Всем доброго времени суток. Пытаюсь отправить картинку на стену группы ВК.
Но не получается загрузить картинку.
По порядку:
Получаю сервер для загрузки:

var
  sl  : TStringList;
  res : string;
  JSONObj : TJSONObject;
  serv, photo, hash  : string;
  picStream : TIdMultiPartFormDataStream;
begin
  sl  :=  TStringList.Create;
  // Получаем сервер загрузки
  sl.Add('group_id=111586045');
  sl.Add('access_token='+token);
  sl.Add('v=5.131');
  res := IdHTTP1.Post('https://api.vk.com/method/photos.getWallUploadServer?', sl);
  JSONObj :=  TJSONObject.ParseJSONValue(res) as TJSONObject;
  try
    serv := JSONObj.FindValue('response.upload_url').Value;
    memoLog.Lines.Add(serv);
  except
    ShowMessage ('Не удалось проучить сервер загрузки.' +#13#10+ JSONObj.FindValue('error.error_msg').Value);
    exit;
  end;

Потом загружаю картинку по полученному серверу:

// Загружаем картинку
  picStream := TIdMultiPartFormDataStream.Create;
  picStream.AddFile('file1', 'D:\myasnaya-muha-1024x709.jpg', 'multipart/form-data');
  res := IdHTTP1.Post(serv, picStream);
  JSONObj :=  TJSONObject.ParseJSONValue(res) as TJSONObject;
  try
    serv := JSONObj.GetValue('server').Value;
    photo := JSONObj.GetValue('photo').Value;
    hash := JSONObj.GetValue('hash').Value;
    memoLog.Lines.Add(serv);
    memoLog.Lines.Add(photo);
    memoLog.Lines.Add(hash);
  except
    ShowMessage ('Не удалось загрузить картинку.' +#13#10+ JSONObj.FindValue('error.error_msg').Value);
    exit;
  end;
  picStream.Free;

Потом делаю сохранение фото:

// Сохраняем фото
  sl.Clear;
  sl.Add('group_id=111586045');
  sl.Add('photo='+photo);
  sl.Add('server='+serv);
  sl.Add('hash='+hash);
  sl.Add('access_token='+token);
  sl.Add('v=5.131');
  res := IdHTTP1.Post('https://api.vk.com/method/photos.saveWallPhoto?', sl);
  memoLog.Lines.Add(res);

И вот тут приходит ответ, что типа неправильный токен. Но с этим токеном все остальные API методы работают

{"error":{"error_code":5,"error_msg":"User authorization failed: no access_token passed.","request_params":[{"key":"method","value":"photos.saveWallPhoto"},{"key":"oauth","value":"1"}]}}

Может кто подскажет?
Заранее Благодарен.

В примерах в документации токен передается в параметрах URL, а не в теле.

https://vk.com/dev/first_guide

https://api.vk.com/method/friends.getOnline?v=5.52&access_token=....

…но там нигде не указано четко что как отправлять.
Их РНР библиотека тоже в теле всё отправляет для POST.

Может просто с переменной token что-то не так в том месте?

Исключено. Другие API методы нормально с этим же токеном отрабатываются в этой же процедуре.
Все участки кода, которые я предоставил находятся в одной и той же процедуре и идут друг за другом. Переменная token глобальная и в коде нигде не меняется, кроме как при авторизации.

Я про то, что я бы для начала с помощью отладчика или отладочного вывода проверил бы значение в том месте. Вдруг оно где-то случайно поменялось или не та переменная (локальная с тем же именем, …).

Еще на всякий случай убрать ? в конце, раз за ним все равно нет параметров.

Как это нет параметров? В каждом вызове API VK есть параметры

? нужен только если передавать параметры в URL.

mypage.html?hello=world&name=vasya

Query string - Wikipedia

Так там в каждом методе API VK передаются параметры. Я бы сказал больше, что мне не приходилось работать с такими методами VK API, где не нужны параметры.
Отладчиком прошёлся. token верный 100%
Да он и не может быть не верный, т.к. другие то методы нормально с этим токеном там же отрабатываются.

Так причем тут это, вы ж в теле запроса передаете, а не в URL. Значит ? не нужен.

Так. Почему же тогда во всех других методах нужен. Они все вызываются совершенно идентично и отрабатывают прекрасно. Сейчас попробую убрать конечно. Но что-то мне подсказывает, что будет ошибка…

Попробовал. Всё точно так же ошибка токена. Хоть с ?, хоть без него.

Ни в каких не нужен если за ним не идут параметры как тут

Ну а убрать на всякий случай, вдруг оно например определяет откуда читать параметры (из тела или URL) по наличию ?.

Тогда я бы попробовал посмотреть нет ли чего странного в отправляемом запросе (например, по сравнению с предыдущими) с помощью чего-нибудь типа Fiddler.
Или попробовать выполнить запрос какой-нибудь другой утилитой (curl, Postman, …, Postman вообще удобная штука для экспериментов). Если и там та же ошибка, то перепроверить, что всё как в документации, и писать в тех. поддержку.

Кстати я использую прямую авторизацию и в ней client_id и client_secret как я понял от родного андроид приложения. Может в нём дело? Но хотя токен то получаю.
Создал своё приложение. Взял с него client_id и client_secret но с него даже авторизация не проходит. В чем может быть проблема? Не могли бы вы свои дать для проверки?

Для нее ж вроде надо просить разрешение в тех. поддержке. https://vk.com/dev/auth_direct

Так что проще использовать рекомендуемый способ через OAuth )

В современных Дельфи вроде есть какие-то стандартные и сторонние библиотеки упрощающие работу с OAuth.
Delphi авторизация на сайте https - #21 от пользователя AlexP

Но вообще я бы взял язык, для которого есть оф. библиотека вк, чтоб не велосипедить.
Или хотя бы живая не оф. типа https://github.com/vknet/vk

Если очень нужна “прямая” без ручного взаимодействия, то наверно можно автоматизировать взаимодействие с формой/отправку запросов для OAuth авторизации. В библиотеке выше вроде так и сделано.

У меня даже аккаунта вк нет.

Спасибо. Так не хотелось на C# этого делать. Но похоже придётся (((