Программистика
قناة بسيطة
Лучший канал про python Ссылка для друга: https://t.me/+Ai6ughKtf5g2ZmFi Купить рекламу: https://telega.in/c/+Ai6ughKtf5g2ZmFi Админ: @JeyRahol По рекламе: @ReivuManager
إظهار المزيد5 573
المشتركون
-324 ساعات
-427 أيام
-12130 أيام
أرشيف المشاركات
5 571
Repost from N/a
ЧТО ЖЕ ДЕЛАТЬ НА PYTHON? Проекты на Python за 11 минут
🎥 ПервоисточникПрограммистика|| #video
5 571
🖥 Flask-Moment — расширение для Flask, которое интегрирует Moment.js для форматирования дат и времени в шаблонах Jinja2! С помощью этого инструмента можно легко отображать даты и время в удобном формате, включая поддержку локализации, временных зон и обновлений времени в реальном времени. Основное применение — улучшение отображения временных данных в веб-приложениях Flask. Flask-Moment позволяет использовать Moment.js прямо в шаблонах, избавляя разработчиков от необходимости самостоятельно писать сложный код JavaScript для обработки времени.🐱 Ссылка на GitHub Программистика || #Library
5 571
Telegram опубликовал список 8 самых быстрорастущих каналов для программистов:
Only Python — Подборки приёмов и фич, о которых не рассказывают в курсах.
Only Tech — Главные тренды и инсайды из мира технологий, маркетинга и интернет-культуры.
Only Hack — Реальные кейсы кибератак, инструменты и методы защиты, которые используют хакеры.
Only GitHub — Репозитории, которые решают реальные задачи.
Скрипты, фреймворки и готовые решения
Only IT — Без мнений и слухов — только факты и важные IT-события.
Only Apple — Новые апдейты, утечки и фишки, которые Apple ещё не показала.
Only GPT — Промпты, хаки и свежие инструменты, о которых молчат даже AI-каналы.
Only Memes — Если ты когда-нибудь деплоил в пятницу вечером — ты поймешь
Подписывайтесь и прокачивайте свои скиллы.
5 571
Тебе нужна автоматическая документация API в формате Swagger/OpenAPI. Что быстрее?
5 571
⚡️ DevOps теперь в Telegram!
Канал сеньора, где публикуются гигабайты материалов для DevOps-инженеров:
97 ГБ — Linux
48 ГБ — Docker
12 ГБ — Kubernetes
25 ГБ — Redis
81 ГБ — Git
19 ГБ — Jira
29 ГБ — Grafana
Присоединяйтесь: @devops_tg
5 571
👩💻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"})
Программистика || #Статья5 571
Repost from Технотренды
⚡️ Запускаем крупный розыгрыш призов, где можно выиграть iPhone 17, игровые наушники, клавиатуру и мышь!
Без лишних слов, условия:
1. Подписка на:
— бизнестрендс
— Технотренды
— Блумберг
2. Нажать кнопку «Участвовать» снизу
Итоги будут опубликованы 15 ноября в 18:00 на наших каналах, желаем удачи!
5 571
В Яндексе платят 300.000р, Сбер нуждается в инженерах, а в Тинькофф нехватка кадров
«Бигтех по-русски» — место, где разработчики из крупных компаний рассказывают правду о работе мечты, зарплатах и жизни в IT.
Присоединяйся: @bigtech
5 571
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 👍 Состояния — для сложных сценариевПрограммистика || #Статья
5 571
🚀 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}")
Продолжение поста снизу👇
Программистика || #Статья5 571
🖥 Validators — это библиотека Python, предназначенная для простого и эффективного валидирования данных!
В отличие от других инструментов, требующих определения схем или форм, Validators позволяет проверять отдельные значения без необходимости в сложной настройке. Она предоставляет функции для проверки различных типов данных, включая электронные почты, URL, IP-адреса, доменные имена и другие.
🐱 Ссылка на GitHub
Программистика || #Library
5 571
🖥 Pydoll — это библиотека для автоматизации браузеров на базе Chromium без WebDriver, предлагающая реалистичную эмуляцию поведения. Библиотека поддерживает асинхронные функции Python, повышая производительность и позволяя обрабатывать разлинчые события и одновременно выполнять веб-скрапинг.🐱 Ссылка на GitHub Программистика || #Library
5 571
🤖 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 — для продаПрограммистика || #Статья
5 571
👩💻 Добрый, добрый Python с Сергеем Балакиревым
Этот курс позволит вам изучить основы программирования на языке Python, начиная с самых азов и заканчивая довольно серьезными конструкциями. После каждого теоретического видеоурока вы найдете практические задания на закрепление пройденного материала. Курс рассчитан и на самых начинающих и для тех, кто уже знаком с Python, но хотел бы повысить, а заодно и проверить, свой уровень.
🌐 СсылкаПрограммистика || #Course
متاح الآن! بحث تيليغرام 2025 — أهم رؤى العام 
