• Как с помощью бота добавлять других ботов в чат телеграм?

    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
    Ответ написан
  • Как реализовать интеграцию интернет-магазина с whatsapp?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Да, поставщик предоставит свой API, который можно использовать. Также можно использовать готовые интеграции разных решений (CRM, чатботы итд) с этим поставщиком. Сейчас провайдеры WABA API все заинтересованы, чтобы подключались именно через них, поэтому обычно с готовностью отвечают на вопросы: что, как, сколько стоит, с кем есть готовые интеграции и всё такое.

    Чтобы слать сообщения не в ответ на сообщение пользователя, надо сначала зарегистрировать шаблоны (борьба со спамом у них такая). Если пользователь напишет первым, то открывается 24-часовое окно, когда можно отправлять любые сообщения.

    Альтернатива - это нелегальные API на имитации WhatsApp Web. Это гораздо дешевле. Но нужно понимать, что это риск бана. Если просто отвечать на входящие сообщения, а магазин небольшой, то риск бана невелик, но если инициативно первым слать сообщения, то он существенно возрастает.
    Ответ написан
  • Проверка на пользователя в бан листе?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Во-первых,

    event.user_id != banned_ids

    неверно, надо

    event.user_id not in banned_ids

    Во-вторых, user_id скорее всего число, а в файле будут строки. Поэтому:

    banned_ids = [int(user_id) for user_id in BanUsers.read().splitlines()]
    Ответ написан
  • Как спарсить pdf файлы с сайта?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Вообще говоря, в данном случае скачать совсем не проблема безо всяких скриптов, достаточно wget:

    wget -r -np https://codernet.ru/media/
    Ответ написан
    3 комментария
  • Активная ссылка на viber бота?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ответ написан
    Комментировать
  • Как реализовать приветствие подписчика на канале?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нельзя. Сделай несколько каналов и рекламься со списком ссылок.
    Ответ написан
    Комментировать