• Как сделать аутентификацию на сайте через телеграм?

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

    Дело в том что без виджета на начало 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 или нет, годен он или нет.

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

    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 комментариев
  • Почему после проброса 80 и 443 порта nginx не видит переменной server_name?

    @Reversaidx
    Проще сделать по другому, направить весь трафик на Nginx(одного из серверов), дальше по имени домена пропроквировать на другой Nginx
    server {
    listen 80 443;
    server_name proxy_domain;
    location / {
    access_log off;
    proxy_pass IP
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\
    }
    }
    И соотвественно другой конфиг для другого домена, т.к при текущем перенаправлении не понятно что именно доходит до сервера, а моём случае все запустится зп 5 минут(можно не использовать третью виртуалку, а проксировать с рабочего сервера на новый сервер конкретно для домена)
    Ответ написан
    1 комментарий
  • Как проверить попадание координат?

    @Serjio-Grig Автор вопроса
    Тот самый никто (=
    Проблема решена.
    (Bx - Ax) * (Py - Ay) - (By - Ay) * (Px - Ax)

    - наша точка, Px - latitude, Py - longitude
    A - один из углов, xy соответственно
    B - противоположный A угол.

    Отрицательное значение: попадает
    Положительное: не попадает
    Ответ написан
    Комментировать
  • Как провайдеры интернета ограничиваю скорость доступа?

    vvpoloskin
    @vvpoloskin Куратор тега Компьютерные сети
    Инженер связи
    Сеть оператора ШПД в общем случае довольно простая, по крайней мере по сравнению с мобильными, спутниковыми и магистральными сетями, она состоит из множества коммутаторов, одного маршрутизатора и биллинга. Фактически это большая сеть доступа. Маршрутизатор здесь называется BRAS (ну или dslam если мы о adsl). Так вот конкретно для pppoe на клиентской стороне создается так называемый туннельный интерфейс, и на стороне BRAS аналогичный при успешном подключении абонента. На BRAS на этом туннельном интерфейсе и вешается ограничение. Сами данные по ограничению услуги BRAS берет из биллинга при создании подключения (взаимодействует с ним по RADIUS/TACACS или даже DIAMETER).

    Ни один нормальный оператор по умолчанию не будет использовать шейпинг, без каких-либо доп договоренностей везде стоит полисинг. Скажу больше - правило зорошего тона ставить с клиентской стороны в сторону оператора шейпинг, а с операторской в сторону клиента - полисер.

    И да, PPPoE уже давно несовременная технология авторизации, сейчас все стараются переходить (и успешно переходят) на IPoE. Но это уже совсем другая история.
    Ответ написан
    Комментировать
  • Как написать REST/RESTful приложение для связки в дальнейшем с Angular 5?

    zo0m
    @zo0m
    full stack developer
    Самый лучший способ - воспользоваться Сваггером. Описать свой API в редакторе ( https://editor.swagger.io ), а потом сгенерировать готовый код nodejs "Generate Server"->"nodejs-server"

    На выходе получите работающее API, только данные будут тестовые. Открываете сгенерированный код, и цепляете свою логику. Рекомендую саму логику вынести в отдельный файл, и из сгенерированного просто прокинуть вызовы. Тогда, когда вам понадобится изменить/дополнить API вы меняете конфигураци в редакторе сваггера и генерите заново стабу для сервера.
    Ответ написан
    Комментировать