Forwarded from 14:36 (🇰irill Grinchu🇰)
Ладно, можете кидать свои результаты в @grinrillik
У меня, например, 94 с половиной
У меня, например, 94 с половиной
Представляете, когда я начинал деволопить бота для яндух музыки, то знал только об одном, а тут оказывается еще один есть! Умеет в загрузку треков, поиск и вообще активно живёт в чатиках, а не в личке, а ещеее, а еще у него есть классная фича, о которой я уже думал в связи с отправой войсов в чатик моего бота. Да-да, распознование треков!
https://t.me/yamdbot
https://t.me/yamdbot
Telegram
Yandex.Music Bot
Неофициальный бот Яндекс.Музыки для загрузки треков.
Unofficial Yandex.Music bot.
Donate: @donate_alowave
Unofficial Yandex.Music bot.
Donate: @donate_alowave
Forwarded from Alowave Dev Blog via @like
This media is not supported in your browser
VIEW IN TELEGRAM
YM Update Beta 0.1.7
- Добавлено распознавание треков
- Добавлено распознавание треков
Marshal's channel
Остыл, теперь можно и рассказать. Дело в том, что я соглашаюсь на все конкурсы, что мне предлагают (в рамках учебного заведения), вот уже третий год. Пару дней назад отказался от очередного, да, возможно чутка поздно заявил об этом, но отказался. Как только…
Обязательно прочитайте прошлый пост!
Ну что же. Продолжение... Тогда я принял участие в каком-то там этапе, да. Всё же не предупредил заранее, а только в последние дни. Ок, пошел просто, не собирался напрягаться. Просто сидел, чиллил и делал по тиху, надеясь на то, что у других ребят выйдет больше. Ушел минут за 20 до конца, когда поставил определенную точку в прогрессе и понимал, что след. фичу уже делать времени нет. Всё это вообще не суть, я занял первое место, к сожалению.
И вот пошла речь о республике, я вновь (еще до НГ) сказал, что не буду принимать участие. Мне сообщили, что после НГ поговорим. Поговорили... Сегодня...
То, что там опять говорили про мою обязанность уже писать не буду. Просто запишу мелкими (постараюсь) пунктами.
- Как я не пытался объяснить, что мне нафиг не нужен C#, WPF, Entity Framework, что я ПИТОНИСТ - администрация ни в какую не понимает.
- Продолжают рассказывать как могут послать в жопу при распределении и что на вызов меня с компании всем будет насрать (я уже думаю о выплате средств).
- Не хотят рассматривать другие кандидатуры (2 и 3 место), хотя я топлю за этих ребят и им это надо больше, чем мне. Да и C# это их, прокачают себя, что есть хорошо.
- Завтра нужно дать ответ, ибо будут отправлять какой-то там индивидуальный план по подготовки учащегося и уж очень хотят вписать мою фамилию туда.
- Завтра дать ответ, а только в 20х числах сообщат конкретно, что будет за стэк технологий. Поговаривают, что там вообще добавится 1С, а по скорости разработки понятно что будет лидировать. Ну уж в это говнище я лезть не буду! Т.е. мне ща надо согласиться на хрен пойми что!
- В прошлом сообщении я там за принцип сказал, но чета опять на меня давят, а мне бы дожить до выпуска отсюда. Тогда я был на эмоциях, да и сейчас. В общем, я допускаю, что забью на то, что написал в конце.
Теперь посмотрим чутка с другой стороны.
- Я работаю не только на работе, но и над личными проектами. Если сюда еще влетит этот бесполезный C#, то спать я буду еще меньше, а пар пропускать больше. Поэтому я намекнул им на поблажку в посещении пар.
- Если подготовлюсь и выиграю (опыт, да и всё для этого есть, кроме желания), то имею шанс попасть в банк талантливой молодежи Беларуси.
- Зачем мне этот банк? Проскочила инфа, что скоро примут закон (как раз до моего призыва), что тех, кто в этом банке, не будут призывать в армию. К сожалению, это пока только проект и даже не закон. Инфы в интернете не нашел, риск на это надеяться трында какой!
Не знаю, очень скверно. В деревню по расределению попасть не хочу, за шанс избавиться от армии (хоть и временно) нужно браться. Не хочу учить говно бесполезное на один раз. Я шо, шлюпка? Да и в целом представлять это УО уже желания нет (ибо им плевать на моё мнение и заботятся только о своей репутации)
А, еще. Если согласиться, тип, "чего тебе стоит?", то это надо готовиться, учить. Не могу просто взять и поехать с нифига (я так сделал два года назад и сказал, что больше так не поступлю).
UPD. Если попасть в банк, то опять не останут. Дальше мучать будут. Отправят на межнар
Айда опросик?
Ну что же. Продолжение... Тогда я принял участие в каком-то там этапе, да. Всё же не предупредил заранее, а только в последние дни. Ок, пошел просто, не собирался напрягаться. Просто сидел, чиллил и делал по тиху, надеясь на то, что у других ребят выйдет больше. Ушел минут за 20 до конца, когда поставил определенную точку в прогрессе и понимал, что след. фичу уже делать времени нет. Всё это вообще не суть, я занял первое место, к сожалению.
И вот пошла речь о республике, я вновь (еще до НГ) сказал, что не буду принимать участие. Мне сообщили, что после НГ поговорим. Поговорили... Сегодня...
То, что там опять говорили про мою обязанность уже писать не буду. Просто запишу мелкими (постараюсь) пунктами.
- Как я не пытался объяснить, что мне нафиг не нужен C#, WPF, Entity Framework, что я ПИТОНИСТ - администрация ни в какую не понимает.
- Продолжают рассказывать как могут послать в жопу при распределении и что на вызов меня с компании всем будет насрать (я уже думаю о выплате средств).
- Не хотят рассматривать другие кандидатуры (2 и 3 место), хотя я топлю за этих ребят и им это надо больше, чем мне. Да и C# это их, прокачают себя, что есть хорошо.
- Завтра нужно дать ответ, ибо будут отправлять какой-то там индивидуальный план по подготовки учащегося и уж очень хотят вписать мою фамилию туда.
- Завтра дать ответ, а только в 20х числах сообщат конкретно, что будет за стэк технологий. Поговаривают, что там вообще добавится 1С, а по скорости разработки понятно что будет лидировать. Ну уж в это говнище я лезть не буду! Т.е. мне ща надо согласиться на хрен пойми что!
- В прошлом сообщении я там за принцип сказал, но чета опять на меня давят, а мне бы дожить до выпуска отсюда. Тогда я был на эмоциях, да и сейчас. В общем, я допускаю, что забью на то, что написал в конце.
Теперь посмотрим чутка с другой стороны.
- Я работаю не только на работе, но и над личными проектами. Если сюда еще влетит этот бесполезный C#, то спать я буду еще меньше, а пар пропускать больше. Поэтому я намекнул им на поблажку в посещении пар.
- Если подготовлюсь и выиграю (опыт, да и всё для этого есть, кроме желания), то имею шанс попасть в банк талантливой молодежи Беларуси.
- Зачем мне этот банк? Проскочила инфа, что скоро примут закон (как раз до моего призыва), что тех, кто в этом банке, не будут призывать в армию. К сожалению, это пока только проект и даже не закон. Инфы в интернете не нашел, риск на это надеяться трында какой!
Не знаю, очень скверно. В деревню по расределению попасть не хочу, за шанс избавиться от армии (хоть и временно) нужно браться. Не хочу учить говно бесполезное на один раз. Я шо, шлюпка? Да и в целом представлять это УО уже желания нет (ибо им плевать на моё мнение и заботятся только о своей репутации)
А, еще. Если согласиться, тип, "чего тебе стоит?", то это надо готовиться, учить. Не могу просто взять и поехать с нифига (я так сделал два года назад и сказал, что больше так не поступлю).
UPD. Если попасть в банк, то опять не останут. Дальше мучать будут. Отправят на межнар
Айда опросик?
Я хотел начать орать, но рано. Тип яндух сохраняет и отдает не экранированные данные, а потом вспомнил, ШО ТАК И НАДО!
Знаете же какая лучшая практика против XSS всяких? Экранировать при ВЫВОДЕ, а не ВВОДЕ!
Почему? Да потому что если выйдет найти место без фильтра на ввод (ну или тупо в базу запись вставить), то пассивная XSS начнёт работать везде, где есть вывод этих данных.
С другой стороны, такой подход обязывает всех использующих API экранировать у себя локально и вероятность того, что где-нить прогер забудет это сделать высока.
Короче я бы зарофлил и пошёл фигачить ХСС в приложухи яндуха)0))
UPD. Они в своих прилах вообще юзают HTML вставки для банеров там всяких и прочей лабуды)))
UPD2. Норм люди обёртку над выводом пилят, я тоже адекватным стараюсь быть
Держите еще ссылку на вики шо это, некоторым полезно Межсайтовый скриптинг
Знаете же какая лучшая практика против XSS всяких? Экранировать при ВЫВОДЕ, а не ВВОДЕ!
Почему? Да потому что если выйдет найти место без фильтра на ввод (ну или тупо в базу запись вставить), то пассивная XSS начнёт работать везде, где есть вывод этих данных.
С другой стороны, такой подход обязывает всех использующих API экранировать у себя локально и вероятность того, что где-нить прогер забудет это сделать высока.
Короче я бы зарофлил и пошёл фигачить ХСС в приложухи яндуха)0))
UPD. Они в своих прилах вообще юзают HTML вставки для банеров там всяких и прочей лабуды)))
UPD2. Норм люди обёртку над выводом пилят, я тоже адекватным стараюсь быть
Держите еще ссылку на вики шо это, некоторым полезно Межсайтовый скриптинг
text = TextBuilder()Сойдёёёёт, так давно с
text.add(f'Моя музыка')
text.add('<b>{display_name}</b>', display_name=context.client.account.display_name)
def add(self, line='', **values):
escaped_values = {key: escape(value) for key, value in values.items()}
.format
не работал, ужас.escape
из пакета html
И тут я понял, что не шарю вообще за ООП, особенно в питоне. Или спать уже хочу. Кооороооочеее
Хочу замутить несколько синглтон классов (3). Возьмем изи пример:
Если вынести выше и унаследоваться, то каждый класс будет юзать один экземляр родителя и будет полная белеберда. У всех будет доступ к инстансу обобщённого класса-родителя, а не текущего класса
UPD. Офигенно объяснил. Короче поле
Хочу замутить несколько синглтон классов (3). Возьмем изи пример:
class Singleton:
__singleton = None
@classmethod
def get_instance(cls):
if cls.__singleton is not None:
return cls.__singleton
else:
raise RuntimeError(f'{cls.__name__} not initialized')
Вооопрооос, если я хочу несколько синглтон классов и не хочу дублировать get_instance
в каждом из нём, то как обобщить? Если вынести выше и унаследоваться, то каждый класс будет юзать один экземляр родителя и будет полная белеберда. У всех будет доступ к инстансу обобщённого класса-родителя, а не текущего класса
UPD. Офигенно объяснил. Короче поле
__singleton
будет иметь общее значение у всех классов, что унаследовались от Singleton
UPD2. Ну точнее как, get_instance
будет возвращать общее поле родителя, а не текущего класса. А как сделать так, чтоб с текущего класса( не хооочууу в каждом классе get_instance
иметь(
Marshal's channel
И тут я понял, что не шарю вообще за ООП, особенно в питоне. Или спать уже хочу. Кооороооочеее Хочу замутить несколько синглтон классов (3). Возьмем изи пример: class Singleton: __singleton = None @classmethod def get_instance(cls): …
Что-то я уснул по щелку пальцев без задней мысли об этом, утром начали приходить нотификейты, разбудившие меня. Увлекательно предисловие.
Это мне писали "нафига тебе аж 3 синглтона?".
Мне что-то в голову ударило, что создать класс и там в полях инициализировать свои сервисы (которые я хотел переделать на синглтон) и потом шарить один экземляр этого класса с сервисами на всё приложение не оч хорошо.
Надо доразобраться с DI
UPD. Собсна видос покрывает чуть ли не всё, что надо знать.
Dependency Injection - Jakob Jenkov
Пока без понятия как более правильно такое делать в питоне и делают ли. Вон кто-то аж либу юзает: Inject - PyPi, которая в своём описании "тонко" намекает
Это мне писали "нафига тебе аж 3 синглтона?".
Мне что-то в голову ударило, что создать класс и там в полях инициализировать свои сервисы (которые я хотел переделать на синглтон) и потом шарить один экземляр этого класса с сервисами на всё приложение не оч хорошо.
class Services:
def __init__(track_watcher=TrackWatcher()):
self.track_watcher = track_watcher
services = Services()
А потом где надо from services import services
services.track_watcher.subscribe(update, context, track)
Когда мне сказали, что это Dependency injection - я ушёл гуглить. То, что нагуглил, вроде подходит под моё. Можно не переписывать ✨Надо доразобраться с DI
UPD. Собсна видос покрывает чуть ли не всё, что надо знать.
Dependency Injection - Jakob Jenkov
Пока без понятия как более правильно такое делать в питоне и делают ли. Вон кто-то аж либу юзает: Inject - PyPi, которая в своём описании "тонко" намекает
the python way, the good way
YouTube
Dependency Injection
Dependency injection is a design technique where dependencies are injected into an object from the outside, instead of being created by the object itself on the inside. A dependency is an object that is needed by another object for that object to do its job.…
Навигация
Так как в тележке можно редачить древние сообщения, то можно завести сборник постов. Там где не просто круги рисовать, покекать, а почитать что-то можно.
- CORS в FF
- Узнаем откуда отбрэнчевались (не всегда правильно выводит)
- Какие-то вкусности с спринта на работе (Джанго)
- Моя статейка на Habr'e после конкурса "IT-Планета"
- Офигенно-годные подкасты с англ фразами на яндух музыке (больше 900 шт)
- Докер и его кэша всякие
- Моё знакомство с GitHub Actions
- Про Headless CMS
- Очепчятка в янух апи
- Офигел с алхимии
- Разобрался когда документ должен быть встроенным, а когда нет (MongoDB)
- Эмоции после перехода на MongoDB
- Счастливый я с 100+ звёздами на GitHub'e у моей либы
- Про бинарные данные, передачу их в JSON, размер utf-8
- О самозагруженных треках в яндух музыке
- Немного о проблеме бота, которую я потом пытался решить (причины проблемы)
- Юзаем последний PyPy на Heroku
- Мой кэш запросов для API Яндекс.Музыки в ТГ боте
- PyPy, тайп хинты, жирные запросы у яндуха, моя вторая статья на Habr'e
- Про новую версию pytest и как засаппортить python3.6
- Вся активность на гитхабе за 2019 с приватными репами
- Мои итоги 2019 года
- Репорт бага в Telegram Desktop в URI
- XSS, не эскейпнутые данные у яндуха
- Dependency Injection
- Статистика и аналитика для ботов на примере бота Яндекс.Музыки и сервиса Chatbase.
Так как в тележке можно редачить древние сообщения, то можно завести сборник постов. Там где не просто круги рисовать, покекать, а почитать что-то можно.
- CORS в FF
- Узнаем откуда отбрэнчевались (не всегда правильно выводит)
- Какие-то вкусности с спринта на работе (Джанго)
- Моя статейка на Habr'e после конкурса "IT-Планета"
- Офигенно-годные подкасты с англ фразами на яндух музыке (больше 900 шт)
- Докер и его кэша всякие
- Моё знакомство с GitHub Actions
- Про Headless CMS
- Очепчятка в янух апи
- Офигел с алхимии
- Разобрался когда документ должен быть встроенным, а когда нет (MongoDB)
- Эмоции после перехода на MongoDB
- Счастливый я с 100+ звёздами на GitHub'e у моей либы
- Про бинарные данные, передачу их в JSON, размер utf-8
- О самозагруженных треках в яндух музыке
- Немного о проблеме бота, которую я потом пытался решить (причины проблемы)
- Юзаем последний PyPy на Heroku
- Мой кэш запросов для API Яндекс.Музыки в ТГ боте
- PyPy, тайп хинты, жирные запросы у яндуха, моя вторая статья на Habr'e
- Про новую версию pytest и как засаппортить python3.6
- Вся активность на гитхабе за 2019 с приватными репами
- Мои итоги 2019 года
- Репорт бага в Telegram Desktop в URI
- XSS, не эскейпнутые данные у яндуха
- Dependency Injection
- Статистика и аналитика для ботов на примере бота Яндекс.Музыки и сервиса Chatbase.
Большое спасибо @olegkovalov за публикацию в подборке каналов в @oleg_log! Вас сейчас уже приличное количество, но, надеюсь, меня это никак не смутит. Поэтому я в очередной раз выкладываю ночную какулю, а утром смотрю на неё и чуть что исправляю ✨
Я из принципа уже не хочу хранить callback дату инлайн кнопок в монго. Продолжаю страдать с бинарными данными.
Раньше было так: указывался формат, по нему шла распаковка. Всё жестко ограничено до безобразия. Из-за этого я не мог поддерживать самозагруженные треки (ибо они у яндуха UUID, а не просто ID). Т.е. формат был
Поэтому, было решено чутка улучшить encode&decode данных:
1. Добавить поддержку строк (для UUID'a).
2. Распаковывать динамически (если есть еще байты, то брать слайс по размеру последнего формата и анпакать).
Решения вродь классные, но то, что вышло, мне особо не нрав (код ниже).
Вышло так, что строки оказались заифаны. Столкнулся с проблемой указания их длины. Вариантов так-то не много.
1. Указать длину перед строкой. Так-то да, но какие-то манипуляции с тем, что мы распаковали число, а это оказалось не часть данных которую надо будет передать дальше, а часть формата. Лабуда. Хотя, если принять
2. Паковать строку без указания длинны. Распаковка тогда от первой встреченной
С продолжением формата всё понятно вродь. Я заюзал итератор по формату, с дефолтным значением на последний элемент, чтобы продлить его. Храню текущую позицию и прибавляю к ней
В общем пока писал пост, уже понял, что надо переписывать строки на указание длины.
А еще я уже потерял весь смысл от этих байтов, нафига (вообще интересно :D)? Просто бы положил в кнопку да и не парился. Раньше было необходимо, чтобы влезть в огрань телеги (64 байта utf-8 в callback дату кнопки влазит) , а сейчас я всё у себя кэширую и мне не надо много хранить у клиента, так, пару чиселок, юидик один
Я из принципа уже не хочу хранить callback дату инлайн кнопок в монго. Продолжаю страдать с бинарными данными.
Раньше было так: указывался формат, по нему шла распаковка. Всё жестко ограничено до безобразия. Из-за этого я не мог поддерживать самозагруженные треки (ибо они у яндуха UUID, а не просто ID). Т.е. формат был
l
, а для UUID'a надо s
в определённое кол-во символов (36?). Более того, из-за жесткой прописи формата "пакета" я не мог передавать неопределённое кол-во тех же треков. Из-за этого на последних страницах плейлиста (при пагинации ведь округляем вверх), отсутствовала кнопка "скачать текущую страницу". Списал это на фичу, хотя был костыль. Ибо в кнопке хранились все 7 ID'ов треков (на одной странице столько) и никак не меньше!Поэтому, было решено чутка улучшить encode&decode данных:
1. Добавить поддержку строк (для UUID'a).
2. Распаковывать динамически (если есть еще байты, то брать слайс по размеру последнего формата и анпакать).
Решения вродь классные, но то, что вышло, мне особо не нрав (код ниже).
Вышло так, что строки оказались заифаны. Столкнулся с проблемой указания их длины. Вариантов так-то не много.
1. Указать длину перед строкой. Так-то да, но какие-то манипуляции с тем, что мы распаковали число, а это оказалось не часть данных которую надо будет передать дальше, а часть формата. Лабуда. Хотя, если принять
ls
за пару и никак иначе, то вроде ничего так.2. Паковать строку без указания длинны. Распаковка тогда от первой встреченной
s
до конца. Сразу к минусам этого способа: нельзя указать несколько строк, нельзя вообще что-либо передать после s
. UPD. На самом деле можно, идя с конца, зная форматы и их размер, но тогда только одна s
может быть.С продолжением формата всё понятно вродь. Я заюзал итератор по формату, с дефолтным значением на последний элемент, чтобы продлить его. Храню текущую позицию и прибавляю к ней
step
, где step
- это calcsize()
формата, что продлил.В общем пока писал пост, уже понял, что надо переписывать строки на указание длины.
А еще я уже потерял весь смысл от этих байтов, нафига (вообще интересно :D)? Просто бы положил в кнопку да и не парился. Раньше было необходимо, чтобы влезть в огрань телеги (64 байта utf-8 в callback дату кнопки влазит) , а сейчас я всё у себя кэширую и мне не надо много хранить у клиента, так, пару чиселок, юидик один
Вот собсна
Такими темпами всего бота по кускам уже собрать можно будет 😂
И да, это всё про ботика @music_yandex_bot
UPD. Не спрашивайте откуда там какие-то рандомные f-строки)
decode
, так, посмотреть, не отдохя далеко, побить меня. А если хочется далеко, то вот ссылка на весь мой класс с callback датой: https://codepaste.ml/3031bf43/Такими темпами всего бота по кускам уже собрать можно будет 😂
И да, это всё про ботика @music_yandex_bot
UPD. Не спрашивайте откуда там какие-то рандомные f-строки)
Статистика и аналитика для ботов на примере бота Яндекс.Музыки и сервиса Chatbase.
Пару слов о сервисе. В далёком 2017 году компашка людей из гугла запилила сервис для ботов с ИИ. Гугл взяла их под крылышко и сервис считается гугловым.
Сам сервис заточен конкретно на ботов, которые на нейронках генерят ответы пользователю. Собсна название говорит само за себя, однако! Однако еще в 2017 году я начал использовать его как аналитику для обычных ботов. Тогда выбор был не очень большой. Был Botan.io (эдакий мост между яндекс аппметрикой и ботами, раньше я использовал его, сейчас проект мёртв). К сожалению и chatbase не развивается, застрял в 17 году. Пытается выглядеть законченным продуктом.
Перейдём к его использованию. Быстро пробегусь по тому, что у нас есть.
Платформа. Если ваш бот работает не только в TG, но и в других местах, можно легко отделять их друг от друга. Лично я живу только в TG, но использую эту возможность по максимуму. Я разделяю статистику пользователей из разных регионов. У некоторых пользователей бота доступно поле
Версионность. Как и с платформой. Легко отделяем одну статистику от другой.
Тип отправителя. Имеется агент и пользователь. При отправке сообщения юзеру шлём с типом агент, если юзер нам прислал - пользователь. Это построит нам целые переписки при анализе поведения пользователей.
Намерение (Intents). Изначально заточен для того, чтобы понять смысл сообщения пользователя. Например, что он с нами поздоровался. Я же использую как стейты того, что он сделал. Проще говоря, просто указываю имя хандлера, который обработал его сообщение. Указывать надо как при отправке сообщения юзера, так и бота, для связи этих двух сущностей.
Not Handled. Можно передать с сообщением только с типом user. Сообщаем о том, что не поняли, что от нас хотят. Я использую как лог левых сообщений, на которых нет обработчиков (просто интересно). И как логирование ошибок.
Помимо всего этого конечно же мы указываем время, ID юзера. Я использую ID с телеги, а не из моей БД.
Стату можно собирать в пачу и отправлять одним запросом, что удобно (я ещё и в отдельных потоках это делаю).
Прикрутили отправку статы и получили следующее:
Активность юзеров, посещения, уники, кол-во сессий, авг сессий на юзера, среднее время на сессию, лог ошибок. Все это с фильтрами по версиям, датам, платформам.
Фигня, да? Согласен.
Переходим к самому интересному: session flow. Мы видим как пользователи передвигаются по нашему боту! Мы видим всё дерево от начало общения до последнего действия! Видим узкие места в юзабилити, как именно пользователи осуществляют переход к тому, или иному меню. Мы видим как нашим ботом пользуются! Сколько и куда пошло, сколько отвалилось. При желании можем открыть диалог с конкретным пользователем и проанализировать действия.
Что-нибудь еще? Дааа!
FUNNELS
Это цепочки наших Intents, которые мы создаем сами. Например, дефолт цепочкой юзера может быть:
ИТОГО
Сервис пригоден для использования, всё красиво, современно, удобно. API простое и понятное, дока легка для понимания и полноценна. Правда, на сервисе как-то одиноко, складывается ощущение, что ты юзаешь что-то мёртвое... Я бы с удовольствием рассмотрел бы ещё другие варианты.
А что используете вы? ✨
UPD. Из пикчи сразу видно, что проблема с авторизацией, о которой я уже подробно писал, всё ещё есть
UPD2. Забыл рассказать о том, что не использую. Сервис ещё имеет трек ссылок. Т.е. если вы рассылаете линки, то можно оборачивать их через chatbase и смотреть переходы и т.д.
Пикча с session flow
Пару слов о сервисе. В далёком 2017 году компашка людей из гугла запилила сервис для ботов с ИИ. Гугл взяла их под крылышко и сервис считается гугловым.
Сам сервис заточен конкретно на ботов, которые на нейронках генерят ответы пользователю. Собсна название говорит само за себя, однако! Однако еще в 2017 году я начал использовать его как аналитику для обычных ботов. Тогда выбор был не очень большой. Был Botan.io (эдакий мост между яндекс аппметрикой и ботами, раньше я использовал его, сейчас проект мёртв). К сожалению и chatbase не развивается, застрял в 17 году. Пытается выглядеть законченным продуктом.
Перейдём к его использованию. Быстро пробегусь по тому, что у нас есть.
Платформа. Если ваш бот работает не только в TG, но и в других местах, можно легко отделять их друг от друга. Лично я живу только в TG, но использую эту возможность по максимуму. Я разделяю статистику пользователей из разных регионов. У некоторых пользователей бота доступно поле
language
. Поэтому платформы у меня Telegram, Telegram-ru и т.д.Версионность. Как и с платформой. Легко отделяем одну статистику от другой.
Тип отправителя. Имеется агент и пользователь. При отправке сообщения юзеру шлём с типом агент, если юзер нам прислал - пользователь. Это построит нам целые переписки при анализе поведения пользователей.
Намерение (Intents). Изначально заточен для того, чтобы понять смысл сообщения пользователя. Например, что он с нами поздоровался. Я же использую как стейты того, что он сделал. Проще говоря, просто указываю имя хандлера, который обработал его сообщение. Указывать надо как при отправке сообщения юзера, так и бота, для связи этих двух сущностей.
Not Handled. Можно передать с сообщением только с типом user. Сообщаем о том, что не поняли, что от нас хотят. Я использую как лог левых сообщений, на которых нет обработчиков (просто интересно). И как логирование ошибок.
Помимо всего этого конечно же мы указываем время, ID юзера. Я использую ID с телеги, а не из моей БД.
Стату можно собирать в пачу и отправлять одним запросом, что удобно (я ещё и в отдельных потоках это делаю).
Прикрутили отправку статы и получили следующее:
Активность юзеров, посещения, уники, кол-во сессий, авг сессий на юзера, среднее время на сессию, лог ошибок. Все это с фильтрами по версиям, датам, платформам.
Фигня, да? Согласен.
Переходим к самому интересному: session flow. Мы видим как пользователи передвигаются по нашему боту! Мы видим всё дерево от начало общения до последнего действия! Видим узкие места в юзабилити, как именно пользователи осуществляют переход к тому, или иному меню. Мы видим как нашим ботом пользуются! Сколько и куда пошло, сколько отвалилось. При желании можем открыть диалог с конкретным пользователем и проанализировать действия.
Что-нибудь еще? Дааа!
FUNNELS
Это цепочки наших Intents, которые мы создаем сами. Например, дефолт цепочкой юзера может быть:
Меню -> Умные плейлисты -> Плейлист дня -> Скачать текущую страницу
Я создаю такие цепочки из отправленных Intents и потом отслеживаю уровень их достижимости. Наблюдаю за тем, как люди поэтапно проходят по ней и сколько людей. Цепочкам можно задавать имена.ИТОГО
Сервис пригоден для использования, всё красиво, современно, удобно. API простое и понятное, дока легка для понимания и полноценна. Правда, на сервисе как-то одиноко, складывается ощущение, что ты юзаешь что-то мёртвое... Я бы с удовольствием рассмотрел бы ещё другие варианты.
А что используете вы? ✨
UPD. Из пикчи сразу видно, что проблема с авторизацией, о которой я уже подробно писал, всё ещё есть
UPD2. Забыл рассказать о том, что не использую. Сервис ещё имеет трек ссылок. Т.е. если вы рассылаете линки, то можно оборачивать их через chatbase и смотреть переходы и т.д.
Пикча с session flow
Marshal's channel
JetBrains ❤️ Подогнали мне лицензии на все свои продукты для разработки https://github.com/MarshalX/yandex-music-api
Давно не было шит-постов. Продлить в последний раз или переехать на проектную 🤔 для студентов на два года дают? Тогда продлить 🌚
И да-да, spark лучший почтовый клиент
И да-да, spark лучший почтовый клиент
Капец СМИ жоские. Через несколько секунд выкладывают материал на одну тему. Конкуренция у них там дикая, видать. Надеюсь, что ТГ шлёт без уведомления, когда я выключаю его и потом делаю прикрепление фотки 🤔
Ну и да, читаем
https://kod.ru/ton-gram-notice-jan-2020/
https://rozetked.me/news/9137-telegram-raz-yasnil-princip-i-osobennosti-raboty-ton-blockchain
UPD. Ориг https://t.tlinks.run/blog/ton-gram-notice
Ну и да, читаем
https://kod.ru/ton-gram-notice-jan-2020/
https://rozetked.me/news/9137-telegram-raz-yasnil-princip-i-osobennosti-raboty-ton-blockchain
UPD. Ориг https://t.tlinks.run/blog/ton-gram-notice
Искусство командной строки
UPD. Там за 67к звёзд, а я первый раз вижу. Всё плохо, или таких много?)
Продвинутому использованию командной строки зачастую не уделяют достаточного внимания. О терминале говорят как о чем-то мистическом. На самом же деле, это умение очевидно (и не очевидно) увеличивает Вашу продуктивность в работе. Данный документ является подборкой заметок и советов, которые я нашел для себя полезными, работая с командной строкой в Linux. Некоторые из них – простые и очевидные, но некоторые - довольно сложные. И предназначены для решения конкретных задач. Это небольшая публикация, но если Вы уже знаете обо всем, что тут написано, и можете вспомнить, как это все использовать – вы много знаете!https://github.com/jlevy/the-art-of-command-line/blob/master/README-ru.md
UPD. Там за 67к звёзд, а я первый раз вижу. Всё плохо, или таких много?)