Исходник Гайд [RakSAMP Lite] Уведомления в Telegram.

S0meTh1n69

Участник
Автор темы
29
16
Всем привет, увидел сообщение от человека, которому нужен был скрипт для отправки уведомлений в Telegram под RakSAMP Lite, поэтому эта тема вышла в свет.

Первым делом, нужно создать нашего бота в Telegram и получить Token и наш ChatID.
Для того, чтобы получить Token и ChatID в Telegram, вам нужно:

  1. Создать бота Telegram, следуя инструкциям на странице BotFather. Просто напишите ему "/newbot" и следуйте инструкциям.
  2. Получите Token, который представляет собой уникальный идентификатор вашего бота. BotFather должен отправить вам сообщение с этим токеном.
  3. Чтобы получить ChatID, вы можете использовать специального бота Telegram, который называется "userinfobot". Просто найдите его в поиске Telegram и отправьте ему сообщение. Он должен ответить с вашим ID чата.
Обратите внимание, что bot_token должен быть строго конфиденциальным, так как любой, кто имеет доступ к этому токену, может управлять вашим ботом.
Что делать дальше:

  1. Скачать библиотеку "requests", распаковать архив по пути: "\RakSAMP Lite\scripts\libs"
  2. Скачать, или переписать исходник "tgnotif.lua"
  3. Переместить скрипт по пути: "\RakSAMP Lite\scripts\"
Часть установки пройдена, теперь немного о самом скрипте.

Как работает скрипт:

Скрипт начинается с определения таблицы ansi_decode, которая соотносит символы ANSI с соответствующими им кодами UTF-8. Затем определяется функция AnsiToUtf8, которая переводит символы ANSI в UTF-8.

Далее определяются переменные bot_token и chat_id, которые должны быть заменены на Токен вашего бота и ID чата в Telegram, куда будут отправляться сообщения. Затем определяется функция send_telegram_message, которая отправляет сообщение в Telegram, используя API Telegram.

В конце определяется функция sampev.onServerMessage, которая вызывается каждый раз, когда сервер отправляет сообщение. Эта функция вызывает send_telegram_message, чтобы отправить сообщение в Telegram. В результате, при получении сообщения от сервера, оно будет отправлено в указанный чат в Telegram.

Исходник:
-- Подключаем модуль для обработки событий
local sampev = require('samp.events')
-- Поключаем библиотеку requests для отправки HTTP запросов
local requests = require("requests")

-- Таблица соответствия символов ANSI кодам UTF-8
local ansi_decode = {
  [128]= "\208\130", [129]= "\208\131", [130]= "\226\128\154", [131]= "\209\147", [132]= "\226\128\158", [133]= "\226\128\166",
  [134]= "\226\128\160", [135]= "\226\128\161", [136]= "\226\130\172", [137]= "\226\128\176", [138]= "\208\137", [139]= "\226\128\185",
  [140]= "\208\138", [141]= "\208\140", [142]= "\208\139", [143]= "\208\143", [144]= "\209\146", [145]= "\226\128\152",
  [146]= "\226\128\153", [147]= "\226\128\156", [148]= "\226\128\157", [149]= "\226\128\162", [150]= "\226\128\147", [151]= "\226\128\148",
  [152]= "\194\152", [153]= "\226\132\162", [154]= "\209\153", [155]= "\226\128\186", [156]= "\209\154", [157]= "\209\156",
  [158]= "\209\155", [159]= "\209\159", [160]= "\194\160", [161]= "\209\142", [162]= "\209\158", [163]= "\208\136",
  [164]= "\194\164", [165]= "\210\144", [166]= "\194\166", [167]= "\194\167", [168]= "\208\129", [169]= "\194\169",
  [170]= "\208\132", [171]= "\194\171", [172]= "\194\172", [173]= "\194\173", [174]= "\194\174", [175]= "\208\135",
  [176]= "\194\176", [177]= "\194\177", [178]= "\208\134", [179]= "\209\150", [180]= "\210\145", [181]= "\194\181",
  [182]= "\194\182", [183]= "\194\183", [184]= "\209\145", [185]= "\226\132\150", [186]= "\209\148", [187]= "\194\187",
  [188]= "\209\152", [189]= "\208\133", [190]= "\209\149", [191]= "\209\151"
  }

-- Функция для перевода символов ANSI в UTF-8
function AnsiToUtf8(s)
  local t = {}
  for i = 1, #s do
    local b = s:byte(i)
    if b < 128 then
      t[#t+1] = string.char(b)
    else
      t[#t+1] = ansi_decode[b] or (b > 239 and "\209" .. string.char(b - 112) or (b > 191 and "\208" .. string.char(b - 48) or '_'))
    end
  end
return table.concat(t)
end



-- Замените <bot_token> на токен вашего бота Telegram
local bot_token = '<bot_token>'
-- Замените <chat_id> на ваш ID чата Telegram
local chat_id = '<chat_id>'

-- Непосредственно функция отправки сообщений в Telegram
local function send_telegram_message(message)
  local url = string.format('https://api.telegram.org/bot%s/sendMessage?chat_id=%s&text=%s', bot_token, chat_id, AnsiToUtf8(message))
  local response = requests.get(url)
  if response.status_code == 200 then
    print('Сообщение отправлено в Telegram')
  else
    print('Ошибка отправки сообщения в Telegram:', response.text)
  end
end

-- Функция обработки сообщений от сервера
function sampev.onServerMessage(color, text)
  local message = string.format('Сообщение от сервера: %s', text)
  send_telegram_message(message)
end
 

Вложения

  • tgnotif.lua
    2.5 KB · Просмотры: 125

rustersha

Потрачен
3
5
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Библиотека encoding шутка для тебя?
А так же изучи документацию requests, поймешь как можно передавать параметры без колхоза твоего https://github.com/JakobGreen/lua-requests#url-parameters
 

rustersha

Потрачен
3
5
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
А еще запрос надо делать в pcall, если возникнет ошибка (на уровне сети), скрипту пизда
 
  • Нравится
Реакции: yung milonov

CaJlaT

Овощ
Модератор
2,721
2,394
Всем привет, увидел сообщение от человека, которому нужен был скрипт для отправки уведомлений в Telegram под RakSAMP Lite, поэтому эта тема вышла в свет.

Первым делом, нужно создать нашего бота в Telegram и получить Token и наш ChatID.
Для того, чтобы получить Token и ChatID в Telegram, вам нужно:

  1. Создать бота Telegram, следуя инструкциям на странице BotFather. Просто напишите ему "/newbot" и следуйте инструкциям.
  2. Получите Token, который представляет собой уникальный идентификатор вашего бота. BotFather должен отправить вам сообщение с этим токеном.
  3. Чтобы получить ChatID, вы можете использовать специального бота Telegram, который называется "userinfobot". Просто найдите его в поиске Telegram и отправьте ему сообщение. Он должен ответить с вашим ID чата.
Обратите внимание, что bot_token должен быть строго конфиденциальным, так как любой, кто имеет доступ к этому токену, может управлять вашим ботом.
Что делать дальше:

  1. Скачать библиотеку "requests", распаковать архив по пути: "\RakSAMP Lite\scripts\libs"
  2. Скачать, или переписать исходник "tgnotif.lua"
  3. Переместить скрипт по пути: "\RakSAMP Lite\scripts\"
Часть установки пройдена, теперь немного о самом скрипте.

Как работает скрипт:

Скрипт начинается с определения таблицы ansi_decode, которая соотносит символы ANSI с соответствующими им кодами UTF-8. Затем определяется функция AnsiToUtf8, которая переводит символы ANSI в UTF-8.

Далее определяются переменные bot_token и chat_id, которые должны быть заменены на Токен вашего бота и ID чата в Telegram, куда будут отправляться сообщения. Затем определяется функция send_telegram_message, которая отправляет сообщение в Telegram, используя API Telegram.

В конце определяется функция sampev.onServerMessage, которая вызывается каждый раз, когда сервер отправляет сообщение. Эта функция вызывает send_telegram_message, чтобы отправить сообщение в Telegram. В результате, при получении сообщения от сервера, оно будет отправлено в указанный чат в Telegram.

Исходник:
-- Подключаем модуль для обработки событий
local sampev = require('samp.events')
-- Поключаем библиотеку requests для отправки HTTP запросов
local requests = require("requests")

-- Таблица соответствия символов ANSI кодам UTF-8
local ansi_decode = {
  [128]= "\208\130", [129]= "\208\131", [130]= "\226\128\154", [131]= "\209\147", [132]= "\226\128\158", [133]= "\226\128\166",
  [134]= "\226\128\160", [135]= "\226\128\161", [136]= "\226\130\172", [137]= "\226\128\176", [138]= "\208\137", [139]= "\226\128\185",
  [140]= "\208\138", [141]= "\208\140", [142]= "\208\139", [143]= "\208\143", [144]= "\209\146", [145]= "\226\128\152",
  [146]= "\226\128\153", [147]= "\226\128\156", [148]= "\226\128\157", [149]= "\226\128\162", [150]= "\226\128\147", [151]= "\226\128\148",
  [152]= "\194\152", [153]= "\226\132\162", [154]= "\209\153", [155]= "\226\128\186", [156]= "\209\154", [157]= "\209\156",
  [158]= "\209\155", [159]= "\209\159", [160]= "\194\160", [161]= "\209\142", [162]= "\209\158", [163]= "\208\136",
  [164]= "\194\164", [165]= "\210\144", [166]= "\194\166", [167]= "\194\167", [168]= "\208\129", [169]= "\194\169",
  [170]= "\208\132", [171]= "\194\171", [172]= "\194\172", [173]= "\194\173", [174]= "\194\174", [175]= "\208\135",
  [176]= "\194\176", [177]= "\194\177", [178]= "\208\134", [179]= "\209\150", [180]= "\210\145", [181]= "\194\181",
  [182]= "\194\182", [183]= "\194\183", [184]= "\209\145", [185]= "\226\132\150", [186]= "\209\148", [187]= "\194\187",
  [188]= "\209\152", [189]= "\208\133", [190]= "\209\149", [191]= "\209\151"
  }

-- Функция для перевода символов ANSI в UTF-8
function AnsiToUtf8(s)
  local t = {}
  for i = 1, #s do
    local b = s:byte(i)
    if b < 128 then
      t[#t+1] = string.char(b)
    else
      t[#t+1] = ansi_decode[b] or (b > 239 and "\209" .. string.char(b - 112) or (b > 191 and "\208" .. string.char(b - 48) or '_'))
    end
  end
return table.concat(t)
end



-- Замените <bot_token> на токен вашего бота Telegram
local bot_token = '<bot_token>'
-- Замените <chat_id> на ваш ID чата Telegram
local chat_id = '<chat_id>'

-- Непосредственно функция отправки сообщений в Telegram
local function send_telegram_message(message)
  local url = string.format('https://api.telegram.org/bot%s/sendMessage?chat_id=%s&text=%s', bot_token, chat_id, AnsiToUtf8(message))
  local response = requests.get(url)
  if response.status_code == 200 then
    print('Сообщение отправлено в Telegram')
  else
    print('Ошибка отправки сообщения в Telegram:', response.text)
  end
end

-- Функция обработки сообщений от сервера
function sampev.onServerMessage(color, text)
  local message = string.format('Сообщение от сервера: %s', text)
  send_telegram_message(message)
end
Асинхронные запросы + нормальный перевод в utf8 вместе с символами пунктуации, при котором не нужно будет добавлять gsub на каждый символ + "гайд" на поддержку эмодзи
Lua:
require('addon')
local effil = require 'effil'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
-----------------------------------------REQUESTS-----------------------------------------

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
   -- Проверка выполнения потока
   newTask(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

function encodeUrl(str)
    for c in str:gmatch('[%c%p%s]') do
        if c ~= '%' then
            local find = str:find(c, 1, true)
            if find then
                wait(0)
                local char = str:sub(find, find)
                str = str:gsub(string.format('%%%s', char), ('%%%%%02X'):format(char:byte()))
            end
        end
    end
    return u8(str)
end
-----------------------------------------TELEGRAM-----------------------------------------

function sendtg(msg)
    newTask(function()
        msg = msg:gsub('{......}', '') -- удаление всех цветов
        msg = msg:gsub('_', '\\_') -- экранирование нижнего подчёркивания для Markdown
        msg = encodeUrl(msg)
        local url =
        asyncHttpRequest('GET',
            'https://api.telegram.org/bot' .. telegram.token .. '/sendMessage?chat_id=' .. telegram.chatid .. '&text='..msg..'&parse_mode=Markdown',
        nil, function(result) end)
    end)
end
Переходим на сайт, копируем байты смайлика и заменяем \x на %
Пример:
Lua:
sendtg('%F0%9F%92%BE %%%%')
1677466138263.png

А так же изучи документацию requests, поймешь как можно передавать параметры без колхоза твоего https://github.com/JakobGreen/lua-requests#url-parameters
Тг почему-то не хочет принимать аргументы в таком виде, хотя мб я что-то не так делал.... тестил месяца 2 назад....


P.s: encodeUrl можно существенно сократить, но мне лень 😀
 
Последнее редактирование:

S0meTh1n69

Участник
Автор темы
29
16
Асинхронные запросы + нормальный перевод в utf8 вместе с символами пунктуации, при котором не нужно будет добавлять gsub на каждый символ + "гайд" на поддержку эмодзи
Lua:
require('addon')
local effil = require 'effil'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
-----------------------------------------REQUESTS-----------------------------------------

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
   -- Проверка выполнения потока
   newTask(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

function encodeUrl(str)
    for c in str:gmatch('[%c%p%s]') do
        if c ~= '%' then
            local find = str:find(c, 1, true)
            if find then
                wait(0)
                local char = str:sub(find, find)
                str = str:gsub(string.format('%%%s', char), ('%%%%%02X'):format(char:byte()))
            end
        end
    end
    return u8(str)
end
-----------------------------------------TELEGRAM-----------------------------------------

function sendtg(msg)
    newTask(function()
        msg = msg:gsub('{......}', '') -- удаление всех цветов
        msg = msg:gsub('_', ' ') -- удаление нижнего подчёркивания, телеграм почему-то обсирается, даже если отправить его байтами
        msg = encodeUrl(msg)
        local url =
        asyncHttpRequest('GET',
            'https://api.telegram.org/bot' .. telegram.token .. '/sendMessage?chat_id=' .. telegram.chatid .. '&text='..msg..'&parse_mode=Markdown',
        nil, function(result) end)
    end)
end
Переходим на сайт, копируем байты смайлика и заменяем \x на %
Пример:
Lua:
sendtg('%F0%9F%92%BE %%%%')
Посмотреть вложение 191483


Тг почему-то не хочет принимать аргументы в таком виде, хотя мб я что-то не так делал.... тестил месяца 2 назад....
Да, у меня тоже не получилось в таком формате отправлять, ошибка пустого сообщения.
 

rustersha

Потрачен
3
5
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
По поводу асинхронности: в lua нет нормальной асинхронности, через потоки вам необходимо слать запросы только в случае, если их много
Если раз в минуту, то можно обойтись синхронными запросами
Lua:
local requests = require('requests')

local encoding = require('encoding')
encoding.default = 'CP1251'
u8 = encoding.UTF8

function char_to_hex(str)
  return ('%%%02X'):format(str:byte())
end

function url_encode(str)
  return str:gsub('([^%w])', char_to_hex)
end

local telegram = {
  chat_id = '<chat_id>',
  token = '<token>'
}

function telegram.sendMessage(text)
  local params = {
    chat_id = telegram.chat_id,
    text = url_encode(u8(text))
  }
  local url = ('https://api.telegram.org/bot%s/sendMessage'):format(telegram.token)
  local status, result = pcall(requests.get, {url = url, params = params})
  if status and result.status_code == 200 then
    print('successfully sended telegram message', result.text)
  else
    -- TODO: repeat request N times if error
    print('error while sending telegram message')
  end
end

function onLoad()
  telegram.sendMessage('Привет Hello')
  telegram.sendMessage('!@#$%^&*()_+-=[]{},.<>"\'')
  telegram.sendMessage('1st line\n2nd line')
  telegram.sendMessage([[так же можно отправлять
новые строки
вот так]])
end
Screenshot_20230227_111428.jpg
 

Haymiritch

Известный
379
197
зачем ваш ansitoutf8 если можно из обычного сампа просто енкодинг забрать и в раксамп всунуть я не понимаю вас