Ответы пользователя по тегу Python
  • Как сделать append на json обьект?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Используем метод update:

    my_dict={ "foo": "bar" }
    
    my_dict.update({ "lorem": "ipsum" })
    Ответ написан
    Комментировать
  • Aogram Почему бот не отвечает на сообщение?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Да, это потому что "в конце". Обработчики перебираются последовательно, и как находится подходящий, остальные не используются. А тут два обработчика с одинаковым декоратором, естественно, что первый будет применяться, а второй уже нет.

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

    Условие commands=["баланс"] в декораторе позволит использовать команду как /баланс

    А вот такой вариант:

    @dp.message_handler(lambda message: message.text and (message.text.lower() == "баланс"))
    позволит сделать то же самое без / перед словом "баланс". И вообще, так можно делать более сложные проверки.
    Ответ написан
  • Как записать сообщение пользователя тг бота в переменную и передать ее в парсер(переменная это абривиатура криптовалюты),?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Использовать register_next_step_handler пример.
    Ответ написан
    Комментировать
  • Как сохранить результат работы парсера в файл .txt?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Я, конечно, понимаю, что указанное куратором тэга решение будет работать, но вообще говоря оно всё равно неправильное. Легко увидеть, что в таком варианте при повторном запуске скрипта файл не будет пересоздан - в него будут добавлены всё те же записи ещё раз.

    Тут ошибка в том, что файл открывается заново в каждой итерации цикла, что само по себе неразумно, а также и перезатирается его содержимое. Поэтому-то и получается одна строка в итоге. Для исправления надо вынести открытие файла на уровень выше, чем for. В этом случае он будет открыт один раз и закрыт только после завершения цикла.
    Ответ написан
    9 комментариев
  • Почему записывает данные иероглифами?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Исправить этот файл можно так:

    iconv -f utf-8 -t utf-16 < test.txt | sed '1s/^\xFF\xFE//' > test_fixed.txt


    Под Linux советую encoding не использовать при работе с файлами, так как если специально не намудрить, будет правильно и красиво использоваться utf-8.
    Ответ написан
    3 комментария
  • Как вывести сообщения по очереди?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Любой учебник по python, искать раздел про цикл for.
    Ответ написан
    Комментировать
  • Как исправить ошибку SQLite3, Discord Bot?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Смотри, допустим, emoji у тебя равно :duck:, тогда будет выполнен следующий запрос:

    INSERT INTO emo VALUES (:duck:)

    А надо было:

    INSERT INTO emo VALUES (':duck:')

    Теперь понятно?

    Ладно, допусим, ты вставишь в запрос кавычки, дальше кто-нибудь добавит в код эмодзи кавычки и сможет заставить скрипт выполнить такой запрос:

    INSERT INTO emo VALUES ('');DROP TABLE emo;--')

    После чего таблица emo будет удалена. Нельзя просто так вставлять в запрос то, что передаёт пользователь. Надо использовать плейсхолдеры:

    cursor.execute("INSERT INTO emo VALUES (?)", (emoji,))


    В этом случае база сама позаботится о том, чтобы правильно использовать значения в запросах с учётом синтаксиса.
    Ответ написан
    Комментировать
  • При входе на сервер функция отвечающая за ввод данных в db не работает. тоже самое происходит с функцией, которая вызывается коммандой. что делать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    По умолчанию Discord не присылает события on_member_join, для этого надо явно включить member intents.

    intents = discord.Intents.default()
    intents.members = True
    client = commands.Bot(command_prefix='!', intents=intents)
    Ответ написан
    Комментировать
  • Как стилизовать вывод данных в консоли?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В общем случае см. man console_codes.
    Ответ написан
    Комментировать
  • Multiprocessing читает каждую строчку из txt файла на каждом процессоре?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Один из самых простых способов это сделать - назначить каждому процессу из N штук свой номер и пусть первый читает строки 1, N+1, 2N+1, ..., второй 2, N+2, 2N+2, ... и так далее. Строки других процессов просто пропускать.

    # number - номер процесса от 0 до total-1
    # total - всего процессов
    def process(number, total):
       for i, l in enumerate(f):
          if i % total == number:
              ...
    Ответ написан
    Комментировать
  • Как получить сообщение канала telegram в переменную (парсер)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если канал свой (или есть связи с владельцами), то можно подписать на него своего бота и ловить события. Использовать обычные библиотеки для Bot API (telebot, aiogram итд).

    Если канал чужой, то бота подписать не получится, необходимо использовать клиентский API, изображающий обычного пользователя (библиотеки telethon, pyrogram).
    Ответ написан
  • Как из string сделать list Python?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Даже если обернуть last_name в кавычки, это не будет валидный json, потому что в json кавычки должны быть двойные. Самый простой способ это решить - использовать ast.literal_eval - так как указанный код является валидным кодом на python:

    import ast
    s = "[{'name': 'Рулон', 'last_name': 'Обоев'}, {'name': 'Лежана', 'last_name': 'Раздвиногова'}]"
    print (repr(ast.literal_eval(s)))


    Почему не просто eval? Потому что это более безопасно. Если в качестве "данных" нам прилетит

    os.system("rm -rf /some/file")

    то eval выполнит этот код и удалит файл как ни в чём не бывало, а ast.literal_eval кинет исключение.
    Ответ написан
    Комментировать
  • Как починить код запуска программы?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Судя по всему, речь идёт о боте для Discord? Этот код не будет работать. И довольно очевидно, что с твоим текущим уровнем знаний Python шансов заставить это работать нет.
    Ответ написан
    Комментировать
  • BadRequest: Unsupported parse_mode?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Скорее всего, в недрах create_bot (который не приведён в вопросе) используется parse_mode с неверным значением.
    Ответ написан
    Комментировать
  • Как обратиться к бд если она занята другой программой?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Как вариант, создаётся lock file рядом с базой, и все процессы, которые с ней работают, ставят эксклюзивную блокировку перед любой операцией с базой, а после её выполнения её снимают. Но всё же рекомендую перейти на самостоятельную СУБД.
    Ответ написан
    Комментировать
  • В чём ошибка определения переменной экземпляра?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Рекомендую напечатать id объектов, сразу станет видно проблему:

    for i in range(11):
      print (f"`{i} {id(g[i])}")
      for j in range(7):
        print (f"  `{j} {id(g[i][j])}")
        #deb.write(str(i)+"-"+str(j)+" "+str(g[i][j].x)+" "+str(g[i][j].y)+"\r\n")


    кусочек вывода
    `0 140084785493632
      `0 140084785519824
      `1 140084785520544
      `2 140084785519872
      `3 140084785520016
      `4 140084785520448
      `5 140084785520592
      `6 140084785520112
    `1 140084785493632
      `0 140084785519824
      `1 140084785520544
      `2 140084785519872
      `3 140084785520016
      `4 140084785520448
      `5 140084785520592
      `6 140084785520112


    Все элементы списка длины 11 по первому индексу ссылаются на один и тот же массив длины 7

    Ошибка тут в том, что выражение

    some_list * 11

    конструирует список из 11 ссылок на один и тот же массив. Который на последней итерации цикла получает x=10 во всех элементах.

    Решить можно, например, так:

    g = []
    
    for i in range(11):
      g.append([])
      for j in range(7):
        g[i].append(Point(i, j))


    В python все объекты передаются по ссылке, и это надо учитывать, а при необходимости копировать их явно.
    Ответ написан
    Комментировать
  • Проблемы с запуском бота телеграм на Python, что делать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Здесь много неправильно, и не странно, что это не работает.

    На первом уровне вложенности основной код, который должен делать 3 вещи:

    1. Импортировать модули.

    2. Создавать объект класса TeleBot.

    3. Вызывать от него polling.

    Что делает polling? Это цикл, который дёргает у Bot API метод getUpdates и получает время от времени новые обновления от Telegram. Для каждого он вызывает обработчики (handler). По умолчанию нет ни одного handler, и простейший бот без них не делает ничего - только скачивает и сразу выбрасывает получаемые сообщения.

    Далее надо сделать обработчики. Они представляют из себя обычные функции. Например, обработчик сообщения принимает объект класса Message, в котором все данные по сообщению: отправитель, текст, время отправки, id чата итд.

    Чтобы бот знал, что вот эта конкретная функция является обработчиком такого-то события с такими-то условиями, надо использовать декораторы. Например:

    @bot.message_handler(commands=['start','menu'])
    def start_message(message):
      # в этом обработчике мы можем обработать команду /start или /menu,
      # при этом можно брать из message данные о сообщении:
      # message.text - текст
      # message.from_user - объект класса User с данными отправителя
      # message.chat - объект класса Chat с данными о чате (группа или приват)
      ... тут нужные действия ...


    Использовать декоратор без @ и последующего описания функции бессмысленно - он просто ничего не будет делать (потому что декоратор - это специально устроенный класс, вызов bot.message_handler создаёт экземпляр этого класса, от которого потом вызывается специальный метод, а тут этого не происходит).

    Вызывать на первом уровне вложенности bot.send_message таки возможно, но... но тут в него передаётся, например, message.chat.id - а что такое message? Этой переменной в скрипте нет. И откуда бы она взялась, если сообщение получается внутри вызова bot.polling и должно передаваться обработчику, который нужно было бы оформить как функцию с декоратором? В коде нет ни одного такого. Да и переменная message будет актуальна только внутри этого обработчика, снаружи функции она не будет доступна.

    В общем, это никак не может работать.

    Плохая идея начинать изучения языка с ботов, области, в которой уже нужно обладать определённым уровнем познаний. Начинать имеет смысл с азов. Делать сначала простейшие задания (вида "попросить пользователя ввести два числа и вывести их сумму"), освоить циклы и функции, работу с файлами и строками, ну и всё такое. Затем, вернувшись к теме ботов, уже будешь делать всё не вслепую, а хоть как-то понимая происходящее.

    Представь себе, что ты бы купил автомобиль, и не смог бы понять, как его завести. Начал бы тыкать куда попало. Например, нашёл нипель на колесе - подёргал. Дворник крутится, если приложить усилия (ой, сломал, теперь не будет ездить?). Сзади труба торчил - к ней надо водопроводный шланг подвести? Вот примерно так сейчас ты делаешь бота. Даже если тебе подскажут, что изменить, ты всё равно не научишься программировать и не будешь понимать, что сделал.
    Ответ написан
    Комментировать
  • Как установить аватар?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Там же есть документация и даже с примером. Он, конечно, на js, но из него и так всё ясно: надо передать параметр avatar со ссылкой на аватарку,

    Установить никак. Боты не могут менять аватарки пользователей.
    Ответ написан
    Комментировать
  • Как вызвать функцию через inline mode?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Никак, inline mode для этого не предназначен.

    Inline mode - это средство помощи пользователю в наборе сообщения. В бота прилетает запрос, который он анализирует и выдаёт список вариантов. Этот список потом кэшируетя и может какое-то время не вызывать при таких же параметрах со стороны пользователя реального запроса к боту. Изменять уже отправленные ответы для inline mode бот не может. Узнать, отправил ли пользователь в итоге сообщения и в какой чат он тоже не имеет возможности.
    Ответ написан
    Комментировать
  • Как вивести елемент из словаря которкый находится в другом файле?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ошибка же всё объясняет: на момент окончания f-строки открытая внутри фигурная скобка не имеет парной закрытой. Всё потому, что в выражениях внутри f-строк надо использовать другие виды кавычек:

    f"{some_dict['some_key']}"

    или

    f'{some_dict["some_key"]}'

    или можно так:

    f"""{some_dict["some_key"]}"""
    Ответ написан
    1 комментарий