Рубрика развивается при поддержке

Нормальная инструкция по созданию стикеров-информеров

Полтора месяца назад я увидел статью про стикеры-информеры, а потом вышла статья от Aviasales, гордо названная инструкцией по созданию таких же. Тут меня осенило, что нужно сделать свои стикеры с блэкджеком и куртизанками, а потом написать адекватную инструкцию.

В закладки

Собственно, что я и сделал. Долго думать над темой мне было лениво, так что я взял самый тупой вариант — погоду. Ну и сделал стикеры, а потом забыл про них на месяц.

Как видите, я дизайнер от бога.

Пользуйтесь: ссылка для тех, у кого заблокирован Telegram.

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

Итак, собственно, инструкция:

Этап 0. Придумать, о чём вы хотите информировать людей.

Этап 1. Сделать бота в Telegram (про это уже был миллион статей, подробнее почитать можно, например, на «Хабре»).

Этап 2. Создать от имени бота свой стикерпак с первым стикером путём отправки простейшего запроса:

curl \ -F "name=myFirstStickerPack_by_YourBotName" \ -F "title=Stikerpack name" \ -F "emojis=❤️" \ -F "user_id=YourUserId" \ -F "png_sticker=@/path/to/FirstSticker \ https://api.telegram.org/bot<:botSecret>/createNewStickerSet

Тут возникают первые сложности:

Во-первых, где взять свой User ID: идём в поиск Telegram и ищем бота, который отвечает вашим ID (например @userid_bot).

Во-вторых, как загрузить картинку: загрузите её к себе на сервер и отдавайте в Telegram просто её адрес в интернетах.

В-третьих, Telegram говорит, что ваш запрос не секьюрный: мессенджер просит, чтобы у вас был SSL и вот это всё. Решение очевидно — выполнять запросы с адреса, на котором есть SSL, а не локально.

Этап 3. Добавляем свои стикеры.

К этому моменту вы уже должны уметь генерировать стикеры, которые вы будете загружать, сделать это можно на любом языке.

Всё практически аналогично предыдущему запросу, за исключением того, что это другой запрос и другие данные:

curl \ -F "name=myFirstStickerPack_by_YourBotName" \ -F "userid=YouUserId" \ -F "emojis=❤️" \ -F "png_sticker=@/path/to/FirstSticker \ https://api.telegram.org/bot<:botSecret>/addstickertoset

Поздравлю, вы восхитительны. Но что дальше?

Этап 4. Обновляем стикеры.

Чтобы обновить стикер, нужно удалить старый. Я делаю это не самым оптимальным путём, так как не хочу хранить на сервере промежуточную информацию о стикерах (читать как: мне лень было поднимать базы данных).

Поэтому получаем список стикеров в стикерпаке запросом.

curl \ -F "name=myFirstStickerPack_by_YourBotName" \ https://api.telegram.org/bot<:botSecret>/getStickerSet

Находим в нём стикер, который вы хотите обновить, по его эмодзи,
берём его file_id и затем удаляем путём отправки запроса:

curl \ -F "sticker=file_id" \ https://api.telegram.org/bot<:botSecret>/deleteStickerFromSet

А теперь просто отправляем новый, используя запрос из третьего этапа. Обратите внимание, если вы передаёте URL с адресом картинки, а не грузите её напрямую, то он каждый раз должен быть уникальным, так как Telegram кэширует данные.

Этап 5. Поздравляю, вы восхитительны, пишите статью на vc.ru и в «Спортлото»!

Если кому-нибудь будет интересно, я оформил всё вышесказанное в коде и опубликовал на GitHub. Будте готовы страдать, там наговнокожено

Материал опубликован пользователем.
Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Kokoulin Nikolay", "author_type": "self", "tags": [], "comments": 15, "likes": 18, "favorites": 67, "is_advertisement": false, "subsite_label": "dev", "id": 81148, "is_wide": true, "is_ugc": true, "date": "Fri, 30 Aug 2019 16:20:42 +0300", "is_special": false }
Облачная платформа
Основа для цифровизации бизнеса
0
{ "id": 81148, "author_id": 877, "diff_limit": 1000, "urls": {"diff":"\/comments\/81148\/get","add":"\/comments\/81148\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/81148"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 235819, "last_count_and_date": null }
15 комментариев
Популярные
По порядку
Написать комментарий...
1

```
Во-первых, где взять свой User ID: идём в поиск Telegram и ищем бота, который отвечает вашим ID (например @userid_bot).

Во-вторых, как загрузить картинку: загрузите её к себе на сервер и отдавайте в Telegram просто её адрес в интернетах.
```

Я правильно понял, что работоспособность стикерпака у сотен юзеров зависит от одного бесплатного бота и непонятного сервера?

А вообще крутая тема, ты восхитителен :)

Ответить
1

Ну ты можешь создать своего бота, который тебе ответит твоим же userid если ты его по какой-то причине не знаешь. Другого, адекватного способа получить свой userid нет.
Ну если ты переживаешь за надежность сервера с которого ты грузишь обновления, можешь грузить на прямую в телеграм, но мне было лень

Ответить
0

Пишем своему боту и смотрим ID в json, который придёт скрипту бота.

Ответить
0

ой, ступил) А удалить уже не могу

Ответить
0

Работоспособность стикеров не зависит от бота, который отвечает ID. Он нужен только один раз.

Ответить
1

Нормально

Ответить
1

Интересно, давайте на github)
Все думал кто-то сделает с курсами межбанка такое, но, вероятно, не судьба...

Сам, как говорится, «гуманитарий»

Ответить
0

Ну я оформил простой пример, это говнокод на богомерзком PHP, приправленный плохими практиками, так что будте готовы страдать: https://github.com/kokoulin/telegram-stickers

Ответить
0

Ушел в fintech из банка, за «страдать» соскучился. Спасибо)

Ответить
0

Это вы богомерзкий, а php в после 7.0 отличный язык для промышленной разработки.
Судя по вашему коду, вы даже не джун. А уже так смело поносите технологию.

Ответить
0

А вы не умеете в сарказм (:

Ответить
0

Вы восхитительны!

Ответить
0

Ееее, топовые стикеры))

Ответить
0

мне лень было поднимать базы данных

Мне тоже было лень, а потом я узнал про SQLite.

Ответить
0

И? Это все еще не быстрее чем написать цикл и запрос, и все ровно нужно еще сущности описывать для моделей которые в бд храниться будут. Для маленького тупого скрита это немного излишне

Ответить
{ "page_type": "article" }

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "Article Branding", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cfovx", "p2": "glug" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Баннер в ленте на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "disable": true, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ] { "page_type": "default" }