• Как сделать формать получаемой информации из вебхука читаемым(например, конвертировать его в json)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Данные в запросе имеют тип bytes, а не str.

    data = json.loads(request.body.decode())
    Ответ написан
  • Как создать бота для discord на python?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Есть целый ряд библиотек на Python с реализацией Discord API, но почти всеми никто не пользуется, за исключением одной - discord.py. Библиотека настолько хороша, что весь интернет усыпан примерами и решениями именно с её использованием, а про другие никто и не знает почти. К сожалению, автор забросил разработку по личным причинам, но есть форки, идентичные натуральным, в частности, disnake, nextcord, pycord. Но многие до сих пор пользуются оригинальной библиотекой. Для указанной в вопросе функциональности её возможностей более чем хватает, нет только поддержки новомодных slash commands, но если они понадобятся - то перейти на любой форк можно почти безболезненно, так как они полностью совместимы с оригиналом.

    Раздача ролей и обработка команд на основе роли - это настолько популярный вопрос у начинающих ботописателей, что повсюду (и на этом сайте в том числе) просто море вопросов, ответов, примеров, советов итд итп по этой тематике.
    Ответ написан
    Комментировать
  • Sqlite3 не работает update?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    А почему name в запросе идёт первым, а user_id - вторым - при этом в передаваемых параметрах наоборот?

    cursor.execute("UPDATE gaming SET name =  ? WHERE user_id = ?", [user_id, text])
    Ответ написан
  • Aiogram. Как отправить сообщение повторно зная его message_id?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нет, невозможно через Bot API получить информацию по ранее отправленным сообщениям. Следовало сохранять эти сообщения или исходную информацию, на которой они были основаны.
    Ответ написан
    Комментировать
  • Не работает callback при создании телеграм бота, что делать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    И не будет работать. У тебя два обработчика с одинаковым фильтром. Использоваться будет первый, в нём обрабатывается только bts2 и bts1. Решения:

    1. Или переместить содержание второго обработчика в первый.

    2. Или в обработчике сделать более узкий фильтр, например:

    @bot.callback_query_handler(func=lambda call: call.data.startswith('bts'))
    ...
    
    @bot.callback_query_handler(func=lambda call: call.data == 'startzen')
    ...
    Ответ написан
    7 комментариев
  • Как с помощью бота добавлять других ботов в чат телеграм?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Никак, бот вообще не может добавлять никого, даже пользователей. Может только генерировать и посылать инвайт.
    Ответ написан
  • Как грепать вывод tcpdump?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    tcpdump -i ens18 -w file.pcap фильтры
    tshark -r file.pcap -T fields -e ip.dst | sort | uniq


    Можно сразу всё сделать wireshark'ом, но у него формат фильтров отличается.
    Ответ написан
    1 комментарий
  • Как удалить пересланное сообщение Aiogram?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В этом примере бот получает сообщение с ТЕКСТОМ /delete, пытается найти в нём forward_from_message_id (откуда???) и удалить в чате с пользователем-отправителем сообщение с таким id. Довольно очевидно, что это работать не будет вообще никак.

    Какая вообще задача стояла?
    Ответ написан
    8 комментариев
  • Создание телеграм бота для оповещения?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Да, обязательно получатель должен находиться в группе или подписан на бота. Некоторые сайты предлагают сделать привязку аккаунта на сайте к боту, чтобы получать уведомления, но это не слишком удобно.
    Ответ написан
  • Как сделать приветственное сообщение в AIogram?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это меняется в свойствах бота у BotFather.
    Ответ написан
    Комментировать
  • Как передать логин и пароль через requests (директива запаролена с помощью htaccess)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Для Basic Auth:

    from requests.auth import HTTPBasicAuth
    
    r = requests.get(url, auth=HTTPBasicAuth(login, password))


    Для других способов авторизации можно написать свой класс. Например, для Bearer:

    class BearerAuth(requests.auth.AuthBase):
      def __init__(self, token):
        self.token = token
      def __call__(self, r):
        r.headers["authorization"] = "Bearer " + self.token
        return r
    
    r = requests.get(url, auth=BearerAuth(my_token))
    Ответ написан
  • При обновлении данных в БД sqlite3, обновляет только 1 строку, как сделать, что бы обновляло сразу все?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    cursor.execute возвращает генератор, который возвращает кортежи значений. Таким образом, в конструкции:

    for i in qwe.execute(""" SELECT vk_id FROM stata """):


    значением i будет не значение vk_id, а кортеж из одного значения (vk_id,).

    Далее, в этом цикле делается запрос с (i,), который даёт ((vk_id,),), то есть одно значение. Кроме того, внутри итерации по курсору выполняется другой запрос с тем же курсором с затиранием внутренних данных курсора от предыдущего запроса, поэтому при заходе на вторую итерацию уже не возвращается ничего. Получается один запрос по одному vk_id. Всё работает ровно так, как написано.

    Что тут можно сделать?

    Вариант 1. В executemany имеет смысл передать список не из одного значения, а из множества (иначе нет смысла в executemany, проще обычный execute). Например, их можно получить путём накопления в цикле в список с последующим отдельным (вне цикла) вызовом executemany. Но если с данными запроса ничего особого делать не нужно, то и цикл тут лишний, можно получить всё сразу через fetchall().

    Вариант 2. Обойтись средствами SQL. Примеры:

    -- добавить всем 1
    UPDATE stata SET coins = coins+1;
    -- добавить удвоенный доход всем с вип-статусом, если срок его действия ещё не истёк
    UPDATE stata SET coins = coins+dohod*2 WHERE vip_status=1 AND vip_status_end>=NOW();
    Ответ написан
    Комментировать
  • Ошибка авторизации VK API?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Авторизация по логину и паролю является неподдерживаемым способом и давно работает через пень-колоду. Следует использовать OAuth2.
    Ответ написан
  • Почему команды бота(discord.py) не обновляются?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Они могут обновляться не сразу, а в течение часа.
    Ответ написан
  • Как общаться с процессом в Linux?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Вызов pidfd_open предназначен совсем для другого. Он нужен, чтобы мониторить состояние процесса с помощью операций ввода-вывода (в частности, таких, как select/poll). Для доступа к stdin/stdout/stderr процесса он не предназначен, это должны быть отдельные дескрипторы (причём разные).

    Для простоых применений достаточно использовать функцию popen. Если целью является разобраться в том, как это всё работает, то рекомендую написать простейшую программу с popen, затем погонять по ней strace (с ключом -f) и понять, что скрывается под капотом. В частности, понять, зачем там будут вызовы dup, fork и exec, как переопределяется stdin/stdout/stderr и всё такое.
    Ответ написан
    Комментировать
  • Временный доступ и особые права в Windows?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Лучше всего поднять домен. Можно даже на samba, не покупая WinServer (и да, AD позволит делать намного больше и намного круче, поэтому если есть возможность - ею лучше пользоваться). Пользователей заводить централизовано и обучать использованию сетевого диска для личных файлов.

    Также у меня был опыт организации большого парка компьютеров в компьютерных классах для проведения олимпиад по программированию. Это очень специфическая задача разового использования системы, отличающаяся от регулярных занятий. В отличие от 90-х и нулевых, когда количество знакомых участникам сред разработки можно было пересчитать по пальцам, в наше время требуется установить десятки различных компиляторов и IDE. При этом к олимпиаде всё это должно стабильно работать. Ещё до меня просто на всех компах поставили VirtualBox с эталонным образом, который переимпортировали отдельно на каждой машине к каждой олимпиаде (весёлое занятие - бегать с пачкой флешек и везде это проделывать), но это было не слишком удобно, да и участников сбивает с толку, что надо что-то там делать в окошке виртуалки.

    Я подготовил на всех машинах Linux, где у специального пользователя запускаются иксы без DE и WM с headless fullscreen VirtualBox с целевой системой из образа (Windows XP). Сам эталонный образ машины лежал на LVM, а в VirtualBox передавался снапшот LV с образом. Соответственно, перед олимпиадой все машины вместо дефолтной системы вручную загружали в Linux, с сервера скриптом выполняли (ssh с ключом) на всех машинах пересоздание снапшота, а потом можно было просто ввести имя нужного пользователя. После олимпиады снапшот можно было пересоздать, получив опять чистую эталонную систему.

    До кучи, саму систему и эталонный образ я раскладывал udpcast'ом по igmp, это заметно ускорило дело, даже несмотря на неуправляемые свитчи. В первый раз всё это, конечно, потребовало кучу времени, но оно того стоило. Участники в большинстве своём даже не догадывались, что работают в виртулке :)
    Ответ написан
    1 комментарий
  • Как сделать так, чтобы бот выполнял команду 1 раз?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ох, ну тут всё неправильно.

    Не надо пихать ещё одну функцию send_message внутри send_message. Их надо вынести на один уровень. И вообще, назвать более адекватно их содержанию. Ведь первая обрабатывает команду /weather, а вторая - название города. Странно называть их одинаково неопределённым send_message (чтоб враги не догадались?).

    Что происходит в этом коде? Сначала мы регистрируем обработчики команд /weather и /start с помощью декоратора. При вызове /weather мы КАЖДЫЙ раз (ведь это часть функции-обработчика на следующем уровне вложенности!) заново определяем обработчик для content_type=text. Далее после первого вызова /weather этот обработчик начинает работать на все текстовые сообщения. Причём на сообщения ВСЕХ пользователей нашего бота. То есть реально, один вызывает /weather и тем самым изменяет поведение бота для всех пользователей сразу. Если в боте будет где-то ещё определяться таким же "внутренним" описанием ещё один обработчик content_type=text, то он будет всегда игнорироваться до следующего перезапуска бота, ведь один обработчик текстовых сообщений уже есть и он всегда будет применяться.

    Чего удивительного в том, что бот работает ровно так же странно, как странно написано в его коде?

    Надо понимать, что обработчик сообщения принимает ОДНО сообщение и его обрабатывает. Он не может принять сообщение и ещё сразу же следующее. Каждое обработается своим обработчиком. Чтобы обработка сообщений зависела от ряда сообщений, используют FSM (Finite State Machine), машину состояний. В telebot есть довольно простая в использовании FSM на основе вызова register_next_step_handler. Вызов register_next_step_handler переопределяет то, каким обработчиком будет обработано следующее сообщение с этим пользователем (точнее, в этом chat_id, который может быть и идентификатором группы).

    Собственно, принцип работы такой: когда пользователь вызывает /weather, мы должны с помощью вызова bot.register_next_step_handler зарегистрировать кастомный обработчик следующего сообщения. Этот обработчик будет обрабатывать только сообщения этого пользователя, подобное поведение не будет влиять на других пользователей. Для более сложных взаимодействий можно делать длинные и даже ветвящиеся цепочки обработчиков, спрашивать у пользователя разные данные, предлагать изменить ранее введённые данные итд итп.

    Официальный пример использования смотреть тут.
    Ответ написан
    1 комментарий
  • Как остановить выполнение цикла командой?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нужно вместо while True гонять цикл по какому-то другому условию, которое рано или поздно изменится. Например, можно завести глобальную переменную, задавать ей True в команде запуска, а в команде остановки выставлять False. Да, это очень дурацкое решение, так как нельзя будет использовать команду в разных каналах одновременно. Но как бы и задача сама по себе очень дурацкая, явно попытка научиться делать ну хоть что-нибудь...

    Обычно если нужно делать какие-то регулярные задачи для бота, применяют другие решения. Например, расширение tasks или модуль aioschedule. Длинный цикл в обработчике команды - это часто не очень хорошее решение. Например, если бот будет перезапущен, цикл не будет запущен заново, а если задачи цикла хранятся в сохраняемой между перезапусками очереди - то перезапуск бота не будет влиять на этот функционал.
    Ответ написан
    3 комментария
  • Какие библиотеки использовать для парсинга текстовых файлов (Python)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Допустим, мы напряжёмся и пропарсим миллион файлов не за полтора часа, а за час, потратив три часа на разработку и отдалку кода. И зачем? Чего мы тут сэкономим? Обычно для разовых операций временем работы заботятся тогда, когда оно действительно велико. Например, если требуется месяц непрерывной работы, то я бы ещё подумал, можно ли его сократить до недели.

    Библиотека numba нужна для ускорения собственноручно написанных вычислительных алгоритмов. В парсинге текстовых файлов, скорее всего, узким местом будут исключительно операции ввода-вывода, так что тут она ничем не поможет.
    Ответ написан
    Комментировать
  • Как получить все группы в которых состоит бот?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если это именно бот, а не пользователь, то никак. В Bot API нет такой функциональности. Можно только самому отслеживать добавления/удаления бота с самого начала его существования.

    Для юзербота пример есть прямо в документации: https://docs.pyrogram.org/start/examples/get_dialogs
    Ответ написан