• Как сделать вывод сообщения в определённую секунду?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    import time
    
    # Время берется 1 раз в момент запуска скрипта, чему оно будет равно?
    now = datetime.now() 
    current_time = now.strftime("%H:%M:%S")
    
    # Цикл запущен и проверяет время, которое было взято 1 раз выше, что получится? Получится то, что цикл будет искать время, которое уже истекло.
    while True:
        time.sleep(1)
        if current_time == '16:49:00':
            print('text')
    
    # Так, щас 16:49:00?
    # Ок, ждем 1 сек...
    # Так, щас 16:49:01?
    # Ок, ждем 1 сек...
    # Так, щас 16:49:02?
    # У нас время идет вперед или назад..? Если все таки вперед, то сможет ли оно достигнуть current_time, которое уже меньше, чем ожидаемое время..?

    print() в помощь, чтобы понимать, что происходит в коде, если до полноценной отладки пока далеко:
    import time
    from datetime import datetime
    
    while True:
        now = datetime.now()
        current_time = now.strftime("%H:%M:%S")
    
        if current_time == '17:15:00':
            print('text')
            time.sleep(1)
        else:
            print(f'Нихуа ({current_time})!')
            time.sleep(1)
    
    # Нихуа (17:14:56)!
    # Нихуа (17:14:57)!
    # Нихуа (17:14:58)!
    # Нихуа (17:14:59)!
    # text
    # Нихуа (17:15:01)! <--- Вот здесь оказывается Ваш первоначальный скрипт
    # Нихуа (17:15:02)!
    # Нихуа (17:15:03)! <--- Мы ждем какое время, 16:49:00?

    P.S. Ваш код все таки сработает, когда пройдут сутки, но я не думаю, что так было задумано ;)
    Ответ написан
    2 комментария
  • Как хранить списки в бд?

    Maksim_64
    @Maksim_64
    Data Analyst
    Если использовать реляционные базы данных то делить на таблицы и описывать связи, предварительно избавившись от списков, на уровне пандаса, переформатировав (распрямив) датафрейм, метод explode например поможет избавится от списков. В целом одна и та же информация, может быть представлена в разном виде и в реляционных бд предпочтительнее (но не обязательно) иметь простые типы данных.

    Использовать не реляционные базы данных, они больше подходят если данные имеют вложенную структуру и простым переформатированием не обойтись.

    Если тебя все устраивает и тебе удобно работать с фреймом, но хочется иметь такое представление информации только не в памяти, а на диске. Можешь использовать например сериализацию, метод для фреймаto_pickle, и соответственно read_pickle для чтения.

    По итогу, когда ты собираешься хранить данные, ты их в дальнейшем будешь извлекать и анализировать. Работать с колонкам содержащими вложенные списки, можно, но не так эффективно, как с правильно организованными данными, будь уверен, что ты хранишь в колонках вложенные списки от отсутствия альтернатив.
    Ответ написан
    Комментировать
  • Что изучать python backend разработчику?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Что изучать python backend разработчику?

    Вы не совсем верно ставите задачу, не "что изучать", а "какие инструменты выбрать для этой задачи". Если под "python backend разработчику" понимается классическая backend разработка, по типу сервера, для каких либо приложений, то:
    1. Как сделать, чтобы по указанному url отдавалась html страница с таким то данными? Django Writing views. В процессе работы Вы начнете понимать, для чего нужны какие то вьюхи и модели.
    2. Оказалось, что в п1. неудобно вставлять всю страницу, что делать, если мне нужно сделать более сложную html страницу? Используем один из самых популярных шаблонизаторов Jinja for Server-Side Rendering in Django.
    3. Как и где хранить данные? Пробуем SQLite. В процессе работы Вы начнете понимать, для чего нужны какие то ORM.
    4. Выяснилось, что п3 не подходит для моего проекта (почему конкретно?), где еще хранить данные? Пробуем PostgreSQL.
    5. Как сделать простое API на Django? Используем Django REST framework (DRF) или Django Ninja.
    6. Как создать возможность аутентификации пользователей и показ им именно их личной информации? How to use sessions, JWT.
    7. Как быть, если мне приходит запрос с фронта и мне нужно быстро вернуть ответ, а не ждать, пока бэк все обработает? Django Background Tasks.
    8. Задач стало очень много, Django не тянет, надо выполнять все в фоне, п6. уже не подходит (почему конкретно?), что делать? Django Celery.
    9. Как развернуть мой мега сайт на хостинге? Shared хостинг (если VDS много, это жестко конечно, но хозяин - барин). Для VDS идем гуглить, в каком порядке и что надо ставить.
    10. Как сделать автоматическое развертывание несколько проектов на удаленном сервере и нужно ли оно мне (описываем, что, где и в каком порядке нужно развернуть)? Docker + CI/CD.

    В процессе может и админка для бэка понадобиться и много чего еще по мелочи. Опять же - вначале задача, затем поиск инструмента.

    Так же можно гуглить по типу Django Roadmap 2024.
    Ответ написан
    2 комментария
  • Как запустить файл отдельно от главного скрипта?

    @Zuio4ok Автор вопроса
    Нашел решение, работает любой дефолтный способ запуска(os, subprocess и тд), главное добавить "start"

    Пример:
    os.system("start notepad.exe")
    66be34eaf2777549240471.png
    Ответ написан
    Комментировать
  • Как сделать аутентификацию на сайте через телеграм?

    CoDeR2006
    @CoDeR2006 Автор вопроса
    TS
    И так, для меня в будущем, и для тех кто это нагуглил:

    Дело в том что без виджета на начало 2024 сделать авторизацию практический не возможно, вот реально правильное решение если у вас похожий стэк, и вы планируете делегировать саму регистрацию на сервер, а не делать все через front.

    Интегрируем виджет в приложение react + ts:
    (это если вам надо что бы был не редирект, а вызов функции со стороны telegram)
    import { useEffect } from 'react'
    import { ITelegramUser } from '../../../../types/telegram/api-telegram-user.ts'
    
    declare global {
      interface Window {
        onTelegramAuth: (user: ITelegramUser) => void
      }
    }
    
    export const ButtonTelegramAuth = () => {
      useEffect(() => {
        const button = document.createElement('script')
        button.async = true
        button.src = 'https://telegram.org/js/telegram-widget.js?22'
        button.setAttribute('data-telegram-login', 'name_bot')
        button.setAttribute('data-size', 'large')
        button.setAttribute('data-radius', '20')
        button.setAttribute('data-onauth', 'onTelegramAuth')
    
        document.body.appendChild(button)
    
        window.onTelegramAuth = function (user) {
          alert(
            'Logged in as ' +
              user.first_name +
              ' ' +
              user.last_name +
              ' (' +
              user.id +
              (user.username ? ', @' + user.username : '') +
              ')'
          )
        }
    
        return () => {
          document.body.removeChild(button)
        }
      }, [])
    
      return <div id="telegram-widget-container"></div>
    }


    если нужен все таки редирект мы добавляем такое поле:
    script.setAttribute('data-auth-url', 'https://site.pw');

    и удаляем это:
    button.setAttribute('data-onauth', 'onTelegramAuth')
    
    declare global {
      interface Window {
        onTelegramAuth: (user: ITelegramUser) => void
      }
    }
    
     window.onTelegramAuth = function (user) {
          alert(
            'Logged in as ' +
              user.first_name +
              ' ' +
              user.last_name +
              ' (' +
              user.id +
              (user.username ? ', @' + user.username : '') +
              ')'
          )
        }


    И так объясняю в чем задумка:
    В ваше приложение react интегрируется все тот же виджет, но правильным образом. После нажатия на виджет происходит авторизация пользователя (он вводит свои данные / просто нажимает войти). Потом телеграм передает все его данные вам (в функцию - №1 способ / по get параметрам в url). Если вы делегируете
    регистрацию на сервер (а так правильно) то выбираете 2 способ. Сервер получает данные валидирует их и заносит в БД, затем делает редирект вашего пользователя к вам обратно на front, и заносит token (или что там еще не разобрался) в HttpOnly Ckookie. Ну а далее в моем случае Guard будет проверять есть этот token или нет, годен он или нет.

    Передаю привет Максиму в будущем. Как дела Макс ?
    Ответ написан
    9 комментариев
  • Как передать переменную из одной функции в другую?

    iggor-markin
    @iggor-markin
    Python Developer
    Чтобы задать пользователю несколько вопросов тебе нужно воспользоваться машиной состояний. Обычно реализация есть в любой популярной библиотеке. Вот пример на aiogram: https://github.com/aiogram/aiogram/blob/dev-2.x/ex...
    Ответ написан
    Комментировать
  • Как сделать сервер на Линукс для телеграм бота?

    krax1337
    @krax1337
    личинка Девопса
    Один из вариантов это Docker

    Попробуй докеризировать своих ботов, и далее уже запускать их в отдельные Docker контейнеры. Так ты сможешь их изолировать, а еще они сами будут подниматься при ловле исключений и запуске компьютера (--restart always). Еще с помощью Docker легко будет пробросить API ключи в переменное окружение.
    Ответ написан
    Комментировать
  • Змея не хочет вытаскивать словарь из файла *.txt, как ей помочь?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    теоретически может вытащить словарь

    А практически он читает строку.

    Либо через json
    import json
    
    with open('db.txt', 'r', encoding='utf-8') as db:
        db_dict = json.load(db)


    Либо через literal_eval, хотя json, конечно, лучше
    Ответ написан
    2 комментария
  • Как достать текст из текста?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    Я знаю что можно взять используя регулярные выражения, но я новенькой в пайтоне, и совсем не понял как сделать

    Регуляркой не обязательно:
    data = '' #  в  data - вся приведенная простыня
    for line in data.split('\n'):
        if line.startswith(('Пользователь', '=== Всего пользователей:', '=== Общий трафик')):
            print(line)

    === Всего пользователей:  8 
    Пользователь:  Admin_16/03 Порт: 1317 Трафик: 75.06 GB
    Пользователь:  Rahym_16/03 Порт: 6993 Трафик: 214.78 GB
    Пользователь:  Mama_16/03 Порт: 6951 Трафик: 28.14 GB
    Пользователь:  Klass_17/03 Порт: 7124 Трафик: 69.52 GB
    Пользователь:  Rahym2_01/04 Порт: 8543 Трафик: 73.77 MB
    Пользователь:  Toyjan_01/04 Порт: 7814 Трафик: 8.75 GB
    Пользователь:  David_03/04 Порт: 5870 Трафик: 6.05 GB
    Пользователь:  Test_07/04 Порт: 4282 Трафик: 0 B
    === Общий трафик всех пользователей:  402.36 GB
    Ответ написан
    Комментировать
  • Как отправлять самому себе сообщения через бота телеграм?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ошибку, вообще-то надо показывать, кто ж будет решать то не знаю что?

    Но давай я повангую.

    Во-первых, Bot - это класс. Нужно создать его экземпляр:

    from aiogram import Bot
    bot = Bot(token=config.bot_token)


    Во-вторых, при этом всё равно будет ошибка coroutine was never awaited. Потому что асинхронные функции нельзя просто так вызывать из синхронного кода.

    Вызвать можно так:

    async def main():
      await bot.send_message(my_chat_id, my_message)
      await bot.close()
    
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    Ответ написан
    Комментировать
  • Как преобразовать строку в имя переменной?

    @mkone112
    Начинающий питонист.
    Да что вы все пристали? Ненужно, ненужно... Интересно же!
    globals().update({f'a{i}':i for i in range(10)})
    Ответ написан
    Комментировать
  • В чём отличие @Decorator от @Decorator()?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Декоратор - это функция, которой на вход подаётся функция и вернуть он должен тоже функцию. Например:
    @decorator 
    def foo():
     ..

    Эквивалентно foo = decorator(foo)

    Теперь про случай из вопроса. В качестве декоратора вместо обычной функции вы используете класс (точнее его объект):
    @FuncDec()
    def foo():
        print('Hello')

    Эквивалентно foo = FuncDec()(foo), а именно:
    • создаётся объект FuncDec (вызывается конструктор __init__)
    • этот объект вызывается (__call__) вместе с параметром foo
    • объект вернул функцию wrapper, которая и будет в дальнейшем выполняться вместо объявленной foo
    • профит

    Но если убрать скобки, то получится эквивалент foo = FuncDec(foo)
    То есть просто вызов конструктора, который у вас не принимает параметров - поэтому и ругается.
    Ответ написан
    Комментировать
  • Нужно сделать программу покороче. Как?

    0xD34F
    @0xD34F
    нужно в 24 строки уложиться

    Замените тело функции invert на

    return ''.join('0' if n == '1' else '1' for n in d)

    Получится ровно 24.

    Тело второй функции тоже сократим до одной строки:

    return '1' if n == 1 else ((s := dracon(n - 1)) + '1' + invert(s)[::-1])

    Сами функции теперь ничего не мешает переписать в виде лямбд.

    Наконец, заметим, что две строки перед циклом, который перебирает dr, идентичны одной из веток условного оператора внутри цикла - так что удалим их, а цикл пусть сделает ещё одну итерацию, для этого в начале dr должно оказаться что-то, отличное от '1'.

    Достаточно коротко получилось?
    invert = lambda d: ''.join('0' if n == '1' else '1' for n in d)
    dracon = lambda n: '1' if n == 1 else ((s := dracon(n - 1)) + '1' + invert(s)[::-1])
    
    dr = '0' + dracon(int(input()))
    print(dr)
    
    import turtle as t
    tt = t.Turtle()
    
    for n in dr:
      if n == '1':
        tt.right(90)
        tt.forward(4)
      else:
        tt.left(90)
        tt.forward(4)
    
    input()

    Тут конечно надо отметить, что на данный момент далеко не везде используется python версии 3.8+, так что приведённый код может у вас и не взлететь, по причине наличия в нём assignment expression (оператор :=).
    Ответ написан
    3 комментария
  • Как Спарсить полученный ответ Json python?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    import json
    
    s = '''{
    "response": {
    "text": "Статус юзера"
    }
    }'''
    
    j = json.loads(s)
    
    print(j['response']['text'])
    Ответ написан
    5 комментариев
  • AWS vs GoogleCloud vs DigitalOcean – как выбрать облако?

    inoise
    @inoise Куратор тега Amazon Web Services
    Solution Architect, AWS Certified, Serverless
    Итак, для начала DigitalOcean - НЕ ОБЛАКО. Это просто набор связанных сервисов. Зайти в DigitalOcean очень просто, выйти тоже, все понятно и прозрачно но там даже горизонтального масштабирования нет. Это слегка прокачанные те же VPS-ки.

    Теперь по всему остальному. Есть золотая троица AWS/Azure/GCP, но тут начинают играть другие правила.
    1. Стоит обратить внимание на то что им действительно надо учиться и это занимает время. Чтобы сделать решение, а не поделку и не влететь на деньги месяца не хватит ибо там очень много всего.
    2. Я могу сказать что переезд из одного облака в другой возможен при двух условиях: вы пользуетесь только базовыми сервисам (вроде виртуалок, БД, S3) и у вас есть 2 архитектора с сильным пониманием этих облаков
    3. Два архитектора по тому что я не знаю ни одного такого человека кто потратил достаточно сил и вник сразу в несколько облаков достаточно глубоко. Я был там везде и в результате все-равно остановился на AWS, хотя Azure и GCP имеют свои преимущества
    4. Про сервисы - ехать в облако и не пользоваться особыми сервисами и фичами этого облака - дорого и глупо
    5. А самое интересное что сделать и мигрировать проект проще чем обучить людей и изменить подходы к прайсингу
    6. Миграция в облако и из облака - не делается по щелчку пальцев, особенно если есть много данных


    По AWS могу поделиться гайдами как туда ехать, да и у них Cloud Migration очень понятный раздел с документацией. Если сравнивать эти облака то:
    • AWS - serverless, cutting-edge solutions, прозрачная инфраструктура
    • Azure - экосистема от MS, прекрасный CosmosDB (но это скорее про цены)
    • GCP - глобальные ресурсы, BigData

    При этом большинство этих фич в том или ином виде есть в других облаках.

    И маленькая ремарочка по k8s. Если вы едете не в GCP то он вам не нужен. AWS и Azure сделали так что вы можете его туда удобно загнать, но это будет дороже. Тот же AWS ECS + Fargate куда удобнее и я не знаю тех System Engeneer что по собственному желанию пересаживались с этого на k8s
    Ответ написан
    8 комментариев
  • Как сохранять данные в питон?

    pickle - текст
    json - ключ : значение
    структура(имя, возраст, почта, etc) - бд: sqlite3, которую нет необходимости устанавливать отдельно, mysql, postgresql, etc
    Ответ написан
    Комментировать
  • Как защитить код?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Но как защитить сам код?
    - как вариант, переписать бота на C/C++.
    Упаковываем ботов правильно: файлы .ini и .pyz

    Я даже боюсь представить, что там за секретный код, судя по вашим предыдущим вопросам)):
    Как в telebot отправлять сообщение определенному пользователю?

    Как спарсить json ответ?

    Как добавить объект в список json?

    Как сделать кнопку с ссылкой в telebot python?
    Ответ написан
    Комментировать
  • Почему перестала работать смена ttl на макбуке для мтс?

    EHOTnOTACKYH
    @EHOTnOTACKYH
    Подтверждаю, проблема в ipv6. Если кто-то знает, как поменять там значение hop limit, подскажите. Задаю в sysctl.conf значение net.inet6.ip6.hlim=65, при проверке значения в терминале выдается 65, но при пинге локалхоста оно внезапно меняется на 64.

    По вопросу, что делать с МТС. Очевидно, нужно отключить ipv6 на МакБуке. Если раздаете интернет через Wi-Fi, то в настройках системы на МакБуке выбираете "Сеть" >"Wi-Fi" > "дополнительно" > вкладка TCP/IP, в "Конфигурация IPv6" выбираете "Выключить". Если пункта "выключить" нет (у меня не было), то вбиваете в терминале следующую строчку:

    networksetup -setv6off Wi-Fi

    После этого IPv6 будет вырублен и МТС перестанет видеть, что вы раздаете интернет на МакБук. Если раздаете через кабель или блютус, то отключать ipv6 нужно для того способа, которым вы раздаете интернет.
    Ответ написан
    6 комментариев