Легкий путь в Python
5.81K subscribers
143 photos
22 videos
3 files
181 links
Я Алексей Яковенко, senior-разработчик Python. Здесь вы найдете статьи, заметки, посты и видео для прокачки навыков программирования. Интересно и новичку, и профи 💡

По вопросам: https://t.me/yakvenalexx
Download Telegram
🐍 Что такое аргументы при запуске Python-скриптов и зачем они вообще нужны?

Когда мы запускаем Python-скрипт, нам часто нужно передать ему какие-то настройки: диапазоны, файлы, коэффициенты, флаги и т. д.
Чтобы не хардкодить всё прямо в коде, Python позволяет передавать параметры снаружи — через аргументы командной строки.

Проще говоря: вместо того чтобы переписывать переменные в .py файле, мы даём скрипту команды прямо при запуске.

Например:

python script.py --name "Ozon" --delay 5 --enable-log


Такой подход даёт 3 плюса:

1. Гибкость — один и тот же скрипт работает в разных режимах.
2. Удобство — не надо лазить в код ради одного числа.
3. Автоматизация — идеально для cron, CI/CD и массовых операций.

📦 Практический пример

Вот как это делается с помощью библиотеки argparse:

import argparse


def parse_arguments():
parser = argparse.ArgumentParser(
description="Пример использования аргументов"
)

parser.add_argument(
"--start",
type=int,
required=True,
help="Начальный индекс"
)

parser.add_argument(
"--end",
type=int,
required=True,
help="Конечный индекс"
)

parser.add_argument(
"--markup",
type=float,
default=10.0,
help="Процент наценки"
)

return parser.parse_args()


if __name__ == "__main__":
args = parse_arguments()
print(f"Обрабатываю товары от {args.start} до {args.end} с наценкой {args.markup}%")


Запуск:

python update_prices.py --start 0 --end 17 --markup 15


Вывод:

Обрабатываю товары от 0 до 17 с наценкой 15%
👍287🔥4🎉2👎1🐳1👨‍💻1🎃1
Приятно, конечно, но немного смущает, что нейронка уровня Claude дает мне советы о том, как атаковать сайт🤔
Please open Telegram to view this post
VIEW IN TELEGRAM
😁44🤣12😱4🤨2👾21👍1🔥1👌1
🚀 Как поднять лояльность магазина на Авито до 100% с Python

Интегрировал Avito Messenger API и настроил автоматические уведомления в Telegram. Результат — покупатели получают ответы моментально, лояльность 100%. Сейчас расскажу, как реализовать это на Python асинхронно.

📦 Стек технологий
pip install fastapi uvicorn aiohttp python-dotenv


💻 Решение за 2 шага

Шаг 1: Регистрируем webhook

import asyncio
import aiohttp
import os
from dotenv import load_dotenv

load_dotenv()

async def get_token():
url = "https://api.avito.ru/token/"
data = {
"grant_type": "client_credentials",
"client_id": os.getenv("AVITO_CLIENT_ID"),
"client_secret": os.getenv("AVITO_CLIENT_SECRET"),
}
async with aiohttp.ClientSession() as session:
async with session.post(url, data=data) as resp:
return (await resp.json())["access_token"]

async def register_webhook(webhook_url):
token = await get_token()
url = "https://api.avito.ru/messenger/v3/webhook"
headers = {"Authorization": f"Bearer {token}"}

async with aiohttp.ClientSession() as session:
async with session.post(url, json={"url": webhook_url}, headers=headers) as resp:
print(f" Webhook зарегистрирован: {resp.status}")

asyncio.run(register_webhook("https://your-domain.ru/webhook/avito"))


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

Шаг 2: FastAPI обработчик

from fastapi import FastAPI, Request
import aiohttp
from datetime import datetime
import os

app = FastAPI()

TOKEN = os.getenv("TELEGRAM_BOT_TOKEN")
CHAT_ID = os.getenv("TELEGRAM_CHAT_ID")

async def send_telegram(text: str):
url = f"https://api.telegram.org/bot{TOKEN}/sendMessage"
async with aiohttp.ClientSession() as session:
await session.post(url, json={"chat_id": CHAT_ID, "text": text})

@app.post("/webhook/avito")
async def webhook(request: Request):
data = await request.json()
payload = data.get("payload", {})

if payload.get("type") == "message":
value = payload["value"]
msg = value["content"]["text"]
author = value["author_id"]
time = datetime.fromtimestamp(value["created"]).strftime("%H:%M")

notification = f"📨 Новое сообщение\n\n💬 {msg}\n👤 {author}\n {time}"
await send_telegram(notification)

return {"status": "ok"}

@app.get("/health")
async def health():
return {"status": "healthy"}


Запуск:
uvicorn main:app --host 0.0.0.0 --port 5000


🔑 .env файл

AVITO_CLIENT_ID=your_id
AVITO_CLIENT_SECRET=your_secret
TELEGRAM_BOT_TOKEN=your_token
TELEGRAM_CHAT_ID=your_chat_id


📈 Результат

⚡️ Асинхронная обработка — нет блокировок
📱 Моментальные уведомления в Telegram
🎯 Лояльность магазина 100%
⏱️ Ответы за минуты вместо часов
🚀 Высокая производительность FastAPI

💡 Как работает:

1. Регистрируешь webhook один раз через async скрипт
2. Avito шлёт POST-запросы при новых сообщениях
3. FastAPI асинхронно обрабатывает и пересылает в Telegram
4. Все запросы неблокирующие — высокая пропускная способность

Чистая асинхронная архитектура без polling и блокировок! 🔥

Вопросы? Пишите 👇
🔥38👍1551😍1💋1🎃1
Быстрый вход по SSH без пароля за пару минут

Настроим автоматический вход по SSH-ключу с переходом в root. Вместо ввода паролей будете просто писать ssh myserver и сразу попадать в root-сессию.

Полный скрипт для настройки

Просто подставьте свои данные и выполните:

Linux/MacOS

# Задаём переменные
ALIAS_NAME=myserver
HOST=1.222.33.44
PORT=22
USER=username

# Генерируем ключ
mkdir -p "$HOME/.ssh/project_keys/$ALIAS_NAME" && \
ssh-keygen -t ed25519 -f "$HOME/.ssh/project_keys/$ALIAS_NAME/id_ed25519"

# Копируем на сервер (один раз введёте пароль)
ssh-copy-id -i "$HOME/.ssh/project_keys/$ALIAS_NAME/id_ed25519.pub" -p "$PORT" "$USER@$HOST"

# Настраиваем конфиг
KEY_PATH="$HOME/.ssh/project_keys/$ALIAS_NAME/id_ed25519"
cat >> "$HOME/.ssh/config" <<EOF
Host $ALIAS_NAME
HostName $HOST
Port $PORT
User $USER
IdentityFile $KEY_PATH
RemoteCommand sudo -i
RequestTTY yes
EOF
chmod 600 "$HOME/.ssh/config"


Windows (PowerShell)

# Задаём переменные
$ALIAS_NAME = "myserver"
$HOST = "1.222.33.44"
$PORT = "22"
$USER = "username"

# Генерируем ключ
New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\.ssh\project_keys\$ALIAS_NAME" | Out-Null
ssh-keygen -t ed25519 -f "$env:USERPROFILE\.ssh\project_keys\$ALIAS_NAME\id_ed25519"

# Копируем на сервер
type "$env:USERPROFILE\.ssh\project_keys\$ALIAS_NAME\id_ed25519.pub" | ssh -p $PORT "$USER@$HOST" "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

# Настраиваем конфиг
$KEY_PATH = "$env:USERPROFILE\.ssh\project_keys\$ALIAS_NAME\id_ed25519"
@"

Host $ALIAS_NAME
HostName $HOST
Port $PORT
User $USER
IdentityFile $KEY_PATH
RemoteCommand sudo -i
RequestTTY yes
"@ | Add-Content "$env:USERPROFILE\.ssh\config"


Опционально: sudo без пароля

Если всё равно запрашивается пароль для sudo, на сервере под root:

visudo
# Добавить: username ALL=(ALL:ALL) NOPASSWD:ALL


Готово!

Теперь подключаемся просто:
ssh myserver


Для нескольких серверов повторите с другими переменными:
ssh production
ssh staging
ssh backup


Безопасность: Храните ключи в безопасности, используйте отдельный ключ для каждого сервера, на production лучше ограничить sudo конкретными командами.
18🔥15👍6❤‍🔥33👎1🥰1💯1
Привет, друзья!
Пришел вас порадовать, если вы вдруг хотите перед новым годом прокачаться в темах аутентификации и кэширования.
 
В школе Python разработки Pytex на этой неделе проходят 2 практических вебинара с Senior-разработчиком Артёмом Шумейко. 

16 декабря в 18:00 МСК — «Пишем систему аутентификации и авторизации: сессии vs JWT токены»
На вебинар вы:
— разберётесь в ключевых принципах аутентификации и авторизации через сессии и токены
— вместе с Senior-разработчиком напишете приложение, в котором реализуете оба подхода.
После такой пошаговой практики вы будете понимать, как строить безопасную систему входа в приложение.  

РЕГИСТРИРУЙТЕСЬ НА ВЕБИНАР ПО АУТЕНТИФИКАЦИИ 

18 декабря в 18:00 МСК — «5 слоёв кэширования в веб-приложениях»
На вебинаре вы:
— разберёте теорию кэширования: уровни, механизмы, типы хранилищ;
— поймёте, где и зачем применять разные виды кэша;
— разберетесь, как бэкендер может снизить нагрузку на бэк в десятки раз через кэширование на уровне браузера;
— на практике внедрите 5 уровней кэширования в реальное приложение.
Это тот навык, который отличает джуна от мидла и который особенно ценят работодатели.

РЕГИСТРИРУЙТЕСЬ НА ВЕБИНАР ПО КЭШИРОВАНИЮ

Это абсолютно бесплатно, поэтому регистрируйтесь и качайте харды перед праздниками⬆️
🔥149👍72👎1🥰1🤮1😍1
Claude не перестает поражать своей непосредственностью😆
🤣41😁10🔥3💋1😇1🎄1
Как всегда запускать Docker Compose плагин, даже если в скриптах или Makefile используется старая команда

Многие проекты используют Makefile или скрипты с командой docker-compose. Однако в современных системах Docker Compose часто устанавливается как плагин и вызывается через docker compose. Это приводит к ошибкам или неработоспособности старых скриптов, если не предпринять дополнительных действий.

Решение

Создайте символическую ссылку на Docker Compose плагин, чтобы команда docker-compose всегда запускала нужный плагин.

1. Найдите путь к плагину

Например:

   /usr/libexec/docker/cli-plugins/docker-compose

или для локальной установки:

   ~/.docker/cli-plugins/docker-compose


2. Создайте символическую ссылку

Для системной установки:

   sudo ln -s /usr/libexec/docker/cli-plugins/docker-compose /usr/local/bin/docker-compose

Для пользовательской:

   ln -s ~/.docker/cli-plugins/docker-compose ~/.local/bin/docker-compose

(убедитесь, что ~/.local/bin в PATH).

3. Проверьте работу

   docker-compose --version

Команда должна вывести версию плагина.

Теперь команда docker-compose будет вызывать Docker Compose плагин.
Не нужно менять Makefile или скрипты — всё работает как раньше, а команда docker compose тоже будет доступна.
2👍167🔥5🙈2🤗21👎1👌1🤝1
🎄 Кому нужен .RU-домен за 1 рубль?

В REG.RU сегодня проходит новогодняя акция — можно взять домен в зоне .RU всего за 1 ₽ по промокоду NY2026!

💡 Акция действует только сегодня и завтра, так что лучше не тянуть.

Как получить домен за 1 рубль:

1. Зарегистрируйтесь на reg.ru, если у вас еще нет аккаунта.
2. Перейдите в подбор доменов и выберите желаемое имя.
3. Добавьте домен в корзину.
4. Введите промокод NY2026 и нажмите на «плюсик».
5. Отключите все лишние услуги — хостинг, облако, дополнительные зоны и т. д.
6. Оформите заказ — и ваш домен уходит за 1 ₽ на год!
13👍7🔥7🤮6🙈2❤‍🔥1🎉1👀1
Как автоматизировать Photoshop через кодинг

Когда говорят об автоматизации, чаще всего имеют в виду Python. Но важно понимать: Photoshop не выполняет Python-код напрямую.

Зато у него есть встроенная поддержка скриптов — Photoshop умеет исполнять код на JavaScript (ExtendScript).

Это не «JS как в браузере» и не замена Python. Это родной язык автоматизации Photoshop, с прямым доступом к:

- слоям
- тексту
- смарт-объектам
- экспорту файлов
- истории документа

Если задача — управлять самим Photoshop, то скрипты внутри Photoshop — самый надёжный путь.

Что это даёт на практике

Через код можно:

- массово менять текст в PSD
- генерировать сотни изображений из одного шаблона
- автоматизировать экспорт
- исключить Actions и Variables с их ограничениями

По сути, мы описываем действия, которые дизайнер делает руками, но в виде кода.

Пример задачи

Есть:

- один PSD
- текстовый слой
- значения 1 м → 100 м

Нужно:

- автоматически подставить значения
- сохранить 100 PNG-файлов
- вернуть PSD в исходное состояние

Пример скрипта для Photoshop (JSX)

#target photoshop

var doc = app.activeDocument;
var layerName = "1 м"; // имя текстового слоя
var outputFolder = Folder.selectDialog("Выбери папку для сохранения");

if (!outputFolder) {
alert("Папка не выбрана");
exit();
}

function findTextLayer(layerSet) {
for (var i = 0; i < layerSet.layers.length; i++) {
var layer = layerSet.layers[i];
if (layer.kind == LayerKind.TEXT && layer.name == layerName) {
return layer;
}
if (layer.typename == "LayerSet") {
var found = findTextLayer(layer);
if (found) return found;
}
}
return null;
}

var textLayer = findTextLayer(doc);
if (!textLayer) {
alert("Текстовый слой не найден");
exit();
}

for (var i = 1; i <= 100; i++) {
textLayer.textItem.contents = i + " м";

var file = new File(outputFolder + "/pkabel_4x2_5_" + i + "m.png");

var opts = new PNGSaveOptions();
opts.compression = 9;

doc.saveAs(file, opts, true, Extension.LOWERCASE);
}

// откат без сохранения
doc.activeHistoryState = doc.historyStates[0];

alert("Готово!");


Как запускать

- Photoshop → Файл → Сценарии → Обзор…
- выбрать .jsx
- выбрать папку
- получить пачку файлов

Важный момент

Python здесь не «конкурент» JavaScript.

- Python — отличный оркестратор процессов
- Photoshop — отдельная среда выполнения
- ExtendScript — язык управления внутри неё

В реальных пайплайнах это часто комбинируется: Python → запускает процессы → Photoshop выполняет свои скрипты
🔥145👍5❤‍🔥1🙉1
Бесплатная учительская подписка ChatGPT Plus 🎓

Что такое учительская подписка?

Это специальная образовательная версия ChatGPT Plus с полным доступом к GPT-4, расширенными возможностями и приоритетом в обработке запросов — все бесплатно для преподавателей.

Как получить бесплатно:

1. Переходим по ссылке https://em.bjedu.tech/en/ и создаем бесплатную образовательную почту (обязательно в зоне erzi.me)

2. Копируем полученный email адрес

3. Заходим в ChatGPT: https://chatgpt.com (Обязательно используйте VPN!)

4. Нажимаем "Зарегистрироваться" и вставляем образовательную почту

5. Придумываем надежный пароль и жмем "Продолжить"

6. Копируем код подтверждения из письма и вводим его

7. Заполняем данные регистрации

🎯 Важно: В поле "Роль" обязательно выбираем "Teacher" (Учитель)

8. Если после регистрации видите значок образовательной подписки — поздравляю, все получилось! 🎉
🔥158👍6🍓1🎃1😘1
Бесплатный бизнес-аккаунт Gemini на месяц 🚀

Что дает бизнес-подписка Gemini?

Полный доступ к расширенным возможностям Google Gemini, включая продвинутые модели, инструменты для работы с данными, интеграцию с Google Workspace и новейшие фичи вроде Nano Babanana и генерации видео через Veo3.

Пошаговая инструкция:

1. Переходим на сайт временной почты: https://temp-mail.org/en

2. Копируем сгенерированный email адрес

3. Открываем страницу бизнес-регистрации Gemini: https://auth.business.gemini.google/login

4. Вставляем временную почту и продолжаем регистрацию

5. Копируем код подтверждения из письма и вводим его

6. Завершаем настройку аккаунта

Готово! Теперь целый месяц пользуетесь всеми премиум-инструментами Gemini абсолютно бесплатно 🎉

Что доступно:

Продвинутые модели Gemini
Nano Babanana
Генерация видео через Veo3
Расширенные лимиты запросов
Интеграция с бизнес-инструментами

Важно: Не забудьте сохранить доступ к временной почте на весь период использования!
216👍5🔥4🕊2❤‍🔥1💯1
С наступившим 2026-м, друзья! 🎄

В прошлом году я появлялся здесь реже, чем хотелось бы — и вам, и мне самому. Практика, рабочие задачи, собственные проекты затянули с головой, и на статьи не всегда оставались силы и время. Но за это время я понял одну важную вещь: я действительно скучал.

Скучал по вам, по диалогу, по самому процессу — когда берёшь идею из реальной задачи и превращаешь её в понятный, живой материал.

А фактуры, к слову, накопилось немало. Реальная практика, настоящие кейсы: FastAPI, Aiogram, LangChain, LangGraph и ещё куча интересных находок.

Уже сейчас у меня готов материал для трёх больших статей на Хабр (написаны тексты и код, остается вычитать), и в этом году я хочу писать заметно чаще.

Идей много, проектов ещё больше — самое время возвращаться в активный ритм и делиться тем, что действительно работает.

Спасибо, что остаетесь здесь и не теряете канал из виду. Это очень мотивирует.

Пусть 2026-й станет для вас годом чистого кода, интересных задач и по-настоящему лёгких решений 🐍
1🔥47👍1811🎉6🍾5👀1🙊1
🚀 5 января на Хабре выходит мой большой практический туториал «Как запустить 4 независимые нейросети на одном GPU (16 ГБ) под FastAPI»

Если вы когда-нибудь пытались запустить несколько AI-моделей на одном GPU и упирались в CUDA out of memory, костыли, докер-ад или облачные счета — этот материал точно для вас.

🧠 Что я показываю в статье (33 минуты на прочтение):

✔️ Как параллельно запустить 4 нейросети на одном GPU 16GB (RTX A4000)
✔️ Реальный FastAPI-пайплайн:

OCR (DeepSeek) → ASR (Whisper RU) → LLM (Qwen2.5) → TTS (MMS RU)


✔️ GPU memory tricks: torch.no_grad, lazy loading, fp16, освобождение VRAM
✔️ Продакшн без Docker: systemd, virtualenv, автозапуск
✔️ Почему VPS с GPU за ~12к/мес выгоднее облачных API
✔️ PyTorch + Transformers — hands-on, без воды

🔥 Какие модели используются:

* 🖼 DeepSeek OCR — распознавание текста
* 🎙 Whisper RU — ASR
* 🤖 Qwen2.5 — LLM
* 🗣 MMS-TTS (RU) — синтез речи

📡 Всё это объединено в FastAPI с отдельными эндпоинтами и общим GPU.

📦 Исходники уже открыты:

* код
* тесты
* конфиги
* systemd-сервисы

👉 GitHub: ССЫЛКА

Это не «посмотрите, как красиво», а реальный боевой сетап, который можно:

* развернуть на своём сервере
* доработать под продукт
* использовать как базу для AI-сервиса

📅 Публикация: 5 января на Хабре
⭐️ Если тема откликается — поставь звезду репозиторию, чтобы не потерять
💬 В комментариях к статье можно будет задать вопросы — отвечу👇
3🔥79🎉6🤩32❤‍🔥2👍2😘2🙏1🙉1🤷1