Рубрики
Без рубрики

Как создать роскошный бот с Python – полный учебник

Автор оригинала: Beau Carnes.

Этот учебник покажет вам, как создать свой бот-бот своего собственного раздора в облаке.

Вам не нужно ничего устанавливать на свой компьютер, и вам не нужно ничего платить, чтобы провести свой бот.

Мы собираемся использовать ряд инструментов, включая API раздора, библиотеки Python и облачную вычислительную платформу, называемую Reft.it Отказ

Существует также видео версия этого письменного руководства. Видео встроен ниже, а письменная версия – после видео.

Как создать учетную запись BoT Roscord

Для того, чтобы работать с библиотекой Python и API раздора, мы должны сначала создать учетную запись BoT Roscord.

Вот шаг к созданию учетной записи Roscord Bot.

1. Убедитесь, что вы вошли в систему на Сайт раздора Отказ

2. Перейдите к Страница приложений Отказ

3. Нажмите на кнопку «Новое приложение».

4. Дайте приложению имя и нажмите «Создать».

5. Перейдите на вкладку «Бот», а затем нажмите «Добавить бот». Вам придется подтвердить, нажав «Да, сделай это!»

Держите настройки по умолчанию для Общественный бот (проверено) и Требуется код AAuth2 Code (не проверять).

Ваш бот был создан. Следующий шаг – скопировать токен.

Этот токен – пароль вашего бота, поэтому не делитесь ни с кем угодно. Это может позволить кому-то войти в свой бот и делать все виды плохих вещей.

Вы можете восстановить токен, если он случайно будет разделен.

Как пригласить ваш бот присоединиться к серверу

Теперь вы должны получить ваш бот пользователя на сервер. Чтобы сделать это, вы должны создать URL-адрес приглашения.

Перейдите на вкладку «OAUTH2». Затем выберите «BOT» под раздел «Scopes».

Теперь выберите разрешения, которые вы хотите для бота. Наш бот собирается в основном использовать текстовые сообщения, поэтому нам не нужно много разрешений. Возможно, вам понадобится больше в зависимости от того, что вы хотите, чтобы ваш бот. Будьте осторожны с разрешением «Администратор».

После выбора соответствующих разрешений щелкните кнопку «Копировать» над разрешениями. Это будет скопировать URL, который можно использовать для добавления бота на сервер.

Вставьте URL в ваш браузер, выберите сервер, чтобы пригласить бот, и нажмите «Авторизация».

Чтобы добавить бот, ваша учетная запись нуждается в разрешениях «Управление сервером».

Теперь, когда вы создали пользователя Bot, мы начнем написать код Python для бота.

Как кодировать базовый бот раздорты с библиотекой Discord.py

Мы будем использовать библиотеку Discord.py Python, чтобы написать код для бота. DiscoD.py – обертка API для раздора, которая облегчает создание бота раздора в Python.

Как создать REPL и установить disocrd.py

Вы можете разработать бот на вашем локальном компьютере с любым редактором кода. Однако в этом руководстве мы будем использовать refl.it, потому что это сделает это проще для того, чтобы кто-нибудь следовать. REPL.IT – это онлайн IDE, которую вы можете использовать в вашем веб-браузере.

Начните, собираемся в Reft.it Отказ Создайте новую замену и выберите «Python» в качестве языка.

Использовать библиотеку Discord.py, просто напишите Импорт раздор На вершине main.py Отказ Reft.it автоматически устанавливает эту зависимость при нажатии кнопки «Запустить».

Если вы предпочитаете кодировать BOT локально, вы можете использовать эту команду на MacOS для установки DiscOd.py:

Python3 -M PIP установить -U Discord.py

Возможно, вам придется использовать PIP3 вместо Пип Отказ

Если вы используете Windows, то вместо этого вы должны использовать следующую строку:

PY -3 -M PIP установить -U Discord.py

Как настроить раздорные события для вашего бота

Discord.py вращается вокруг концепции событий. Событие – это то, что вы слушаете, а затем отвечаете. Например, когда происходит сообщение, вы получите событие об этом, на что вы можете ответить.

Давайте сделаем бот, который отвечает на конкретное сообщение. Этот простой код бота, наряду с пояснением кода, взяты из Документация Discord.py Отказ Мы будем добавлять больше функций до бота позже.

Добавьте этот код в main.py. (Вы можете назвать файл что-то еще, если хотите, просто не Discord.py.) Я объясню, что все этот код делает в ближайшее время.

import discord
import os

client = discord.Client()

@client.event
async def on_ready():
    print('We have logged in as {0.user}'.format(client))

@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(os.getenv('TOKEN'))

Когда вы создали своего пользователя Bot On Discord, вы скопировали токен. Теперь мы собираемся создать .env Файл для хранения токена. Если вы используете свой код локально, вам не нужен .env файл. Просто замените OS.GETENV («токен») с токеном.

.env Файлы используются для объявления переменных среды. На repl.it, большинство файлов, которые вы создаете, видны для всех, но .env Файлы видны только вам. Другие люди, просматривая публичную ревкус, не смогут увидеть содержание .env файл.

Поэтому, если вы разрабатываете на reft.it, включите только личную информацию, такие как токены или ключи в .env файл.

Нажмите кнопку «Добавить файл» и создайте файл с именем .env Отказ

Внутри файла добавьте следующую строку, включая ваш фактический токен, который вы скопировали ранее:

TOKEN=[paste token here]

Теперь давайте перейдем на то, что каждая строка кода делает в вашем коде бота раздора.

  1. Первая строка импортирует библиотеку Discord.py.
  2. Вторая строка импортирует библиотеку ОС, но это используется только для получения Токен Переменная от .env файл. Если вы не используете .env Файл, вам не нужна эта строка.
  3. Далее мы создаем экземпляр A Клиент Отказ Это соединение для раздора.
  4. @ Client.Event () Декоратор используется для регистрации события. Это асинхронная библиотека, поэтому дела выполняются с обратными вызовами. Обратный вызов – это функция, которая называется, когда происходит что-то еще. В этом коде on_ready () Событие называется, когда бот готов начать использование. Затем, когда бот получает сообщение, on_message () Событие называется.
  5. on_message () Триггеры события каждый раз, когда получено сообщение, но мы не хотим, чтобы это ничего не хочелось, если сообщение от нас самих. Так что если Message.author такой же, как Client.User код только что возвращает.
  6. Далее мы проверяем, если Message.content начинается с '$ Hello' Отказ Если так, то бот отвечает 'Привет!' на канал его использовали в.
  7. Теперь, когда бот установлен, окончательная строка запускает бот с токеном входа. Это получает токен из OUT .env файл.

У нас есть код для бота, так что теперь нам просто нужно запустить его.

Как запустить бот

Теперь нажмите кнопку «Беги», чтобы запустить свой бот в REPL.IT.

Если вы пишете Bot локально, вы можете использовать эти команды в терминале для запуска бота:

В окнах:

py -3 main.py.

В других системах:

python3 main.py.

Сейчас иди в вашу коммуникацию и введите «$ Hello». Ваш бот должен вернуть “Привет!”.

Как улучшить бот

Теперь, когда у нас есть базовый бот, мы улучшаем это. Это называется «поощряйте бот» по причине.

Этот бот ответит с посланием поощрения всякий раз, когда кто-то отправляет сообщение, содержащее грустное или угнетающее слово.

Любой, кто сможет добавить поощренные сообщения для использования бота, и представленные пользователем сообщения будут сохранены в базе данных REPL.IT.

Бот также вернет случайную вдохновляющую цитату из API, когда кто-то набирает сообщение «$ вдохновлять» в чат.

Мы начнем с добавления функции «$ Inspire».

Как добавить вдохновляющие цитаты в бот

Мы получим вдохновляющие цитаты из API под названием Zenquotes.io. Нам нужно импортировать пару больше модулей Python, добавить get_quote () Функция и обновить наш бот код для вызова функции.

Вот обновленный код. После кода я объясню новые части.

import discord
import os
import requests
import json

client = discord.Client()

def get_quote():
  response = requests.get("https://zenquotes.io/api/random")
  json_data = json.loads(response.text)
  quote = json_data[0]['q'] + " -" + json_data[0]['a']
  return(quote)

@client.event
async def on_ready():
  print('We have logged in as {0.user}'.format(client))

@client.event
async def on_message(message):
  if message.author == client.user:
    return

  if message.content.startswith('$inspire'):
    quote = get_quote()
    await message.channel.send(quote)

client.run(os.getenv('TOKEN'))

Теперь мы должны импортировать Запросы модуль. Этот модуль позволяет нашему коду сделать HTTP-запрос, чтобы получить данные из API. API возвращает JSON, так что JSON Модуль облегчает работу с возвращаемыми данными.

get_quote () Функция довольно простая. Во-первых, он использует модуль запросов для запроса данных из URL API. API возвращает случайную вдохновляющую цитату. Эта функция может быть легко переписана, чтобы получить цитаты из другого API, если текущий перестает работать.

Далее внутри функции мы используем json.loads () Чтобы преобразовать ответ от API на JSON. С помощью проб и ошибок я выяснил, как получить цитату от JSON в формат строки, который я хотел. Цитата возвращается из функции в виде строки.

Заключительная часть, обновленная в коде, является к концу. Ранее он искал сообщение, которое началось с «$ Hello». Теперь это ищет «$ Inspire». Вместо того, чтобы возвращать «Привет!», Это получает цитату с цитата () и возвращает цитату.

На этом этапе вы можете запустить свой код и попробовать.

Как добавить поощрение сообщений на бот

Теперь мы реализуем функцию, в которой бот отвечает поощряющим сообщениям, когда пользователь поставляет сообщение с грустным словом.

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

Сначала нам нужно создать список Python, который содержит печальные слова, на которые будет отвечать бот.

Добавьте следующую строку после клиент Переменная создана:

Sad_words = [«грустный», «депрессивный», «несчастный», «злой», «несчастливый»]

Не стесняйтесь добавлять больше слов в список.

Как добавить поощрение сообщений на бот

Теперь мы добавим список поощренных сообщений, с которыми будет отвечать бот.

Добавьте следующий список после Sad_words Список вы создали:

starter_encouragements = [
  "Cheer up!",
  "Hang in there.",
  "You are a great person / bot!"
]

Как и раньше, не стесняйтесь добавлять больше фраз по вашему выбору в список. Я просто использую три предмета, потому что позже мы добавим возможность пользователей добавлять более поощрение фраз для бота для использования.

Как ответить на сообщения

Теперь нам нужно обновить наш бот, чтобы использовать два списка, которые мы создали. Сначала импортируйте случайный модуль, потому что бот будет выбирать поощрение сообщений случайным образом. Добавьте следующую строку в отчетность импорта в верхней части кода: Импорт случайных Отказ

Теперь мы обновим on_message () Функция, чтобы проверить все сообщения, чтобы увидеть, содержат ли они слово из Sad_words список. Если найден грустное слово, бот отправит случайное послание поощрения.

Вот обновленный код:

async def on_message(message):
  if message.author == client.user:
    return

  msg = message.content

  if msg.startswith('$inspire'):
    quote = get_quote()
    await message.channel.send(quote)
    
  if any(word in msg for word in sad_words):
    await message.channel.send(random.choice(starter_encouragements))

Это хорошее время для проверки бота. Вы достаточно знаете сейчас, чтобы создать свой собственный бот. Но Далее вы узнаете, как реализовать более расширенные функции и хранить данные с использованием базы данных repl.it.

Как включить пользовательские сообщения

Бот полностью функционален, но теперь давайте позволим обновить бот прямо из раздора. Пользователь должен быть в состоянии добавить больше поощряющих сообщений для бота для использования, когда он обнаруживает грустное слово.

Мы собираемся использовать встроенную базу данных reft.it.it для хранения пользовательских сообщений. Эта база данных является хранилищем ключа, который встроен в каждый reft.

В верхней части кода при других операторах импорта добавьте От замены импорта DB Отказ Это позволит нам использовать базу данных repl.it.

Пользователи смогут добавить пользовательские обнадеживающие сообщения для бота, чтобы использовать непосредственно из раздува в чате. Прежде чем добавлять новые команды для бота, давайте создадим два функция помощника, которые добавит пользовательские сообщения в базу данных и удаляют их.

Добавьте следующий код после get_quote () Функция:

def update_encouragements(encouraging_message):
  if "encouragements" in db.keys():
    encouragements = db["encouragements"]
    encouragements.append(encouraging_message)
    db["encouragements"] = encouragements
  else:
    db["encouragements"] = [encouraging_message]

def delete_encouragment(index):
  encouragements = db["encouragements"]
  if len(encouragements) > index:
    del encouragements[index]
  db["encouragements"] = encouragements

update_encouragements () Функция принимает поощряющее сообщение как аргумент.

Сначала он проверяет, является ли «поощрением» ключом в базе данных. Если это так, он получает список поощрений уже в базе данных, добавляет новый список в список и сохраняет обновленный список обратно в базу данных под ключом «Поодности».

Если база данных еще не содержит «поощрения», создается новый ключ, создан новый ключ, и новое поощряющее сообщение добавляется в качестве первого элемента в списке.

delete_encouragement () Функция принимает индекс как аргумент.

Получает список поощрений из базы данных, хранящейся в соответствии с ключом «Поощрения». Если количество элементов в списке поощрений больше, чем индекс, то элемент списка при этом индекс удален.

Наконец, обновленный список сохраняется обратно в базу данных под ключом «Поодности».

Вот обновленный код для on_message () функция. После кода я объясню новые разделы.

async def on_message(message):
  if message.author == client.user:
    return

  msg = message.content
 
  if msg.startswith("$inspire"):
    quote = get_quote()
    await message.channel.send(quote)

  options = starter_encouragements
  if "encouragements" in db.keys():
    options = options + db["encouragements"]

  if any(word in msg for word in sad_words):
    await message.channel.send(random.choice(options))

  if msg.startswith("$new"):
    encouraging_message = msg.split("$new ",1)[1]
    update_encouragements(encouraging_message)
    await message.channel.send("New encouraging message added.")

  if msg.startswith("$del"):
    encouragements = []
    if "encouragements" in db.keys():
      index = int(msg.split("$del",1)[1])
      delete_encouragment(index)
      encouragements = db["encouragements"]
    await message.channel.send(encouragements)

Первая новая линия кода сверху – Варианты Отказ Мы делаем копию Starter_Encouragements Поскольку мы собираемся добавить представленные пользователем сообщения в этот список, прежде чем выбрать случайное сообщение для отправки бота.

Мы проверяем, есть ли «поощрения» уже в клавишах баз данных (что означает, что пользователь представил хотя бы одно пользовательское сообщение). Если это так, мы добавляем пользовательские сообщения в поощрения стартера.

Затем, вместо того, чтобы отправить случайное сообщение от Starter_Encouragements Бот теперь отправляет случайное сообщение от Варианты Отказ

Следующий новый раздел кода используется для добавления нового пользовательского сообщения в базу данных. Если сообщение «Разрешенность» начинается с «$ new», то текст после «$ new» будет использоваться в качестве нового поощрения сообщения.

Код msg.split («$ new», 1) [1] Снижает сообщение из команды «$ new» и сохраняет сообщение в переменной. В этой строке кода обратите внимание на пространство в "$ new" Отказ Мы хотим все после космос.

Мы называем update_encouragements Функция Helper с новым сообщением, а затем бот отправляет сообщение в раздорный чат, подтверждающий, что сообщение было добавлено.

Третий новый раздел (в конце кода выше) проверяет, начинается ли новое сообщение «$ del». Это команда для удаления элемента из списка «Поодности» в базе данных.

Сначала новая переменная под названием поощрения инициализируется как пустой массив. Причина этого состоит в том, что этот раздел Кода отправит сообщение с пустым массивом, если база данных не включает в себя клавишу «Поощрение».

Если ключевой ключ «Поощрение» находится в базе данных, индекс будет разделен из сообщения раздора, начиная с «$ del». Тогда delete_encouragement () Функция называется прохождение в индексе для удаления. Обновленный список поощрений загружен в поощрения Переменная, а затем бот отправляет сообщение для раздора с текущим списком.

Окончательные особенности бота

Бот должен работать, так что это хорошее время, чтобы проверить его. Теперь мы добавим несколько окончательных функций.

Мы добавим возможность получить список представленных пользователем сообщений справа от DiscoD, и мы добавим возможность выключить и на том, отвечает ли бот на грустные слова.

Я дам вам полный последний код программы, а затем обсудим обновления под кодом.

import discord
import os
import requests
import json
import random
from replit import db

client = discord.Client()

sad_words = ["sad", "depressed", "unhappy", "angry", "miserable"]

starter_encouragements = [
  "Cheer up!",
  "Hang in there.",
  "You are a great person / bot!"
]

if "responding" not in db.keys():
  db["responding"] = True

def get_quote():
  response = requests.get("https://zenquotes.io/api/random")
  json_data = json.loads(response.text)
  quote = json_data[0]["q"] + " -" + json_data[0]["a"]
  return(quote)

def update_encouragements(encouraging_message):
  if "encouragements" in db.keys():
    encouragements = db["encouragements"]
    encouragements.append(encouraging_message)
    db["encouragements"] = encouragements
  else:
    db["encouragements"] = [encouraging_message]

def delete_encouragment(index):
  encouragements = db["encouragements"]
  if len(encouragements) > index:
    del encouragements[index]
  db["encouragements"] = encouragements

@client.event
async def on_ready():
  print("We have logged in as {0.user}".format(client))

@client.event
async def on_message(message):
  if message.author == client.user:
    return

  msg = message.content

  if msg.startswith("$inspire"):
    quote = get_quote()
    await message.channel.send(quote)

  if db["responding"]:
    options = starter_encouragements
    if "encouragements" in db.keys():
      options = options + db["encouragements"]

    if any(word in msg for word in sad_words):
      await message.channel.send(random.choice(options))

  if msg.startswith("$new"):
    encouraging_message = msg.split("$new ",1)[1]
    update_encouragements(encouraging_message)
    await message.channel.send("New encouraging message added.")

  if msg.startswith("$del"):
    encouragements = []
    if "encouragements" in db.keys():
      index = int(msg.split("$del",1)[1])
      delete_encouragment(index)
      encouragements = db["encouragements"]
    await message.channel.send(encouragements)

  if msg.startswith("$list"):
    encouragements = []
    if "encouragements" in db.keys():
      encouragements = db["encouragements"]
    await message.channel.send(encouragements)
    
  if msg.startswith("$responding"):
    value = msg.split("$responding ",1)[1]

    if value.lower() == "true":
      db["responding"] = True
      await message.channel.send("Responding is on.")
    else:
      db["responding"] = False
      await message.channel.send("Responding is off.")

client.run(os.getenv("TOKEN"))

Первый раздел, добавленный к коду прямо под Starter_Encouragements список:

if "responding" not in db.keys():
  db["responding"] = True

Мы создаем новый ключ в базе данных под названием «Отвечая» и установите его на «True». Мы будем использовать это, чтобы определить, должен ли бот ответить на грустные слова или нет. Поскольку база данных сохраняется даже после того, как программа останавливается запущена, мы только создаем новую клавишу, если она еще не существует.

Следующая новая часть кода состоит в том, что раздел, который отвечает на печальные слова, теперь находится внутри этого, если утверждение: Если БД [«отвечать»]: Отказ Бот будет реагировать только на грустные слова, если дБ [«отвечать»] Отказ Возможность обновления этого значения заходит после этого следующего раздела.

Далее, после того, как код, чтобы BOT ответил команду «$ del», есть новый код, чтобы ответить на команду «$ список» при отправке в качестве сообщения раздора.

Этот раздел начинается с создания пустого списка, называемого поощрения Отказ Затем, если в базе данных уже есть поощрения, эти поощрения заменяют пустой список, который был только что создан.

Наконец, бот отправляет список поощрений в качестве сообщения раздора.

Последний новый раздел находит следующий. Этот код заставляет BOT ответить на команду «$ reganging». Эта команда берет аргумент либо «TRUE», либо «FALSE». Вот пример использования: «$ отвечает правду».

Код сначала снимает аргумент с Value.Split («$ Ответ», 1) [1] (Как и раньше, обратите внимание на пространство в "$ Ответ на" ). Тогда есть оператор IF/ELSE, что соответствующим образом устанавливает ключ «Отвечая» в базе данных и отправляет уведомление о сообщениях, чтобы раздор. Если аргумент – это что-нибудь, кроме «правда», код предполагает «ложь».

Код для бота завершен! Теперь вы можете запустить бот и попробовать. Но есть еще один важный шаг, который мы обсудим дальше.

Как настроить бот, чтобы работать непрерывно

Если вы запустите свой бот в REPL.IT, а затем закройте вкладку, он работает, ваш бот будет прекратить работу.

Но есть два способа постоянно поддержания бота, даже после закрытия веб-бауза.

Первый путь и простейший способ – подписаться на оплаченный план в REPL.IT. Их самый дешевый платный план называется планом хакера, и он включает в себя пять всегда на рентам.

Вы можете получить три месяца бесплатно, используя эту ссылку (ограничена первыми 1000 человек):

После того, как вы подписались на этот план, откройте refl и щелкните по названию вверху. Затем выберите опцию «Всегда на».

Есть еще один способ сохранить ваш код, даже на свободном уровне, но это немного сложнее. Reft.it продолжит запустить веб-сервер, даже после закрытия вкладки. Но даже веб-сервер будет работать только до часа без какого-либо использования.

Вот что за reft.it docs говорят:

Чтобы постоянно поддерживать бот, мы будем использовать другой бесплатный сервис, называемый Robot Womptime At https://uptimerobot.com/ Отказ

Робот безотказной работы может быть установлен на веб-сервер Bot на REPL.IT каждые 5 минут. С постоянными звонками, бот никогда не войдет на сцену сна и будет просто продолжать работать.

Поэтому мы должны сделать еще две вещи, чтобы наш бот постоянно работать:

  1. Создайте веб-сервер в REPL.IT и
  2. Установите Robot Roomtime, чтобы непрерывно пинговать веб-сервер.

Как создать веб-сервер в REPL.IT

Создание веб-сервера проще, чем вы можете подумать.

Чтобы сделать это, создайте новый файл в вашем проекте под названием stef_alive.py Отказ

Затем добавьте следующий код:

from flask import Flask
from threading import Thread

app = Flask('')

@app.route('/')
def home():
    return "Hello. I am alive!"

def run():
  app.run(host='0.0.0.0',port=8080)

def keep_alive():
    t = Thread(target=run)
    t.start()

В этом коде мы используем колбу для запуска веб-сервера. Сервер возвращает «Привет. Я жив». всем, кто его посещает. Сервер будет работать на отдельной резьбе с нашего бота. Мы не будем обсуждать все здесь, так как остальные не имеют права актуальны для нашего бота.

Теперь нам просто нужен бот для запуска этого веб-сервера.

Добавьте следующую строку в верхнюю часть main.py импортировать сервер.

from keep_alive import keep_alive

Чтобы запустить веб-сервер, когда main.py Запускается, добавьте следующую строку в качестве второй строки, прямо перед запуском бота.

stear_alive ()

Когда вы запускаете BOT на REPL.IT После добавления этого кода, откроется новое окно веб-сервера. Для веб-сервера, показанного URL. Скопируйте URL, чтобы вы могли использовать его в следующем разделе.

Как настроить робот времени безотказной работы

Теперь нам нужно настроить робот безотказной работы для Ping на веб-сервере каждые пять минут. Это заставит бот постоянно работать.

Создайте бесплатный аккаунт на https://uptimerobot.com/ Отказ

Как только вы вошли в свою учетную запись, нажмите «Добавить новый монитор».

Для нового монитора выберите «HTTP (S)» в качестве типа монитора и назовите его, что вам нравится. Затем вставьте в URL-адрес вашего веб-сервера от REPL.IT. Наконец, нажмите «Создать монитор».

Были сделаны! Теперь бот будет работать непрерывно, чтобы люди всегда могли взаимодействовать с ним на REPL.IT.

Заключение

Теперь вы знаете, как создать BOT RUSOD BOT с Python и непрерывно запустить его в облаке.

Есть много других вещей, которые могут сделать библиотека Discord.py. Поэтому, если вы хотите дать раздорту бота еще больше функций, ваш следующий шаг – проверить Документы для Discord.py.