Как сделать чтобы дискорд бот работал всегда
Перейти к содержимому

Как сделать чтобы дискорд бот работал всегда

  • автор:

Как сделать чтобы Discord бот был всегда в сети?

Как сделать чтобы Discord бот написанный на discord.py был всегда в сети?

  • Вопрос задан более трёх лет назад
  • 7063 просмотра

Решения вопроса 1

Kp18

На хероку можно, единственное если делать базу пользователей в файле, а не в том же 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-консоль, процесс бота будет завершен и бот перестанет работать. Давайте сделаем так, чтобы бот работал постоянно.

Создаем фоновый процесс для запуска бота

Для этого переходим в раздел Хостинг, далее выбираем контейнер в котором был создан сайт, а в контейнере в списке сайтов выбираем тот сайт, в рамках которого будет запущен процесс бота. И переходим во вкладку “Фоновые процессы”:

Screenshot 2023-03-02 at 17.45.10.png

Теперь нажимаем на кнопку “Добавить процесс” и перед нами окрывается окно настроек:

Screenshot 2023-03-02 at 17.48.49.png

Всё что нам осталось сделать для запуска бота, это написать команду, которая будет его запускать. Команда будет выглядеть следующим образом:

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 

И на экране будет отображаться лог бота, обновляемый в реальном времени.

Перезапуск бота

Когда вы вносите изменения в код бота, по умолчанию процесс бота в памяти о них ничего знать не будет. Чтобы бот подхватил изменения, нужно его перезапустить. Для этого есть несколько способов:

  1. В личном кабинете в разделе фоновых процессов у нужного процесса нажмите на пункт меню “перезапустить”.
  2. В ssh консоли сервера запустите команду touch ~/site.ru/reload . Эта команда перезапустит ваш сайт и все фоновые процессы, привязанные к этому сайту.

Создаём Discord-бота на Python

Сегодня мы напишем Discord-бота с помощью Python и discord.py. А также посмотрим на примеры ботов.

Всем привет, сегодня мы напишем Discord-бота на Python и discord.py + бонусом посмотрим на примеры ботов. Приступим ?

Перед работой

Перед тем, как начать, вам нужны:

  1. Python 3;
  2. discord.py;
  3. Discord-аккаунт и свой сервер.

Для установки discord.py воспользуйтесь пакетным менеджером:

pip3 install discord.py 

Создаём нашего бота

Перейдите на Developer Portal и нажмите на New application.

Создаём Discord-бота на Python 1

Вы создали своё приложение, на странице приложение перейдите в Bot >> Add Bot и создайте своего Discord-бота.

Сохраните токен бота! Дальше он нам понадобится!

Создаём Discord-бота на Python 2

Если всё прошло успешно, поздравляю, половина дела сделана ?

Добавление бота на сервер

Теперь можно добавить бота на сервер.

Перейдите в OAuth2 >> URL Generator, в Scopes выбираем Bot и ниже — права бота, копируем сгенерированный URL. Вставляем в браузер, и добавляем на наш сервер.

Создаём Discord-бота на Python 3

Эхо-бот

Напишем традиционного эхо-бота, и разберём каждую строчку кода.

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']) 

Создаём Discord-бота на Python 4

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']) 

Создаём Discord-бота на Python 5

@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']) 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *