Как в max поучить ссылку на пост в канале по api?

Возможно, как и я вы тоже столкнулись с проблемой, что не понятно как формировать ссылку на пост в макс на сервере.

Мне надо было сделать аналитику для амо срм. Менеджер публикует пост, я добавляю размеченную ссылку на бот MAX. Дальше клиент переходит в бот, я отправляю подготовленный текст под этот пост. Пишу данные по переходу в базу данных (для дашбородов) и прокидываю в амо, во все сделки пользователя комментарий, что клиент отреагировал на той пост с такой ссылкой(чтобы менеджер мог провалится на пост).

Из браузера это делает достаточно легко. Вы нажимаете правой кнопкой мыши и формируете ссылку

Как в max поучить ссылку на пост в канале по api?

В итоге вы получаете ссылку такого вида

Как в max поучить ссылку на пост в канале по api?

Как же мне получить это AZ1NexmAC6o хвост на сервер?

Благо много толковых ребят в моем чате Boto_shop и мне прислали пример на питоне

https://max.ru/c/{chat_id}/{base64(seq.to_bytes(8, 'big'))} chat_id = (ID канала в MAX) seq = значение max_mid из БД (столбец parsed_posts) base64 — urlsafe_b64encode, без padding (=)

Но мои страдания не закончились)))

Сам код достаточно простой, но есть особенность работы на js с макс

Ниже рабочий пример

const seqBigInt = BigInt(seq); const chat_id = chat_id; const seqBuffer = Buffer.alloc(8); seqBuffer.writeBigUInt64BE(seqBigInt, 0); let encoded_id = seqBuffer.toString('base64url').replace(/=/g, ''); const link = `https://max.ru/c/${chat_id}/` + encoded_id;

Проблема

Я на радостях пошел собирать логику. Достаточно быстро сделал всю задачу, и даже пошел записывать видео на ютуб.

Но после второй попытки, я не понимал почему у меня хвост на питоне фромируется легко, а на js отличается, при том что буквально на один символ.

Например надо такой AZ1NexmAC6o а у меня js отдавал AZ1NexmAC6aВ какой то момент у меня опускались руки. Я уже думал поднимать веб сервер на питоне. Пробовать в n8n на питоне сделать. Но питон в n8n тоже не работал. Короче полное не понимание почему кодировка отличалось на одну букву

Моя логика решения это вопроса

Я подумал, что проклятый n8n, надо от него отказаться совсем. Открыл курсор, накидал код на питоне, который шлет пост в канал, добавляет кнопку и получает ссылку. Все работает! Ура!

Иду дальше, все то же пишу на js. И опять ссылка не формирует. (ну вернее отличается одним символом)

Тут я совсем завис))

А оказалось проблема заключалось в работе функции на js JSON.parse()В силу того, что MAX апи seq отдает как большое число такого типа 116311884585437928.то из-за особенности работы js, который большие числа (больше 2^53 = 9 007 199 254 740 992 ) при формирования json использует float64 и теряется точность.

То есть у тебя на самом деле приходит от сервера max 116311884585437928 , а после JSON.parse() у тебя уже 116306181711408380

На n8n выглядит так решения. Надо включить получение бинарных данных от сервера. И прежде чем получить json seg обернуть в кавычки

Как в max поучить ссылку на пост в канале по api?

Код из картинки

replace(/"seq"\s*:\s*(\d+)/g, '"seq":"$1"')

Вы не представляете, как я был рад. У меня были и чувства радости и злости. Радости, что это аналитика работает. Злость, что в макс через одно место сделали формирования ссылки на посты

Вопросы

Знали ли до прочтения статьи, как формировать ссылку на пост?

Зачем макс, так усложнил нам жизнь?

Понравилась ли вам статья такого формата?

2 комментария