• Как обратиться к ключам словаря через input?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Можно сделать словарь dynos, в котором будут два ключа: carno и maia. Ну и потом просто получать их.

    dinos = {'carno': { 'weight': 2170, 'health': 2170, 'bite': 200, 'bleed': 15, 'sbite': 0, 'sbleed': 0 }, 'maia': { 'weight': 2868, 'health': 2868, 'bite': 175, 'bleed': 0, 'sbite': 0, 'sbleed': 0 }}
    
    d1=dinos[input()]
    Ответ написан
    Комментировать
  • Как убрать отступы при парсинге?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Смотря что там. Можно вместо text попробовать content, там уже посмотреть что лучше будет. Ну и просто попробовать .text.strip()
    Ответ написан
    Комментировать
  • Ошибка invalid syntax в python, что делать?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Запускаете на третьем питоне? Синтаксис от второго
    Ответ написан
    3 комментария
  • Как ответить на личное сообщение боту?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Если хотите писать сообщения в ЛС, то убирайте все упоминания серверов, зачем вы получаете список участников какого-то сервера, если общаетесь в приватном чате.

    Удалить:
    for message.author in guild.members

    Тип стоит проверять по другому. Вместо
    if message.channel.type == discord.DMChannel:
    используйте
    if isinstance(message.channel, discord.DMChannel):

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

    Как-то так:
    @bot.event
    async def on_message(message):
        
        if message.author.bot:
            return
        
        if isinstance(message.channel, discord.DMChannel):
            await message.author.send("message")
    Ответ написан
    Комментировать
  • Обязательно ли для изучения Flask и его понимания знать Jinja2? И в практике это важный элемент?

    SoreMix
    @SoreMix
    yellow
    Смотря чем занимаетесь. jinja - шаблонизатор, если вы не используете его в своем проекте, то по и бог с ним.

    Допустим для простого API для своих проектов вовсе не нужны html документы, а уж тем более с подстановкой переменных, собственно, jinja тоже не нужен. Или если все же html документы используются, но они статичны, как в сайте-визитке

    Если Flask используется для написания полноценного сайта, то без знаний jinja уже не обойтись.
    Ответ написан
    Комментировать
  • Бот не меняет сообщение Telebot, как решить?

    SoreMix
    @SoreMix
    yellow
    у админа все работает прекрасно сообщение меняется, но у саппорта ничего не меняется и выдается ошибка


    У вас два метода,которые изменяют сообщение. Первый для сапорта, второй для администратора. В чате у одного нет сообщения второго и наоборот

    Логично было бы заменить
    bot.edit_message_text(chat_id=admin, message_id=call.message.message_id, text= f'❤️ Пользователь @{str(call.message.chat.username)} принят', parse_mode="Markdown")
    bot.edit_message_text(chat_id=support, message_id=call.message.message_id, text= f'❤️ Пользователь @{str(call.message.chat.username)} принят', parse_mode="Markdown")

    на
    bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text= f'❤️ Пользователь @{str(call.message.chat.username)} принят', parse_mode="Markdown")


    Так же хотелось бы узнать что делать чтобы вместо @{str(call.message.chat.username)} писался username человека которого приняли, а то там пишется username того кто принял

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

    Но можно и вызвать метод getChat, передать в него id чата и получить из него имя пользователя. Но зачем, если можно имя сразу передать через inline кнопку

    upd: а, ну я понял, что подразумевалось при использовании двух методов. Нужно во всех чатах обновить информацию. Здесь ошибка появляется из-за того, что ID сообщений не совпадает в двух чатах. Можно пофиксить как нибудь через добавление ID сообщений в кнопку через редактирование, но способ странный конечно. Сейчас напишу что нибудь.

    Окей, допустим у нас есть два id чата - admin и support, занесем их в список. И создадим еще список, где будем хранить наши id сообщений. Главная идея в том, чтобы добавить в callback_data наши ID чата и ID поддержки вместе с их уникальными ID сообщений. Дальше я просто выложу код и прокоментирую.
    @bot.message_handler(commands=['start'])
    def send_start(message):
    
        # начальная клавиатура
        markup = types.InlineKeyboardMarkup()
        markup.add(types.InlineKeyboardButton('Принять пользователя', callback_data='dummy'))
    
        # два списка, один с ID чатов сапорта и админа, второй для ID сообщений
        chats = [admin, support]
        message_ids = []
    
        # Для каждого из наших старших юзеров отправляем сообщение, в котором есть имя человека для одобрения и наша клавиатура.
        # во время отправки сообщений мы сохраняем их ID и добавляем в наш список message_ids
        for chat in chats:
            msg = bot.send_message(chat, 'Пользователь: 1234', reply_markup=markup)
            message_ids.append(msg.message_id)
    
        # здесь склеиваем наш chat_id и message_id и формируем из них строку вида "chatid_messageid:chatid2_messageid2"
        # у меня cb_data получается "XXXXXXX_1264:YYYYYYYY_1265", где 1264 & 1265 - id сообщений, а XXXX & YYY - ID чатов людей из списка chats
        cb_data = ':'.join(f'{chat_id}_{message_id}' for chat_id, message_id in zip(chats, message_ids))
        markup = types.InlineKeyboardMarkup()
        markup.add(types.InlineKeyboardButton('Принять пользователя', callback_data=cb_data))
    
        # еще раз склеиваем наши списки, и редактируем в них клавиатуру
        for chat_id, message_id in zip(chats, message_ids):
            bot.edit_message_text('test', chat_id, message_id, reply_markup=markup)


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

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

    @bot.callback_query_handler(func= lambda call: True)
    def accept(call):
    
        messages_info = call.data.split(':')
        for message_info in messages_info:
            chat_id, message_id = message_info.split('_')
            bot.edit_message_text(chat_id=chat_id, message_id=message_id, text= f'❤️ Пользователь @{str(call.message.chat.username)} принят', parse_mode="Markdown")


    Не тестил, но думаю работать будет. Надеюсь понятно что я имел ввиду
    Ответ написан
    Комментировать
  • Как спарсить информацию предмета Steam?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    import requests
    
    
    data = requests.get('https://steamcommunity.com/market/listings/730/AK-47%20%7C%20Redline%20%28Field-Tested%29/render/?query=&start=60&count=10&country=RU&language=english&currency=1').json()
    
    
    for skin in data['assets']['730']['2'].values():
        if 'fraudwarnings' in skin:
            for fraudwarning in skin['fraudwarnings']:
                if fraudwarning.startswith('Name Tag'):
                    print(fraudwarning.replace('Name Tag: ', '').replace('\'\'', ''))
    
        else:
            print(skin['name'])


    Стикеры и прочее там же
    Ответ написан
    Комментировать
  • Как вывести на экран нужные данные из pythone списка?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    with open('doc.txt', 'w', encoding='utf-8') as f:
        for sublist in spisok[1]:
            f.write(','.join(str(el) for el in sublist))
            f.write('\n')
    Ответ написан
  • Как отправить сообщение или Embed через одну команду?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    От пользователя нельзя отправить embed. Можно создать какой нибудь свой формат для embed и воссоздать его в коде. Понятия не имею можно ли передать нормально код, но можно сделать вот такой костыль:

    1. Создаем конструкцию нужную нам в JSON формате, я сделал такой, понятно что можно дорабатывать под себя бесконечно:
    {"title": "Информация о пользователе", "color": "0xEE82EE", "fields": [{"name": "Присоеденился к серверу", "value": "joined_at"}, {"name": "Присоеденился к Discord", "value": "created_at"}, {"name": "Роли", "value": "roles"}]}
    .
    Ну и парс переменных можно сделать какой нибудь получше.
    2. Кодируем ее в b64, потому что дискордру почему-то ругается на кавычки, опять таки, может есть и другой вариант, но раз писать такое, то отрываться по полной.
    eyJ0aXRsZSI6ICLQmNC90YTQvtGA0LzQsNGG0LjRjyDQviDQv9C+0LvRjNC30L7QstCw0YLQtdC70LUiLCAiY29sb3IiOiAiMHhFRTgyRUUiLCAiZmllbGRzIjogW3sibmFtZSI6ICLQn9GA0LjRgdC+0LXQtNC10L3QuNC70YHRjyDQuiDRgdC10YDQstC10YDRgyIsICJ2YWx1ZSI6ICJqb2luZWRfYXQifSwgeyJuYW1lIjogItCf0YDQuNGB0L7QtdC00LXQvdC40LvRgdGPINC6IERpc2NvcmQiLCAidmFsdWUiOiAiY3JlYXRlZF9hdCJ9LCB7Im5hbWUiOiAi0KDQvtC70LgiLCAidmFsdWUiOiAicm9sZXMifV19

    3. Отправляем нашу base64 строку как аргумент в команду say, строка без проблем проглатывается
    4. В функции обработчике декодируем ее, и читаем как обычный JSON, строя наш embed по своим правилам
    def make_embed(embed_json, ctx):
    
        emb = discord.Embed(title=embed_json.get('title', '-'), color=int(embed_json.get('color', 0xEE82EE), 16))
    
        fields = embed_json.get('fields', [])
        for field in fields:
            
            field_value = field.get('value', '-')
            
            if field_value == 'joined_at':
                field_value = ctx.message.author.joined_at.strftime('%d.%m.%Y %H:%M:%S')
            
            elif field_value == 'created_at':
                field_value = ctx.message.author.created_at.strftime('%d.%m.%Y %H:%M:%S')
            
            elif field_value == 'roles':
                field_value = ctx.message.author.roles
    
            emb.add_field(name=field.get('name', '-'), value=field_value)
    
        return emb
    
    
    @bot.command()
    async def say(ctx, arg, isbase64=False):
    
        if isbase64:
            try:
                decoded_embed = json.loads(base64.b64decode(arg.encode('utf-8')).decode('utf-8'))
            except Exception as e:
                await ctx.send(f'Ошибка при распаковке base64: {e}')
                return
    
            embed = make_embed(decoded_embed, ctx)
            await ctx.send(embed=embed)
    
        else:
            await ctx.send(arg)


    Соответственно, отправляя !say text мы получим в ответ просто текст, точно так же как и при
    !say eyJ0aXRsZSI6ICLQmNC90YTQvtGA0LzQsNGG0LjRjyDQviDQv9C+0LvRjNC30L7QstCw0YLQtdC70LUiLCAiY29sb3IiOiAiMHhFRTgyRUUiLCAiZmllbGRzIjogW3sibmFtZSI6ICLQn9GA0LjRgdC+0LXQtNC10L3QuNC70YHRjyDQuiDRgdC10YDQstC10YDRgyIsICJ2YWx1ZSI6ICJqb2luZWRfYXQifSwgeyJuYW1lIjogItCf0YDQuNGB0L7QtdC00LXQvdC40LvRgdGPINC6IERpc2NvcmQiLCAidmFsdWUiOiAiY3JlYXRlZF9hdCJ9LCB7Im5hbWUiOiAi0KDQvtC70LgiLCAidmFsdWUiOiAicm9sZXMifV19
    . Однако, если передадим третий параметр True:
    !say eyJ0aXRsZSI6ICLQmNC90YTQvtGA0LzQsNGG0LjRjyDQviDQv9C+0LvRjNC30L7QstCw0YLQtdC70LUiLCAiY29sb3IiOiAiMHhFRTgyRUUiLCAiZmllbGRzIjogW3sibmFtZSI6ICLQn9GA0LjRgdC+0LXQtNC10L3QuNC70YHRjyDQuiDRgdC10YDQstC10YDRgyIsICJ2YWx1ZSI6ICJqb2luZWRfYXQifSwgeyJuYW1lIjogItCf0YDQuNGB0L7QtdC00LXQvdC40LvRgdGPINC6IERpc2NvcmQiLCAidmFsdWUiOiAiY3JlYXRlZF9hdCJ9LCB7Im5hbWUiOiAi0KDQvtC70LgiLCAidmFsdWUiOiAicm9sZXMifV19 True
    то второй аргумент будет обрабатываться уже как base64 строка, и строить embed

    Можно и есть способ лучше, но первое что в лоб приходит это вот такой говнокод.

    Аж плохо стало
    Ответ написан
    4 комментария
  • Ошибка при создания бота Discord на python. Как решить?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    # Mute
    @client.command()
    @commands.has_permissions(administrator = True)
    
    # !help
    @client.command(pass_context = True)
    @commands.has_permissions(administrator = True)
    
    async def help(ctx):


    На одну функцию прицепили одинаковые декораторы
    Ответ написан
    3 комментария
  • Ошибка sqlite3.OperationalError: table USER has no column named status как исправить?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    В таблице USER нет столбца status
    Ответ написан
    7 комментариев
  • Поможете с авторегом на mail.ru?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    from selenium.webdriver.support.ui import Select
    
    select = Select(driver.find_element_by_id('select-0-2-232'))
    select.select_by_visible_text('Март')


    Можно через Select попробовать, но тег не всегда на странице есть почему-то, не на фулскрине появляется
    Ответ написан
    Комментировать
  • Проблема с bot.register_next_step_handler?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Хендлеры не привязаны ни к чему.

    sent = bot.send_message(message.chat.id, 'Напиши ОДНО любое сообщение') #Пришлось добавить чтоб человек понимал
    bot.register_next_step_handler(sent, func_but1)
    Ответ написан
  • Как перед ".png", ".jpeg" и др. добавить новый кусок текста?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    import os
    from PIL import Image
    
    directory = r'C:\Users\user\Desktop\*каталог, в котором находятся изображения*'
    images = os.listdir(directory)
    
    for image_name in images:
        image_path = os.path.join(directory, image_name)
        img = Image.open(image_path)
        img_size = (200, 200)
        img.thumbnail(img_size)
        new_image_name = '_s.'.join(image_name.rsplit('.', 1))
        new_image_path = os.path.join(directory, new_image_name)
        img.save(new_image_path)
    Ответ написан
    8 комментариев
  • Как сделать так, чтобы бот телеграм не прекращал работу после ошибки?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    def func_1(message):
        if message.text.isdigit():
            i = int(message.text)
            b = i * i
            bot.send_message(message.chat.id, str(i)+' + '+str(i)+' = '+str(b))
        else:
            bot.send_message(message.chat.id, "число")


    Ну и в else нужно добавить next step handler на эту же функцию, или как там реализовано это все
    Ответ написан
    1 комментарий
  • Почему решение идёт не так как нужно?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    1 * 86400 = 86400 а не 86400 единиц

    Умножили строку на число
    Ответ написан
  • Почему возвращается None при парсинге?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    хотя класс такой на странице есть и прогружается он сразу

    6095400058977915213790.jpeg
    Нет его там. Даже визуально видно, что он не сразу появляется. Данные приходят по wss
    wss://data.tradingview.com/socket.io/websocket?from=symbols%2FBTCUSD%2F&date=2021_05_06-10_12


    Однажды парсил tradingview по заказу, можно было получать валюты через https://scanner.tradingview.com/crypto/scan пары BINANCE:BTCUSDT и BINANCE:BTCRUB. Понятия не имею как там сейчас дела, но лучше искать другой сайт для курса
    Ответ написан
    Комментировать