Или как я доставлял расписание студентам в новом формате решая несколько проблем, используя парсинг и PHP 7 в 2017-2021 годах.
Начало. 1 курс, 2017 год
Поступил на компьютерные сети. Мне 16 лет.
Тогда у меня был телефон samsung j3 1/16 памятью с android 5.1 версией. Компьютера не было, но был нетбук samsung N150 (с 2 гб памятью на борту с win7). А также не удобный стул и в целом рабочее место за этим нетбуком. Выживач моего времени :)
Я начал общение с одногруппником, дальше мы стали дружить. У него был какой-то опыт и понимание о Linux, чуток он знал Python и мог верстать очень простые сайты.
Спустя некоторое время нашего общения мы стали задумываться о проблемах существующей системы расписания в колледже. О том как нам ставили пары - отдельная песня, но здесь речь именно про саму систему и весь её дискомфорт для бедных студентов юзеров.
Да, расписание динамическое, а не постоянное на полгода учебного времени.
Проблемы системы расписания в колледже
Начнём с того, как это было и как студенты узнавали о расписании?
На сайте колледжа была кнопка которая вела пользователя на внешнюю ссылку "Облако mail ru", куда каждый день выкладывали файлы Word в формате '.docx'. В каждом файле Word был текст и была таблица, где были размещены группы, пары и остальная информация.
Как мне помнится, первое время я видел файлы '.doc', позже перешли на формат '.docx'.
Дальше, на телефонах (чаще всего именно на них) пользователи открывали файл Word используя разные приложения и таким образом просматривали расписание своей группы.
Теперь разберём конкретно проблемы, по порядку:
На территории колледжа очень был медленный мобильный интернет, а у некоторых там не ловило совсем.
Поэтому, чтобы попасть на "Облако mail ru" который имел вес, было проблематично и затрачивало много времени на загрузку только самого сайта.После того как пользователь оказался на облаке, надо скачать файл с нужным расписанием, а то и все файлы. Один файл весил примерно ~44 Килобайта, таких могло быть штуки 2-4 на разные дни. Да, это немного по нынешним меркам, но это вес, а в условиях медленного интернета это может быть вечность ожидания загрузки.
Открыть Word файл в то время на Android для устройств как у меня было трудоёмкой задачей. Потому что внутренней памяти просто не хватало на установку таких тяжеленных приложений. А кроме этого, даже если я и мог открыть на своём телефоне файл Word, то это было очень долго (лаги).
Из этого возникает лишь ужасное чувство проблемы UX (пользовательского опыта) и возникает вопрос.
Зачем ~1000 людям (~студенты + ~преподы) делать ровно одинаковые действия ради одинакового результата? Тем более затрачивая на это много времени.
Попытка создать свою систему расписания с нуля
И это было ошибкой.
Мы с другом загорелись идеей полностью переделать систему расписания в колледже с нуля. Он был front-end (делал визуал сайта, то что видят все), я back-end (все механизмы которые не видны никому кроме разработчика).
Уже был февраль 2018 года, мы по чуть-чуть делали систему.

В целом идея была такой: шаблон Excel файла, в нём по ячейкам всё расписано по группам. Человек который составляет расписание использовал бы шаблон, загружал бы файл по определенной ссылке и готово. Для этого даже был "Личный кабинет".
Мы ходили демонстрировать эту систему, но на нашу идею отреагировали остро, опасаясь что мы оставим backdoor'ы.
Мне было очень обидно, я вышел с колледжа, пошёл на остановку в ожидании своей маршрутки. И пока ехал, дал обещание себе, что на втором курсе я сделаю свою систему расписания, которая перевернёт всё. И ей будут пользоваться.
2 курс, 2018 год
Лето закончилось. Начались первые пары в новом учебном году.
Что я себе обещал? Помню. И в середине сентября я приступил к новой системе. Каждый день после учёбы стал работать над реализацией нон-стопом.
Новая система расписания
Окей, мне надо сделать так, чтобы мне мгновенно было доступно расписание любой группы любого дня, не внося ничего нового в уже существующую систему расписания.
При себе имеется немного опыта работы с PHP/html/css/js, уже есть понимание как работать с Excel файлами, есть немного опыта вёрстки на Bootstrap 3. Что делать, у меня лапки
Идей не было, поэтому я стал смотреть своему врагу в глаза - открыл Word с расписанием и думал, что с этим смогу сделать на программном уровне.
Так я заметил, а ниче тот факт, что это таблица, но в Word'е?
Дальше я открыл '.docx' файл как архив и смотрел содержимое, увидел там много xml. Тогда, никакой информации найти не удалось о том, как устроен файл Word. Поэтому, я стал искать методы получения этой таблицы из файла, чтобы потом брать из неё данные. Начал баловаться конвертированием одного формата в другой и нашёл идеальную цепочку.
Дальше, приступил писать php скрипт (будущий обработчик расписания), который бы автоматизировал весь процесс.
Первая трудность была в поисках API для того чтобы брать файлы из облака. Его не было. Поэтому я сунулся изучать "код страницы" облака и наткнулся на интересный json прямо на странице, который хранил всю информацию о файлах лежащие по ссылке, а именно: название, время обновления, md5-хеш и что-то ещё.
Сам json был большим и был страх того, что он может быть каким-то динамичным из-за чего всё поломается рано или поздно. Тогда я не понимал как вытащить этот большой json-массив.
С регулярными выражениями мне помог какой-то доброволец в одной из групп ВК где обсуждался PHP. Этот доброволец дал "старт" в решении первых трудностей, дальше я уже сам стал разбираться в регулярках. Часто существовала проблема появления рекламы на облаке при парсинге, вот она была динамичной и могла сломать скрипт.

Потом стал изучать как на уровне кода можно скачать файл прямо из облака. Для этого я обратил внимание на ссылку, которая формируется когда файл уже скачали. Там был примерно такой формат:https://cloud.mail.ru/public/short_user_cloud_id/public_folder_id/22.01.18.docx?key=hash
short_user_cloud_id
- содержал короткий ID пользователя этого публичного облакаpublic_folder_id
- сгенерированный ID публичной папки облака пользователя22.01.18.docx
- название файла который хотим скачатьhash
- хеш-сумма токена, который брался из json массива отдельной ссылкой. Подозреваю, что это был SHA-256
Дальше идёт идеальная цепочка конвертирования. Помню мне пришлось не мало потратить времени, чтобы найти самый быстрый вариант конвертации файла. Тогда, если не ошибаюсь, была vds с 512 Мб памятью, 1 ядром и 10 Гб диском.
Так в первой версии скрипта использовался soffice
, а дальше в версии handler2.php
уже использовались только библиотеки написанные на PHP для конвертации в таком порядке:
DOCX -> HTML
HTML -> XLSX
После этого, получается готовый Excel файл, из которого скрипт циклом ищет все группы из массива, собирает информацию о парах и отправляет в базу данных MySQL.
В первой версии скрипта сначала расписание отправлялось в нашу беседу ВК, дальше уже пошла работа над сайтом.

Помню этот день, сидим на паре и в беседу ВК со второй моей страницы приходит сообщение с расписанием, все одногруппники были в восторге
Новый сайт
и новый bootstrap 4!
Когда было видно что скрипт отрабатывает чётко, уже началась работа над сайтом. Большая часть будущего сайта была взята с прошлой провальной идеи, а именно визуал.


По кнопке "Общее" можно было скачать с моего сайта расписание формата Word и просмотреть файл прямо в браузере используя API от Google Viewer (но он был медленный).
А так планировалось сделать вывод общей таблицы всех групп из базы данных, но так и не было реализовано.
По кнопке "Backup расписания" можно было увидеть список файлов с расписанием которые хранились месяц, а потом удалялись. Не особо полезно, но пару раз пригодилось.
3 курс, 2019 год
Периодически я исправлял разные баги, следил за стабильной работой. Скрипт иногда падал, просто потому, что где-то в названии файла то символ лишний, то реклама на облаке ломала парсинг, то ещё что-то. Но самое главное, это финальная версия скрипта handler3.php
Ах да, именно тогда я добавил на сайт метрику, чтобы наблюдать за посещаемостью.
Кроме исправлений, самым главным изменением было - получать расписание на телефон в виде SMS.
Помню была перемена между парами, для себя я понимал, что мне стало лень заглядывать на свой же сайт или заходить в беседу ВК чтобы посмотреть что за пары у нас будут на X день. Поэтому, моя ленивая наглость взяла верх, я захотел получать расписание в виде SMS.
Придя домой стал искать сервисы для этой цели с низкой стоимостью. Но, мне повезло найти сервис, который разработчикам позволял на свой номер получать максимум 5 штук смс в день бесплатно. Этого мне хватало за глаза.
Так, я по экспериментировал дома, смс приходили, залил обновленный скрипт и на следующий день пошел в колледж.
Сидя на паре мне пришла SMS, я показал другу, тот был в радостном шоке

Тогда были лимиты на символы на одно сообщение. Русские символы - 70, английские - 140 максимум. По этой причине использовался транслит, для того, чтобы иметь гарантию полной информации в сообщении.
После этого, одногруппники стали просить тоже отправлять им SMS. Дал инструкцию как я смогу отправлять им эти сообщения, они дали мне нужные данные которые я положил в скрипт. И всё начало работать.
4 курс, 2020 год
За работой скрипта я уже смотрел не так активно как раньше, потому что он работал и душа успокоилась из-за его стабильности. Иногда он мог упасть по какой-то причине, я быстро вносил временные фиксы которые потом приходилось удалять. Чаще всего из-за "корявых" названий файлов.
К примеру, на что был ориентирован скрипт: 22.02.18.docx, 24.01.18.docx
А что могло быть в облаке: 22.06.docx, 12_03_18.docx
Сейчас я понимаю как это можно было бы решить, но тогда как-то и мыслей не было
Был случай, я оказался с одним другом в кругу его знакомых и один паренёк подходит ко мне спрашивает меня "...а ты сделал расписание в колледже?", я ответил да, на что он сказал "..у нас в группе все пользуются твоим сайтом". Как выяснилось, этот паренёк был 1 курс. Меня это удивило, как сарафанное радио разбежалось.
Тогда и посещаемость сайта внезапно стала высокой. Исключая всех ботов, в целом по метрике было видно что на сайт заходят примерно весь колледж. (Увы, скриншота не нашел)
Дальше периодически стал слышать какую-то обратную связь от преподавателей, которые даже у нас не преподавали. Говорили о том, что это очень удобно и они своим студентам советуют пользоваться. Также к примеру спрашивали меня о том, будет ли отдельная кнопка "Преподавателям", чтобы преподаватель мог по своей фамилии увидеть названия групп у которых будет его пара.
Ещё помню, что какие-то ребята моей специальности ТКС, но младше на 2 года пытались сделать улучшенную версию моей разработки и в итоге не реализовали это. Окак
Иногда возникали ошибки из-за человеческого фактора того человека который заполнял расписание — например, было «ТКС5» вместо «ТКС-5». Ко мне обращались с такими замечаниями, но я намеренно не исправлял их самостоятельно. Вместо этого я подчеркивал, что ответственность за корректность данных лежит на человеке, который составляет расписание. Такой подход заставил его быть внимательнее при заполнении, и со временем ошибок стало меньше.
Чем закончился 4 курс
В один из дней меня не было в колледже, но ответственный человек за сайт колледжа искал меня, тогда друг передал мой номер телефона. Мы созвонились. Мне предложили перенести сайт на поддомен сайта колледжа потому что у меня последний курс, а этой штукой пользуются. Также предложили небольшой бонус к стипендии.
Сайт я перенёс на поддомен. Но мой работал до 1 июля 2021 года, посещаемость не снижалась. Видимо, это всё произошло после следующего сообщения которое я оставил на сайте:
Сайт tks5.ru существует последний учебный год. Идея сделать данный сайт на замену облака (mail.ru, куда нам заливают расписание) была весьма успешной.
Мне хотелось передать сайт кому-то кто остаётся в колледже, но некому. Спасибо всем кто заходил сюда и пользовался данной системой. Очень приятно.
Здесь никогда не было рекламы, сайт существовал на простой идее специально для всех людей, кому не хотелось скачивать постоянно документ Word.
К сожалению, 1 июля в 2021 году сайт прекратит своё существование раз и навсегда.
Философия сайта
Быстро. Удобно. Без лишнего. Доступ каждому — никакой рекламы. Идеально на любом устройстве.
Самый страшный момент за историю существования сайта
Сайт служил верой и правдой почти 2 года на хостинге Ай**р. Дальше был рейд, доступ к сайту был утерян на некоторое время. Бэкапов не было, с бОльшим доверием всё хранилось на vds, но после этой ситуации везде и во всём у меня есть бэкапы.
Тогда, я успел быстро переехать на другой хостинг, не имея важных файлов, но оставляя сообщение для пользователей

17.12.2019 в 11 часов на дата-центр хостинга где расположен сайт tks5.ru был рейд. Два руководителя не могут между собой поделить бизнес и из-за этого было отключено электричество в дата-центре. Постарадали около 50.000 сайтов (официальная информация). Резервной копии сайта нет, ждём восстановления. Сайт уже переехал на другой хостинг.
Идёт процесс восстановления!Приношу извинения за временные неудобства.
Вывод
Время в колледже лично для меня было лучше, чем в школе, я вспоминаю те времена с приятным ощущением на душе.
В первую очередь делалось для себя, для своего удобства. Но и было понимание, что это нужно не только мне. Этот проект облегчал во многом жизнь пользователям.
На то время, я восхитился такими людьми как: Стив Джобс, Павел Дуров.
Хвала безумцам. Бунтарям. Смутьянам. Неудачникам. Тем, кто всегда некстати и невпопад. Тем, кто видит мир иначе. Они не соблюдают правила. Они смеются над устоями. Их можно цитировать, спорить с ними, прославлять или проклинать их. Но только игнорировать их – невозможно. Ведь они несут перемены. Они толкают человечество вперед. И пусть кто-то говорит: безумцы, мы говорим: гении. Ведь лишь безумец верит, что он в состоянии изменить мир, - и потому меняет его. (c) Стив Джобс
А Павел Дуров восхищал своей гениальностью в простом понимании к UI во всём. Хотелось сделать так, как бы родное по душе пользователю. Кроме этого, сайт всегда содержался мной из моего кармана, я никогда не вставлял рекламу и гордился свободой сайта.
По итогу, доступ к моему сайту оказался в 3 раза (меньше вес) быстрее чем к сайту облака и тратил в 10 раз меньше времени пользователя на какие-то действия ради получения информации о парах.
Для статьи мне всё же удалось откопать бэкапы сайта и поднять его для того чтобы дать возможность потрогать, поэтому, прошу сюда: https://vadimboev.ru/college/index.php
Впервые, спустя много времени, я выкладываю исходный код сайта и всё что в нём было в открытый доступ, вдруг кому-то будет интересно посмотреть.
Предупреждаю, вероятно, обработчик расписания запустить не получится, многие вещи устарели и в целом требуется это всё переписать. Можно лишь посмотреть как это было внутри.
Я знаю насколько там всё ужасно, поэтому мнения о плохом коде не интересы.
В соответствии с 152-ФЗ, все персональные данные были удалены/замазаны. Ссылки ведущие на облако были видоизменены. Сохраненная база данных была отредактирована. Файлы с самим расписанием .docx/.xlsx удалены.
Репозиторий на Github: https://github.com/VadimBoev/tks5
Как это история повлияла на меня
Спустя какое-то время после окончания колледжа мне стало интересно разрабатывать проекты которые занимают мало места в памяти, работают оптимизировано и так далее.
Одним из таких примеров является мой ремейк игры Flappy Bird который я делал для Android где размер APK файла меньше 100 Килобайт!
Этот репозиторий набрал более 2.3 тысяч звёзд
Ещё один пример, но это уже под ключ разрабатывалось. Мне для решения одной большой задачи потребовалось написать свой web-сервер на C++, который кушал всего 1 Мегабайт оперативной памяти. Он выполняет определенный функционал, парсит, отправляет запросы через cUrl и так далее.
Творите, создавайте, компьютерная наука это всего лишь биты информации
Комментарии (3)
revector
19.06.2025 16:15Делал расписание ещё на PC/XT в далёком 80-ом году, на Си. Голову пришлось поломать от "хотелок" закзачика. Работала прога на локальном компьютере в преподавательской. В общем мне заплатили )))
FanatPHP
19.06.2025 16:15Я знаю насколько там всё ужасно, поэтому мнения о плохом коде не интересы
Тут другое интересно - а читателям-то какой интерес смотреть на школьный говнокод? И зачем эти ностальгические сопли в хабе РНР? Это скорее в какой-нибудь читальный зал. В общем, статья прекрасно резюмируется заключительной фразой
Творите, создавайте, компьютерная наука это всего лишь чтобы огурцы ложкой банка майонеза
Van414
Знакомо до боли! Тоже на втором курсе устал от убогого сайта с расписанием и написал скрапер с нормальным интерфейсом довел почти до конца, осталось пару багов и хостинг и забросил Понял что сделал то что хотел интересную штуку для себя. А тратить время на доводку ради двух человек которые может воспользуются как-то лень стало Плюс экзамены подоспели.)