Популярное сообщение Utka Опубликовано: 8 декабря 2021 Популярное сообщение Поделиться Опубликовано: 8 декабря 2021 (изменено) Скрытый текст Продолжение прошлой темки Введение Для начала хочу поблагодарить всех тех, кто советовал, критиковал, просто оставлял комментарии и ставил колобков на прошлую тему. Почему я снова решил написать тему? Да все просто. Я наконец закончил работу. Discord бот Уххххх это было очень тяжело. Проект получился небольшим, но сделать его стоило множества потраченного в пустую времени из-за моей тупизны или микро-моментов. Написан на discord.py, а чтобы его добавить прошу перейти по ссылке. Сам код: Скрытый текст import discord from discord.ext import commands from datetime import datetime import json from keep_alive import keep_alive with open("card_artist.json", "r") as read_file: data_artists = json.load(read_file) with open("card_price.json", "r") as read_file: data_prices = json.load(read_file) with open("card_legalities.json", "r") as read_file: data_legalities = json.load(read_file) with open("card_image1.json", "r") as read_file: data_images = json.load(read_file) with open("card_oracle1.json", "r") as read_file: data_oracles = json.load(read_file) prefix = "*" bot = commands.Bot(command_prefix=prefix, help_command=None) @bot.command() async def help(context): help = '*find {имя карты} - найти фото карты \n ' \ '*findfull {имя карты} - найти полную информацию о карте \n' \ '*findoracle {имя карты} - найти оракл карты \n' \ '*findprice {имя карты} - найти цену \n' \ '*findlegal {имя карты} - легальность карты в разных форматах \n' \ 'Также вы можете получить фотографию карты во время общения. Для этого надо в квадратных скобках написать название карты. Пример: [название карты]' embed_commands = discord.Embed(title="Команды бота", description=help, colour=0x87CEEB, timestamp=datetime.utcnow()) embed_commands.set_author(name="MTGSearcher", icon_url="https://sun9-69.userapi.com/impg/MpeCkG6cKBmcQoirZmi0EvNgKdnwlB5A6k7aHA/J74wfRfqfE8.jpg?size=720x720&quality=96&sign=a34757aa8ad78dbf4b71ca7aa0b73dd7&type=album") await context.send(embed=embed_commands) @bot.event async def on_ready(): print('We have logged in as {0.user}'.format(bot)) await bot.change_presence( activity=discord.Activity(type=discord.ActivityType.watching, name=f"{len(bot.guilds)} серверов!")) @bot.command() async def findfull(ctx, *, content: str): card_image = 'Не найдено!' prices = 'Не найдено!' legality = 'Не найдено!' card_name = content flag = 0 flag1 = 0 for i in data_images: if i['name'] == card_name or i['name'].lower() == card_name or ( card_name.lower() in i['name'].lower() and card_name.lower()[0:3] == i['name'].lower()[0:3]): if 'image_first_side' not in i: card_image = i['image'] break else: flag = 1 card_image_1 = i['image_first_side'] card_image_2 = i['image_second_side'] break for i in data_oracles: if i['name'] == card_name or i['name'].lower() == card_name or card_name.lower() in i['name'].lower(): if 'oracle_first_side' not in i and 'oracle_second_side' not in i: card_oracle = i['oracle_text'] break else: flag = 1 card_oracle_1 = i['oracle_first_side'] card_oracle_2 = i['oracle_second_side'] break if flag == 0: embed_oracle = discord.Embed(title="Оракл карты", description=card_oracle, colour=0x87CEEB, timestamp=datetime.utcnow()) embed_oracle.set_author(name="MTGSearcher", icon_url="https://sun9-69.userapi.com/impg/MpeCkG6cKBmcQoirZmi0EvNgKdnwlB5A6k7aHA/J74wfRfqfE8.jpg?size=720x720&quality=96&sign=a34757aa8ad78dbf4b71ca7aa0b73dd7&type=album") await ctx.send(embed=embed_oracle) else: embed_oracle = discord.Embed(title="Оракл карты", colour=0x87CEEB, timestamp=datetime.utcnow()) embed_oracle.set_author(name="MTGSearcher", icon_url="https://sun9-69.userapi.com/impg/MpeCkG6cKBmcQoirZmi0EvNgKdnwlB5A6k7aHA/J74wfRfqfE8.jpg?size=720x720&quality=96&sign=a34757aa8ad78dbf4b71ca7aa0b73dd7&type=album") embed_oracle.add_field(name="Оракл верхний стороны", value=card_oracle_1, inline=False) embed_oracle.add_field(name="Оракл нижней стороны", value=card_oracle_2, inline=False) await ctx.send(embed=embed_oracle) for i in data_prices: if i['name'] == card_name or i['name'].lower() == card_name or card_name.lower() in i['name'].lower(): for j in i['prices'].items(): if j[1] != None: prices += str(j[0]) + ' ' + ':' + ' ' + str(j[1]) + '\n' break for i in data_legalities: if i['name'] == card_name or i['name'].lower() == card_name or card_name.lower() in i['name'].lower(): for j in i['legalities'].items(): if j[1] != None: legality += str(j[0]) + ' ' + ':' + ' ' + str(j[1]) + '\n' break card_stats = 'Данная карта не имеет стат!' for i in data_artists: if i['name'] == card_name or i['name'].lower() == card_name or card_name.lower() in i['name'].lower(): card_artist = i['artist'] break embed_full = discord.Embed(title="Полная информация о карте", colour=0x87CEEB, timestamp=datetime.utcnow()) embed_full.set_author(name="MTGSearcher", icon_url="https://sun9-69.userapi.com/impg/MpeCkG6cKBmcQoirZmi0EvNgKdnwlB5A6k7aHA/J74wfRfqfE8.jpg?size=720x720&quality=96&sign=a34757aa8ad78dbf4b71ca7aa0b73dd7&type=album") embed_full.add_field(name="Цены", value=prices, inline=False) embed_full.add_field(name="Легальность", value=legality, inline=False) embed_full.add_field(name="Художник", value=card_artist, inline=False) await ctx.send(embed=embed_full) if flag == 0: await ctx.send(card_image) else: await ctx.send(card_image_1) await ctx.send(card_image_2) @bot.command() async def find(ctx, *, content: str): card_image = 'Не найдено!' card_name = content flag = 0 for i in data_images: if i['name'] == card_name or i['name'].lower() == card_name or ( card_name.lower() in i['name'].lower() and card_name.lower()[0:3] == i['name'].lower()[0:3]): if 'image_first_side' not in i: card_image = i['image'] break else: flag = 1 card_image_1 = i['image_first_side'] card_image_2 = i['image_second_side'] break if flag == 0: await ctx.send(card_image) else: await ctx.send(card_image_1) await ctx.send(card_image_2) @bot.command() async def findoracle(ctx, *, content: str): card_name = content card_oracle = 'Не найдено!' flag = 0 for i in data_oracles: if i['name'] == card_name or i['name'].lower() == card_name or card_name.lower() in i['name'].lower(): if 'oracle_first_side' not in i and 'oracle_second_side' not in i: card_oracle = i['oracle_text'] break else: flag = 1 card_oracle_1 = i['oracle_first_side'] card_oracle_2 = i['oracle_second_side'] break if flag == 0: embed_oracle = discord.Embed(title="Оракл карты", description=card_oracle, colour=0x87CEEB, timestamp=datetime.utcnow()) embed_oracle.set_author(name="MTGSearcher", icon_url="https://sun9-69.userapi.com/impg/MpeCkG6cKBmcQoirZmi0EvNgKdnwlB5A6k7aHA/J74wfRfqfE8.jpg?size=720x720&quality=96&sign=a34757aa8ad78dbf4b71ca7aa0b73dd7&type=album") await ctx.send(embed=embed_oracle) else: embed_oracle = discord.Embed(title="Оракл карты", colour=0x87CEEB, timestamp=datetime.utcnow()) embed_oracle.set_author(name="MTGSearcher", icon_url="https://sun9-69.userapi.com/impg/MpeCkG6cKBmcQoirZmi0EvNgKdnwlB5A6k7aHA/J74wfRfqfE8.jpg?size=720x720&quality=96&sign=a34757aa8ad78dbf4b71ca7aa0b73dd7&type=album") embed_oracle.add_field(name="Оракл верхний стороны", value=card_oracle_1, inline=False) embed_oracle.add_field(name="Оракл нижней стороны", value=card_oracle_2, inline=False) await ctx.send(embed=embed_oracle) @bot.command() async def findprice(ctx, *, content: str): card_name = content output = 'Не найдено!' for i in data_prices: if i['name'] == card_name or i['name'].lower() == card_name or card_name.lower() in i['name'].lower(): for j in i['prices'].items(): if j[1] != None: output += str(j[0]) + ' ' + ':' + ' ' + str(j[1]) + '\n' break embed_price = discord.Embed(title="Цены карты", description=output, colour=0x87CEEB, timestamp=datetime.utcnow()) embed_price.set_author(name="MTGSearcher", icon_url="https://sun9-69.userapi.com/impg/MpeCkG6cKBmcQoirZmi0EvNgKdnwlB5A6k7aHA/J74wfRfqfE8.jpg?size=720x720&quality=96&sign=a34757aa8ad78dbf4b71ca7aa0b73dd7&type=album") await ctx.send(embed=embed_price) @bot.command() async def findlegal(ctx, *, content: str): legality = 'Не найдено!' card_name = content for i in data_legalities: if i['name'] == card_name or i['name'].lower() == card_name or card_name.lower() in i['name'].lower(): for j in i['legalities'].items(): if j[1] != None: legality += str(j[0]) + ' ' + ':' + ' ' + str(j[1]) + '\n' break embed_legal = discord.Embed(title="Легальность карты", description=legality, colour=0x87CEEB, timestamp=datetime.utcnow()) embed_legal.set_author(name="MTGSearcher", icon_url="https://sun9-69.userapi.com/impg/MpeCkG6cKBmcQoirZmi0EvNgKdnwlB5A6k7aHA/J74wfRfqfE8.jpg?size=720x720&quality=96&sign=a34757aa8ad78dbf4b71ca7aa0b73dd7&type=album") await ctx.send(embed=embed_legal) @bot.command() async def findartist(ctx, *, content: str): card_name = content for i in data_artists: if i['name'] == card_name or i['name'].lower() == card_name or card_name.lower() in i['name'].lower(): card_artist = i['artist'] break await ctx.send(card_artist) @bot.event async def on_message(message): await bot.process_commands(message) context = message.content.split() a = '' k1 = 0 k2 = 0 k3 = 0 for i in range(len(context)): if context[i][-1] == ')' and k1 == 1: k1 = 0 a += context[i] card_name = a.replace('(', '').replace(')', '').strip(' ') for i in data_images: if i['name'] == card_name or i['name'].lower() == card_name or ( card_name.lower() in i['name'].lower() and card_name.lower()[0:3] == i['name'].lower()[ 0:3]): if 'image_first_side' not in i: card_image = i['image'] await message.channel.send(card_image) break else: card_image_1 = i['image_first_side'] card_image_2 = i['image_second_side'] await message.channel.send(card_image_1) await message.channel.send(card_image_2) break a = '' elif context[i][0] == '(' or k1 == 1: k1 = 1 a += context[i] + ' ' elif context[i][-1] == '}' and k2 == 1: k2 = 0 a += context[i] card_name = a.replace('{', '').replace('}', '').strip(' ') for i in data_oracles: if i['name'] == card_name or i['name'].lower() == card_name or card_name.lower() in i[ 'name'].lower(): if 'oracle_first_side' not in i and 'oracle_second_side' not in i: card_oracle = 'Оракл карты: ' + i['name'] + '\n' + i['oracle_text'] await message.channel.send(card_oracle) break else: card_oracle_1 = 'Оракл верхней стороны карты: ' + i['name'] + '\n' + i['oracle_first_side'] card_oracle_2 = 'Оракл нижней стороны карты: ' + i['name'] + '\n' + i['oracle_second_side'] await message.channel.send(card_oracle_1) await message.channel.send(card_oracle_2) break a = '' elif context[i][0] == '{' or k2 == 1: k2 = 1 a += context[i] + ' ' elif context[i][-1] == ']' and k3 == 1: k3 = 0 a += context[i] card_name = a.replace('[', '').replace(']', '').strip(' ') output = 'Цена карты: ' + card_name + '\n' for i in data_prices: if i['name'] == card_name or i['name'].lower() == card_name or card_name.lower() in i[ 'name'].lower(): for j in i['prices'].items(): if j[1] != None: output += str(j[0]) + ' ' + ':' + ' ' + str(j[1]) + '\n' card_name_original = i['name'] break if output != 'Цена карты: ' + card_name + '\n': output = 'Цена карты: ' + card_name_original + '\n' + output await message.channel.send(output) a = '' elif context[i][0] == '[' or k3 == 1: k3 = 1 a += context[i] + ' ' keep_alive() bot.run('TOKEN') Можно долго говорить, что и как здесь написано. Скажу лишь, что я использую базу данных с scryfall.com. Но как я его хосчу? Легко) Я загрузил программу на replit.com, а затем добавил в основной файл keep_alive() Это отдельный файл. Вот он: Скрытый текст 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() Вот так выглядит discord бот) Несуразно, но мне очень понравилось его писать. Telegram бот Решил его написать, чтобы потренироваться и понять как пишутся боты в телеге(практически ничем от диса не отличается). Могут быть ошибки и проблемы, буду постепенно решать. Но насколько я его проверил, работает хорошо и косяков не заметил. Для того, чтобы посмотреть на мое творение пишите сюда: @MtgSearcher_Bot. И еще вы можете добавить в беседу(вообще для этого написан) Сам код: Скрытый текст import logging from aiogram import Bot, Dispatcher, executor, types import json from keep_alive import keep_alive with open("card_price.json", "r") as read_file: data_prices = json.load(read_file) with open("card_image1.json", "r") as read_file: data_images = json.load(read_file) with open("card_oracle1.json", "r") as read_file: data_oracles = json.load(read_file) API_TOKEN = 'TOKEN' logging.basicConfig(level=logging.INFO) log = logging.getLogger('broadcast') bot = Bot(token=API_TOKEN, parse_mode=types.ParseMode.HTML) dp = Dispatcher(bot) @dp.message_handler(commands=['start', 'help']) async def send_welcome(message: types.Message): await message.reply("Привет!\nЯ бот для поиска карт)\n Команды:\n 1) (название карты) - фото карты \n 2) {название карты} - оракл карты \n 3) [название карты] - цены карты") @dp.message_handler() async def find(message: types.Message): context = message['text'].split() a = '' k1 = 0 k2 = 0 k3 = 0 for i in range(len(context)): if context[i][-1] == ')' and k1 == 1: k1 = 0 a += context[i] card_name = a.replace('(','').replace(')','').strip(' ') for i in data_images: if i['name'] == card_name or i['name'].lower() == card_name or ( card_name.lower() in i['name'].lower() and card_name.lower()[0:3] == i['name'].lower()[ 0:3]): if 'image_first_side' not in i: card_image = i['image'] await bot.send_photo(chat_id=message.chat.id, photo=card_image) break else: card_image_1 = i['image_first_side'] card_image_2 = i['image_second_side'] await bot.send_photo(chat_id=message.chat.id, photo=card_image_1) await bot.send_photo(chat_id=message.chat.id, photo=card_image_2) break a = '' elif context[i][0] == '(' or k1 == 1: k1 = 1 a += context[i] + ' ' elif context[i][-1] == '}' and k2 == 1: k2 = 0 a += context[i] card_name = a.replace('{','').replace('}','').strip(' ') for i in data_oracles: if i['name'] == card_name or i['name'].lower() == card_name or card_name.lower() in i[ 'name'].lower(): if 'oracle_first_side' not in i and 'oracle_second_side' not in i: card_oracle = 'Оракл карты: ' + i['name'] + '\n' + i['oracle_text'] await message.answer(card_oracle) break else: card_oracle_1 = 'Оракл верхней стороны карты: ' + i['name'] + '\n' + i['oracle_first_side'] card_oracle_2 = 'Оракл нижней стороны карты: ' + i['name'] + '\n' + i['oracle_second_side'] await message.answer(card_oracle_1) await message.answer(card_oracle_2) break a = '' elif context[i][0] == '{' or k2 == 1: k2 = 1 a += context[i] + ' ' elif context[i][-1] == ']' and k3 == 1: k3 = 0 a += context[i] card_name = a.replace('[','').replace(']','').strip(' ') output = '' for i in data_prices: if i['name'] == card_name or i['name'].lower() == card_name or card_name.lower() in i[ 'name'].lower(): for j in i['prices'].items(): if j[1] != None: output += str(j[0]) + ' ' + ':' + ' ' + str(j[1]) + '\n' card_name_original = i['name'] break if output != '': output = 'Цена карты: ' + card_name_original + '\n' + output await message.answer(output) a = '' elif context[i][0] == '[' or k3 == 1: k3 = 1 a += context[i] + ' ' if __name__ == '__main__': keep_alive() executor.start_polling(dp, skip_updates=True) Хоститься абсолютно по той же методике, что и прошлый бот Заключение Спасибо, что прочитали! Буду рад любому комментарию или реакции на тему. А еще лучше если вы попробуете одного из этих ботов и поделитесь реакцией))) Для меня это был первый такой опыт и я рад, что он получился таким удачным Изменено 8 декабря 2021 пользователем Utka 4 1 8 Наверх Ссылка на комментарий Поделиться на других сайтах More sharing options...
Fre3MaN Опубликовано: 8 декабря 2021 Поделиться Опубликовано: 8 декабря 2021 Молодец! Ссылка на комментарий Поделиться на других сайтах More sharing options...
Net_Ware Опубликовано: 8 декабря 2021 Поделиться Опубликовано: 8 декабря 2021 Комментарий один: Дорогу осилит идущий! (© возможно Сенека). Если ничего не делать и не пробовать, ничего не выйдет, ну и большое начинается с малого ))) много штампов, смысл один - делать то что нравится, не оглядываясь на злопыхателей )) 2 Наверх Ссылка на комментарий Поделиться на других сайтах More sharing options...
Популярное сообщение swalle Опубликовано: 8 декабря 2021 Популярное сообщение Поделиться Опубликовано: 8 декабря 2021 2 часа назад, Net_Ware сказал: Комментарий один: Дорогу осилит идущий! (© возможно Сенека). Если ничего не делать и не пробовать, ничего не выйдет, ну и большое начинается с малого ))) много штампов, смысл один - делать то что нравится, не оглядываясь на злопыхателей )) держи еще умных мыслей 1 4 8 Наверх Ссылка на комментарий Поделиться на других сайтах More sharing options...
ak8 Опубликовано: 8 декабря 2021 Поделиться Опубликовано: 8 декабря 2021 Здравствуйте. Спасибо. Вопросы: 1. "Как запустить его в Телеге?". 2. "Как им пользоваться?" 2 Наверх Ссылка на комментарий Поделиться на других сайтах More sharing options...
Net_Ware Опубликовано: 8 декабря 2021 Поделиться Опубликовано: 8 декабря 2021 (изменено) Для злопыхателей... Скрытый текст Я про чай, а вы про что подумали? Изменено 8 декабря 2021 пользователем Net_Ware 3 1 2 Наверх Ссылка на комментарий Поделиться на других сайтах More sharing options...
Utka Опубликовано: 8 декабря 2021 Автор Поделиться Опубликовано: 8 декабря 2021 (изменено) 1 час назад, ak8 сказал: 1. "Как запустить его в Телеге?". Дан его ник, по которому можно написать, а затем добавить 1 час назад, ak8 сказал: 2. "Как им пользоваться?" при первом запуске показаны его команды(или по команде /start) @MtgSearcher_Bot ник бота в телеге Изменено 8 декабря 2021 пользователем Utka 2 Наверх Ссылка на комментарий Поделиться на других сайтах More sharing options...
uberburner Опубликовано: 11 декабря 2021 Поделиться Опубликовано: 11 декабря 2021 Спасибо! Теперь я знаю, что Plains нелегальны в олдскуле Скрытый текст 1 2 Наверх Ссылка на комментарий Поделиться на других сайтах More sharing options...
Utka Опубликовано: 11 декабря 2021 Автор Поделиться Опубликовано: 11 декабря 2021 6 часов назад, uberburner сказал: Спасибо! Теперь я знаю, что Plains нелегальны в олдскуле Спасибо большое!) Поправил данное недоразумение)) Скрытый текст Ссылка на комментарий Поделиться на других сайтах More sharing options...
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВойти
Уже зарегистрированы? Войдите здесь.
Войти сейчас