.10 приложений для телеги(полное API телеги) 70 реальных покупателей со средним чеком на одну программу 30$, вы спросите - сколько продаж? я отвечу - 210 раз была продана та или иная программа



.полноценный клиент с регистрацией аккаунтов. нужен для просмотра купленных и не купленных приложений с возможномтью обновления существующих и скачивания. написан с библиотекой Киви (OpenGL)



.3 сервера (Flask, FastAPI, Django) 1и2 проверяют ключи пользователей на уровне железа(защита от распространения), 3 сервер это полноценная биржа с множеством полноценных решений.(на стадии разработки, осталось пару деталей типа websocket для чатов и уведомлений и платёжки. на данный момент чаты и уведомления построены на базе SSE, допотопное решение конечно, но разработка идёт)



1год комерческой разработки 2 дня некомерческой

на самом деле я полный ноль в разработке



спасибо за внимание

Наибольший вклад в теги

Все теги (6)

Лучшие ответы пользователя

Все ответы (10)
  • Как сделать, чтобы тг бот работал бесконечно на 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 комментария
  • Как посмотреть созданные каналы телеграм как публичные так и не публичные?

    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 комментариев
  • Как сделать ограничение запроса в pyrogram?

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

    а FloodWait ограничивает только пользователя самого пирограма
    Ответ написан
    Комментировать