การตรวจสอบ webhook ประสิทธิภาพสูงใน Rust ด้วย Axum เพิ่มการระบุผู้เข้าชม การตรวจจับบอต และ smart signals เข้าสู่แอปพลิเคชัน Rust ของคุณภายในไม่กี่นาที
เพิ่ม SDK เข้าสู่โปรเจกต์ของคุณด้วย package manager ที่คุณต้องการ
npm install axumyarn add axumpnpm add axumเริ่มใช้งานได้ด้วยการตั้งค่าขั้นต่ำ
use axum::{body::Bytes, http::HeaderMap, routing::post, Router};async fn webhook(headers: HeaderMap, body: Bytes) -> &'static str { // verify headers["x-tracio-signature"] against body, then act println!("{}", String::from_utf8_lossy(&body)); "OK"}#[tokio::main]async fn main() { let app = Router::new().route("/webhook/tracio", post(webhook)); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); axum::serve(listener, app).await.unwrap();}รูปแบบพร้อมใช้งานจริงพร้อมการจัดการข้อผิดพลาด สถานะการโหลด และการกำหนดค่าขั้นสูง
use axum::{body::Bytes, http::{HeaderMap, StatusCode}, routing::post, Router};use hmac::{Hmac, Mac};use sha2::Sha256;use serde::Deserialize;type HmacSha256 = Hmac<Sha256>;#[derive(Deserialize)]struct Bot { result: String,}#[derive(Deserialize)]struct Event { #[serde(rename = "visitorId")] visitor_id: String, bot: Bot,}// Recompute the HMAC-SHA256 over "<t>.<rawBody>" and compare it.fn verify(body: &[u8], header: &str, secret: &[u8]) -> bool { let (mut t, mut v1) = ("", ""); for kv in header.split(',') { match kv.split_once('=') { Some(("t", val)) => t = val, Some(("v1", val)) => v1 = val, _ => {} } } let mut mac = HmacSha256::new_from_slice(secret).unwrap(); mac.update(t.as_bytes()); mac.update(b"."); mac.update(body); match hex::decode(v1) { Ok(sig) => mac.verify_slice(&sig).is_ok(), Err(_) => false, }}async fn webhook(headers: HeaderMap, body: Bytes) -> Result<&'static str, StatusCode> { let secret = std::env::var("TRACIO_WEBHOOK_SECRET").unwrap_or_default(); let sig = headers .get("x-tracio-signature") .and_then(|v| v.to_str().ok()) .unwrap_or(""); if !verify(&body, sig, secret.as_bytes()) { return Err(StatusCode::UNAUTHORIZED); } let event: Event = serde_json::from_slice(&body).map_err(|_| StatusCode::BAD_REQUEST)?; if event.bot.result == "bot" { println!("flagging bot visitor {}", event.visitor_id); } Ok("OK")}#[tokio::main]async fn main() { let app = Router::new().route("/webhook/tracio", post(webhook)); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); axum::serve(listener, app).await.unwrap();}ตัวเลือกทั้งหมดสำหรับการเริ่มต้นและกำหนดค่า SDK
publicKeystringpublic key ของคุณจากแดชบอร์ด — ปลอดภัยที่จะส่งไปกับเบราว์เซอร์endpointstringURL endpoint ที่กำหนดเองสำหรับการติดตั้งแบบกำหนดเส้นทางผ่านพร็อกซี — URL ที่ระบุชัดจะมีผลเหนือ regionregionstringภูมิภาคข้อมูล: us หรือ eutimeoutMsnumberเวลาหมดเวลาของการเรียก getResult() ทั้งหมด เป็นมิลลิวินาทีlinkedIdstringID บัญชีภายในของคุณสำหรับผู้ใช้ที่ล็อกอินอยู่ เพื่อเชื่อมโยงการเข้าชมที่ใช้อุปกรณ์เดียวกันtagstringป้ายกำกับอิสระที่แนบไปกับคำขอระบุตัวตน เช่น checkout หรือ logindebugbooleanบันทึกวงจรชีวิตของสคริปต์และกิจกรรมเครือข่ายลงคอนโซลของเบราว์เซอร์scriptUrlstringแทนที่ URL ของสคริปต์เอเจนต์ทั้งหมด — สำหรับโฮสต์เองหรือใช้ Subresource Integrityเจาะลึกยิ่งขึ้นด้วยเอกสารอ้างอิง API ฉบับเต็ม การกำหนดค่า webhook และคู่มือขั้นสูง
เอกสารอ้างอิง API ฉบับเต็ม คู่มือการผสานรวม และแนวปฏิบัติที่ดีที่สุด
การส่งอีเวนต์แบบเรียลไทม์ สคีมาของ payload และการตรวจสอบลายเซ็น
กำหนดค่าการแจ้งเตือนอีเวนต์แบบเรียลไทม์สำหรับการระบุอุปกรณ์ทุกครั้ง
เพิ่ม device fingerprinting เข้าสู่แอปพลิเคชัน Rust ของคุณภายในเวลาไม่ถึง 5 นาที