Задать вопрос
  • Как сделать приветственное сообщение в 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
    Сисадмин, просто сисадмин...
    Нельзя. Сделай несколько каналов и рекламься со списком ссылок.
    Ответ написан
    Комментировать
  • Как через Viber API получить онлайн-статус моего контакта? С чего начать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    У Viber есть два принципиально разных API: Viber Business Messages и Viber Bot (ранее Viber Public Accounts). Первый в основном предназначен для платных рассылок по номеру телефона и доступен только для бизнеса, второй нужен для создания телеграм-подобных ботов (пользователь должен написать первым). Ни тот, ни другой не предполагают получение статуса пользователя.
    Ответ написан
    Комментировать
  • Скрыть полностью номер мобилы?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Настройки приватности позволяют скрыть свой номер:
    spoiler
    62435d177916c426454953.png
    Ответ написан
    Комментировать
  • Можно ли telegram бота подключить сразу к двум сервисам через один токен?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нельзя. Сообщения пользователя будет получать или один, или другой.

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ошибка тут:

    with open(cFile, 'w') as f3:

    Надо открывать файл как бинарный ('wb').

    А также тут:

    c = str(i)

    При приведении бинарных данных к строке они могут исказиться.
    Ответ написан
    2 комментария