global update and global fix
This commit is contained in:
186
apps/docs/lib/bot-examples.ts
Normal file
186
apps/docs/lib/bot-examples.ts
Normal file
@@ -0,0 +1,186 @@
|
||||
import type { OAuthExample } from '@/lib/oauth-examples';
|
||||
|
||||
export function buildBotExamples(apiBase: string): OAuthExample[] {
|
||||
const API_BASE = apiBase.replace(/\/+$/, '');
|
||||
const BOT_TOKEN = '123456789:AAHdqTcvCH1vGWJxfSeofS0As2XJarzRz5Q';
|
||||
|
||||
return [
|
||||
{
|
||||
id: 'telegraf',
|
||||
label: 'Telegraf',
|
||||
language: 'javascript',
|
||||
code: `import { Telegraf } from 'telegraf';
|
||||
|
||||
// Достаточно сменить apiRoot — код бота остаётся без изменений
|
||||
const bot = new Telegraf(process.env.BOT_TOKEN, {
|
||||
telegram: {
|
||||
apiRoot: '${API_BASE}/bot'
|
||||
}
|
||||
});
|
||||
|
||||
bot.start((ctx) => ctx.reply('Привет! Бот работает через Lendry Bot API.'));
|
||||
bot.command('ping', (ctx) => ctx.reply('pong'));
|
||||
|
||||
// Inline-клавиатура и callback_query
|
||||
bot.command('menu', (ctx) =>
|
||||
ctx.reply('Выберите действие:', {
|
||||
reply_markup: {
|
||||
inline_keyboard: [
|
||||
[{ text: '✅ OK', callback_data: 'ok' }, { text: '❌ Cancel', callback_data: 'cancel' }]
|
||||
]
|
||||
}
|
||||
})
|
||||
);
|
||||
|
||||
bot.action('ok', async (ctx) => {
|
||||
await ctx.answerCbQuery('Принято!');
|
||||
await ctx.editMessageText('Вы нажали OK ✅');
|
||||
});
|
||||
|
||||
bot.launch();`
|
||||
},
|
||||
{
|
||||
id: 'node-telegram-bot-api',
|
||||
label: 'node-telegram-bot-api',
|
||||
language: 'javascript',
|
||||
code: `import TelegramBot from 'node-telegram-bot-api';
|
||||
|
||||
const token = process.env.BOT_TOKEN;
|
||||
const bot = new TelegramBot(token, {
|
||||
polling: true,
|
||||
baseApiUrl: '${API_BASE}/bot'
|
||||
});
|
||||
|
||||
bot.on('message', (msg) => {
|
||||
bot.sendMessage(msg.chat.id, \`Вы написали: \${msg.text}\`);
|
||||
});`
|
||||
},
|
||||
{
|
||||
id: 'curl',
|
||||
label: 'cURL',
|
||||
language: 'bash',
|
||||
code: `# getMe — проверка токена
|
||||
curl -s -X POST '${API_BASE}/bot${BOT_TOKEN}/getMe' | jq
|
||||
|
||||
# sendMessage — chat_id = UUID пользователя Lendry ID
|
||||
curl -s -X POST '${API_BASE}/bot${BOT_TOKEN}/sendMessage' \\
|
||||
-H 'Content-Type: application/json' \\
|
||||
-d '{
|
||||
"chat_id": "USER_UUID",
|
||||
"text": "Привет из Bot API!"
|
||||
}' | jq
|
||||
|
||||
# sendMessage с inline-клавиатурой
|
||||
curl -s -X POST '${API_BASE}/bot${BOT_TOKEN}/sendMessage' \\
|
||||
-H 'Content-Type: application/json' \\
|
||||
-d '{
|
||||
"chat_id": "USER_UUID",
|
||||
"text": "Выберите:",
|
||||
"reply_markup": {
|
||||
"inline_keyboard": [[{ "text": "OK", "callback_data": "ok" }]]
|
||||
}
|
||||
}' | jq
|
||||
|
||||
# editMessageText
|
||||
curl -s -X POST '${API_BASE}/bot${BOT_TOKEN}/editMessageText' \\
|
||||
-H 'Content-Type: application/json' \\
|
||||
-d '{
|
||||
"chat_id": 1000000000000,
|
||||
"message_id": 1,
|
||||
"text": "Текст обновлён"
|
||||
}' | jq
|
||||
|
||||
# answerCallbackQuery
|
||||
curl -s -X POST '${API_BASE}/bot${BOT_TOKEN}/answerCallbackQuery' \\
|
||||
-H 'Content-Type: application/json' \\
|
||||
-d '{
|
||||
"callback_query_id": "CALLBACK_QUERY_ID",
|
||||
"text": "Готово!"
|
||||
}' | jq
|
||||
|
||||
# setChatMenuButton — глобальная кнопка меню (Web App)
|
||||
curl -s -X POST '${API_BASE}/bot${BOT_TOKEN}/setChatMenuButton' \\
|
||||
-H 'Content-Type: application/json' \\
|
||||
-d '{
|
||||
"menu_button": {
|
||||
"type": "web_app",
|
||||
"text": "Открыть",
|
||||
"web_app": { "url": "https://app.example.com" }
|
||||
}
|
||||
}' | jq
|
||||
|
||||
# setChatMenuButton — per-chat override
|
||||
curl -s -X POST '${API_BASE}/bot${BOT_TOKEN}/setChatMenuButton' \\
|
||||
-H 'Content-Type: application/json' \\
|
||||
-d '{
|
||||
"chat_id": 1000000000000,
|
||||
"menu_button": {
|
||||
"type": "web_app",
|
||||
"text": "Персонально",
|
||||
"web_app": { "url": "https://app.example.com/user" }
|
||||
}
|
||||
}' | jq`
|
||||
},
|
||||
{
|
||||
id: 'python',
|
||||
label: 'Python',
|
||||
language: 'python',
|
||||
code: `import os
|
||||
import requests
|
||||
|
||||
API_BASE = '${API_BASE}'
|
||||
TOKEN = os.environ['BOT_TOKEN']
|
||||
CHAT_ID = 'USER_UUID'
|
||||
|
||||
def bot_api(method: str, payload: dict | None = None):
|
||||
url = f"{API_BASE}/bot{TOKEN}/{method}"
|
||||
response = requests.post(url, json=payload or {}, timeout=30)
|
||||
response.raise_for_status()
|
||||
return response.json()
|
||||
|
||||
print(bot_api('getMe'))
|
||||
print(bot_api('sendMessage', {'chat_id': CHAT_ID, 'text': 'Привет!'}))`
|
||||
},
|
||||
{
|
||||
id: 'botfather',
|
||||
label: 'BotFather (REST)',
|
||||
language: 'bash',
|
||||
code: `# Создание бота (JWT пользователя Lendry ID)
|
||||
curl -s -X POST '${API_BASE}/bots' \\
|
||||
-H 'Authorization: Bearer ACCESS_TOKEN' \\
|
||||
-H 'Content-Type: application/json' \\
|
||||
-d '{
|
||||
"name": "Мой сервисный бот",
|
||||
"username": "my_service"
|
||||
}' | jq
|
||||
|
||||
# Ответ содержит token — сохраните его, повторно не показывается при GET
|
||||
|
||||
# Профиль бота через BotFather в чате (после POST /family/groups/{id}/botfather):
|
||||
# /setdescription my_service Описание перед /start
|
||||
# /setabouttext my_service Краткое описание
|
||||
# /setuserpic my_service https://cdn.example.com/avatar.png
|
||||
# /setmenubutton my_service https://app.example.com|Открыть приложение`
|
||||
},
|
||||
{
|
||||
id: 'webapp',
|
||||
label: 'Mini App initData',
|
||||
language: 'javascript',
|
||||
code: `// На backend Mini App проверяйте initData через Bot API
|
||||
const response = await fetch('${API_BASE}/bots/web-app/validate', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
initData: window.Telegram.WebApp.initData,
|
||||
botToken: process.env.BOT_TOKEN
|
||||
})
|
||||
});
|
||||
|
||||
const result = await response.json();
|
||||
if (!result.valid) {
|
||||
throw new Error(result.error ?? 'Невалидный initData');
|
||||
}
|
||||
const user = result.userJson ? JSON.parse(result.userJson) : null;`
|
||||
}
|
||||
];
|
||||
}
|
||||
Reference in New Issue
Block a user