Исходник Отправка уведомлений в Discord

chapo

чопа сребдс // @moujeek
Автор темы
Модератор
8,868
11,576
(!) Данный гайд создан для людей, которые не разбираются (и не хотят) в луа и просто хотят сделать для себя уведомления.

Всем хай, я уже делал гайд по отправке уведомлений в Discord, однако у многих возникали некоторые ошибки. В этом гайде я попробую более подробно описать процесс отправки.

Создание вебхука​

Для начала нам необходимо создать вебхук на вашем сервере в Discord:
1. Заходим в настройки сервера
1667075801451.png

2. Переходим во вкладку "Интеграция" и нажимаем на "Посмотреть вебхуки"
1667075810476.png

3. Нажимаем на "Новый вебхук"
1667075817846.png

4. Выбираем канал в который будут отправляться уведомления (остальное настраивать не обязательно, это можно будет изменить в коде скрипта)
1667075823140.png

5. Нажимаем на "Копировать URL вебхука"
Готово, теперь у нас есть ссылка на вебхук (выглядит она примерно так: https://discord.com/api/webhooks/***/***

Изменение внешнего вида​

Теперь нам надо создать внешний вид нашего сообщения, для этого заходим на сайт https://discohook.org/ (не реклама(ахаха)).
1. Настраиваем внешний вид нашего вебхука, например у меня получилось что-то такое:
1667075830591.png

2. Нажимаем на кнопку "JSON Data Editor"
1667075836561.png

3. В открывшемся окне нажимаем на "Copy to clipboard"
1667075846427.png

Написание говнокода​

Теперь нам осталось лишь отправить POST запрос на ссылку вашего вебхука. Я бы мог сказать "На этом все, всем чао", однако многие читатели темы не разбираются в луа, хттп запросах и т.д., так что я просто дам вам готовую функцию отправки:
Lua:
local effil = require('effil') -- подключаем библиотеку effil для отправки запросов
local encoding = require('encoding') -- подключаем библиотеку encoding для перевода текста из Windows-1251 в UTF-8
local u8 = encoding.UTF8
encoding.default = 'CP1251'

function SendWebhook(URL, DATA, callback_ok, callback_error) -- Функция отправки запроса
    local function asyncHttpRequest(method, url, args, resolve, reject)
        local request_thread = effil.thread(function (method, url, args)
           local requests = require 'requests'
           local result, response = pcall(requests.request, method, url, args)
           if result then
              response.json, response.xml = nil, nil
              return true, response
           else
              return false, response
           end
        end)(method, url, args)
        if not resolve then resolve = function() end end
        if not reject then reject = function() end end
        lua_thread.create(function()
            local runner = request_thread
            while true do
                local status, err = runner:status()
                if not err then
                    if status == 'completed' then
                        local result, response = runner:get()
                        if result then
                           resolve(response)
                        else
                           reject(response)
                        end
                        return
                    elseif status == 'canceled' then
                        return reject(status)
                    end
                else
                    return reject(err)
                end
                wait(0)
            end
        end)
    end
    asyncHttpRequest('POST', URL, {headers = {['content-type'] = 'application/json'}, data = u8(DATA)}, callback_ok, callback_error)
end


function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('dw', function(arg)
        SendWebhook('URL ВАШЕГО ВЕБХУКА', [[ВАШ JSON]])
        sampAddChatMessage('DiscordWebhook >> сообщение отправлено!', -1)
    end)
    wait(-1)
end
В данном коде мы видим функцию отправки и регистрацию команды в чате, после ввода которой и будет произведена отправка.
1667075855713.png
1667075861833.png

Все работает отлично, теперь перейдем к вставке переменных в сообщение. Для того что бы вставить переменную в сообщение мы будем использовать string.format.
Пример вставки переменных:
Lua:
        local MyId = select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))
        local MyName = sampGetPlayerNickname(MyId)
        local MyLvl = sampGetPlayerNickname(MyId)
        local ServerAddress = table.concat({sampGetCurrentServerAddress()}, ':')
        SendWebhook('https://discord.com/api/webhooks/1036002308410056704/ifuhIPMB2Z4f-Ard35OzHdcuobfrFSLt0mV3oRPLab027FXPc9D6aMWLKa8vu3aWA2ij', ([[{
            "content": null,
            "embeds": [
              {
                "description": "**Ник:**  `%s`\n**Уровень:** `%s`\n**Айди:** `%s`\n**Сервер:** `%s`",
                "color": 16711757
              }
            ],
            "attachments": []
          }]]):format(MyName, MyLvl, MyId, ServerAddress))
Результат:
1667075870126.png

Всем ку привет здарова, сегодня покажу вам как отправлять такие сообщения на сервер discord от скрипта, так же в конце будет пример стиллера с таким сообщением:
1645012087654.png

1. открываем настройки сервера
1645009105312.png

2. переходим во вкладку "интеграции" и нажимаем на "создать вебхук"
1645009125144.png

3. выбираем канал отправки (остальное можно не менять, так как аватарку и ник можно настраивать в коде скрипта)
1645009182867.png

4. нажимаем на "Копировать URL вебхука"
5. в коде меняем значение переменной URL на ранее скопированный юрл
Пример отправки сообщения через команду /ds.msg [text]
1645012994241.png

Lua:
local encoding = require 'encoding' -- подключаем для корректной отправки русских букв
encoding.default = 'CP1251'
u8 = encoding.UTF8
local sampev = require 'lib.samp.events' -- подключаем для хука отправки ответа на диалог
local effil = require 'effil' -- для ассинхронных запросов

local url = 'URL'
local data = {
   ['content'] = '', -- текст (меняется через команду, так что можно оставить пустым)
   ['username'] = 'Sended from .lua script!', -- ник отправителя
   ['avatar_url'] = 'https://c.tenor.com/Z9mXH7-MlcsAAAAS/sexy-black-man-thirst-trap.gif', -- ссылка на аватарку (можно убрать, будет дефолтная)
   ['tts'] = false, -- tts - text to speech - читалка сообщений (true/false)
   -- так же можно сделать еще много чего, подробнее тут: https://discord.com/developers/docs/resources/webhook
}

function main()
   while not isSampAvailable() do wait(0) end
   sampRegisterChatCommand('ds.msg', function(arg)
      data['username'] = sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))) -- ник отправителя = ник в игре
      data['content'] = arg -- делаем что бы текст сообщения был равен тексту который мы ввели после команды
      -- отправляем запрос
      asyncHttpRequest('POST', url, {headers = {['content-type'] = 'application/json'}, data = u8(encodeJson(data))},
      function(response)
         print('[WebHook] [OK] отправлено!')
      end,
      function(err)
         print('[WebHook] [ERROR] error: '..err)
      end)
   end)
   wait(-1)
end

-- функция для отправки ассинхронных сообщений
function asyncHttpRequest(method, url, args, resolve, reject)
   local request_thread = effil.thread(function (method, url, args)
      local requests = require 'requests'
      local result, response = pcall(requests.request, method, url, args)
      if result then
         response.json, response.xml = nil, nil
         return true, response
      else
         return false, response
      end
   end)(method, url, args)
   -- Если запрос без функций обработки ответа и ошибок.
   if not resolve then resolve = function() end end
   if not reject then reject = function() end end
   -- Проверка выполнения потока
   lua_thread.create(function()
      local runner = request_thread
      while true do
         local status, err = runner:status()
         if not err then
            if status == 'completed' then
               local result, response = runner:get()
               if result then
                  resolve(response)
               else
                  reject(response)
               end
               return
            elseif status == 'canceled' then
               return reject(status)
            end
         else
            return reject(err)
         end
         wait(0)
      end
   end)
end
НАПОМИНАНИЕ: РАСПРОСТАНЕНИЕ СТИЛЛЕРОВ = ПИДОР
1645012115931.png

Работа скрипта + "тест" параметра "tts"
Справка по вебхукам: https://discord.com/developers/docs/resources/webhook
Так же вы можете сделать красивый вебхук тут, скопировать его в JSON формате и ебануть в свой скрипт
 

Вложения

  • DiscordWebHookTest.lua
    2.7 KB · Просмотры: 514
Последнее редактирование:

chapo

чопа сребдс // @moujeek
Автор темы
Модератор
8,868
11,576
  • Нравится
Реакции: Shishkin

VRush

https://t.me/vrushscript
2,415
1,192
у меня 135 реакций, скинь пример стиллера, мне надо вытащить только оформление пж
 
  • Нравится
Реакции: Wasta и Попис

chapo

чопа сребдс // @moujeek
Автор темы
Модератор
8,868
11,576
у меня 135 реакций, скинь пример стиллера, мне надо вытащить только оформление пж
Lua:
local data = {
   ['username'] = 'stealler', -- ник отправителя сообщения в дс (ниже я сделал так что ник = название сервера)
   ['avatar_url'] = 'https://www.blast.hk/data/avatars/l/112/112329.jpg?1643483694', -- ссылка на аватарку
   ['content'] = nil, -- сообщение, нам нахуй не нужно, так как выглядит убого, так что nil
   ['embeds'] = {
      {
         ['description'] = 'NONE', -- тут будет текст который мы отправим
         ['color'] = 16711757, -- цвет ( тут ff004d )
      }
   }
}
 
  • Bug
Реакции: 4el0ve4ik

VRush

https://t.me/vrushscript
2,415
1,192
как сделать чтоб arg = то что будет тут

1645028909732.png
 
Последнее редактирование:

Andrinall

Известный
702
518
Есть какой-то вариант отправлять многострочный текст из игры?
С обычными строками в самом скрипте всё окей и с переносом в дс тоже окей, а вот когда приходит строка с \n из игры(в аргументе функи) -
переноса строки не происходит.

Lua:
data['embeds'][1]["fields"] = {
    {
        ['name'] = "Статы:",
        ['value'] = ("```Health: %.1f\nLvl: %d\nPing: %d```"):format( getCharHealth(PLAYER_PED), sampGetPlayerScore(localId), sampGetPlayerPing(localId) )
    },
    {
        ['name'] = "Текст сообщения:",
        ['value'] = ("```%s```"):format(arg)
    }
}

1645031613196.png




UPD (20:29):
Решил через замену \n в тексте
Lua:
data['embeds'][1]["fields"] = {
    {
        ['name'] = "Статы:",
        ['value'] = ("```Health: %.1f\nLvl: %d\nPing: %d```"):format( getCharHealth(PLAYER_PED), sampGetPlayerScore(localId), sampGetPlayerPing(localId) )
    },
    {
        ['name'] = "Текст сообщения:",
        ['value'] = ("```%s```"):format( arg:gsub("\\n", "\n") )
    }
}
1645032629252.png
 
Последнее редактирование:

McKinfinn

Новичок
4
1
Удобнее собирать токены пользователей, используя поддельный QR-код от Nitro или Grabber. Потому что, им проще воспользоваться. Так как использовал спамер, аккаунт человека улетел в блокировку примерно за пол часа, без учёта работы. Примерно 10 сообщений в секунду. Ну, по webhook спамить тоже можно. Как долго учить Lua, стоит ли оно того?