OnyxGram Developers
27 августа 2026
4 сборки за день, +20 −0 пунктов API.
- +
can_be_editedвChatMember— может ли спрашивающий бот менять права этого администратора. Поля не было вообще, хотя у вариантаadministratorоно обязательное. - ~
until_dateприходит у статусовrestrictedиkickedвсегда,0означает «навсегда». Раньше вместо нуля поле просто отсутствовало. - ~
can_edit_tagприходит у статусаrestricted. Значение повторяет право писать: отдельного ограничения за ним не стоит. - ~Те же три поля исправлены и в ответе getChatMember, не только в обновлении
chat_member.
Одного пропущенного поля хватает, чтобы обновление стало нечитаемым целиком — библиотека отказывается собирать объект участника, а не подставляет пустое значение. Обновление при этом остаётся в очереди и приходит снова каждые несколько секунд, так что бот перестаёт разбирать и все следующие обновления.
- ~Очередь обновлений сохраняет и читает все пятнадцать видов. Раньше в неё попадали только
message,channel_post,callback_query,inline_query,chosen_inline_result,pre_checkout_queryиguest_message, аchat_member,my_chat_member,chat_join_request,message_reaction,poll,poll_answer,edited_messageиedited_channel_postтерялись между сервером и ботом. - ~Касается и getUpdates, и вебхука: оба берут обновления из одного хранилища, так что смена способа доставки ничего не меняла.
Выглядело это как обновление без содержимого: счётчик update_id увеличивался, бот получал ответ — и все поля в нём были пустые. Типизированные библиотеки на такое не жалуются: раз ни одно поле не заполнено, ни один обработчик не совпадает.
Поэтому chat_member, my_chat_member и chat_join_request из сборки chatmember до этой сборки ни разу не дошли ни до одного бота, хотя на сервере формировались правильно. То же самое случилось с poll и poll_answer из сборки polls-members.
- ~sendPoll разбирает
options,correct_option_idsиcountry_codes, когда запрос пришёл какmultipart/form-data. До этого метод отвечалBad Request: poll options must be an arrayна совершенно правильный вызов.
В форме нет типов: любое поле — строка, и массив приезжает текстом ["да","нет"]. Остальные методы это уже учитывали, sendPoll — нет. Так запрос отправляют aiogram, python-telegram-bot, telegraf и почти всё, что умеет прикладывать файлы; в чистом JSON опросы работали и до этой сборки.
- +Обновления об опросах:
poll_answer— кто за что проголосовал,poll— новые счётчики и закрытие.poll_answerприходит только по неанонимному опросу: в анонимном сервер не раскрывает голосующего никому, включая автора. - +Полный набор параметров sendPoll:
correct_option_ids,question_parse_mode,question_entities,explanation_parse_mode,explanation_entities,open_period,close_date,allows_revoting,shuffle_options,allow_adding_options,hide_results_until_closes,members_only,country_codes. Варианты можно передавать объектами со своей разметкой. - +
joined_dateиsubscription_until_dateвChatMember. Дату вступления участника бот раньше не видел вообще. - ~banChatMember и unbanChatMember работают по пользователю, которого в чате нет, а getChatMember на постороннего отдаёт статус
leftвместо ошибки. - ~
chat_memberиmessage_reactionнужно запрашивать вallowed_updatesпо имени. Раньше сервер отдавал всё подряд, и бот, написанный до появления этих типов, получал незнакомые ему обновления.
Опрос-капча собирается так: type=quiz, is_anonymous=false, allows_revoting=false, open_period под таймаут. Ограничённый участник голосовать может — мут не мешает пройти проверку.
Правильные ответы викторины сервер не раскрывает до того, как человек проголосовал или опрос закрылся: в poll у неотвеченной викторины correct_option_id и explanation отсутствуют.