• Работает ли telegram oauth в России?

    neatsoft
    @neatsoft
    Life is too short for bad software
    Telegram login widget в России не работает, но авторизация через Telegram элементарно реализуется с помощью бота. При отправке команды бот вызывает веб-хук, передавая имя пользователя, в ответ отправляется одноразовая ссылка для входа на сайт. Бота нужно запускать на зарубежном хостинге, т.к. с него должен быть доступен api.telegram.org, пользователь может находиться где угодно.

    Вот пример на Django 2.0 (максимально упрощённый):
    1. Через @BotFather нужно создать нового бота, записать полученный token - <bot_token>
    2. Добавить команду /login с помощью /setcommands
    3. В консоли сгенерировать случайный uuid (uuidgen -r) - <webhook_token>
    4. Настроить веб-хук (вместо httpie можно использовать curl, wget, или любую другую подобную утилиту):
      http "https://api.telegram.org/bot<bot_token>/setWebhook?url=https://<domain_name>/bot/<webhook_token>/"

    5. Внести необходимые изменения в проект
    6. Если используется DatabaseCache, инициализировать таблицу в базе данных:
      ./manage.py createcachetable

    .

    settings.py
    ...
    TELEGRAM_BOT_ACCESS_TOKEN = <bot_token>
    TELEGRAM_BOT_WEBHOOK_TOKEN = <webhook_token>
    TELEGRAM_BOT_OTP_TIMEOUT = 120
    
    USE_X_FORWARDED_HOST = True
    
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
            'LOCATION': 'django_cache',
        }
    }
    ...


    urls.py
    ...
    from .views import BotView, LoginView
    
    
    urlpatterns = [
        ...
        path('bot/<uuid:token>/', BotView.as_view()),
        path('login/<uuid:otp>/', LoginView.as_view(), name='login'),
    ]


    views.py
    import json
    import requests
    import uuid
    
    from django.conf import settings
    from django.contrib.auth import login
    from django.contrib.auth.models import User
    from django.core.cache import cache
    from django.http import HttpResponse, HttpResponseNotFound, HttpResponseRedirect
    from django.urls import reverse
    from django.utils.decorators import method_decorator
    from django.views import View
    from django.views.decorators.csrf import csrf_exempt
    from django.views.generic import TemplateView
    
    ...
    
    @method_decorator(csrf_exempt, name='dispatch')
    class BotView(View):
        def post(self, request, token):
            if str(token) != settings.TELEGRAM_BOT_WEBHOOK_TOKEN:
                return HttpResponseNotFound()
    
            params = json.loads(request.body)
            message = params['message']
    
            if message.get('text') == '/login':
                user = message['from']
                chat_id = user['id']
                data = {
                    'username': user['username'],
                    'first_name': user.get('first_name', ''),
                    'last_name': user.get('last_name', ''),
                }
    
                otp = uuid.uuid4()
                cache.set(otp, data, settings.TELEGRAM_BOT_OTP_TIMEOUT)
                path = reverse('login', args=[otp])
                login_url = request.build_absolute_uri(path)
    
                url = 'https://api.telegram.org/bot{}/sendMessage?chat_id={}&text={}'.format(
                    settings.TELEGRAM_BOT_ACCESS_TOKEN,
                    chat_id,
                    login_url,
                )
    
                requests.get(url, timeout=10)
    
            return HttpResponse('')
    
    
    class LoginView(TemplateView):
        template_name = 'login.html'
    
        def dispatch(self, request, otp):
            self.data = cache.get(otp, {})
            return super().dispatch(request, otp)
    
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['data'] = self.data
            return context
    
        def post(self, request, otp):
            cache.delete(otp)
    
            username = self.data.get('username')
            if not username:
                return HttpResponseRedirect(request.path)
    
            user, created = User.objects.update_or_create(
                username=username,
                defaults={
                    'first_name': self.data.get('first_name', ''),
                    'last_name': self.data.get('last_name', ''),
                },
            )
            login(request, user)
    
            path = reverse('home')
            return HttpResponseRedirect(path)


    templates/login.html
    {% extends 'bootstrap4/bootstrap4.html' %}
    
    {% block bootstrap4_content %}
    
    <div class="container">
    
      <div style="padding:5rem; text-align:center;">
        {% if not data %}
          <h1>This url invalid or expired.</h1>
        {% else %}
          <h1>Login as {{ data.username }}</h1>
          <form action="" method="post">
            {% csrf_token %}
            <button type="submit" class="btn btn-primary btn-lg btn-block">
              Login
            </button>
          </form>
        {% endif %}
      </div>
    
    </div>
    
    {% endblock %}
    Ответ написан
    Комментировать
  • Как настроить tile сервер на Debian 12?

    freeExec
    @freeExec
    Участник OpenStreetMap
    1. Не имеет отношение к tile-серверу. Обратитесь к документации leaflet или что там у вас;
    2. Создать несколько стилей отображения и соответственно загружать какой вам надо.
    2.1. Либо если у вас там векторные тайлы, то можно отключить их отображение на клиенте.
    Ответ написан
    Комментировать
  • Как сменить ip с серого на белый с помощью vds?

    @Joyz
    Вашу проблему можно решить несколькими путями в зависимости, что вы хотите получить от домашнего сервера и какие задачи у него будут.
    1. Покупаете VPS и оплачиваете его ежемесячно. На нем устанавливаете VPN и настраиваете роутинги как вам нужно. Далее домашний сервер подключается по VPN в купленному VPS. Оба компьютера будут доступны друг другу как в локальной сети. Возможно, еще на VPS придется поднять и настроить nginx reverse proxy.
    2. Покупаете домен с ежегодной оплатой и делегируете его на Cloudflare. Настраиваете Cloudflare Zero Trust и их Tunnels к вашему серверу и нужным портам. При обращении по доменному имени и его поддоменам будете получать доступ к сервисам, запущенным на вашем сервере. В этом варианте получаете еще дополнительную защиту вашего домашнего сервера.
    У обеих вариантов если свои плюсы и минусы. Ну и естественно, оба варианта можно объединять для решения разных задач.
    Ответ написан
    2 комментария
  • Как сделать "переадресацию" с VDS с белым IP на удаленный компьютер без белого IP?

    @Drno
    Ну например -
    поднимаете сервер opvnvpn на VPS
    подключаете с него своим ПК как клиентом
    делаете DNAT с помощью iptables с VPS на IP клиента в VPN
    Ответ написан
    5 комментариев
  • Aiogram: почему в Telegram не визуализируется voice сообщение?

    EntireMusic
    @EntireMusic Автор вопроса
    (:
    Из документации:
    For this to work, your audio must be in an .OGG file encoded with OPUS

    То есть, чтобы войс визуализировался, нужно отправлять его в формате .OGG, тогда и продолжительность будет отображаться корректно. А чтобы отображалась продолжительность (duration) при отправке других форматов, нужно явно её указать при отправке.

    Важное дополнение для Windows:
    1. Скачайте ffmpeg и распакуйте
    2. Добавьте путь в Path
    3. Функция на Python:
    import subprocess
    import io
    
    def mp3_to_ogg(filename, path=''):
        with open(f'{path}{filename}.mp3', 'rb') as input_file, open(f'{path}{filename}.ogg', 'wb') as output_file:
            mp3_io = io.BytesIO(input_file.read())
            ffmpeg_command = ['ffmpeg', '-i', 'pipe:0', '-c:a', 'libopus', '-f', 'ogg', 'pipe:1']
            result = subprocess.run(ffmpeg_command, input=mp3_io.read(), capture_output=True)
            ogg_bytes = result.stdout
            output_file.write(ogg_bytes)

    *вы можете изменить функцию, например добавив путь к файлам, использовав временные файлы и т.д.
    Ответ написан
    1 комментарий
  • Как сейчас достичь хабраэффект?

    @AlikDex
    только если у вас хостинг за 2$
    Ответ написан
    Комментировать
  • Почему в perl нет двумерных массивов?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Вы немного путаете массив массивов и многомерные массивы.

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

    А просто многомерные массивы в перл естественно есть.
    Двумерные массивы это просто массив, в котором для обращения к элементу нужно указать два индекса - array(x,y).
    Или вот трехмерный массив с тремя индексами array(x,y,z)
    Ответ написан
    Комментировать
  • Как улучшить результаты теста в Google PageSpeed?

    aliprofi
    @aliprofi
    Хочешь стать неудачником? Всегда ищи виноватых!
    Если у вас Wordpress, то реальные результаты дает плагин WP Rocket https://zmoe.ru/links/wprocket - ускоряет реально до 98-100 со всех метрикой и кучей других скриптов.

    624fd21a27793422594032.png
    Ответ написан
    Комментировать
  • Как на линуксе пустить некоторые заблокированные РКН домены через впн?

    Bermut
    @Bermut
    Жертва домашней лаборатории
    Идешь на https://antifilter.download/, скачиваешь листы адресов на маршрутизатор, берешь пакет ipset, пишешь скрипт который будет парсить лист и добавлять адреса в iplist, дальше пишешь что-то подобное
    iptables -t mangle -I PREROUTING -s <route subnet> -m conntrack --ctstate NEW -m set --match-set <list name> dst -j CONNMARK --set-xmark 1
    iptables -t mangle -A PREROUTING -m connmark --mark 1 -j MARK --set-mark 1
    ip ru a table 1 fwmark 1
    ip r a default via <vpn gw> t 1
    ip r a <route subnet> dev <interface> t 1
    Ответ написан
    8 комментариев
  • Как запустить несколько Docker-контейнеров с MySQL на одном порту и на одном хосте?

    martin74ua
    @martin74ua
    Linux administrator
    В http протоколе есть заголовок, позволяющий определить, к какому сайту делается запрос.
    в mysql протоколе нет такого признака.
    так что вешайте мускул серверы на разные порты.
    Ответ написан
    6 комментариев
  • Какая файловая система наиболее устойчива к сбоям?

    Alex_Geer
    @Alex_Geer
    System Engineer
    Нужно смотреть на файловые системы с журналированием. Например XFS или ext4
    Что это такое: https://www.interface.ru/home.asp?artId=18352
    Как включить журналирование например на ext4 гуглится легко.
    Ответ написан
    4 комментария
  • Как проще всего настроить, чтобы локальные машины были доступны в зоне .local?

    Stealch
    @Stealch
    Админ, мотобродяга.
    1. Убить Avahi на никсовом серве! sudo service avahi-daemon stop
    2. Поднять локальный DNS, создать зону .local, прописать необходимые устройства. Прописать доменный суффикс для всех новых устройств в сети (чтобы каждое устройство получало динамически доменное имя вида {имя устройства}.local).
    3. Прописать локальный DNS в маршрутизатор для выдачи оного клиентам, НО НЕ СЕРВЕРУ. Сервер должен использовать статические IP и DNS от провайдера или гугловские (да хоть adguard-овские, на выбор админа)
    Ответ написан
    2 комментария
  • Как подключить домен к серверу за NAT?

    @Drno
    Можно. Nginx reverse proxy
    На VPS можешь поднять любой ВПН сервер, цепляться к нему из дома, и уже в nginx указывать IP адрес домашней машины в ВПН сети
    Ответ написан
    Комментировать
  • Как настроить OpenVPN сервер на Ubuntu, чтобы клиенты видели друг друга?

    @darkfire13
    Здесь и сейчас dieg.info
    Чтобы клиенты видели другу друга отвечает параметр client-to-client в конфиге сервера.
    Ответ написан
    Комментировать
  • Как настроить OpenVPN сервер на Ubuntu, чтобы клиенты видели друг друга?

    Daemon23RUS
    @Daemon23RUS
    Без Ваших конфигов, что то советовать - с таким же успехом можно и у гадалки спросить.
    Так что без потыкатся не выйдет, что у Вас с опцией client-to-client на OpenVPN сервере ?
    Ответ написан
  • Bash - Как сравнивать время?

    qork
    @qork
    { background: #F00B42 }
    Текущее время date +%s
    Время редактирования stat -c %Z file.log

    Вычитаешь текущее из изменения, результат сравниваешь с желаемым числом секунд.
    Если(результат > желаемого){ шли оповещение }
    Ответ написан
    Комментировать
  • Как настроить виртуальную машину в qemu/kvm?

    @mnhunter81
    инженер-электроник, системный администратор
    проверить установлен ли пакет bridge-utils
    Ответ написан
    Комментировать
  • Как сделать телепортацию белого ip-адрес на другой сервер при помощи ipip-туннеля?

    DoMoVoY
    @DoMoVoY
    с помощью proxy arp ты создаешь проблему другим хостам в сегменте. так не нужно делать только если ты не провайдер или администратор сети.
    задача решается через DNAT всего трафика или нужных портов. тип туннеля не играет роли. ipip/gre/ipsec/wg/tap/tun и т.д.
    Ответ написан
  • Как настроить мониторинг Linux сервака на Zabbix?

    @kisaa
    Есть мнение, что в конфиге агента надо указать не локальный адрес сервера в вашей домашней локалке, а ваш публичный домашний IP:
    https://www.reddit.com/r/zabbix/comments/zjepon/za...
    Если он может меняться - подумайте о туннеле до своей VPSки. Вообще, подумайте об этом в любом случае, потому что защищённое лучше незащищённого (особенно если вы не используете шифрование).
    Ответ написан
    1 комментарий