ar
Feedback
Программистика

Программистика

قناة بسيطة

Лучший канал про python Ссылка для друга: https://t.me/+Ai6ughKtf5g2ZmFi Купить рекламу: https://telega.in/c/+Ai6ughKtf5g2ZmFi Админ: @JeyRahol По рекламе: @ReivuManager

إظهار المزيد
5 573
المشتركون
-324 ساعات
-427 أيام
-12130 أيام
أرشيف المشاركات
Repost from N/a
ЧТО ЖЕ ДЕЛАТЬ НА PYTHON? Проекты на Python за 11 минут
🎥 Первоисточник
Программистика|| #video

🖥 Flask-Moment — расширение для Flask, которое интегрирует Moment.js для форматирования дат и времени в шаблонах Jinja2! С п
🖥 Flask-Moment — расширение для Flask, которое интегрирует Moment.js для форматирования дат и времени в шаблонах Jinja2! С помощью этого инструмента можно легко отображать даты и время в удобном формате, включая поддержку локализации, временных зон и обновлений времени в реальном времени. Основное применение — улучшение отображения временных данных в веб-приложениях Flask. Flask-Moment позволяет использовать Moment.js прямо в шаблонах, избавляя разработчиков от необходимости самостоятельно писать сложный код JavaScript для обработки времени.
🐱 Ссылка на GitHub Программистика || #Library

Telegram опубликовал список 8 самых быстрорастущих каналов для программистов: Only Python — Подборки приёмов и фич, о которых
Telegram опубликовал список 8 самых быстрорастущих каналов для программистов: Only Python — Подборки приёмов и фич, о которых не рассказывают в курсах. Only Tech — Главные тренды и инсайды из мира технологий, маркетинга и интернет-культуры. Only Hack — Реальные кейсы кибератак, инструменты и методы защиты, которые используют хакеры. Only GitHub — Репозитории, которые решают реальные задачи. Скрипты, фреймворки и готовые решения Only IT — Без мнений и слухов — только факты и важные IT-события. Only Apple — Новые апдейты, утечки и фишки, которые Apple ещё не показала. Only GPT — Промпты, хаки и свежие инструменты, о которых молчат даже AI-каналы. Only Memes — Если ты когда-нибудь деплоил в пятницу вечером — ты поймешь Подписывайтесь и прокачивайте свои скиллы.

Тебе нужна автоматическая документация API в формате Swagger/OpenAPI. Что быстрее?
Anonymous voting

⚡️ DevOps теперь в Telegram! Канал сеньора, где публикуются гигабайты материалов для DevOps-инженеров: 97 ГБ — Linux 48 ГБ —
⚡️ DevOps теперь в Telegram! Канал сеньора, где публикуются гигабайты материалов для DevOps-инженеров: 97 ГБ — Linux 48 ГБ — Docker 12 ГБ — Kubernetes 25 ГБ — Redis 81 ГБ — Git 19 ГБ — Jira 29 ГБ — Grafana Присоединяйтесь: @devops_tg

👩‍💻 Python 3.14 — Новая эпоха производительности
🎥Первоисточник
Программистика|| #video

👩‍💻FastAPI vs Flask: выбор без розовых очков Flask был королём 10 лет. Простой, лёгкий, работает везде. Но потом пришла FastAPI и разломала всю игру. Теперь все спрашивают: "А может, мне FastAPI?" Давайте разберёмся без маркетинга. 🧱 Типичные заблуждения:
🟡 "Flask проще — беру его для быстрого проекта" На самом деле: Flask простой, но медленный. Для API это критично. Если нужна скорость — Flask не поможет. 🟡 "FastAPI слишком новый, нет боевых примеров" На самом деле: FastAPI используют Uber, Netflix, Microsoft. Это не хипстерская игрушка. 🟡 "Flask легче найти разработчиков" На самом деле: в 2025 году FastAPI знают даже новички. Спрос растёт. 🟡 "FastAPI только для асинхронности" На самом деле: FastAPI даёт type hints, валидацию, документацию — всё из коробки.
📌 Сравнение по параметрам 1️⃣ Скорость — где разница? Flask (синхронный):
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/api/users/<int:user_id>')
def get_user(user_id):
    user = db.get_user(user_id)  # блокирует поток
    return jsonify(user)
➡️Если в БД 500ms — поток висит 500ms. На 100 одновременных запросов нужно 100 потоков. Это жрёт память и процессор. FastAPI (асинхронный):
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

@app.get("/api/users/{user_id}")
async def get_user(user_id: int):
    user = await db.get_user(user_id)  # не блокирует поток
    return user
На 100 одновременных запросов нужно 1-2 потока. Все ждут параллельно. Результат: FastAPI на 5-10x быстрее на асинхронных операциях (БД, HTTP, файлы). 2️⃣ Type hints и валидация Flask:
@app.route('/api/users', methods=['POST'])
def create_user():
    data = request.get_json()
    # Что тут? Кто знает
    name = data.get('name')  # может быть None
    age = data.get('age')    # может быть строка вместо числа
    
    if not name or not isinstance(age, int):
        return {'error': 'Invalid data'}, 400
    
    user = db.create_user(name, age)
    return jsonify(user)
FastAPI:
from pydantic import BaseModel

class UserCreate(BaseModel):
    name: str
    age: int

@app.post("/api/users")
async def create_user(user: UserCreate):
    # Валидация уже произошла!
    # Если age не int — FastAPI вернёт 422 автоматически
    db_user = await db.create_user(user.name, user.age)
    return db_user
➡️Результат: FastAPI проверяет типы и валидирует данные из коробки. Flask требует ручной проверки. 3️⃣ Документация Flask:
@app.route('/api/users/<int:user_id>')
def get_user(user_id):
    """Получить пользователя по ID"""
    user = db.get_user(user_id)
    return jsonify(user)
➡️Документация? Пиши сам. Swagger? Подключай flask-restx или flasgger — их код не совпадает с реальностью. FastAPI:
@app.get("/api/users/{user_id}", 
         summary="Получить пользователя",
         description="Возвращает пользователя по его ID",
         responses={404: {"description": "Пользователь не найден"}})
async def get_user(user_id: int):
    user = await db.get_user(user_id)
    return user
➡️Открываешь /docs — там красивая интерактивная документация с примерами, которая автоматически генерируется из кода. Результат: FastAPI = документация генерируется автоматически. Flask = лень писать. 4️⃣ Обработка ошибок Flask:
@app.route('/api/users/<int:user_id>')
def get_user(user_id):
    try:
        user = db.get_user(user_id)
        if not user:
            return {'error': 'Not found'}, 404
        return jsonify(user)
    except Exception as e:
        logging.error(e)
        return {'error': 'Server error'}, 500
Каждый эндпоинт — свой try/except. Кошмар. FastAPI:
from fastapi import HTTPException

@app.get("/api/users/{user_id}")
async def get_user(user_id: int):
    user = await db.get_user(user_id)
    if not user:
        raise HTTPException(status_code=404, detail="User not found")
    return user

# Глобальная обработка ошибок
@app.exception_handler(Exception)
async def global_exception_handler(request, exc):
    logging.error(exc)
    return JSONResponse(status_code=500, content={"detail": "Server error"})
Программистика || #Статья

⚡️ Запускаем крупный розыгрыш призов, где можно выиграть iPhone 17, игровые наушники, клавиатуру и мышь! Без лишних слов, усл
⚡️ Запускаем крупный розыгрыш призов, где можно выиграть iPhone 17, игровые наушники, клавиатуру и мышь! Без лишних слов, условия: 1. Подписка на: — бизнестрендсТехнотрендыБлумберг 2. Нажать кнопку «Участвовать» снизу Итоги будут опубликованы 15 ноября в 18:00 на наших каналах, желаем удачи!

Что обязательно нужно для работы webhook в продакшене?
Anonymous voting

В Яндексе платят 300.000р, Сбер нуждается в инженерах, а в Тинькофф нехватка кадров «Бигтех по-русски» — место, где разработч
В Яндексе платят 300.000р, Сбер нуждается в инженерах, а в Тинькофф нехватка кадров «Бигтех по-русски» — место, где разработчики из крупных компаний рассказывают правду о работе мечты, зарплатах и жизни в IT. Присоединяйся: @bigtech

4️⃣ Работа с файлами Приём файла от пользователя:
@bot.message_handler(content_types=['document'])
def handle_document(message):
    file_info = bot.get_file(message.document.file_id)
    downloaded_file = bot.download_file(file_info.file_path)
    
    # Сохраняем локально
    with open(f"files/{message.document.file_name}", 'wb') as new_file:
        new_file.write(downloaded_file)
    
    bot.reply_to(message, "✅ Файл получен!")
📎 Для больших файлов используй потоковую обработку, не загружай всё в память! Приём файла от пользователя:
@bot.message_handler(content_types=['document'])
def handle_document(message):
    file_info = bot.get_file(message.document.file_id)
    downloaded_file = bot.download_file(file_info.file_path)
    
    # Сохраняем локально
    with open(f"files/{message.document.file_name}", 'wb') as new_file:
        new_file.write(downloaded_file)
    
    bot.reply_to(message, "✅ Файл получен!")
Отправка файла пользователю:
@bot.message_handler(commands=['getfile'])
def send_file(message):
    with open('report.pdf', 'rb') as file:
        bot.send_document(message.chat.id, file)
📎 Для больших файлов используй потоковую обработку, не загружай всё в память! 5️⃣ Платежи через Telegram Telegram поддерживает встроенные платежи (Stripe, ЮKassa и др.).
from telebot.types import LabeledPrice

@bot.message_handler(commands=['buy'])
def send_invoice(message):
    prices = [LabeledPrice(label='Подписка на месяц', amount=50000)]  # в копейках
    
    bot.send_invoice(
        chat_id=message.chat.id,
        title='Премиум подписка',
        description='Доступ ко всем функциям бота',
        invoice_payload='premium_subscription',
        provider_token='YOUR_PAYMENT_TOKEN',
        currency='RUB',
        prices=prices,
        start_parameter='subscription'
    )

@bot.pre_checkout_query_handler(func=lambda query: True)
def checkout(pre_checkout_query):
    bot.answer_pre_checkout_query(pre_checkout_query.id, ok=True)

@bot.message_handler(content_types=['successful_payment'])
def successful_payment(message):
    # Активируем подписку в БД
    activate_premium(message.from_user.id)
    bot.send_message(message.chat.id, "✅ Оплата прошла успешно!")
6️⃣ Состояния пользователя (FSM) Для многошаговых сценариев (регистрация, опросы):
from telebot.handler_backends import State, StatesGroup
from telebot.storage import StateMemoryStorage

state_storage = StateMemoryStorage()
bot = TeleBot("TOKEN", state_storage=state_storage)

class UserStates(StatesGroup):
    name = State()
    age = State()

@bot.message_handler(commands=['register'])
def start_registration(message):
    bot.send_message(message.chat.id, "Как тебя зовут?")
    bot.set_state(message.from_user.id, UserStates.name, message.chat.id)

@bot.message_handler(state=UserStates.name)
def get_name(message):
    bot.send_message(message.chat.id, f"Приятно познакомиться, {message.text}! Сколько тебе лет?")
    
    with bot.retrieve_data(message.from_user.id, message.chat.id) as data:
        data['name'] = message.text
    
    bot.set_state(message.from_user.id, UserStates.age, message.chat.id)

@bot.message_handler(state=UserStates.age)
def get_age(message):
    with bot.retrieve_data(message.from_user.id, message.chat.id) as data:
        data['age'] = message.text
        bot.send_message(message.chat.id, f"{data['name']}, {data['age']} лет — записал!")
    
    bot.delete_state(message.from_user.id, message.chat.id)
🧪 Бонус: мониторинг и логирование Интеграция с Sentry для отслеживания ошибок:
import sentry_sdk

sentry_sdk.init(
    dsn="YOUR_SENTRY_DSN",
    traces_sample_rate=1.0
)

# Теперь все ошибки автоматически отправляются в Sentry
💡 Запомни:
👍 Webhook — обязателен для продакшена 👍 Рассылки — с контролем скорости и асинхронно 👍 Админ-права — проверяй всегда 👍 Файлы — не грузи в память целиком 👍 Платежи — только через официальный API 👍 Состояния — для сложных сценариев
Программистика || #Статья

🚀 Telegram-бот: продвинутые фичи без магии Сделал бота с командами /start и /help? Поздравляю, ты на уровне "Hello, World!". Но настоящие боты делают рассылки, принимают платежи, работают с файлами и имеют админку. Разбираемся, как это сделать без костылей. 🧱 Типичные ошибки продвинутых новичков 🟢 Делают рассылку в один поток — блокируют бота на часы:
for user_id in users:
    bot.send_message(user_id, "Рассылка")
На 10k пользователей — это несколько часов. Telegram API ограничивает скорость. 🟢 Хранят файлы в памяти — бот падает на больших файлах:
file = bot.download_file(file_path)
# file весит 50MB — бот умер
🟢 Не проверяют права админов — любой юзер может управлять ботом:
@bot.message_handler(commands=['admin'])
def admin_panel(message):
    # без проверки прав!
🟢 Webhook настраивают неправильно — бот не получает сообщения или падает. 📌 Как делать правильно 1️⃣ Webhook вместо polling (продакшен) Polling — для теста. Webhook — для боевого режима.
from flask import Flask, request
import telebot

app = Flask(__name__)
bot = telebot.TeleBot("YOUR_TOKEN")

WEBHOOK_URL = "https://yourdomain.com/webhook"

@app.route('/webhook', methods=['POST'])
def webhook():
    if request.headers.get('content-type') == 'application/json':
        json_string = request.get_data().decode('utf-8')
        update = telebot.types.Update.de_json(json_string)
        bot.process_new_updates([update])
        return '', 200
    else:
        return '', 403

@app.route('/set_webhook')
def set_webhook():
    bot.remove_webhook()
    bot.set_webhook(url=WEBHOOK_URL)
    return "Webhook установлен!", 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8443, ssl_context=('cert.pem', 'key.pem'))
📎 Нужен SSL-сертификат (Let's Encrypt или самоподписанный). 2️⃣ Рассылка с контролем скорости Telegram ограничивает: максимум 30 сообщений в секунду.
import time
import logging

def broadcast(users, message_text):
    success = 0
    failed = 0
    
    for user_id in users:
        try:
            bot.send_message(user_id, message_text)
            success += 1
            time.sleep(0.05)  # ~20 сообщений/сек
        except Exception as e:
            logging.error(f"Не удалось отправить {user_id}: {e}")
            failed += 1
            
    logging.info(f"Рассылка завершена: {success} успешно, {failed} ошибок")
Для больших баз (100k+) используй асинхронную библиотеку aiogram:
import asyncio
from aiogram import Bot

async def broadcast_async(users, text):
    bot = Bot(token="YOUR_TOKEN")
    tasks = [bot.send_message(user_id, text) for user_id in users]
    await asyncio.gather(*tasks, return_exceptions=True)
    await bot.session.close()
3️⃣ Админ-панель с проверкой прав Храни список админов в конфиге или базе:
ADMINS = [123456789, 987654321]  # ID админов

def is_admin(user_id):
    return user_id in ADMINS

@bot.message_handler(commands=['admin'])
def admin_panel(message):
    if not is_admin(message.from_user.id):
        bot.send_message(message.chat.id, "❌ Доступ запрещён")
        return
    
    markup = InlineKeyboardMarkup()
    markup.add(InlineKeyboardButton("📊 Статистика", callback_data="stats"))
    markup.add(InlineKeyboardButton("📢 Рассылка", callback_data="broadcast"))
    bot.send_message(message.chat.id, "Админ-панель:", reply_markup=markup)

@bot.callback_query_handler(func=lambda call: call.data == "stats")
def show_stats(call):
    if not is_admin(call.from_user.id):
        return
    
    # Получаем статистику из БД
    user_count = get_user_count()  # твоя функция
    bot.send_message(call.message.chat.id, f"👥 Пользователей: {user_count}")
Продолжение поста снизу👇 Программистика || #Статья

🖥 Validators — это библиотека Python, предназначенная для простого и эффективного валидирования данных! В отличие от других
🖥 Validators — это библиотека Python, предназначенная для простого и эффективного валидирования данных! В отличие от других инструментов, требующих определения схем или форм, Validators позволяет проверять отдельные значения без необходимости в сложной настройке. Она предоставляет функции для проверки различных типов данных, включая электронные почты, URL, IP-адреса, доменные имена и другие. 🐱 Ссылка на GitHub Программистика || #Library

🖥 Pydoll — это библиотека для автоматизации браузеров на базе Chromium без WebDriver, предлагающая реалистичную эмуляцию пов
🖥 Pydoll — это библиотека для автоматизации браузеров на базе Chromium без WebDriver, предлагающая реалистичную эмуляцию поведения. Библиотека поддерживает асинхронные функции Python, повышая производительность и позволяя обрабатывать разлинчые события и одновременно выполнять веб-скрапинг.
🐱 Ссылка на GitHub Программистика || #Library

Почему polling не подходит для продакшена?
Anonymous voting

🤖 Telegram-бот без иллюзий: от первой строки до продакшена Все хотят бота: "сделай мне крипто-трекер", "автопостинг в канал", "магазин с оплатой". Но между "Hello, World!" и рабочим ботом — пропасть из костылей, которые ты не видишь в туториалах. 🧱 Типичные ошибки новичков 🟢 Запускают бота через polling на сервере:
bot.polling()
В продакшене это убивает сервер — бот постоянно дёргает API, жрёт ресурсы и падает при любом сбое сети. 🟢 Хранят токен прямо в коде:
TOKEN = "123456:ABC-DEF..."
bot = Bot(token=TOKEN)
Запушил в Git — токен утёк. Всё, начинай заново. 🟢 Не обрабатывают ошибки:
@bot.message_handler(commands=['start'])
def start(message):
    bot.send_message(message.chat.id, "Привет")
➡️Юзер отправил команду, а бот упал из-за сетевой ошибки — и молчит. 🟢 Пишут всю логику в одном файле на 1000+ строк — потом не могут найти баг. 📌 Как делать правильно 1️⃣ Установка библиотеки Две главные библиотеки: 🟢 python-telegram-bot — async, мощная, для сложных ботов 🟢pyTelegramBotAPI (telebot) — проще для старта
pip install pyTelegramBotAPI
2️⃣ Храни токен в .env Создай файл .env:
BOT_TOKEN=123456:ABC-DEF...
В коде:
import os
from dotenv import load_dotenv
from telebot import TeleBot

load_dotenv()
TOKEN = os.getenv('BOT_TOKEN')
bot = TeleBot(TOKEN)
📎 Не забудь добавить .env в .gitignore! 3️⃣ Базовая структура бота
import os
from dotenv import load_dotenv
from telebot import TeleBot
import logging

# Настройка логирования
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)

load_dotenv()
bot = TeleBot(os.getenv('BOT_TOKEN'))

@bot.message_handler(commands=['start'])
def start(message):
    bot.send_message(
        message.chat.id,
        f"Привет, {message.from_user.first_name}!"
    )

@bot.message_handler(commands=['help'])
def help_command(message):
    bot.send_message(
        message.chat.id,
        "Доступные команды:\n/start - Начать\n/help - Помощь"
    )

@bot.message_handler(func=lambda message: True)
def echo(message):
    bot.reply_to(message, f"Ты написал: {message.text}")

if __name__ == '__main__':
    logging.info("Бот запущен")
    bot.polling(none_stop=True)
4️⃣ Кнопки и клавиатуры Inline-кнопки (под сообщением):
from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton

@bot.message_handler(commands=['menu'])
def menu(message):
    markup = InlineKeyboardMarkup()
    markup.add(InlineKeyboardButton("Опция 1", callback_data="opt1"))
    markup.add(InlineKeyboardButton("Опция 2", callback_data="opt2"))
    bot.send_message(message.chat.id, "Выбери:", reply_markup=markup)

@bot.callback_query_handler(func=lambda call: True)
def callback_handler(call):
    if call.data == "opt1":
        bot.answer_callback_query(call.id, "Ты выбрал опцию 1")
Обычная клавиатура:
from telebot.types import ReplyKeyboardMarkup, KeyboardButton

@bot.message_handler(commands=['keyboard'])
def keyboard(message):
    markup = ReplyKeyboardMarkup(resize_keyboard=True)
    markup.add(KeyboardButton("Кнопка 1"))
    markup.add(KeyboardButton("Кнопка 2"))
    bot.send_message(message.chat.id, "Используй кнопки:", reply_markup=markup)
5️⃣ Обработка ошибок
import time

def safe_polling():
    while True:
        try:
            bot.polling(none_stop=True, timeout=60)
        except Exception as e:
            logging.error(f"Ошибка: {e}")
            time.sleep(5)  # Пауза перед перезапуском

if __name__ == '__main__':
    safe_polling()
6️⃣ Структура проекта для больших ботов
bot_project/
├── .env                 # Токены и секреты
├── .gitignore          
├── main.py             # Запуск бота
├── config.py           # Настройки
├── handlers/           # Обработчики команд
│   ├── start.py
│   ├── menu.py
│   └── admin.py
├── database/           # Работа с БД
│   └── db.py
└── utils/              # Вспомогательные функции
    └── helpers.py
💡 Запомни:
🟢 Токен — в .env, никогда в код 🟢 Логируй всё важное — иначе не поймёшь, где упал 🟢 Polling — для теста, webhook — для прода
Программистика || #Статья

👩‍💻 Добрый, добрый Python с Сергеем Балакиревым Этот курс позволит вам изучить основы программирования на языке Python, нач
👩‍💻 Добрый, добрый Python с Сергеем Балакиревым
Этот курс позволит вам изучить основы программирования на языке Python, начиная с самых азов и заканчивая довольно серьезными конструкциями. После каждого теоретического видеоурока вы найдете практические задания на закрепление пройденного материала. Курс рассчитан и на самых начинающих и для тех, кто уже знаком с Python, но хотел бы повысить, а заодно и проверить, свой уровень.
🌐 Ссылка
Программистика || #Course