• Как оживить docker на windows 10?

    RyanovskY
    @RyanovskY
    зайди в биос и включи виртуализацию, тогда запуститься
    Ответ написан
    Комментировать
  • Возможно ли посмотреть телеграм группы без регистрации? (без официального сервиса типа t.me)?

    RyanovskY
    @RyanovskY
    нет, чтобы просматривать группы нужно быть авторизованным
    Ответ написан
    Комментировать
  • Как развернуть приложение на Django на сервере в локальной сети без доступа в интернет?

    RyanovskY
    @RyanovskY
    запустите сервер в режиме разработки с отключенным флагом 'debag'.

    он подефолту работает в localhost
    Ответ написан
  • Какой подход использовать для редактирования и удаления сообщений по websocket?

    RyanovskY
    @RyanovskY
    в базе данных на сервере у каждого сообщения есть айди.
    клиент тоже должен видеть айди этих сообщений.
    когда они добавляются в контейнер на странице, то получаем данные сообщения из контейнера по айди контейнера и отправляем на сервер сообщение POST с параметром 'dell' например и id сообщения(тут уж для удаления или редактирования вебсокет никчему)
    если редактировать то запрос POST с параметром 'change', id сообщения и самим текстом сообщения.
    Ответ написан
    Комментировать
  • Как сделать, чтобы тг бот работал бесконечно на pythonanywhere?

    RyanovskY
    @RyanovskY
    если телебот то запуск бота делай так:
    asyncio.run(bot.polling(none_stop=True))

    import telebot
    from telebot import types
    import sqlite3
    import csv
    from telebot.types import InlineKeyboardButton, InlineKeyboardMarkup, CallbackQuery
    import colorama
    import random
    from colorama import Fore, init, Style
    from telebot import apihelper
    import asyncio
    import threading
    import time
    import sys
    
    init(autoreset=True)
    colorama.init()
    
    # цвета
    re = "\033[1;31m"  # красный
    gr = "\033[1;32m"  # зелёный
    cy = "\033[1;36m"  # циановый
    pnk = "\033[1;35m"  # розовый
    blu = "\033[1;34m"  # Синий
    ylw = "\033[1;33m"  # Жёлтый
    pur = "\033[1;35m"  # Фиолетовый
    
    # рандомный цвет
    colors = ["\033[1;31m", "\033[1;32m", "\033[1;33m", "\033[1;34m", "\033[1;35m", "\033[1;36m"]
    random_color = random.choice(colors)
    
    
    def banner():
        print(random_color + '''
            ██████╗ ██╗   ██╗ █████╗ ███╗   ██╗ ██████╗ ██╗   ██╗███████╗██╗  ██╗██╗   ██╗
            ██╔══██╗╚██╗ ██╔╝██╔══██╗████╗  ██║██╔═══██╗██║   ██║██╔════╝██║ ██╔╝╚██╗ ██╔╝
            ██████╔╝ ╚████╔╝ ███████║██╔██╗ ██║██║   ██║██║   ██║███████╗█████╔╝  ╚████╔╝ 
            ██╔══██╗  ╚██╔╝  ██╔══██║██║╚██╗██║██║   ██║╚██╗ ██╔╝╚════██║██╔═██╗   ╚██╔╝  
            ██║  ██║   ██║   ██║  ██║██║ ╚████║╚██████╔╝ ╚████╔╝ ███████║██║  ██╗   ██║   
            ╚═╝  ╚═╝   ╚═╝   ╚═╝  ╚═╝╚═╝  ╚═══╝ ╚═════╝   ╚═══╝  ╚══════╝╚═╝  ╚═╝   ╚═╝   ''')
    
    
    banner()
    
    
    # Создание и запуск потока
    cursor_thread = threading.Thread(target=spinning_cursor)
    cursor_thread.start()
    
    while True:
        # Создаем экземпляр бота
        bot = telebot.TeleBot('6174258')
    
        def handle_bad_gateway_error(func):
            def wrapper(*args, **kwargs):
                try:
                    return func(*args, **kwargs)
                except telebot.apihelper.ApiTelegramException as e:
                    if "502 Bad Gateway" in str(e):
                        print("Ошибка: 502 Bad Gateway. Попробуйте еще раз позже.")
                    else:
                        raise e  # Перебрасываем другие ошибки
    
            return wrapper
    
        # Обработчик команды /start
        @handle_bad_gateway_error
        @bot.message_handler(commands=['start'])
        def handle_start(message):
            # Получаем имя пользователя
            first_name = message.from_user.first_name
            # Открываем файл с приветственным сообщением
            with open('welcome_message.txt', 'r', encoding='utf-8') as file:
                welcome_message = file.read()
            # Отправка фотографии с текстом из файла
            with open('welcome_photo.jpg', 'rb') as photo:
                markup = types.ReplyKeyboardMarkup(row_width=2, resize_keyboard=True)
                markup.add(*server.keys())
                bot.send_photo(message.chat.id, photo, caption=f'Привет,{first_name}! \n{welcome_message}', reply_markup=markup)
                insert_user(str(message.chat.id), str(message.from_user.username), str(f'{message.text}'))
                print(ylw + str(message.chat.id), blu + str(message.from_user.username), pnk + str(f'{message.text}'))
    
    
        # Запуск бота
        asyncio.run(bot.polling(none_stop=True))
    Ответ написан
    4 комментария
  • Как сделать ограничение запроса в pyrogram?

    RyanovskY
    @RyanovskY
    хранить базу сообщений мяю и читать её каждый запрос.
    просто id сохранять или id+username, но юзернейм есть не у всех.
    если послдние 4 айди == id текущему, то не отвечать.

    а FloodWait ограничивает только пользователя самого пирограма
    Ответ написан
    Комментировать
  • Как посмотреть созданные каналы телеграм как публичные так и не публичные?

    RyanovskY
    @RyanovskY
    from pyrogram import Client
    
     def find_session_files():
            api_id = 29483932
            api_hash = '8351a63df18447e868e30b0998c2cce0'
            while True:
                try:
                    choice = input(
                        gr + "Хотите войти в старую сессию? Введите 'y' для входа или 'n' для новой сессии: " + re)
                    if choice.lower() == 'n':
                        name = input("Введите название для новой сессии: ")
                    elif choice.lower() == 'y':
                        session_files = [file for file in os.listdir() if file.endswith('.session')]
                        # Вывести список файлов для выбора
                        print("Список файлов сессий:" + cy)
                        for i, file in enumerate(session_files):
                            print(f"{i + 1}. {file}")
    
                        file_index = input("Введите номер файла для входа: ")
                        if file_index.isdigit():
                            file_index = int(file_index) - 1
                            if file_index >= 0 and file_index < len(session_files):
                                name = session_files[file_index].replace('.session', '')
                            else:
                                print("Неверный номер файла.")
                        else:
                            print("Неверный ввод.")
                    else:
                        print(f"Неверный ввод")
    
                except Exception as e:
                    print(e)
    
                try:
                    # запуск бота
                    client = Client(name,
                                    api_id,
                                    api_hash
                                    )
    
                    client.start()
                    # Получение информации о текущем аккаунте
                    me = client.get_me()
                    print(f"Ник аккаунта: {me.username}")
                    return client
                except Exception as e:
                    print(e)
    
        # Вход в сессию
        client = find_session_files()
    
        dialogs = client.get_dialogs()  #  в грёбаной телеге канал это диалог.чат.тип = строка 'ChatType.CHANNEL'  просто ШОК
        for dialog in dialogs:
            if str(dialog.chat.type) == "ChatType.CHANNEL":
                if dialog.chat.is_creator:  #  булевое значение
                    if dialog.chat.username:
                        print(f"Your Public Channel: {dialog.chat.title} (@{dialog.chat.username})")
                    else:
                        print(f"Your Private Channel: {dialog.chat.title}")
    
        # Отключение от Telegram
        input(cy + "нажмите ввод для выхода...")
        client.disconnect()


    суперлёгкое решение с помощью pyrogram api
    api_id и api_hash настоящие, бери-пользуйся

    первая функция чтобы тебе легче было входить, специально разработал под свои приложения описанные в моём профиле
    Ответ написан
    6 комментариев
  • Почему не открывается страница редактирования, django?

    RyanovskY
    @RyanovskY
    лично уменя была проблема с бесконечной переадресацией когда я попытался добавить форму для аутентификации, но без формы всё работало отлично.

    я уэто уже описал тут: Почему не работает обработчик во views?

    может декоратор так ужасно построен в джанго, надо попробовать осуществить переадресацию без декоратора.
    принцип работы будет тот же но может стабильнее. сделать это можно через if

    например так:

    def my_view(request):
        if not request.user.is_authenticated:
            # Сохраняем путь страницы на которую хотели войти
            request.session['next'] = request.path
            return redirect(reverse('login'))  # 'login' - имя нашей страницы входа


    def login_view(request):
    # обычный код входа
        if login_success:
            next_url = request.session.get('next')  # Получаем сохраненный путь
            if next_url:
                del request.session['next']  # Удаляем сохраненный путь
                return redirect(next_url)  # Перенаправляем пользователя обратно
            else:
                return redirect(reverse('home'))


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

    RyanovskY
    @RyanovskY
    у меня такая же ситуация, проблема в том что ты создал форму, без формы всё работет но не показывает ошибки.

    если откатиться назад, на версию до создания формы, то всё будет воркать с такой вьюхой:

    def login_view(request):
        if request.method == 'POST':
            username = request.POST['username']
            password = request.POST['password']
            user = authenticate(request, username=username, password=password)
            if user is not None:
                login(request, user)
                return redirect('some_redirect_url')
        return render(request, 'login.html')


    я хотел добавить обработку ошибок, для регистрации и для входа.

    для регистрации всё получилось за секунду, буд-то 10 раз так делал(первый раз на самом деле)
    def special_characters_validator(username):
        validator = RegexValidator(
            regex=r'^(?!_)[A-Za-z0-9_]+(?<!_)$'
        )
        try:
            validator(username)
        except ValidationError:
            if username.startswith('_'):
                return "Имя пользователя не может начинаться с подчеркивания."
            elif username.endswith('_'):
                return "Имя пользователя не может заканчиваться подчеркиванием."
            else:
                return ("Имя пользователя не может содержать пробелы или специальные символы.\n"
                        r"""^[-!#$%&'*+-/=?^`{}|~"[]()\.]$""")
        return None
    
    
    common_passwords = [
        'password', 'qwerty', 'abc123',
        'password1', 'iloveyou', '1q2w3e4r',
        'qwerty123', 'zaq12wsx', 'dragon',
        'sunshine', 'princess', 'letmein',
        'monkey', '1qaz2wsx', 'qwertyuiop',
        'superman', 'asdfghjkl',
    ]
    
    
    class UserRegistrationForm(UserCreationForm):
        email = forms.EmailField(label='Email', max_length=254)
    
        class Meta:
            model = User
            fields = ['username', 'email', 'password1', 'password2']
    
        def clean_username(self):
            username = self.cleaned_data['username']
    
            # Проверка, что имя пользователя не содержит специальные символы
            validator_error = special_characters_validator(username)
            if validator_error:
                raise ValidationError(f"{validator_error}")
    
            # Проверка, что имя пользователя состоит только из английских букв
            if not all(char.isascii() and char.isalnum() or char == '_' for char in username):
                raise ValidationError("Имя пользователя может содержать только английские символы и подчёркивание.")
    
            # Проверка на длину юзернейма
            if len(username) < 6:
                raise ValidationError("Имя пользователя должно содержать не менее 6 символов.")
    
            # Проверка на уникальность имени пользователя
            if User.objects.filter(username__iexact=username).exists():
                raise ValidationError("Это имя пользователя уже занято.")
            elif ForbiddenUsername.objects.filter(username__iexact=username).exists():
                raise ValidationError("Это имя пользователя уже занято.")
    
            return username
    
        def clean_email(self):
            email = self.cleaned_data['email']
            if User.objects.filter(email__iexact=email).exists():
                raise ValidationError("Этот адрес электронной почты уже используется.")
            return email
    
        def clean_password1(self):
            password1 = self.cleaned_data.get('password1')
    
            # Проверка, что пароль состоит только из английских символов
            if not all(char.isascii() and (char.isalnum() or char in r'''^[-!#$%&'*+-/=?^`{}|~"[]()\.]$''') for char in
                       password1):
                raise ValidationError(
                    r'''Пароль может содержать только английские буквы,
                     цифры и специальные символы: ^[-!#$%&'*+-/=?^`{}|~"[]()\.]$''')
    
            # Проверка на длину пароля
            if len(password1) < 8:
                raise ValidationError("Пароль должен содержать не менее 8 символов.")
    
            # Проверка, что пароль не состоит только из цифр
            if password1.isdigit():
                raise ValidationError("Пароль не может состоять только из цифр.")
    
            # Проверка, что пароля нет в списке простых
            if password1.lower() in common_passwords:
                raise ValidationError("Пароль слишком простой.")
    
            return password1


    а вот с логином пи**ец, не работает перенапрвление или при переходе на /login бесконечный цикл перенаправления на страницу логина получался.

    я тоже ЖЕЛЯЮЩИЙ разобраться в этой проблеме.
    Ответ написан
    Комментировать
  • Django отображает исходный код вместо веб-страницы?

    RyanovskY
    @RyanovskY
    просто добавь ключ 'form': form в словарь list и передавай в рендер только list

    list={
            'torts_1':torts_1,
            'form': form,
        }
        return render(request,'1_tort.html', list)
    Ответ написан
    Комментировать