Как сделать чтобы Discord бот был всегда в сети?
Как сделать чтобы Discord бот написанный на discord.py был всегда в сети?
- Вопрос задан более трёх лет назад
- 7063 просмотра
Решения вопроса 1
На хероку можно, единственное если делать базу пользователей в файле, а не в том же mongodb, то она там работать не будет т. к. хероку не даёт доступ к диску, в этом случае можно на glitch хоть и падает время от времени, но все-же работает
Ответ написан более трёх лет назад
Как заставить бота работать 24/7 не на компьютере?
Я разработал бота (написан на Java для Discord). На данный момент бота запускаю через компилятор на компьютере, но хотел бы, чтобы мой бот работал непрерывно 24/7. Как я понимаю, мне нужен Java-север или что-то другое? Уверен, данный вопрос актуален еще тем, кто пишет бота для Telegram и vk.com
Отслеживать
48.7k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
задан 26 сен 2018 в 2:39
Antonio112009 Antonio112009
2,641 1 1 золотой знак 20 20 серебряных знаков 44 44 бронзовых знака
речь о хостинге?
26 сен 2018 в 4:29
@Anatol да. На я уже подумал над Heroku. Но у меня возникли сложности при добавлении проекта на него. Проект вроде загрузился, но он мне выдает какую-ту ошибку. Пока ее не гуглил
26 сен 2018 в 4:31
вопрос сформулирован некорректно, нет явно обозначенной проблемы. такие вопросы закрываются. если есть актуальная проблема, то опишите её подобающим образом
26 сен 2018 в 4:34
@Antonio112009 на бесплатном тарифе heroku останавливает приложения, если к ним нет обращения с внешней стороны.
5 фев 2020 в 7:56
@dmtr да этот вопрос уже не актуален. Решил просто привести его в порядок, а получилось, что он заново вывел его в главные на СО
5 фев 2020 в 14:37
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Используйте хостинг. Amazon(для крутых, т.к. не дешево) и т.п. — Digital Ocean(его рекомендуют), Heroku, Hostinger тоже неплох.
Вот хорошая статья(Веб-платформа на Java за 30 минут), как быстро развернуть web-приложение Java на сервере.
Отслеживать
ответ дан 26 сен 2018 в 5:31
Anton Sorokin Anton Sorokin
7,008 6 6 золотых знаков 37 37 серебряных знаков 65 65 бронзовых знаков
Для развертывания Java-бота (да и вообще любого другого бота, написанного на других языках) не стоит искать специальный Java-сервер. В данном случае нам понадобится выделенный сервер (dedicated server) или VPS (Virtual Private Server). Web-Hosting — это для хостинга сайтов, а значит нам данный вариант не подходит.
Из моего личного опыта, лучший VPS-провайдер — это Digital Ocean, однако он дорогой и если вы из России, то готовьтесь к тому, что многие запросы на Российские сервера будут недоступны (привет Рос****надзору).
Я бы лучше брал dedicated server. Один из лучших провайдеров выделенных серверов — OVH. Сервера дорогие и поэтому я порекомендовал бы их дочернюю компанию — https://www.kimsufi.com/. Если у вас бот не многозадачен, то за 5-6 евро сервера вам будет сверхдостаточно.
Что же делать после покупки сервера?
Лично я люблю Ubuntu (хотя с ней немало хлопот можно словить) и через командную строку (на сервере) устанавливаете OpenJDK, потом перекидываете по FTP executable jar file (запускаемый Jar-файл). Далее запускаем приложение в фоновом режиме. Если вы просто запустите приложение на сервере и закроете консоль, то программа ваша автоматически завершится.
Как запустить в фоновом режиме приложение?
Создаем файл /etc/systemd/system/myapplication.service
[Unit] Description= # Place a descriptive application name here After=syslog.target After=network.target[Service] User= # Define a user account that will own our app. Example: root Type=simple [Service] ExecStart=/usr/bin/java -jar # Provide /path/to/file/myapplication.jar Restart=always StandardOutput=syslog StandardError=syslog SyslogIdentifier= # A short identifier for system journal, f. e. 'myapplication' [Install] WantedBy=multi-user.target
sudo systemctl start/stop/restart myapplication start — запускает бота
stop — останавливает бота restart — перезапускает бота (можно использовать команду при обновлении jar-файла с ботом)
Запуск python ботов на хостинге
С появлением на нашем хостинге возможности запуска Фоновых процессов, процесс запуска различных ботов, таких как ботов для Telegram, Discord, FB и т.п значительно упростился.
Что такое Фоновые процессы и чем они помогают в запуске бота?
Как правило бот — это отдельный от сайта процесс, который должен работать 24/7, но у которого нет веб-интерфейса и который не должен быть доступен по http(s) снаружи по доменному имени. Но с другой стороны, бот, как и любое программное обеспечение, может содержать ошибки и при возникновении ошибок падать, поэтому очень важно в этом случае его автоматически перезапустить. Кроме того, бот пишет свои логи и к ним необходим прямой доступ, чтобы иметь возможность отслеживать его состояние. Ну и конечно, в случае если сервер хостинга будет перезагружен, либо контейнер для ваших сайтов на хостинге по какой-то причине остановлен, а затем запущен вновь, бот должен незамедлительно стартовать. Все эти вещи обеспечиваются Фоновыми процессами.
Создаем сайт
Фоновые процессы привязаны к сайтам, а сайты располагаются внутри контейнеров. Если нам требуется бот на python, первым делом необходимо создать сайт, который будет работать на python. Ознакомиться с процессом создания сайта на python (django) можно в этой статье.
Далее мы будем считать, что сайт создан и нужная версия python установлена и настроена, вы зашли на сервер по ssh и установили все необходимые базовые пакеты через pip install .
Создаем минимального Discord бота
В этой статье рассматривается создание и запуск бота для Discord, но общий подход для запуска других ботов, например бота для Telegram, ничем не отличается. Для Discord бота нам потребуется установить пакет discord , что мы и сделаем, перейдя в каталог приложения нашего сайта:
cd site.ru/app pip install "discord>=2"
Теперь создадим скрипт, который будет нашим минимальным ботом. Пусть он выглядит так:
import discord intents = discord.Intents.default() intents.message_content = True client = discord.Client(intents=intents) @client.event async def on_ready(): print(f'We have logged in as ') @client.event async def on_message(message): if message.author == client.user: return if message.content.startswith('$hello'): await message.channel.send('Hello!') client.run('your token here')
Этот бот не делает ничего, кроме того, что если вы напишите сообщение в дискорд сервер, к которому подключен ваш бот, которое начинается с фразы “$hello”, бот ответит вам сообщением “Hello!”. В последней строке кода вместо ‘your token here’ вам необходимо прописать ваш токен для API Discord. Если в итоге файл создан и назван my_bot.py , то запустить его очень просто:
python my_bot.py
Начало положено. Но теперь, если мы закроем ssh-консоль, процесс бота будет завершен и бот перестанет работать. Давайте сделаем так, чтобы бот работал постоянно.
Создаем фоновый процесс для запуска бота
Для этого переходим в раздел Хостинг, далее выбираем контейнер в котором был создан сайт, а в контейнере в списке сайтов выбираем тот сайт, в рамках которого будет запущен процесс бота. И переходим во вкладку “Фоновые процессы”:
Теперь нажимаем на кнопку “Добавить процесс” и перед нами окрывается окно настроек:
Всё что нам осталось сделать для запуска бота, это написать команду, которая будет его запускать. Команда будет выглядеть следующим образом:
cd ~/site.ru/app && python my_bot.py
Если в коде бота не было ошибок и все остальное вы сделали по инструкции, после нажатия на кнопку “Добавить и запустить”, процесс бота будет запущен.
Доступ к логам бота
В окне, где мы подключены к серверу по ssh, мы запускаем следующую команду:
ls -l ~/site.ru/log
Нам будет показан список папок с логами. Для фоновых процессов название папок имеет вид service-ID-runlog , где ID — уникальный идентификатор процесса, который для каждого процесса отображается в списке процессов в Личном кабинете. Теперь запустим команду:
tail -f ~/site.ru/log/service-ID-runlog/current
И на экране будет отображаться лог бота, обновляемый в реальном времени.
Перезапуск бота
Когда вы вносите изменения в код бота, по умолчанию процесс бота в памяти о них ничего знать не будет. Чтобы бот подхватил изменения, нужно его перезапустить. Для этого есть несколько способов:
- В личном кабинете в разделе фоновых процессов у нужного процесса нажмите на пункт меню “перезапустить”.
- В ssh консоли сервера запустите команду touch ~/site.ru/reload . Эта команда перезапустит ваш сайт и все фоновые процессы, привязанные к этому сайту.
Создаём Discord-бота на Python
Сегодня мы напишем Discord-бота с помощью Python и discord.py. А также посмотрим на примеры ботов.
Всем привет, сегодня мы напишем Discord-бота на Python и discord.py + бонусом посмотрим на примеры ботов. Приступим ?
Перед работой
Перед тем, как начать, вам нужны:
- Python 3;
- discord.py;
- Discord-аккаунт и свой сервер.
Для установки discord.py воспользуйтесь пакетным менеджером:
pip3 install discord.py
Создаём нашего бота
Перейдите на Developer Portal и нажмите на New application.
Вы создали своё приложение, на странице приложение перейдите в Bot >> Add Bot и создайте своего Discord-бота.
Сохраните токен бота! Дальше он нам понадобится!
Если всё прошло успешно, поздравляю, половина дела сделана ?
Добавление бота на сервер
Теперь можно добавить бота на сервер.
Перейдите в OAuth2 >> URL Generator, в Scopes выбираем Bot и ниже — права бота, копируем сгенерированный URL. Вставляем в браузер, и добавляем на наш сервер.
Эхо-бот
Напишем традиционного эхо-бота, и разберём каждую строчку кода.
import discord from discord.ext import commands config = < 'token': 'your-token', 'prefix': 'prefix', >bot = commands.Bot(command_prefix=config['prefix']) @bot.event async def on_message(ctx): if ctx.author != bot.user: await ctx.reply(ctx.content) bot.run(config['token'])
import discord from discord.ext import commands
Нужные нам импорты.
config =
Вспомогательный словарь config в котором храним токен и префикс команд (далее расскажу зачем нужен префикс команд).
bot = commands.Bot(command_prefix=config['prefix'])
Создаём нашего бота, в аргументе передаём префикс.
@bot.event
Декоратор, предназначенный для обработки событий, подробнее здесь.
async def on_message(ctx):
Создаём асинхронную функцию, с параметром ctx, представляет из себя сообщение.
if ctx.author != bot.user:
Проверка, не является ли автор сообщения нашим Discord-ботом. Дело в том, что если бот отправит сообщение, это будет новым событием, и тогда получается цикл.
await ctx.reply(ctx.content)
Отвечаем на сообщение (ctx.reply), в аргументы передаём сообщение (ctx.content).
bot.run(config['token'])
Запускаем нашего бота, в аргументы передаём токен бота.
Надеюсь вы разобрались с кодом, и мы можем переходить далее.
Обработка команд
Перед тем, как обрабатывать команды, нам пригодится наш префикс.
import random import discord from discord.ext import commands config = < 'token': 'your-token', 'prefix': '$', >bot = commands.Bot(command_prefix=config['prefix']) @bot.command() async def rand(ctx, *arg): await ctx.reply(random.randint(0, 100)) bot.run(config['token'])
@bot.command()
Декоратор обработки команд
async def rand(ctx, *arg):
Асинхронная функция rand
await ctx.reply(random.randint(0, 100))
Отвечаем на сообщение, в аргументы передаём случайное число от 0 до 100
Бонус
import random import discord from discord.ext import commands config = < 'token': 'your-token', 'prefix': '$', >bot = commands.Bot(command_prefix=config['prefix']) @bot.command() @commands.has_role("Хозяин") async def rand(ctx, *arg): await ctx.reply(random.randint(0, 100)) bot.run(config['token'])
import discord from discord.ext import commands config = < 'token': 'your-token', 'prefix': '$', >bot = commands.Bot(command_prefix=config['prefix']) @bot.command() async def kick(ctx, user : discord.User(), *arg, reason='Причина не указана'): await bot.kick(user) await ctx.send('Пользователь был изгнан по причине ""') bot.run(config['token'])