URL webhook yang diterima tombol Verify sejak percobaan pertama.

Console hanya menerima URL https dan tombol Verify di sana meminta 200, redelivery nonaktif kecuali Anda menemukan sakelarnya, dan LINE tidak pernah menyebut seberapa sering percobaan ulangnya. AnyHook menjawab Verify, menyimpan setiap event di edge, dan terus mencoba ulang handler Anda dengan jadwal yang benar-benar bisa Anda lihat.

Masalah waktu

LINE Developers Console tidak akan menyimpan Webhook URL yang bukan https, dan tombol Verify di sebelahnya mengirim POST sungguhan yang harus dibalas 200. Tunnel lolos pemeriksaan itu sampai hostname-nya berganti, lalu bot Anda tidak mengarah ke mana pun dan console tidak akan memberi tahu Anda. Masalah yang lebih dalam adalah apa yang terjadi saat pengiriman terlewat: webhook redelivery nonaktif secara default, dan bahkan saat diaktifkan, LINE terang-terangan menyatakan bahwa jumlah dan interval percobaan ulang (retry) tidak diungkapkan dan dapat berubah tanpa pemberitahuan.

Sisi balasan punya jamnya sendiri. Reply token berlaku satu menit dan hanya bisa dipakai sekali, jadi event yang terlambat diambil server Anda, setelah crash, deploy, atau percobaan ulang, tidak bisa lagi dijawab dengan panggilan reply yang gratis. Jika server bot tidak dapat dijangkau cukup lama, LINE dapat berhenti mengirim webhook ke server itu sama sekali, dan ambangnya juga tidak dipublikasikan.

Nonaktif
Setelan pabrik redelivery: webhook yang terlewat hilang
200
Yang harus dilihat tombol Verify sebelum URL tersimpan
1 mnt
Masa berlaku reply token, sekali pakai
?
Jumlah dan interval percobaan ulang yang dipublikasikan LINE: tidak ada

Arahkan console ke AnyHook, verifikasi satu header

Atur sumber App ke LINE dan tempel Channel Secret: AnyHook memeriksa x-line-signature di edge (HMAC-SHA256 base64 dari raw body), dan permintaan palsu tidak pernah sampai ke Anda atau memakan kuota Anda. Setiap pengiriman ditandatangani ulang dengan AnyHook-Signature yang baru.

// 1. In AnyHook: set the app's source to LINE, paste your Channel Secret.
//
// 2. In LINE Developers Console -> Messaging API:
//    Webhook URL: https://in.anyhook.net/{user-slug}/{app-slug}
//    Press Verify (AnyHook answers 200), enable "Use webhook",
//    and turn ON "Webhook redelivery" while you are there.

import { verifyWebhook } from "anyhook-verify";

export async function POST(req: Request) {
  const ok = await verifyWebhook(req, process.env.ANYHOOK_SIGNING_SECRET!);
  if (!ok) return new Response("invalid signature", { status: 401 });

  const event = await req.json();
  for (const e of event.events ?? []) {
    if (e.type !== "message") continue;

    const answer = await draftAnswer(e.message); // an LLM call, a few seconds

    // Reply tokens die after one minute and work once. On a retried
    // delivery the token is already dead, so fall back to push instead
    // of dropping the answer on the floor.
    try {
      await lineReply(e.replyToken, answer);
    } catch {
      await linePush(e.source.userId, answer);
    }
  }
  return new Response("ok", { status: 200 });
}

Pertanyaan yang sering diajukan tim

Tombol Verify di console terus gagal. Apa yang sebenarnya diminta?
Tombol itu mengirim POST dengan array events kosong ke URL tersebut dan mengharapkan 200 polos lewat https. Tunnel lokal kadang lolos, kadang tidak, dan rusak saat hostname berganti. URL masuk (inbound URL) AnyHook adalah endpoint https yang stabil dan menjawab setelah permintaan masuk antrean secara persisten, jadi Verify lolos sejak percobaan pertama dan terus lolos. Satu hal lagi: LINE menandatangani POST verifikasi dengan Channel Secret Anda seperti webhook lainnya, jadi jika sumber sudah diatur ke LINE dan Verify masih gagal, penyebab umumnya adalah secret yang salah ketik. AnyHook menolak permintaan seperti itu di edge dengan 401: halaman App menghitungnya, dan 5 yang pertama setiap hari disimpan di log event sebagai ditolak, lengkap dengan header-nya, agar Anda bisa melihat kegagalannya. Tempel ulang secret, lalu tekan Verify lagi.
Siapa yang memverifikasi x-line-signature, AnyHook atau server saya?
AnyHook, di edge, jika sumber App adalah LINE dan Channel Secret sudah diatur: permintaan yang gagal pemeriksaan ditolak sebelum sampai ke server Anda atau memakai kuota. Server Anda kemudian memverifikasi satu header AnyHook-Signature yang seragam. Header x-line-signature asli tetap diteruskan tanpa diubah, dan karena skema LINE hanya menandatangani body, tanpa stempel waktu (timestamp), tanda tangan itu tetap valid saat percobaan ulang jika Anda ingin memeriksanya lagi di downstream.
Apa yang terjadi pada reply token saat pengiriman dicoba ulang?
Hampir pasti sudah kedaluwarsa, karena token itu hidup satu menit sejak webhook aslinya. Pola yang berhasil: jawab dengan endpoint reply pada upaya pertama yang cepat, dan beralih ke endpoint push saat panggilan reply gagal. Bagaimanapun, AnyHook menyimpan body event lengkap, jadi handler yang terlambat tetap tahu persis apa yang dikatakan.
Server bot saya tidur di free tier. Apakah balasan tetap terkirim tepat waktu?
Bagaimanapun juga, LINE mendapat 200 dari AnyHook dalam sekitar satu detik, jadi LINE tidak melihat kegagalan. AnyHook lalu segera mengirim event ke server Anda dan menunggunya bangun, hingga 60 detik di paket Free. Jika server menjawab dalam waktu itu, event tiba pada upaya pertama, terlambat beberapa detik, dan reply token, yang berlaku satu menit sejak event aslinya, biasanya masih berfungsi. Jika server butuh lebih dari satu menit masa berlaku token untuk bangun, fallback push di kode di atas yang menjawab. Jika server Anda sama sekali tidak menjawab tepat waktu, upaya berikutnya dilakukan 5 menit kemudian.
Bot saya ditulis dengan Python. Bagaimana cara memeriksa AnyHook-Signature?
Isi header-nya t=<unix seconds>,v1=<hex>. Hitung HMAC-SHA256 dari f"{t}.{raw_body}" dengan signing secret milik tujuan (App → Destinations → Signing secret di dashboard), bandingkan dengan v1 memakai hmac.compare_digest, dan tolak t yang lebih tua dari 5 menit. Jika Anda sudah memeriksa x-line-signature di handler, Anda boleh tetap melakukannya: LINE hanya menandatangani body, jadi tanda tangan itu tetap valid saat percobaan ulang.
Apakah saya tetap perlu mengaktifkan redelivery milik LINE jika AnyHook sudah mencoba ulang untuk saya?
Ya. Keduanya menangani bagian perjalanan yang berbeda. AnyHook mencoba ulang perjalanan dari AnyHook ke server Anda setelah event tersimpan. Redelivery LINE menangani perjalanan dari LINE ke AnyHook, yang penting dalam kasus langka saat AnyHook tidak dapat menyimpan event secara persisten dan sengaja menjawab 503 agar pengirim mencoba lagi.

Ganti satu URL. Handler LINE Anda tetap.

Paket Free mencakup 10 rb event / bulan. Tanpa SDK: arahkan LINE ke URL masuk AnyHook Anda.