Yondime

кавайчик
Автор темы
Проверенный
306
513

лого.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.

https://t.me/riceoff
Модератор
1,681
1,371
Даня, сможешь сделать пример для отправлений сообщения в личные сообщения? Пытался разобраться, но библиотека выдаёт ошибку "Неверно указаны параметры запроса".
 

hinazuki

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