• Как понять откуда поступила команда в телеграм-боте?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Передавать нужную информацию в callback_data. Например, можно передавать add:артикул, который в обработчике парсить и по нему определять, что же именно добавить.
    Ответ написан
    2 комментария
  • Как запретить программе доступ в интернет?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    1. Фильтровать по владельцу: iptables -m owner -h

    2. Использовать cgroups и фильтровать по ним: iptables -m cgroup -h

    3. Использовать отдельный network namespace без доступа в интернет: ip help netns

    4. Использовать docker с none-сетью: docker run -it --net=none my_awesome_image_for_application
    Ответ написан
    1 комментарий
  • AIOGRAM - как отправить альбом с контентом из переменных?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Когда имеешь дело с функцией, которая хочет объект file, можно использовать io.StringIO ил io.BytesIO.

    Например:

    media.attach_photo(io.BytesIO(requests.get('http://foo/bar.jpg').content), 'Foo Bar')
    Ответ написан
    Комментировать
  • Как исправить эту ошибку? IndentationError: unindent does not match any outer indentation level?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Отступы в 3 и 4 строках разные, должны быть одинаковы. Почитай любой учебник по python для начинающих, там популярно объясняют, почему отступы в python так важны.
    Ответ написан
    Комментировать
  • Что написать в except ,чтоб программа не вылетала при неправильном вводе?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Программа в случае ошибки не просто упадёт, а выкинет исключение. Его надо будет поймать и обработать.

    Например:

    try:
      int("1")
      int("-1")
      int("+1")
      int("hello")
    except ValueError as e:
      print (f"ValueError occured: {e}")


    Тут случится ValueError в последнем приведении к int, использование try ... except позволит его поймать, обработать и продолжить дальнейшую работу программы.
    Ответ написан
    Комментировать
  • Можно ли выйти сразу из всех функций?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Подобный вопрос: Прерывание рекурсии python 3?

    Однако это плохой способ, говорящий о плохой архитектуре программы. Исключения лучше использовать для ловли исключительных ситуаций, а подобные задачи решать иначе. Например, возвращать из функций результат или хотя бы признак успешного выполнения, который проверять на всех уровнях и передавать выше. А лучше подумать над тем, чтобы программа была по-другому устроена, в зависимости от задачи.
    Ответ написан
    2 комментария
  • Сallback_data. Python. Ошибка TypeError: send_message() got an unexpected keyword argument 'callback_data'?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    callback_data - свойство inline-кнопки, а не сообщения. Поэтому работать это и не может.

    keyboard = types.InlineKeyboardMarkup()
    keyboard.add(types.InlineKeyboardButton(text="Кнопка 1", callback_data="button1"))
    keyboard.add(types.InlineKeyboardButton(text="Кнопка 2", callback_data="button2"))
    bot.send_message(message.chat.id, "Нажми на кнопку - получишь результат", reply_markup=keyboard)
    
    @bot.callback_query_handler(func=lambda call: True)
    def button_callback(call):
      bot.send_message(call.message.chat.id, f"Ваша кнопка {call.data}")
    Ответ написан
    Комментировать
  • Почему не получается отправить сообщение пользователю?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В ошибке же всё написано - text должен быть строкой. Скорее всего, courses[course] - не строка.
    Ответ написан
    Комментировать
  • Как переслать сообщение от бота другому пользователю aiogram?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    call.message - это сообщение, с которого пришёл callback, разумеется, оно и есть "предыдущее". Нужно отправить новое сообщение с помощью send_message, этот метод вернёт это отправленное сообщение, дальше именно его и надо пересылать.
    Ответ написан
    Комментировать
  • Просмотр забытого пароля в Winscp?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Предлагаю попробовать echo "%*"
    Ответ написан
  • Не видно InlineKeyboardMarkup. Что я сделал не правильно?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если сначала отправлять сообщение, а только потом цеплять к нему клавиатуру, то клавиатура не будет отправлена.

    Вот тут:

    // внутри мы вызваем execute, который отправляет сообщение
    SendMessage sms = sendMsg(update.getMessage(), per);
    // к уже отправленному объекту сообщения мы цепляем клавиатуру
    sms.setReplyMarkup(getinlineKeyboardMarkup());
    // дальше с переменной sms мы ничего не делаем
    Ответ написан
    Комментировать
  • Как обработать исключение в потоке?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Как-нибудь так:

    web_urls = [...]
    attempts = 5
    for url in web_urls:
      for attempt in range(0,attempts):
        r = None
        try:
           r = requests.get(url)
        except requests.exceptions.ConnectionError, requests.exceptions.ReadTimeout:
           if attempt < attempts-1:
             sleep(5)
           else:
             print (f"Oops request failed and no more attempts for {url}")
        if r:
          break


    Не надо ловить except без конкретизации ошибки и даже без вывода её. В крайнем случае надо её словить и показать, чтобы хоть было известно, что она происходила:

    try:
      ...
    except Exception as e:
      print (e) # а ещё лучше использовать модуль traceback
    Ответ написан
    Комментировать
  • Что хранится на файле gshadow и зачем редактировать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    man gshadow всё объясняет.
    Ответ написан
  • Как правильно изменить?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    trending.text - это текст. Думаю, имелось в виду trending.json()
    Ответ написан
  • Как взять данные с двух таблиц?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Условие id=id2=ctx.author.id в зависимости от используемой базы может иметь как непредсказуемый эффект, так и вообще возвращать ошибку, потому что id=id2 возвращает булевое значение (true или false), которое затем сравнивается с ctx.author.id, что явно не планировалось. Вместо этого надо сделать два условия: id=id2 AND id=ctx.author.id. А ещё лучше переместить id=id2 в условие JOIN (таблица1 JOIN таблица2 ON условие)

    Далее, при работе с базой лучше использовать строки с плейсхолдерами, к этому следует приучать себя заранее, чтобы избегать рисков SQL-инъекций:

    cursor.execute("SELECT * FROM cars WHERE user_id=?", (current_user_id,))


    (В зависимости от базы данных плейсхолдер может быть не ?, как в sqlite3, а %s или что-то ещё)

    Далее, следует разумно выбирать имена полей в таблицах, чтобы их назначение было более понятным, а то что это за id и id2? Например:

    users:
    - id: id пользователя
    - name: имя пользователя
    - birth_date: дата рождения

    cars:
    - id: id автомобиля
    - owner_id: id пользователя-владельца (из таблицы users)
    - reg_number: гос. регистрационный номер
    - model: модель автомобиля

    Например, при такой структуре данных можно получить список автомобилей пользователя таким запросом

    cursor.execute("SELECT users.id AS user_id, users.name, cars.id AS car_id, cars.model FROM users JOIN cars ON users.id=cars.owner_id WHERE users.id=?", (ctx.author.id,))


    Запись (ctx.author.id,) с запятой в скобках нужна для того, чтобы вместо одного значения в функцию был передан tuple из одного значения. В python (1,2,3) означет tuple из трёх значений, но с одним значением такой синтаксис не прокатывает, (1) даёт то же, что и просто 1 без скобок, чтобы это обойти, надо поставить запятую (1,)
    Ответ написан
    Комментировать
  • Django & PostgreSQL MemoryError + не правильная работа скрипта?

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

    Как минимум следует начать хотя бы с такого:

    try:
      ...
    except Exception as e:
      print (e)


    Сейчас же, возможно, случается Exception, но мы этого даже не знаем.

    Далее, не стоит использовать ORM вперемешку с обычными запросами. Это тоже источник потенциальных проблем, ведь ORM может кэшировать данные, в том числе ещё не сохранённые. Возможно, до вызова save случился Exception, данные в кэше отличаются от данных в базе, но при прямом запросе в базу мы получим не то же самое, что получили бы из кэша.

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    TARGET_DIR = "path/to/directory"
    
    for i in range(0, dlinaspiska):
      filename = os.path.join(TARGET_DIR, akki[i]+".json")
      with open(filename, "w") as outfile:
        json.dump(...)
    Ответ написан
    Комментировать
  • Как в python telebot добавить кнопку?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это inline-клавиатура (привязанная к конкретному сообщению), чтобы получить обычную (не привязанную к конкретному сообщению), надо использовать ReplyKeyboardMarkup вместо InlineKeyboardMarkup.
    Ответ написан
    Комментировать
  • Бот Телеграмм на php. Проблема с удалением сообщений. Как правильно?

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Цена на A2P (application-to-person) SMS-сообщения в России сейчас порядка 2 рублей за 1 сегмент (67 символов Unicode UCS2) в зависимости от оператора. Поэтому бесплатных SMS-уведомлений сейчас не бывает.

    Рекомендую поставить почтовый клиент на телефон, который будет через PUSH-уведомления информировать о новых письмах бесплатно.
    Ответ написан
    Комментировать