• Как на питоне проверять наличие файла и считать его название?

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

    from glob import glob
    
    for file_name in glob("path/to/directory/*.csv"):
        ...
    Ответ написан
    Комментировать
  • Как удалить установленный из исходников Perl?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Как правило, софт можно удалить с помощью make uninstall из каталога с исходными текстами. Если установка шла в расположение по умолчанию, то теперь ошмётки надо искать в /usr/local.
    Ответ написан
  • Как исправить Message to delete not found?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Тут делается reply, а затем через 30 секунд удаление этого сообщения. Если нажать кнопку удаления, то сообщение будет удалено, но удаление через 30 секунд всё равно будет вызвано и приведёт к ошибке, ведь сообщения и правда уже нет.
    Ответ написан
  • Как добавить в discord.py Слеш команды?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Последняя опубликованная стабильная версия discord.py очень старая, выпущена давно (до прекращения автором разработки) и не поддерживает slash-команды. Надо или ставить версию из git (автор недавно возобновил разработку), или использовать форки discord.py (disnake, nextcord, pycord), в которых поддержка таких команд уже работает в стабильных версиях..
    Ответ написан
    Комментировать
  • Python: как оставить в текстовом файле строки определенного формата?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    На самом деле этот файл представляет из себя json, который и надо разбирать как json, не занимаясь разбиением на строки и прочей ерундой:

    import json
    
    json_text = '''{"total":20,"rows":[
    {"id":123,"mark":null,"Status":2,"MessageNumber":123456789,"text":"Привет"},
    {"id":1234,"mark":null,"Status":1,"MessageNumber":23456789,"text":"Пока"},
    {"id":12345,"mark":null,"Status":2,"MessageNumber":345678, "text":"Ало"}]
    }'''
    
    data = json.loads(json_text)
    
    numbers = [x["MessageNumber"] for x in data["rows"]]
    print (numbers)
    with open("output.txt", "w") as f:
       print (", ".join(str(x) for x in numbers), file=f)
    Ответ написан
    Комментировать
  • Можно ли общаться с телеграм ботом в канале, но так чтобы этого не было видно остальным?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нельзя, никак. Канал по определению нужен для того, что его содержание видели все подписчики (и вообще все пользователи, если это публичный канал). Вот специально для таких задач в Телеграме появилась возможность ботам писать подписчикам канала даже без /start.
    Ответ написан
    Комментировать
  • Как поправить поиск в BASH?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Тут нет цикла. Если каждый раз брать 1 рандомный элемент всего списка, то нельзя избежать повторения. Список надо взять один раз и по нему итерироваться:

    for filename in $(find ... | shuf)
    do
       do_something_with "$filename"
    done


    Но тут могут быть побочные эффекты с пробелами и спецсимволами в именах.

    (Зачем в исходном примере было |shuf -n 2|head -n 1 я не знаю, это эквивалент простому |shuf -n 1)
    Ответ написан
  • Как создать многопользовательского бота в Telegram на Python?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ошибка в том, что бот сохраняет в одних и тех же переменных данные разных пользователей.

    Решение этой задачи называется FSM (Finite State Machine - конечный автомат) и в указанной библиотеке есть простая реализация FSM на основе метода register_next_step_handler. Пример.
    Ответ написан
    2 комментария
  • Как выровнять блок с информацией об авторах справа и добавить подписи под прочерки?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Верстать \TeX-документ на низкоуровневых \box'ах это особое искусство, и не всё там будет просто... Что-то типа такого:

    \small{
         \vbox{
              \hfill
              \vbox{
                   \hbox to 6cm{Научный руководитель:\ \hrulefill}
                   \hbox to 6cm{\strut\hrulefill}
                   {\tiny\it\hbox to 6cm{\hfill(имя)\hfill}}
                   \hbox{Студент группы ...}
              }
         }
    }


    Сюда бы ещё \vtop to 0cm{...\vfill}, чтобы подписи не раздвигали строки, но что-то сходу не получилось, позабыл я уже как все эти шаманства делаются...
    Ответ написан
  • Так и должно быть?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это нормально - vim обратно более-менее совместим с vi, поэтому в реальных системах в его качестве часто стоит не доисторический мамонт, а какой-то из более поздних (не всегда vim - в BSD-системах это, насколько помню, часто бывает elvis или nvi). Но, скорее всего, это урезанная сборка, которая ещё и понимает, что её запустили по имени vi, а не vim, и начинает симулировать некоторые старые вышедшие из моды особенности vi.

    Смотрим:

    shurik@ubuntu ~ $ ls -l `which vi`
    lrwxrwxrwx 1 root root 20 янв 29  2016 /usr/bin/vi -> /etc/alternatives/vi
    shurik@ubuntu ~ $ ls -l /etc/alternatives/vi
    lrwxrwxrwx 1 root root 16 ноя 13  2020 /etc/alternatives/vi -> /usr/bin/vim.nox


    Скорее всего, в твоём случае там будет ссылка на vim.tiny - сильно урезанную сборку vim.
    Ответ написан
    Комментировать
  • Как исправить ошибку в написании Telegram-бота - python (aiogram)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    И не будет реагировать. Ведь в момент выполнения этого кода message.text == '/game1'.

    Ищи примеры по ключевым словам FSM aiogram.
    Ответ написан
    Комментировать
  • Это можно считать микросервисной архитектурой?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это не микросервисы. Это всего лишь динамическая загрузка кода в контекст одного-единственного приложения. Если в подгруженной библиотеке случится какая-то фатальная ошибка (типа разыменовывания нулевого указателя), то вся программа благополучно помрёт. А в микросервисах падение одного микросервиса не мешает другим продолжить работать (и их специально пишут и организовывают так, чтобы подобное падение не приводило к остановке всего сервиса).

    Микросервисы - это не про распилить приложение хоть как-нибудь на несколько файлов. Это про разделение функций, резервирование, масштабирование и отказоустойчивость. А также про непрерывную разработку и раскатку.
    Ответ написан
    4 комментария
  • Можно ли получить телеграм id по номеру телефона?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Да, потенциально клиентский API Телеграма открыт и позволяет сделать поиск по номеру телефона. Но надо понимать, что пользователь может запретить настройками находить себя по номеру телефона. Также надо понимать, что при сколько-нибудь массовом поиске по номеру телефона Телеграм отреагирует и заблокирует.

    Рекомендую отказаться от этой затеи.
    Ответ написан
    2 комментария
  • Составить запрос в API для проверки работоспособности прокси сервера на Python?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    405 возвращает потому что в доке ошибочно http:// вместо https://, который приводит к редиректу на https:// с GET. Это лечится заменой на https.

    Следующая стадия - полечить ответы об ошибках. Они в ответ возвращают json со строкой, в которой json. Поэтому проверяем, если r.json() текст - интерпретируем как json.

    Сами прокси передавать в POST-запросе через перенос строки в параметре proxy_list:

    import requests
    import json
    
    data = '203.13.32.122:80\n203.13.32.122:443'
    r = requests.post('https://proxy-checker.net/api/proxy-checker/', data={"proxy_list": data })
    
    print (r)
    
    resp_json = r.json()
    if isinstance(resp_json, str):
      resp_json = json.loads(r.json())
    print (json.dumps(resp_json, indent=2, ensure_ascii=False))


    Короче, очень кривой API...
    Ответ написан
  • У всех одинаковое кол - во рефералов, что делать?

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

    cur.execute('UPDATE users SET refferals = ?', str(refs))


    Это стандартная ошибка update without where. При таком запросе UPDATE изменяет все строки таблицы на одно и то же значение. Нужно изменять с фильтром WHERE конкретную запись.
    Ответ написан
    Комментировать
  • Как поймать юзер-бота телеграм?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В общем случае это проблематично. Но если совсем-совсем не жалко пользователей, то можно сделать так: удалить половину, запостить какую-нить хрень, посмотреть была ли утечка хрени. Если была - юзербот в этой половине, не была - в другой половине. Дальше возвращаем удалённых пользователей обратно и убираем только половину группы с юзерботом... в общем, бинарным поиском.

    Бедные пользователи...
    Ответ написан
  • Как организовать прогресс бар в дискорд боте?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Короткий ответ: не надо так делать.

    Длинный ответ: можно отправить сообщение и затем его через равные промежутки редактировать. Но это будет не то использование API, которое предполагает Discord. Можно упереться в лимиты API. Можно получить предписание при попытке review бота. Библиотеки типа tqdm обычно предполагают вывод прогрессбара в консоль, где нет никаких ограничений. И они умеют терминальную псевдографику, которая в Discord недоступна, так там нет терминала.

    Правильный Discord-way - это slash-команды с interaction, выполнение команды или нажатие на кнопку приводит к запуску interaction, в процессе которого пользователь видит сообщение с тремя мигающими кружочками, а потом финальное сообщение.
    Ответ написан
  • Какие права выставить на файл sqlite базы?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Лучше не "ставить из пакета". Это лишает смысла проверку целостности пакета по контрольным суммам, усложняет установку обновлений. Поэтому правильнее иметь некую "эталонную" базу, которую копировать в целевое размещение. Как вариант, в пакете держать .sql (.sql.gz) для инициализации базы. Саму инициализацию делать скриптом (как initdb в postgres) или описать в инструкции что куда скопировать/выполнить. К слову, для процесса обновления тоже может потребоваться механизм, так как структура данных может меняться в новых версиях. Процесс первичной инициализации и последующего обновления можно сделать частью post-install скрипта пакета.

    Базу следует класть не в /usr (в классической теории UNIX-систем /usr может вообще монтироваться в read-only, например, по nfs), а в /var, лучше /var/lib/имя_программы. Сделать специальную системную группу без пользователей вполне нормально, так делают. В инструкции следует описать, что пользователей надо в неё добавлять. Соответственно, на файл права 660, на каталог 770.

    Если пользователи будут работать с этой базой параллельно-одновременно, а не строго по очереди, то потребуется ещё механизм блокировок. В этом случае лучше рассмотреть полноценную СУБД или хотя бы вынести работу с базой в отдельный сервис, с которым программа будет взаимодействовать.
    Ответ написан
    7 комментариев
  • Вложенный цикл_при решении, почему ошибка?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    acres это list, а не dict, и поэтому итерация index in acres перебирает не индексы (ключи), а значения.

    Надо перебирать или range(len(acres)), или использовать enumerate(acres).
    Ответ написан
    Комментировать
  • Бот проверки подписки в телеграм работает не корректно, как исправить?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Бот всё делает так, как написано. А написано проверить, что проверяем, что пользователь по очереди creator/administrator/member и если нет - то ругаемся. Соответственно, если пользователь подписан, то два раза ругнётся и один раз поздравит (в соответствии с тем, какой у него статус, это будет 1/2/3 сообщение в цепочке).

    Надо выкинуть цикл for stat in status вообще. Получить статус пользователя один раз и проверить его:

    status = bot.get_chat_member(chat_id = '-1001670595457', user_id = message.from_user.id).status
    if status in ['creator, administrator', 'member']:
        ...
    Ответ написан
    2 комментария