145 lines
5.1 KiB
Markdown
145 lines
5.1 KiB
Markdown
# Telegram UserBot
|
||
|
||
Модульный Telegram UserBot на JavaScript с поддержкой динамической загрузки команд.
|
||
|
||
## Установка
|
||
|
||
1. Получите API ключи на https://my.telegram.org
|
||
2. Установите зависимости:
|
||
\`\`\`bash
|
||
npm install
|
||
\`\`\`
|
||
3. Замените в `telegram-userbot.js`:
|
||
- `YOUR_API_ID` на ваш API ID
|
||
- `YOUR_API_HASH` на ваш API Hash
|
||
- `YOUR_PHONE_NUMBER` на ваш номер телефона
|
||
|
||
## Запуск
|
||
|
||
\`\`\`bash
|
||
node telegram-userbot.js
|
||
\`\`\`
|
||
|
||
## Встроенные команды
|
||
|
||
- `!help` - Список всех команд
|
||
- `!info` - Информация о системе и аптайме
|
||
- `!ping` - Пинг до DC2 Telegram
|
||
- `!calc <выражение>` - Калькулятор
|
||
- `!time` - Текущее время
|
||
- `!docs` - Документация
|
||
- `.lm <имя_модуля>` - Загрузить новый модуль
|
||
|
||
## Создание модулей
|
||
|
||
### Структура модуля
|
||
|
||
Создайте файл в папке `modules/` с расширением `.js`:
|
||
|
||
\`\`\`javascript
|
||
export default {
|
||
name: 'имя_команды',
|
||
description: 'Описание команды',
|
||
usage: '!команда [параметры]',
|
||
async execute(client, message, args) {
|
||
// Ваш код здесь
|
||
await client.sendMessage(message.chatId, {
|
||
message: 'Ответ команды'
|
||
});
|
||
}
|
||
};
|
||
\`\`\`
|
||
|
||
### Параметры функции execute
|
||
|
||
- `client` - Экземпляр GramJS клиента
|
||
- `message` - Объект сообщения с полями:
|
||
- `chatId` - ID чата
|
||
- `text` - Текст сообщения
|
||
- `senderId` - ID отправителя
|
||
- `args` - Массив аргументов команды (без самой команды)
|
||
|
||
### Пример простого модуля
|
||
|
||
\`\`\`javascript
|
||
export default {
|
||
name: 'hello',
|
||
description: 'Приветствие пользователя',
|
||
usage: '!hello [имя]',
|
||
async execute(client, message, args) {
|
||
const name = args.length > 0 ? args.join(' ') : 'Мир';
|
||
await client.sendMessage(message.chatId, {
|
||
message: `Привет, ${name}!`
|
||
});
|
||
}
|
||
};
|
||
\`\`\`
|
||
|
||
### Пример модуля с API запросом
|
||
|
||
\`\`\`javascript
|
||
export default {
|
||
name: 'weather',
|
||
description: 'Получить погоду',
|
||
usage: '!weather <город>',
|
||
async execute(client, message, args) {
|
||
if (args.length === 0) {
|
||
await client.sendMessage(message.chatId, {
|
||
message: 'Укажите название города'
|
||
});
|
||
return;
|
||
}
|
||
|
||
try {
|
||
const city = args.join(' ');
|
||
const response = await fetch(`https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=YOUR_API_KEY&units=metric&lang=ru`);
|
||
const data = await response.json();
|
||
|
||
if (data.cod === 200) {
|
||
const weather = `🌤 Погода в ${data.name}:\n` +
|
||
`🌡 Температура: ${data.main.temp}°C\n` +
|
||
`💨 Ветер: ${data.wind.speed} м/с\n` +
|
||
`💧 Влажность: ${data.main.humidity}%`;
|
||
|
||
await client.sendMessage(message.chatId, {
|
||
message: weather
|
||
});
|
||
} else {
|
||
await client.sendMessage(message.chatId, {
|
||
message: 'Город не найден'
|
||
});
|
||
}
|
||
} catch (error) {
|
||
await client.sendMessage(message.chatId, {
|
||
message: 'Ошибка получения данных о погоде'
|
||
});
|
||
}
|
||
}
|
||
};
|
||
\`\`\`
|
||
|
||
### Загрузка модулей
|
||
|
||
1. **Автоматическая загрузка**: Поместите файл в папку `modules/` и перезапустите бота
|
||
2. **Динамическая загрузка**: Используйте команду `.lm имя_модуля` для загрузки без перезапуска
|
||
|
||
### Рекомендации
|
||
|
||
- Используйте async/await для асинхронных операций
|
||
- Обрабатывайте ошибки с помощью try/catch
|
||
- Проверяйте наличие аргументов перед их использованием
|
||
- Используйте описательные имена команд
|
||
- Добавляйте проверки входных данных
|
||
- Не забывайте про обработку edge cases
|
||
|
||
### Отладка
|
||
|
||
Для отладки используйте `console.log()` в коде модуля. Логи будут отображаться в консоли бота.
|
||
|
||
### Безопасность
|
||
|
||
- Не используйте `eval()` или подобные функции
|
||
- Валидируйте пользовательский ввод
|
||
- Не храните чувствительные данные в коде
|
||
- Используйте переменные окружения для API ключей
|