Yondime

кавайчик
Автор темы
Проверенный
307
514

лого.png

Всем привет, был заказ с отправкой фотки в ВК, поискал инфу на бластхаке и не нашел, решил заставить сделать @th3egdvach

Гайд:
Первым делом нам нужно подключить необходимые либы и ввести токен с айди юзера + рандомное число для ВК АПИ
Вводим константы + либы:
local requests = require("requests") -- самая крутая либа

local USER_ID = 010101010110 -- айди пользователя
local GROUP_TOKEN = "ПРИВАТКА" -- токен группы
Нужная функция для ВК АПИ, получаем рандомное число:
function randomInt() -- выдает рандомное число, чтобы сообщение отправилось ( требует вк апи )
  math.randomseed(os.time() + os.clock())
  return math.random(-2147483648, 2147483648)
end
Чтобы отправить фото, мы сделаем функцию для простого использования
Вызываем функцию отправления фотографии:
sendPhoto(getGameDirectory()..'/1.png')

function sendPhoto(path)
  -- содержимое функции распишу ниже
end
Для отправки фотки, следуя методам по апи вк, нужно залить ее на сервер
Загрузка фотки на сервер:
local upResponse = requests.post(("https://api.vk.com/method/photos.getMessagesUploadServer?user_id=%d&access_token=%s&v=5.131"):format(USER_ID, GROUP_TOKEN)).json() -- отправляем запрос на метод вк, в котором получаем ссылочку для загрузки 
local uploadedResponse = uploadPhoto(path, upResponse.response.upload_url) -- загружаем фото на ссылку
Функция загрузки фотки по ссылке:
Загружаем фотографию по полученной ссылке:
function uploadPhoto(filename, uploadUrl)
  local fileHandle = io.open(filename,"rb")
  if (fileHandle) then
    local fileContent = fileHandle:read( "*a" )
    fileHandle:close()
    local boundary = 'abcd'
    local header_b = 'Content-Disposition: form-data; name="file"; filename="' .. filename .. '"\r\nContent-Type: image/png\r\n'
    local fileContent =  '--' ..boundary .. '\r\n' ..header_b ..'\r\n'.. fileContent .. '\r\n--' .. boundary ..'--\r\n'
    local resp = requests.post(uploadUrl, {
      headers = {
        ["Content-Length"] =  fileContent:len(),
        ['Content-Type'] = 'multipart/form-data; boundary=' .. boundary   
      },
      data = fileContent
    })
    return resp.json()
  end
end
Дальше мы сохраняем нашу фоточку по методу в вк апи чтобы получить нужные нам данные для прикрепления ее к сообщению
Получаем данные для прикрепления фотографии к сообщению:
local saveResponse = requests.post(("https://api.vk.com/method/photos.saveMessagesPhoto?server=%d&photo=%s&hash=%s&access_token=%s&v=5.131"):format(uploadedResponse.server,uploadedResponse.photo,uploadedResponse.hash, GROUP_TOKEN)).json()
local image = saveResponse.response[1]
local att_image = ("photo%d_%d_%s"):format(image.owner_id, image.id, image.access_key)
Ну и в конце мы просто отправляем стандартное сообщение вк обычным методом
Отправляем сообщение с прикрепленной Фотографией:
return requests.post(("https://api.vk.com/method/messages.send?user_id=%d&attachment=%s&access_token=%s&random_id=%d&v=5.131"):format(USER_ID, att_image, GROUP_TOKEN, randomInt())) -- обычный способ отправки вк
В итоге так будет выглядеть функция в сборе:

Готовая функция sendPhoto:
function sendPhoto(path)
  local upResponse = requests.post(("https://api.vk.com/method/photos.getMessagesUploadServer?user_id=%d&access_token=%s&v=5.131"):format(USER_ID, GROUP_TOKEN)).json()
  local uploadedResponse = uploadPhoto(path, upResponse.response.upload_url)
  local saveResponse = requests.post(("https://api.vk.com/method/photos.saveMessagesPhoto?server=%d&photo=%s&hash=%s&access_token=%s&v=5.131"):format(uploadedResponse.server,uploadedResponse.photo,uploadedResponse.hash, GROUP_TOKEN)).json()
  local image = saveResponse.response[1]
  local att_image = ("photo%d_%d_%s"):format(image.owner_id, image.id, image.access_key)
  return requests.post(("https://api.vk.com/method/messages.send?user_id=%d&attachment=%s&access_token=%s&random_id=%d&v=5.131"):format(USER_ID, att_image, GROUP_TOKEN, randomInt()))
end

Готовый код прикреплю в файлике ниже 😊
Если есть вопросы, готов ответить на них в теме или лс группы вк

Для связи: Группа ВК или Телеграм

 

Вложения

  • sendPhotoToVK.lua
    2.2 KB · Просмотры: 42

hinazuki

Потрачен
346
95
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Можно ли таким же способом залить фото на свой хостинг?
 

Rice.

Известный
Модератор
1,703
1,471
Даня, сможешь сделать пример для отправлений сообщения в личные сообщения? Пытался разобраться, но библиотека выдаёт ошибку "Неверно указаны параметры запроса".
 

hinazuki

Потрачен
346
95
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Если у хостинга есть апи - да
Таким же способом можно залить на свой хостинг, для этого нужно создать php скрипт на своем хостинге:
PHP:
<?php
$path = "upload/" .$_FILES['file']['name']; // папка для сохронение фото
move_uploaded_file($_FILES['file']['tmp_name'], $path);
?>
lua код тот же но в url указываем путь до своего скрипта на хостинге.
 
Последнее редактирование:
  • Вау
Реакции: silentium2006