Agak sulit dipahami maksud dari error ini, kemunculannya tidak teratur dan yang menambah bingung dokumentasi tidak banyak membahas rinci error ini.
{
"ok": false,
"error_code": 400,
"description": "Bad Request: message is not modified: specified new message content and reply markup are exactly the same as a current content and reply markup of the message
}
SUMBER MASALAH
Hingga akhirnya baru disadari setelah error tersebut menyebut reply markup are exactly the same as a current reply markup. Ini menandakan ada kendala dalam tombol reply markup.
Dari pengalaman mencoba dalam bandwidth minimalis atau di jam traffic yang sibuk, frekuensi kemunculan error ini lebih banyak terjadi.
Muncul kecurigaan terjadinya penumpukan antrian queue dalam proses pengiriman pesan yang dianggap sebagai upaya brute force atau flooding request suatu hal yang tabu dalam tatanan keamanan di internet.
Ketika bot merespon dalam waktu yang lama dan tidak memberikan notifikasi pencerahan apapun kepada user mengenai apa yang sedang terjadi, kondisi ini memicu user menekan tombol beberapa kali sehingga memicu penumpukan request.
Request-request yang tertumpuk ini tentunya dengan konten yang sama, sedangkan Telegram memberikan kebijakan untuk menghindari pengiriman berulang untuk request yang kontennya masih sama.
TIMER PADA TOMBOL
Saat anda menggunakan Inline Keyboard dan saat tombol tersebut ditekan akan muncul icon timer di sudut kanan bawah dengan durasi 5-10 detik.
Timer semacam ini dikenal juga dalam self-destruct secret chat. Namun ternyata muncul pula di selain secret chat, sehingga kita dapat mengasumsikan timer yang dimaksud adalah toleransi interval antar request yang diterapkan Telegram dalam pengiriman pesan, interval sekitar 5-10 detik berdasarkan lamanya kemunculan icon timer tersebut.
TRIK sleep( 10000 )
Belum dibuktikan secara eksak, namun patut dicoba dengan melibatkan metode sleep( milidetik ). Sleep() akan membekukan script untuk sementara waktu sehingga kemungkinan bisa mengakomodasi interval antar pengiriman request.
Tambahkan sleep( 10000 ) untuk membekukan script dalam 10 detik atau atur sesuai kebutuhan dan tempatkan di bagian script yang menurut anda perlu untuk diberi interval waktu:
...
sleep( 10000 ); //10 detik
...
TOMBOL SEKALI PAKAI
Cara lainnya adalah dengan menerapkan "Tombol Sekali-Pakai" untuk mencegah user menekan tombol yang sama. Saat user menekan tombol tersebut, pesan dan tombol yang menyertainya langsung tergantikan dengan pesan dan tombol yang berbeda, sehingga diharapkan tidak terjadi pengiriman beruntun untuk pesan yang sama.
Pada Custom Keyboard tersedia opsi One-Time Keyboard walaupun sebenarnya hanya disembunyikan. Pada Inline Keyboard tidak tersedia fitur semacam iniSiLiKiDi
Untuk mengakalinya gunakan metode editMessageText atau editMessageReplyMarkup. Kedua-duanya berfungsi mengganti pesan baik keseluruhan atau hanya tombol keyboard yang menyertainya saja yang diganti dengan metode editMessageReplyMarkup:
- Gunakan editMessageText bila anda ingin mengakali error 400 dengan menghapus tombol inline keyboard.
- Gunakan editMessageReplyMarkup bila anda ingin mengakalinya error 400 dengan mengganti tombol dengan yang baru.
editMessageText
Metode ini hanya bisa digunakan segera setelah user menekan tombol Inline Keyboard karena metode ini memerlukan properti wajib message_id yang khusus dikirimkan bukan dari JSON objek message melainkan JSON objek callback_query.
Tanpa kiriman JSON objek callback_query akan sulit untuk mengarahkan Telegram dalam mengganti pesan dengan tombol yang dimaksud. Berikut notasi penggunaan metode editMessageText:
let dataEditReplyMarkup = {
method: "post",
payload: {
method: "editMessageText",
chat_id: String( data.callback_query.message.chat.id ),
message_id: String( data.callback_query.message.message_id ),
text: textPesan,
reply_markup: JSON.stringify( menuTombolBaru )
}
};
UrlFetchApp.fetch(telegramAPIURL + "/", dataEditReplyMarkup);
Dalam notasi tersebut perlu diperhatikan dua hal:
- message_id diperlukan untuk memberitahu Telegram pesan yang mana yang dimaksud untuk diedit dalam chat tersebut.
- reply_markup opsional bila anda ingin mengganti dengan pesan baru yang bertombol baru pula.
Penjelasan lengkap tentang reply_markup dapat anda simak dalam artikel sebelumnyaSiLiKiDi
Dari mana kita dapatkan message_id?
Ketika user menekan tombol Inline Keyboard maka Telegram akan mengirimkan update data dalam bentuk JSON objek callback_query:
{
"update_id": 420112307,
"callback_query": {
"id": "7866573844579717058",
"from": {
"id": 1850121251,
"is_bot": false,
"first_name": "JOHN",
"last_name": "DOE",
"username": "johndoe",
"language_code": "en"
},
"message": {
"message_id": 391,
"from": {
"id": 202666666207,
"is_bot": true,
"first_name": "FORM BOT",
"username": "simrsformbot"
},
"chat": {
"id": 1850121251,
"first_name": "JOHN",
"last_name": "DOE",
"username": "johndoe",
"type": "private"
},
"date": 1635743365,
"text": "Demo inlinekeyboards_3",
"reply_markup": {
"inline_keyboard": [
[
{
"text": "👆 EMPTY",
"callback_data": "emptyness"
},
{
"text": "🤘 CALLBACK_DATA",
"callback_data": "Hello world!"
},
{
"text": "🤟 URL",
"url": "https://telegram-bot-script.blogspot.com/"
}
]
]
}
},
"chat_instance": "7721309288641021086",
"data": "Hello world!"
}
}
Sehingga dapat kita tangkap message_id dengan notasi objek berikut:
let messageID = data.callback_query.message.message_id;
FINAL SCRIPT
Final Script dapat diunduh di repository. Script ini mendemokan Tombol Sekali Pakai sebagai solusi mengatasi Error 400 Bad Request: message is not modified. Sekalipun dari pengalaman jarang ditemukan lagi error tersebut, namun tidak menjamin 100%.
Dapatkan skrip semua materi di repository
Dukung donasi agar tutorial ini tetap operasional:
SiLiKiDi
Komentar
Posting Komentar