Сап, мне пришла идея по приколу замутить бота, который позволит переводить деньги на баланс форума через инлайн-команду ( @send 10 на шлюх ). Я посидел и родил такое решение на TypeScript/grammY/axios: скрин Версия очень сырая и недоработанная, если у кого-то возникнет желание - можете довести до идеала. Чтобы использовать, нужно ввести в конфиг ваш айдишник телеграмма (или несколько ), токен бота из BotFather (там же нужно поставить инлайн-колбек на 100%), токен с доступом к market из lzt.market/account/api, а также секретное слово. Исходники и гайд по установке: код import { Bot } from "grammy"; import { InputTextMessageContent } from "grammy/out/types"; import axios from 'axios'; import { apitoken, secretWord, tg_token, users } from '../config.json' const bot = new Bot(tg_token); const isNumeric = (value: string) => !isNaN(+value) && isFinite(+value); bot.on("inline_query", async (ctx) => { if(!users.includes(String(ctx.from.id))) return; const query = ctx.inlineQuery.query.trim().split(" "); if (query.length < 2 || !isNumeric(query[0])) return; const [amount, account] = query; let comment; if (query[2]) comment = query.slice(2).join(" "); return ctx.answerInlineQuery([ { type: "article", id: "1", title: `Отправить ${amount} RUB на счет ${account}`, input_message_content: { message_text: `Обработка...` } as InputTextMessageContent, reply_markup: { inline_keyboard: [[{ text: ' Ожидайте...', callback_data: 'nothing_here' }]] }, description: `Нажмите, чтобы отправить ${amount} RUB` } ]); }); bot.on('chosen_inline_result', async (ctx) => { if (!ctx.update.chosen_inline_result.inline_message_id) return; if(!users.includes(String(ctx.from.id))) return; const query = ctx.update.chosen_inline_result.query.trim().split(" "); if (query.length < 2 || !isNumeric(query[0])) return; const [amount, account] = query; let comment; if (query[2]) comment = query.slice(2).join(" ") let url = `https://prod-api.lzt.market/balance/transfer?currency=rub&username=${account}&amount=${amount}&secret_answer=${secretWord}`; if (comment && comment.length > 1) { url += `&comment=${comment}`; } const options = { method: 'POST', url: url, headers: { accept: 'application/json', authorization: `Bearer ${apitoken}` } }; try { let res = await axios.request(options) if (res.status != 200) ctx.api.editMessageTextInline(ctx.update.chosen_inline_result.inline_message_id, ` Произошла ошибка! Проверьте баланс и уточните имя получателя`); ctx.api.editMessageTextInline(ctx.update.chosen_inline_result.inline_message_id, ` Перевод на сумму ${amount} RUB отправлен пользователю ${account}`); } catch (error) { ctx.api.editMessageTextInline(ctx.update.chosen_inline_result.inline_message_id, ` Произошла ошибка! Проверьте баланс и уточните имя получателя`); } }); bot.start(); JS import { Bot } from "grammy"; import { InputTextMessageContent } from "grammy/out/types"; import axios from 'axios'; import { apitoken, secretWord, tg_token, users } from '../config.json' const bot = new Bot(tg_token); const isNumeric = (value: string) => !isNaN(+value) && isFinite(+value); bot.on("inline_query", async (ctx) => { if(!users.includes(String(ctx.from.id))) return; const query = ctx.inlineQuery.query.trim().split(" "); if (query.length < 2 || !isNumeric(query[0])) return; const [amount, account] = query; let comment; if (query[2]) comment = query.slice(2).join(" "); return ctx.answerInlineQuery([ { type: "article", id: "1", title: `Отправить ${amount} RUB на счет ${account}`, input_message_content: { message_text: `Обработка...` } as InputTextMessageContent, reply_markup: { inline_keyboard: [[{ text: ' Ожидайте...', callback_data: 'nothing_here' }]] }, description: `Нажмите, чтобы отправить ${amount} RUB` } ]); }); bot.on('chosen_inline_result', async (ctx) => { if (!ctx.update.chosen_inline_result.inline_message_id) return; if(!users.includes(String(ctx.from.id))) return; const query = ctx.update.chosen_inline_result.query.trim().split(" "); if (query.length < 2 || !isNumeric(query[0])) return; const [amount, account] = query; let comment; if (query[2]) comment = query.slice(2).join(" ") let url = `https://prod-api.lzt.market/balance/transfer?currency=rub&username=${account}&amount=${amount}&secret_answer=${secretWord}`; if (comment && comment.length > 1) { url += `&comment=${comment}`; } const options = { method: 'POST', url: url, headers: { accept: 'application/json', authorization: `Bearer ${apitoken}` } }; try { let res = await axios.request(options) if (res.status != 200) ctx.api.editMessageTextInline(ctx.update.chosen_inline_result.inline_message_id, ` Произошла ошибка! Проверьте баланс и уточните имя получателя`); ctx.api.editMessageTextInline(ctx.update.chosen_inline_result.inline_message_id, ` Перевод на сумму ${amount} RUB отправлен пользователю ${account}`); } catch (error) { ctx.api.editMessageTextInline(ctx.update.chosen_inline_result.inline_message_id, ` Произошла ошибка! Проверьте баланс и уточните имя получателя`); } }); bot.start(); config.json { "users": ["7629404322"], "tg_token": "", "apitoken": "", "secretWord": "" } JS { "users": ["7629404322"], "tg_token": "", "apitoken": "", "secretWord": "" } установка и запуск npm install -D typescript npm i axios grammy npx tsc --init npx tsc в tsconfig.json нужно { "compilerOptions": { "resolveJsonModule": true, "esModuleInterop": true, ... } } JS { "compilerOptions": { "resolveJsonModule": true, "esModuleInterop": true, ... } }
прикольно, но наличие нужного баланса и существование получателя можно проверять на return ctx.answerInlineQuery этапе
etherscan, https://prod-api.lolz.live/users/{user_id} для проверки юзера и /market/me для получения инфы маркета
сомния, ну думаю как-нибудь сяду и допишу до идеала, там еще можно валюту указывать, можно реализовать
ImJustLolzer, Опа, зяц, ты че, сходняк не подготовил? Без зависимостей лезешь, как лох на стрелку без ствола? Пишет не правильно — потому что ты, фраер не посмотрел инструкцию по запуску! Чё делать? А вот чё: Качаешь зависимости как нормальный пацан: npm install -D typescript npm i axios grammy npx tsc --init npx tsc (а если нет файла — ищи, чё там в error вылезает, и ставь вручную, как по фене) Проверяешь, чё там в первой строке — может, кодировку не ту вписал, либо путь кривой. Если опять не заводится — не гони волну, читай лог как мент читает дело, и исправляй косяки. Разбирайся, браток!