10000

Как я с голосовыми сообщениями боролся2

Сижу я, значит, пью чай, спорю в переписке с одной знакомой дамой об отношении к голосовым сообщениям. (Я из тех, кто считает их лютой дичью.) И внезапно понимаю, что столь желанной функции запрета приема голосовых сообщений от создателей мессенджеров я не дождусь, а просить каждого невоспитанного писать текстом...

Значит, настало время взять ситуацию в свои руки, и воспользоваться тем, что api Телеграма, в котором я переписываюсь чаще всего, открыт. Наверняка уже есть какое-то готовое решение в сети.

штош, иду в гугл. Ииии ничего нет, максимум боты для групп. Обидно, досадно, но ладно, придется вспоминать навыки кодинга, полученные и благополучно забытые лет 5 назад.

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

Обращаю внимание на подсказку где брать api_id и api_hash для авторизации, получаю, и переношу все это в текстовой файл, попутно удалив лишние строки:

Устанавливаю на компьютер Python, устанавливаю telethon (клиент телеграма, о котором идет речь), запускаю скрипт, авторизируюсь по номеру телефона, и вижу, что мой аккаунт теперь на любое входящее сообщение в ответ присылает "тестовое сообщение". Отлично, половина работы сделана =)

Теперь нужно каким-то образом вычислять какое из входящих сообщений является голосовухой, и какое из них прислано в личном чате (не в группе и не в канале). И эта информация, видимо, прячется в переменной "event". Курение документации в течение часа, к сожалению, ни к чему не приводит, все как на китайском. Отчаиваюсь, иду за дополнительной кружкой чая, в голове матеря любителей голосовух.

Спустя время приходит в голову идея: ищу расширение, которое полностью распечатывает массив, и вывожу всё содержимое "event" в консоль. И в куче текста вижу это:

попалась, голосовуха проклятая!! Щас мы тебя задетектим... Так подумал я, и ничего не получилось: прямой путь к переменной по многомерному массиву не возвращает что-либо типа bool, или хотя бы текст. В итоге скрипт при запуске жалуется на тип данных, и отрубается.

Что ж, пора снова наливать чай и копаться в документации. И снова ничего не выходит.

И раз законными методами не получилось, решил я попробовать кое-что очень грязное.. А именно, проверять, не содержится ли текст "voice=True" в массиве, полностью преобразованном в текст. Сказано - сделано, пора воплощать:

Проверяю: ессс, работает. Скрипт всегда отвечает "тестовое сообщение" на голосовуху.

Ну и дело остается за малым:

1) Добавить проверку на то, что чат личный. Тут все просто: ID каналов и групп всегда отрицательный, а у личных чатов он положительный.

2) Добавить удаление голосовухи из чата. С этим тоже проблем не возникло, кое-что полезное из документации все же удалось вытащить.

3) Поменять текст сообщения. Чтобы он был курсивным, пришлось поставить по 2 подчеркивания по краям.

Конечный результат:

Вы смотрите срез комментариев. Показать все
19
Автор поста оценил этот комментарий
> А именно, проверять, не содержится ли текст "voice=True" в массиве

И ведь не стыдно людям потом такое показывать... =)
раскрыть ветку (13)
20
Автор поста оценил этот комментарий

"Дяденька, ну я ведь не настоящий сварщик" (с)

Не, ну говнокод, конечно, но проблему же решил :)

раскрыть ветку (11)
20
Автор поста оценил этот комментарий
Если это выглядит глупо, но это работает, то это не глупо.
раскрыть ветку (10)
2
Автор поста оценил этот комментарий

Не, ну вот конкретно это - таки глупо, извините. Просто ТС - не профессионал в разработке, какой с него спрос? Справился - и молодец.


(А кого-нибудь из моей команды я бы за такое бил линейкой по пальцам, потому что для нормального разработчика это недопустимо)

раскрыть ветку (6)
0
Автор поста оценил этот комментарий
Ну никто из вашей команды такую полезную функцию не сделал, а он сделал)
какая разница как?)
раскрыть ветку (5)
0
Автор поста оценил этот комментарий

Мы сделали много других полезных штук.


Разница есть: в эффективности работы, в простоте поддержки, в красоте инженерного решения. Я понимаю, что не-разработчику это ничего не скажет, но разница есть. (А ТС всё равно молодец).

раскрыть ветку (2)
1
Автор поста оценил этот комментарий
Так для себя же делал)
Не для массовой публики

никто не делает. Ни хорошо, ни плохо. А он сделал.

Это как если бы сделал не-профи себе стол. И мастера такие «Да кто ж так делает?! Захочешь потом ножки на другие поменять - задолаешься! И колесики надо было - для большей эффективности! И инженерное решение - тьфу, никакой изящности в решении проблемы.»
Но ведь работает, функции выполняет. А то, что сделано не «как надо», так ведь и инструмент 5 лет в руках не держал, и не на продажу делал, для себя.

Ну вот как осуждать можно, если стол - загляденье и проблему существующую решил?)

upd. Или как мама делает торт - не кондитер, неправильнве технологии. Кондитера бы уволили за такое. А мне вкусно. И всем вкусно )
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Так а где я его осуждаю-то? Уже несколько раз написал, ТС - молодец!

Автор поста оценил этот комментарий

Разница в том что все проффи любят голосовые

раскрыть ветку (1)
Автор поста оценил этот комментарий
А это здесь каким боком?)
0
Автор поста оценил этот комментарий

Свинья с соломенным домиком так тоже говорила пока волк не пришёл. Прилетит в массиве "voice=True" по другому поводу какому-то и будет ложное срабатывание.

раскрыть ветку (2)
0
Автор поста оценил этот комментарий
У свиньи с соломенным домиком не работала основная функция защиты от волка
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Основная функция была предоставить ночлег. И вообще место, где жить.

5
Автор поста оценил этот комментарий
Извините
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку