🛠️ pycraft-tools — «швейцарский нож» для Python
Один пакет, в котором лежат семь модулей: главный help_manager (голос, музыка, автоматизация, база данных, экран, файлы, консоль) и шесть специальных: нейросети, распознавание речи, Яндекс.Музыка, умный дом Яндекса, робот Makerzoid и дневник МЭШ.
pip install pycraft-tools
📑 Содержание
- Установка и extras
- Быстрый старт
- help_manager: главный модуль
- ai_modules: нейросети
- voice_recognition: распознавание речи
- yandex_music_tools: лайки Яндекс.Музыки
- yandex_smart_home: умный дом
- makerzoid_robot: робот по Bluetooth
- mosru_diary: дневник МЭШ
- Секреты и безопасность
📦 Установка и extras
Код всех модулей приходит в одном пакете. Зависимости отдельных модулей ставятся по имени модуля в квадратных скобках:
pip install pycraft-tools[makerzoid_robot] # bleak, python-dotenv
pip install pycraft-tools[voice_recognition] # pyaudio, vosk, tqdm, onnx-asr
pip install pycraft-tools[mosru_diary] # requests, playwright
pip install pycraft-tools[yandex_smart_home] # python-dotenv, flask
pip install pycraft-tools[yandex_music_tools] # yandex-music
pip install pycraft-tools[ai_modules] # requests
pip install pycraft-tools[all] # зависимости всех модулей сразу
Несколько сразу: pip install pycraft-tools[makerzoid_robot,mosru_diary].
| Модуль | Для чего | Extra |
|---|---|---|
help_manager |
главный модуль: Manager, Voice, Music, Auto, Face, BazaDB, Console и другие | не нужен |
ai_modules |
GigaChat (Сбер): чат, картинки, файлы | [ai_modules] |
voice_recognition |
распознавание речи: Google, Vosk, GigaAM | [voice_recognition] |
yandex_music_tools |
скачать «Мне нравится» из Яндекс.Музыки | [yandex_music_tools] |
yandex_smart_home |
лампы, группы, сценарии Умного дома Яндекса | [yandex_smart_home] |
makerzoid_robot |
робот Makerzoid по Bluetooth LE | [makerzoid_robot] |
mosru_diary |
домашка, оценки, расписание из МЭШ | [mosru_diary] |
ℹ️ Если для модуля не хватает зависимости, импорт подскажет, какой extra поставить.
🚀 Быстрый старт
from help_manager import Manager, Music, Auto, Console, BazaDB, Face
Manager.say("Привет, мир!") # озвучка
print(Manager.get_weather("Москва")) # погода
Console.success("Операция выполнена!") # цветной вывод
Auto.screenshot("screen.png") # скриншот
db = BazaDB("test.db")
db.create_table("users", ["name", "age"])
db.insert("users", {"name": "Юсуф", "age": "12"})
print(db.get_all("users"))
🧰 help_manager: главный модуль
Всё в одном файле, все классы можно импортировать так: from help_manager import *.
from help_manager import *
🌐 Manager: голос, погода, файлы, время, интернет
Набор статических методов «на каждый день».
Manager.say("Привет!", "ru") # озвучка через Google TTS
text = Manager.listen_text(5) # слушает микрофон 5 секунд, возвращает текст
Manager.play_music("sound.mp3") # проиграть файл
Manager.get_weather("Москва") # погода (OpenWeatherMap)
Manager.get_weather("Москва", api_key="ВАШ_КЛЮЧ") # со своим ключом
Manager.get_text_with_url("https://example.com", "title") # текст со страницы по CSS-классу
Manager.now("%H:%M") # текущее время по формату
Manager.today() # сегодняшняя дата
Manager.is_connected() # есть ли интернет
Manager.download_file("https://site/file.zip", "file.zip")
Manager.save_json("data.json", {"a": 1}) # JSON-файлы
data = Manager.load_json("data.json")
Manager.load_env(".env") # переменные из .env
Manager.search_and_open_youtube("Imagine Dragons", 1) # найти и открыть видео
Manager.wait(3, "Подождите") # пауза с сообщением
Manager.beep(1000, 300) # звуковой сигнал
🎙️ Voice: все движки речи в одном классе
Озвучка (gtts, silero, edge, pyttsx3) и распознавание (google, vosk, gigaam, whisper). Движки ставятся только по необходимости, нужное покажет Voice.check().
Voice.check() # что установлено, чего не хватает
Voice.say("Привет, я Кеша!") # gTTS по умолчанию
Voice.say("Привет!", engine="silero", voice="aidar", pitch_shift=-2) # офлайн-нейроголос
Voice.say("В файл", engine="edge", save_path="hello.mp3", play=False)
Voice.use(tts="silero", stt="vosk") # выбрать движки по умолчанию
text = Voice.listen(seconds=5) # распознавание выбранным движком
text = Voice.listen("vosk", grammar=["включи свет", "выключи свет"]) # только команды
Voice.transcribe_file("record.wav", engine="whisper") # речь из файла
У любой озвучки есть speed (темп), pitch_shift (тембр в полутонах) и gain (громкость). Для темпа и тембра нужен ffmpeg; для записи и воспроизведения numpy, soundfile, sounddevice.
🎵 Music: плеер Яндекс.Музыки на VLC
Нужны токен Яндекс.Музыки и установленный VLC. Токен можно передать в конструктор или задать переменной YANDEX_MUSIC_TOKEN.
player = Music(token="y0_...")
player.play("Imagine Dragons") # найти и включить трек
player.pause(); player.next(); player.prev()
player.volume(60); player.volume_up(); player.volume_down()
player.add_to_queue("Miyagi - Captain") # очередь
player.show_queue(); player.clear_queue()
player.play_my_wave(limit=15) # случайные из избранного
player.play_favorites(limit=20)
player.mood("happy", limit=10) # музыка под настроение
player.download_favorites("C:/MyMusic") # скачать всё избранное
print(player.get_current_track())
🖱️ Auto: мышь, клавиатура, скриншоты, уведомления
Auto.click(500, 300) # клик
Auto.double_click(500, 300)
Auto.move(100, 100, duration=0.5)
Auto.drag(100, 100, 400, 400) # перетащить
Auto.scroll(-300) # прокрутка
Auto.write("Привет!", delay=0.05) # печатает текст
Auto.press("enter") # нажать клавишу
Auto.screenshot("screen.png") # скриншот
Auto.notify("Готово", "Задача завершена") # уведомление Windows
🖥️ ScreenReader: что на экране
pos = ScreenReader.find_image("button.png", confidence=0.8) # поиск картинки
ScreenReader.wait_for_image("ok.png", timeout=10) # дождаться появления
ScreenReader.find_color((255, 0, 0), tolerance=10) # пиксель по цвету
ScreenReader.find_text_coordinates("Отправить") # текст на экране (EasyOCR)
ScreenReader.highlight_image("button.png", duration=2) # обвести рамкой
🧠 Face: эмоции и улыбка с камеры
emotion = Face.detect_emotion() # 'happy', 'sad', 'angry'...
if Face.detect_smile():
print("Улыбка!")
Face.music_by_mood(player) # включить музыку под настроение (player = Music)
🗄️ BazaDB: SQLite без SQL
db = BazaDB("school.db")
db.create_table("students", ["name", "grade"])
db.insert("students", {"name": "Юсуф", "grade": "8"})
db.get_all("students")
db.find("students", "name", "Юсуф") # точное совпадение
db.search("students", "name", "Юс") # поиск по части (LIKE)
db.update("students", 1, {"grade": "9"})
db.delete("students", 1)
db.stats("students"); db.show_tables(); db.close()
🖥️ Console: красивый вывод
Console.success("Готово!"); Console.error("Ошибка"); Console.warning("Внимание"); Console.info("Инфо")
Console.header("Заголовок")
print(Console.color("Красный текст", "red"))
Console.progress_bar(100, "Загрузка")
w, h = Console.size()
Console.hide() # скрыть окно консоли (Windows)
🔧 Остальные классы
| Класс | Что делает | Пример |
|---|---|---|
Web |
открыть сайт, поиск, YouTube | Web.search("погода") |
System |
выключение, перезагрузка, сон, блокировка | System.lock() |
Info |
батарея, CPU, RAM, ОС | Info.battery() |
FolderUtils |
папки и файлы: создать, копировать, найти, размер | FolderUtils.find_files("C:/docs", ".pdf") |
FileUtils |
чтение, запись, подсчёт строк | FileUtils.read_text("a.txt") |
ImageUtils |
ресайз, обрезка, поворот | ImageUtils.resize("a.jpg", "b.jpg", 800, 600) |
PDFUtils |
текст из PDF | PDFUtils.extract_text("book.pdf") |
Clipboard |
буфер обмена | Clipboard.copy("текст") |
MathHelper |
факториал, среднее, медиана, школьное округление | MathHelper.school_round(2.5) |
PasswordGen |
генератор паролей | PasswordGen.generate(16) |
UnitConverter |
температура, расстояния, вес | UnitConverter.km_to_miles(10) |
ThreadManager |
фоновые потоки | ThreadManager().start(func) |
ImportManager |
импорт модулей по пути | ImportManager.import_module("path/to/file.py") |
GigaChat |
клиент GigaChat (тот же, что в ai_modules) |
см. ниже |
🤖 ai_modules: нейросети
Клиенты ИИ-сервисов. Сейчас есть GigaChat (Сбер), другие провайдеры добавляются отдельными файлами. Нужны ключи из кабинета разработчика Сбера (GIGACHAT_CLIENT_ID и GIGACHAT_CLIENT_SECRET в окружении или .env).
from ai_modules import GigaChat
ai = GigaChat(remember=True, system_prompt="Отвечай коротко")
print(ai.chat("Как дела?")) # ответ с памятью диалога
for part in ai.chat_stream("Расскажи анекдот"): # ответ по кусочкам
print(part, end="")
print(ai.describe_image("photo.jpg", style="brief")) # описание картинки
print(ai.ask_image("Сколько людей на фото?", "photo.jpg")) # вопрос по картинке
ai.generate_image("рыжий кот в скафандре", save_path="cat.jpg")
print(ai.clean_speech("я э-э-э хочу пиццу")) # очистка распознанной речи
print(ai.count_tokens("Привет, мир"), ai.get_balance())
Методы: chat, chat_stream, reset_history, ask_image, describe_image, generate_image, upload_file, list_files, get_file_info, download_file, delete_file, count_tokens, get_balance, list_models, embeddings, clean_speech. Ошибки API: GigaChatError с полями status_code и body.
⚠️
verify_ssl=Falseпо умолчанию. Для боевого кода передайтеca_bundle="сертификат_Минцифры.pem".
🎙️ voice_recognition: распознавание речи
Один интерфейс для трёх движков, выбор строкой.
| Движок | Где | Особенности |
|---|---|---|
google |
онлайн | проще всего, нужен интернет и микрофон |
vosk |
офлайн | модель скачивается сама (small ~80 МБ), wake-word, потоковое распознавание |
gigaam |
офлайн | GigaAM v3 (ONNX, INT8), принимает аудио (файл или PCM) |
pip install pycraft-tools[voice_recognition]
from voice_recognition import create_recognizer
# 1. Google: слушает микрофон
rec = create_recognizer("google", language="ru-RU")
print(rec.listen(timeout=5, phrase_limit=5)) # текст в нижнем регистре или ""
# 2. Vosk: офлайн
rec = create_recognizer("vosk", model_name="small") # "large" ~2 ГБ
print(rec.listen())
# 3. GigaAM: распознать файл или сырой звук
rec = create_recognizer("gigaam")
print(rec.recognize_file("speech.wav"))
print(rec.recognize(pcm_bytes)) # PCM int16, mono, 16 кГц
VoskRecognizer умеет больше: recognize_from_file, recognize_stream с колбэками, set_wake_words, stop_listening. GigaAMEngine.listen() не реализован: записывайте звук сами и передавайте в recognize(). Модель GigaAM скачивается с HuggingFace при первом запуске (~225 МБ).
🎵 yandex_music_tools: лайки Яндекс.Музыки
Скачивает весь раздел «Мне нравится» в папку. Токен в аргументе или в переменной YANDEX_MUSIC_TOKEN.
from yandex_music_tools import YandexMusic
ym = YandexMusic() # токен из YANDEX_MUSIC_TOKEN
print(len(ym.likes()), "треков в лайках")
downloaded, failed = ym.download_likes(output_dir="./YandexMusic", delay=1.0, retries=3)
print(f"Скачано: {downloaded}, ошибок: {failed}")
Файлы называются Артисты - Название.mp3, уже скачанные пропускаются, пауза delay защищает от лимитов Яндекса.
🏠 yandex_smart_home: умный дом
Лампы, группы и сценарии Яндекса. Перед командой модуль проверяет, что устройство её умеет. Токен лежит в .env:
SMART_HOME_TOKEN=y0_...
from dotenv import load_dotenv
from yandex_smart_home import SmartHome, SmartHomeError
load_dotenv()
home = SmartHome()
for dev in home.devices:
print(dev.name, dev.is_on, dev.brightness, dev.temperature)
home.device("Саске").turn_on()
home.device("Саске").set_brightness(50) # 1-100 %
home.device("Саске").set_temperature(4000) # 2700-6500 K
home.group("Верхний свет").turn_off() # группа
home.scenario("Я дома").run() # сценарий
home.turn_off_all_lights() # весь свет
try:
home.device("Яндекс ТВ").turn_on()
except SmartHomeError as e:
print("Не вышло:", e)
Веб-панель: python -m yandex_smart_home.smart_home_web (нужен extra [yandex_smart_home]). Панель без пароля, держите её только в домашней сети.
🤖 makerzoid_robot: робот по Bluetooth
Два мотора и две лампы по Bluetooth LE. Методы обычные, без await. MAC и UUID берутся из .env (ROBOT_MAC, ROBOT_UUID) или из аргументов конструктора.
import time
from dotenv import load_dotenv
from makerzoid_robot import Robot, RobotError
load_dotenv()
bot = Robot()
bot.connect() # только подключается, ничего не выключает
bot.light1(3) # свет 1, цвет 1-7
bot.light2(5) # свет 2, свет 1 не гаснет
bot.forward(5) # скорость 0-10
time.sleep(2)
bot.turn_left(4); time.sleep(1)
bot.stop()
bot.send(m1=7, m2=7, l1=2, l2=6) # моторы и свет одной командой
bot.disconnect(restore=True) # всё выключить и отключиться
Остальное: backward, turn_right, motor1, motor2, light_off, restore, init (если робот не отвечает), send_raw. В коде остался MAC моего робота «по умолчанию»: укажите свой.
📘 mosru_diary: дневник МЭШ
Читает электронный дневник school.mos.ru без открытия браузера: домашка с вложениями, расписание, оценки и средний балл, рейтинг, посещаемость, каникулы, питание.
⚠️ Только чтение: ничего не отмечается, не отправляется и не заказывается. Логин, пароль и SMS не вводятся и не хранятся: первый вход вы делаете сами в окне браузера.
pip install pycraft-tools[mosru_diary]
from mosru_diary import MosRuDiary
d = MosRuDiary(data_dir=r"C:\Users\Me\.session") # тут хранится токен (не коммитьте папку!)
d.login() # один раз: вход вручную в окне браузера
d.school_day_status() # {'school_day': True, 'vacation': False, ...}
d.homework(days=7, only_undone=True, files=True) # невыполненная домашка + вложения
d.schedule("2026-10-23") # уроки: время, кабинет, замены
d.marks_summary() # средний балл по предметам
d.rating() # место в классе
d.attendance(); d.food() # посещаемость; баланс питания
d.snapshot() # всё сразу, удобно для ежедневной сводки
Консоль:
mosru-diary --data-dir .session homework --days 7 --files
mosru-diary --data-dir .session school-day # код возврата 0 = учебный день, 10 = нет
mosru-diary --data-dir .session snapshot --save snapshot.json
Токен (JWT) живёт 24 часа и обновляется сам: на несколько секунд поднимается ваш браузер с сохранённым профилем. Неофициальный клиент: портал может изменить API. Подробный список методов смотрите в mosru_diary/README.md в репозитории.
🔒 Секреты и безопасность
- Токены и ключи держите в переменных окружения или в
.env, а.envдобавьте в.gitignore. Никогда не вставляйте их в код. mosru_diaryхранит токен только локально вdata_dir. Не отправляйте файлmesh_auth.jsonникому.- Если ключ или токен когда-то попал в код, чат или публичный репозиторий, выпустите новый.
📄 Лицензия
MIT © 2026 Yusuf Guseinov
🌐 Ссылки
Metadata
Release files for pycraft-tools 1.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| pycraft_tools-1.3.1.tar.gz | 150.9 kB | Without provenance | Details for pycraft_tools-1.3.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| pycraft_tools-1.3.1-py3-none-any.whl | Python 3 | none | any | Details for pycraft_tools-1.3.1-py3-none-any.whl |
Total release size: 291.7 kB
Release files / pycraft_tools-1.3.1.tar.gz
| Download URL | pycraft_tools-1.3.1.tar.gz |
|---|---|
| Size | 150.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
eda5f25c9bcdd1590be9ac7ed66ff66420fbf6e48894631c69138c94a36045e1
|
|
BLAKE2b-256 checksum How to use checksums |
e139f9ec05bfb470d555792ef087e026a3c8b5dba248b230650fa84b3774f002
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.3
|
Release files / pycraft_tools-1.3.1-py3-none-any.whl
| Download URL | pycraft_tools-1.3.1-py3-none-any.whl |
|---|---|
| Size | 140.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7f26c6aae5fea634db589494f60e28c917577ca6641ba8698548aa16544ac800
|
|
BLAKE2b-256 checksum How to use checksums |
17a52c0403635f8f2cbedb15f023ed361b95a83e9cb045212888df76b126ce42
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.3
|
Security for pycraft-tools 1.3.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.