CodeShadow – Telegram
CodeShadow
76 subscribers
181 photos
11 videos
7 files
127 links
👋 Я Артемий — преподаватель Python и фрилансер.

💻 Показываю, как код и нейросети помогают зарабатывать и упрощать работу.

🚀 Делюсь проектами, опытом и лайфхаками из реальной практики.

✍🏻 Вопросы и идеи: @MifmanRu
Download Telegram
🚀 Telegram-бот — Часть 2: Хелперы и планировщик напоминаний

➡️ПЕРВЫЙ ПОСТ ПО ПРОЕКТУ
➡️ЧАСТЬ 1
Привет, кодеры! Продолжаем разбор Telegram-бота для планирования задач. В первом посте — обзор, в Части 1 — БД и модели. Сегодня: utils.py (хелперы) и scheduler.py (напоминания с APScheduler).


🗂 Хелперы: utils.py

Утилиты для парсинга дат, форматирования и клавиатур Telegram.

# utils.py (ключевые функции)
from datetime import datetime
from dateutil import parser
from config import TZ
from telebot import types

def parse_datetime_user(text: str) -> datetime:
formats = ["%Y-%m-%d %H:%M", "%d.%m.%Y %H:%M", "%Y-%m-%d", "%d.%m.%Y"]
for fmt in formats:
try:
dt = datetime.strptime(text, fmt)
return TZ.localize(dt)
except ValueError:
continue
return None

def format_task(task):
s = f"#{task.id} {task.noscript}\nКогда: {task.starts_at.strftime('%Y-%m-%d %H:%M')}\nСтатус: {task.status.value}"
if task.denoscription:
s += f"\n{task.denoscription}"
return s

def make_main_keyboard():
kb = types.ReplyKeyboardMarkup(resize_keyboard=True)
kb.row(types.KeyboardButton(" Добавить задачу"), types.KeyboardButton(" Добавить пару (фикс.)"))
kb.row(types.KeyboardButton("📋 Мои задачи"), types.KeyboardButton("📅 Расписание / Календарь"))
kb.row(types.KeyboardButton("⚙️ Настройки"), types.KeyboardButton("📝 Отчёт за неделю"))
return kb

- parse_datetime_user: парсит даты в разных форматах, добавляет таймзону.
- format_task: выводит задачу в читаемом виде.
- make_main_keyboard: главная клавиатура с кнопками.

🗂 Планировщик: scheduler.py

Фоновая система напоминаний на APScheduler.

# scheduler.py (основные функции)
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.date import DateTrigger
from apscheduler.triggers.cron import CronTrigger
from db import SessionLocal
from models import Task, ClassSchedule, User, TaskStatus
from config import TZ

scheduler = BackgroundScheduler(timezone=TZ)
scheduler.start()

def schedule_task_reminder(task_id: int, when: datetime, bot, message_text: str):
job_id = f"task_{task_id}"
scheduler.add_job(
func=lambda: _send_task_reminder(task_id, bot, message_text),
trigger=DateTrigger(run_date=when),
id=job_id,
replace_existing=True
)

# _send_task_reminder: отправляет сообщение, если задача pending
def schedule_weekly_class_reminder(class_id: int, bot):
# Настраивает cron для еженедельного напоминания по дню/времени
# Использует remind_before_minutes или дефолт 30 мин
pass # (полный код в репозитории)

def load_all_jobs(bot):
# При старте загружает все pending задачи и active классы в scheduler
pass

- schedule_task_reminder: разовое напоминание за N минут до задачи.
- schedule_weekly_class_reminder: еженедельные cron-задачи для занятий.
- load_all_jobs: восстанавливает задания при запуске бота.


🔧 Советы:
- APScheduler в памяти; для продакшена — job store в БД.
- Проверяйте статус перед отправкой, чтобы избежать спама.
- Логируйте ошибки отправки.


В следующем посте — bot_handlers.py: обработчики команд и FSM для диалогов. Вопросы по APScheduler? Пиши!

🧠 Что добавить в напоминания? Идеи в комментах!


#CodeShadow #TelegramBot #Python #APScheduler #Планировщик
Please open Telegram to view this post
VIEW IN TELEGRAM
211
☔️ Парсинг сайтов: пример на погоде

В прошлом посте («Быстрый старт») мы собрали заголовки с новостного сайта. По результатам опросника, сегодня идём дальше и напишем полезный парсер погоды с Gismeteo.

Почему именно погода?
📌 частая задача на фрилансе (когда приходится парсить информацию с сайтов, делать рассылки и т.д.)
📌 тренировка для понимания динамических страниц
📌 легко показать клиенту результат

Код: парсим температуру для города
import requests
from bs4 import BeautifulSoup

# URL страницы погоды для Москвы
url = "https://www.gismeteo.ru/weather-moscow-4368/"

# Делаем запрос (User-Agent нужен, чтобы сайт "поверил", что мы браузер)
html = requests.get(url, headers={"User-Agent": "Mozilla/5.0"}).text

# Создаём объект BeautifulSoup
soup = BeautifulSoup(html, "html.parser")

# Находим тег <temperature-value> (он хранит температуру в атрибуте "value")
temp_tag = soup.find("temperature-value")

# Забираем число и преобразуем к int
temperature = int(temp_tag["value"])

# Добавляем знак: +, − или ничего (для нуля)
if temperature > 0:
sign = "+"
elif temperature < 0:
sign = "−"
else:
sign = ""

# Выводим результат
print(f"Москва: {sign}{abs(temperature)}°C")


❄️ Как это работает:
☀️requests скачивает страницу;
☀️BeautifulSoup разбирает HTML;
☀️<temperature-value> имеет атрибут value, где хранится число (может быть отрицательным зимой ❄️);
☀️мы вручную добавляем знак «+» или «−»;
☀️результат выводим красиво.


🛠 Что можно докрутить:
☀️добавить выбор города (через аргумент или список URL);
☀️вытягивать прогноз на несколько дней вперёд;
☀️упаковать в Telegram-бота («/weather Москва» → ответ с температурой).
Please open Telegram to view this post
VIEW IN TELEGRAM
21
💼 GitHub и портфолио: твой залог заказов

Фрилансер без портфолио = программист без доказательств.
Выкладывай туда:
- свои мини-проекты
- примеры парсинга
- ботов

Пусть клиент видит твои работы ещё до заказа.

Совсем скоро обсудим где искать заказы и как правильно откликаться.
211
🌍 Где искать заказы: первые шаги

Популярные площадки: Kwork, Freelancehunt, Upwork.
Советы:
- бери сначала простые заказы (парсинг, боты, Excel)
- отвечай быстро и по делу
- прикрепляй похожие проекты из портфолио

И последнее — подведём итог всей серии.
2
🤔 Стоит выкладывать кейсы по Фронтенду (HTML, CSS, создание лендингов)?🐍
Final Results
71%
Уже жду кейсы 👨‍💻
29%
Пожалуй, Python достаточно 🐍
CodeShadow pinned «🤔 Стоит выкладывать кейсы по Фронтенду (HTML, CSS, создание лендингов)?🐍»
bot_handlers.py
44.2 KB
🚀 Telegram-бот — Часть 3: Обработчики команд (bot_handlers.py)

➡️ПЕРВЫЙ ПОСТ ПО ПРОЕКТУ
➡️ЧАСТЬ 1
➡️ЧАСТЬ 2

Привет, кодеры! Продолжаем разбор Telegram-бота для планирования задач. В первом посте я рассказал о проекте, в Части 1 — про базу данных (config.py, db.py, models.py), в Части 2 — про хелперы и напоминания (utils.py, scheduler.py). Сегодня разберём bot_handlers.py — мозг бота, который обрабатывает команды и диалоги с пользователями.

🗂 bot_handlers.py: Логика взаимодействия

Этот файл содержит обработчики команд (/start, /done) и диалогов (добавление задач/занятий, настройки).

Для управления многошаговыми диалогами (например, ввод названия, даты, времени) используется простая FSM (finite-state machine) через словарь user_states.


Ключевые моменты:

— get_or_create_user: Создаёт или получает пользователя по Telegram ID.
— cmd_start: Запускает бота, показывает главное меню.
— FSM через user_states: Хранит состояние диалога (например, awaiting_task_noscript) и данные (payload).

Пример: добавление задачи — пользователь вводит название, дату, время напоминания.
Обработчики для диалогов: Проверяют состояние и обрабатывают ввод (например, handle_task_noscript, handle_task_datetime). 😞

Как работает добавление задачи:

Пользователь нажимает " Добавить задачу" → состояние awaiting_task_noscript.
Вводит название → сохраняется в payload, состояние меняется на awaiting_task_datetime.
Вводит дату/время → парсится через parse_datetime_user, затем запрашивается время напоминания.

🔧 Советы:

⭐️FSM в памяти (user_states) подходит для MVP. Для продакшена используйте Redis или БД для хранения состояний.

⭐️Логируйте действия пользователей для отладки.

⭐️Добавляйте валидацию ввода, чтобы избежать ошибок (например, некорректные даты).

В следующем посте разберём
main.py (запуск бота) и подведём итоги. Хочешь больше примеров диалогов или деталей? Пиши в комментах!

🧠 Какой функционал для диалогов добавил бы ты? Делись идеями!

#CodeShadow #TelegramBot #Python #Telebot #Планировщик
Please open Telegram to view this post
VIEW IN TELEGRAM
21
💼 Как выглядит первый заказ на фрилансе глазами джуна

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

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

Курсы действительно способны стать хорошей базой для старта. Они дают фундаментальные знания, которые пригодятся при создании реальных продуктов. Например, чаще всего востребованы умения интегрировать чистый Python в большие системы вроде CRM или N8N. Сам по себе чистый Python редко встречается в вакансиях, но знание основ программирования открывает двери к решению сложных интеграционных задач.

💼 Получение первого заказа — настоящее испытание. Работа над проектом похожа на приготовление блюда для требовательного гурмана: нужно учитывать предпочтения клиента («специи»), соблюдать сроки и стараться сделать работу качественно. Тут важна внимательность к деталям и способность быстро учиться новому.
Please open Telegram to view this post
VIEW IN TELEGRAM
211
main.py
513 B
🚀 Telegram-бот — Часть 4: Запуск и итоги (main.py)

➡️ПЕРВЫЙ ПОСТ ПО ПРОЕКТУ
➡️ЧАСТЬ 1
➡️ЧАСТЬ 2
➡️ЧАСТЬ 3
Привет, кодеры! Разбираем финальную часть Telegram-бота для планирования задач. В первом посте — идея и функционал, в Части 1 — база данных (config.py, db.py, models.py), в Части 2 — хелперы и напоминания (utils.py, scheduler.py), в Части 3 — обработчики команд (bot_handlers.py). Сегодня завершаем разбор с main.py — точкой старта бота — и подводим итоги.


🗂 main.py: Запуск бота

Этот файл инициализирует базу данных, загружает напоминания и запускает бота в режиме polling.

🫥 Что происходит:

init_db: Создаёт таблицы в БД (используя Base.metadata из models.py).
load_all_jobs: Загружает активные задачи и занятия в APScheduler для напоминаний (из scheduler.py).
start_bot: Запускает бота в режиме бесконечного polling через telebot.

👀 Как всё работает вместе:

main.py инициализирует БД (db.py, models.py).
Загружает напоминания (scheduler.py) для существующих задач/занятий.
Запускает бота (bot_handlers.py), который обрабатывает команды и диалоги, используя хелперы (utils.py).

🔧 Советы по запуску:

💎Локально: Установите зависимости (pip install telebot sqlalchemy apscheduler python-dotenv pytz), настройте .env с BOT_TOKEN, запустите python main.py.

💎Продакшен: Используйте Docker или Heroku, настройте PostgreSQL вместо SQLite, добавьте SQLAlchemyJobStore для APScheduler.

💎Тестирование: Проверьте команды (/start, /done <id>), добавление задач и расписания. Логируйте ошибки (например, блокировку бота юзером).
📊 Итоги проекта:
Бот готов для использования! Он поддерживает задачи с напоминаниями, еженедельное расписание, отчёты и настройки. Код компактный, но масштабируемый. Что дальше? Можно добавить Google Calendar, графики отчётов (Matplotlib) или голосовые заметки. Скоро выложу код на GitHub — следите за каналом!

🧠 Что бы ты доработал в боте? Пиши в комментах!

💎 Если наберёте 7 реакций под последним постом — выкладываю полный код проекта в канал 💪


#CodeShadow #TelegramBot #Python #Планировщик
Please open Telegram to view this post
VIEW IN TELEGRAM
21
🏁 Финал: твой путь во фриланс

Мы прошли путь от мини-скриптов до поиска заказов.
Теперь у тебя есть:
- понимание простых проектов
- базовый набор кода для стартовых заказов
- знание, где брать клиентов

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

Удачи, разработчик! 🚀

P.S. На этом посте закончилась рубрика "Путь во Фриланс"
3
Решил запустить новую рубрику - обучение языку Python на кейсах 👨‍💻

💻💻💻

Пилотным запуском станет создание консольного приложения SafeBox - личный шифратор паролей)

Урок выйдет совсем скоро

Пиши свои идеи для рубрики в комментариях ⬇️
Please open Telegram to view this post
VIEW IN TELEGRAM
222
📼 Друзья, у нас вышел первый видеоурок по созданию шифратора «SafeBox» на Python 💻

Мы вместе разобрали синтаксис и шаг за шагом начали строить программу 👨‍💻

Хочу узнать ваше мнение ⬇️
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Please open Telegram to view this post
VIEW IN TELEGRAM
33
Знаешь, что самое сложное? Начать.
Первый заказ, первый скрипт, первая ошибка.
Ты думаешь: “я не готов”. Но никто не готов.
Готовность появляется в процессе.
22
💼 Окей, давайте поговорим начистоту о разнице между учебными и рабочими проектами!

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

Главное отличие – это деньги. Если на учёбе за проваленное задание самое страшное наказание – отправить тебя на доработку, то в бизнесе каждая ошибка дорого обходится. Сделал недостаточно хорошо – потерял деньги и репутацию перед заказчиком.

Но самое серьёзное изменение – это понимание ценности твоей работы. Когда пишешь код или решаешь проблему для учебного проекта, кажется, будто это пустые упражнения. А вот когда берёшься за реальный заказ, тут-то и приходит осознание, что твоя работа влияет на прибыль и успех бизнеса. Так что готовьте своё портфолио заранее, друзья мои!

Учёба даёт отличную базу, а опыт, полученный вовремя занятий, облегчает переход к профессиональным задачам. Просто всегда помните: каждый проект имеет значение и важен именно потому, что приносит пользу.
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Отлично! 🙂

Совсем скоро выйдет Кейс по простой HTML странице с разбором 💻
Please open Telegram to view this post
VIEW IN TELEGRAM
3
"Фриланс — это не про свободу бездельничать. Это про свободу выбирать, за что тебе платят."
1
💻 Кейс: простая HTML-страница со стилями

👋 Сегодня расскажу, как даже простая HTML-страничка может стать твоим кейсом для портфолио.

Представь, тебе пишет заказчик: “Нужна лендинг-страница визитка — чтобы было стильно, аккуратно и без лишних сложностей.”

Что ты делаешь? Берёшь базовый HTML, добавляешь немного CSS, и уже через пару часов показываешь первый результат.


🥃 Вот минимальный пример такой страницы:

<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<noscript>Мой первый сайт</noscript>
<style>
body {
font-family: Arial, sans-serif;
background: #f5f5f5;
margin: 0;
padding: 0;
text-align: center;
}
header {
background: #222;
color: #fff;
padding: 20px;
}
.btn {
display: inline-block;
margin-top: 20px;
padding: 10px 20px;
background: #e63946;
color: #fff;
text-decoration: none;
border-radius: 5px;
}
.btn:hover {
background: #d62828;
}
</style>
</head>
<body>
<header>
<h1>Привет! Это мой сайт</h1>
<p>Здесь могла бы быть ваша реклама 🚀</p>
<a href="#" class="btn">Связаться</a>
</header>
</body>
</html>

👨‍💻 Код максимально простой, но уже выглядит как маленький лендинг.

Такие вещи часто заказывают на фрилансе, и даже на первых заказах это может быть твоим “боевым кейсом”.

🤵‍♂ В следующем посте расскажу, как запустить эту страницу у себя и показать заказчику.
Please open Telegram to view this post
VIEW IN TELEGRAM
32
💻 Кейс: запуск своей первой HTML-страницы

➡️Предыдущий пост

Привет! 👋 В прошлый раз мы собрали простую HTML-страницу со стилями.

Но код — это одно, а показать результат — совсем другое. Давай разберём, как всё это запустить у себя и показать клиенту.


1️⃣ Создай у себя на компьютере обычный текстовый файл и назови его index.html.

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

2️⃣ Теперь два пути:

☀️Самый простой: открой файл двойным кликом — он сразу запустится в браузере.

☀️Более “правильный”: поставь любой локальный сервер (например, встроенный в Python).

🥃 Вот минимальный запуск через Python:

# сохрани файл как server.py
import http.server
import socketserver

PORT = 8000
handler = http.server.SimpleHTTPRequestHandler
httpd = socketserver.TCPServer(("", PORT), handler)

print("Сервер запущен на http://localhost:8000")
httpd.serve_forever()

Запусти его, и по адресу http://localhost:8000 увидишь свою страничку.

3️⃣ Чтобы показать заказчику — можно выгрузить на GitHub Pages или в любой бесплатный хостинг. Это даст ссылку, которую удобно скинуть.

И вот у тебя уже не просто кусок кода, а реально работающий сайт. А это и есть кейс для портфолио 🎯
Please open Telegram to view this post
VIEW IN TELEGRAM
4👏2