Webhook
Tingkatkan Keupayaan Zealy dengan Sambungan Webhook.
Oleh louis, Fredrika, benjamin

Pada halaman ini
Webhook Zealy menghantar HTTP POST ke URL pilihan anda apabila salah satu daripada sembilan peristiwa komuniti berlaku, antaranya ahli menyertai, tuntutan quest berjaya atau gagal, sprint bermula, dan pengguna diharamkan. Setiap muatan membawa id peristiwa, jenis, data, cap masa milisaat, dan rahsia yang membuktikan permintaan itu sahih.
Asas
Zealy menyediakan webhook yang membolehkan anda menerima pemberitahuan push HTTP setiap kali data dicipta atau dikemas kini. Ini membolehkan anda membina integrasi di atas Zealy. Anda boleh mencetuskan binaan CI, melakukan pengiraan pada data quest, atau menghantar mesej pada syarat tertentu – terpulang kepada anda.
Sila lawati Settings > Integrations > Zapier & Webhooks untuk menyediakan webhook anda.
Bagaimanakah Webhook berfungsi?
Tolakan Webhook hanyalah HTTP POST permintaan, dihantar ke URL pilihan anda. Tolakan dicetuskan secara automatik oleh Linear apabila data dikemas kini. Untuk contoh data yang terkandung dalam muatan, lihat Muatan Webhook.
Pengguna webhook anda ialah titik akhir HTTP yang ringkas. Ia mesti memenuhi syarat berikut:
- Ia tersedia dalam URL HTTPS yang boleh diakses secara umum, bukan localhost
- Ia akan membalas tolakan Webhook Zealy (permintaan HTTP POST) dengan
HTTP 200("OK") respons
Jika penghantaran gagal (contohnya pelayan tidak tersedia, respons mengambil masa lebih 5 saat, badan respons melebihi 5000 bait atau respons dengan kod status HTTP bukan-200), push akan dicuba semula 15 kali. Di sini kelewatan backoff eksponen digunakan: percubaan akan dicuba semula selepas kira-kira 10 minit, kemudian 30 minit, dan seterusnya. Jika URL webhook terus tidak responsif, webhook mungkin dilumpuhkan oleh Zealy dan perlu didayakan semula secara manual.
Untuk memastikan Webhook POST benar-benar dicipta oleh Zealy, kami menjana rahsia rawak yang akan dilampirkan pada badan permintaan dalam medan secret tersebut.
Untuk maklumat tambahan tentang Webhook, terdapat beberapa sumber yang baik:
- RequestBin: Webhooks – Panduan Definitif
- requestbin.com ialah alat yang bagus untuk menguji webhook
- Panduan Pembangun GitHub: Webhook
Untuk apa saya boleh menggunakannya?
- Integrasi dengan Zapier
- Automasikan ganjaran tersuai
- Beritahu tugasan yang menunggu semakan di Telegram
Dan banyak lagi!
Mula menggunakan Webhook Zealy
- Kenal pasti peristiwa yang anda mahu pantau.
- Bangunkan fungsi titik akhir webhook untuk menerima permintaan POST data peristiwa.
- Daftarkan titik akhir anda dalam Zealy menggunakan Papan Pemuka Webhooks di Settings > Integrations > Zapier & Webhooks.
- Lindungi titik akhir webhook anda.
Mencipta pengguna Webhook yang ringkas
Anda mungkin boleh pertimbangkan menggunakan sesuatu seperti Netlify Functions, yang menyediakan cara mudah untuk menggunakan titik akhir HTTP(S): https://www.netlify.com/blog/2018/09/13/how-to-run-express.js-apps-with-netlify-functions/.
// server.js
//
// Use this sample code to handle webhook events in your integration.
//
// 1) Paste this code into a new file (server.js)
//
// 2) Install dependencies
// npm install express
//
// 3) Run the server on http://localhost:4242
// node server.js
// The library needs to be configured with your account's secret key.
// Ensure the key is kept out of any version control system you might be using.
const express = require('express');
const app = express();
// This is your Zealy webhook secret for testing your endpoint locally.
const endpointSecret = '5888a6800dbac634e52d8504f097e064';
app.post('/webhook', express.raw({ type: 'application/json' }), (request, response) => {
const payload = req.body;
// Does createdAt make more sense than time?
const { id, type, data, time, secret } = payload;
if (secret === endpointSecret) {
// Do something neat with the data received!
}
// Return a 200 response to acknowledge receipt of the event
response.send();
});
app.listen(4242, () => console.log('Running on port 4242'));Mengkonfigurasi dalam tetapan
Sediakan webhook dan peristiwa yang patut dipantaunya di Settings > Integrations > Webhooks.
Muatan Webhook
Muatan HTTP webhook akan merangkumi maklumat dalam pengepala HTTP dan badan permintaannya.
Muatan akan dihantar dengan pengepala HTTP berikut:
User-Agent: Zealy-Webhook
Content-Type: application/json; charset=utf-8
{
id: string // unique ID for this event (UUID v4)
type: "JOINED_COMMUNITY" | "LEFT_COMMUNITY" | "QUEST_SUCCEEDED" | "QUEST_CLAIMED" | "QUEST_FAILED" | "QUEST_CLAIM_STATUS_UPDATED" | "SPRINT_STARTED" | "SPRINT_ENDED" | "USER_BANNED", // event type
data: EventData, // event data, see below
time: number, // timestamp, in milliseconds
secret: string, // secret generated when you created your webhook, used for checking origin
}Medan EventData bagi setiap peristiwa:
// JOINED_COMMUNITY
type JoinedCommunityEventData = {
community: WebhookCommunityPayload;
user: WebhookUserPayload;
};
// LEFT_COMMUNITY
type LeftCommunityEventData = {
community: WebhookCommunityPayload;
user: WebhookUserPayload;
};
// QUEST_SUCCEEDED
type QuestSucceededEventData = {
community: WebhookCommunityPayload;
user: WebhookUserPayload;
quest: WebhookQuestPayload;
taskInputs?: Array<{
taskId: string, // task ID (uuid v4)
taskType: 'number' | 'date' | 'api' | 'text' | 'discord' | 'url' | 'telegram' | 'quiz' | 'invites' | 'visitLink' | 'file' | 'poll' | 'opinion' | 'twitterFollow' | 'twitterSpace' | 'tweetReact' | 'tweet',
input: WebhookQuestTaskInputPayload,
}>;
status: 'success';
};
// QUEST_CLAIMED
type QuestClaimedEventData = {
community: WebhookCommunityPayload;
user: WebhookUserPayload;
quest: WebhookQuestPayload;
taskInputs?: Array<{
taskId: string, // task ID (uuid v4)
taskType: 'number' | 'date' | 'api' | 'text' | 'discord' | 'url' | 'telegram' | 'quiz' | 'invites' | 'visitLink' | 'file' | 'poll' | 'opinion' | 'twitterFollow' | 'twitterSpace' | 'tweetReact' | 'tweet',
input: WebhookQuestTaskInputPayload,
}>;
};
// QUEST_FAILED
type QuestFailedEventData = {
community: WebhookCommunityPayload;
user: WebhookUserPayload;
quest: WebhookQuestPayload;
taskInputs?: Array<{
taskId: string, // task ID (uuid v4)
taskType: 'number' | 'date' | 'api' | 'text' | 'discord' | 'url' | 'telegram' | 'quiz' | 'invites' | 'visitLink' | 'file' | 'poll' | 'opinion' | 'twitterFollow' | 'twitterSpace' | 'tweetReact' | 'tweet',
input: WebhookQuestTaskInputPayload,
}>;
};
// QUEST_CLAIM_STATUS_UPDATED
type QuestClaimStatusUpdatedEventData = {
community: WebhookCommunityPayload;
user: WebhookUserPayload;
quest: WebhookQuestPayload;
taskInputs?: Array<{
taskId: string, // task ID (uuid v4)
taskType: 'number' | 'date' | 'api' | 'text' | 'discord' | 'url' | 'telegram' | 'quiz' | 'invites' | 'visitLink' | 'file' | 'poll' | 'opinion' | 'twitterFollow' | 'twitterSpace' | 'tweetReact' | 'tweet',
input: WebhookQuestTaskInputPayload,
}>;
status: 'success' | 'pending' | 'failed';
};
// SPRINT_STARTED
type SprintStartedEventData = {
community: WebhookCommunityPayload;
sprint: WebhookSprintPayload;
};
// SPRINT_ENDED
type SprintEndedEventData = {
community: WebhookCommunityPayload;
sprint: WebhookSprintPayload;
};
// USER_BANNED
type UserBannedEventData = {
community: WebhookCommunityPayload;
user: WebhookUserPayload;
};Entiti biasa:
type WebhookCommunityPayload = {
id: string; // community ID (uuid V4)
name: string; // community name
subdomain: string; // community subdomain
blockchain: string;
discord: string | null; // discord URI of the community, e.g., https://discord.gg/zealy
twitter: string | null; // twitter handle of the community, e.g., zealy_io
website: string | null; // website URI of the community
};type WebhookUserPayload = {
id: string; // user ID (uuid V4)
name: string | null; // user display name
twitter: {
id: string; // user twitter ID
username: string | null; // user twitter handle
} | null;
discord: {
id: string; // user discord ID
handle: string | null; // user discord handle
} | null;
email: string | null; // user email
addresses: Dict<string>; // key/value dictionary for wallets
verifiedAddresses: Dict<string>; // key/value dictionary for all users verified wallets
};type WebhookQuestPayload = {
id: string; // quest ID (uuid V4)
name: string; // quest display name
categoryId: string; // category ID (uuid V4)
categoryName: string | null; // category display name
xp: number | null; // XP reward
published: boolean | null; // true if quest is published, false otherwise
autoValidate: boolean | null;
tasks: TaskPayload[];
lastReviewerId: string; // user ID (uuid V4)
};type WebhookQuestTaskInputPayload =
| { } // for task type 'visitLink', 'invites', 'discord', 'telegram', 'twitterFollow', 'twitterSpace'
| { value: string } // for task type 'text', 'date', 'url', 'opinion'
| { value: number } // for task type 'number'
| { values: string[] } // for task type 'poll', 'quiz'
| { fileUrls: string[] } // for task type 'fileUrls'
| { tweetId?: string } // for task type 'tweetReact', 'tweet'
| { requestId: string, statusCode: number } // for task type 'api'type WebhookSprintPayload = {
id: string; // sprint ID (uuid V4)
startingAt: ISOString; // sprint starting date - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
endingAt: ISOString; // sprint ending date
};Melindungi webhook
Mencipta webhook akan menjana rahsia rawak yang boleh anda gunakan untuk mengesahkan bahawa permintaan itu datang daripada webhook Zealy. Salin rahsia di bahagian atas kanan panel pemeriksaan webhook dan sahkan bahawa rahsia yang ditetapkan dalam badan permintaan POST adalah sama.
Jika rahsia itu bocor, anda boleh menjananya semula dari halaman yang sama.

Menguji webhook
Dari panel periksa webhook, anda boleh mencetuskan peristiwa ujian secara manual. Klik butang di kanan atas dan pilih 'Send test event'. Anda boleh memilih jenis peristiwa antara jenis peristiwa yang dipantau. Peristiwa akan dicetuskan dengan data olok-olok dan status akan dipaparkan.
Penyahpepijatan
Anda boleh melihat log semua peristiwa lalu yang dicetuskan oleh webhook jika anda klik webhook tersebut dari halaman Webhooks. Dengan menapis mengikut status, anda boleh menggunakan log untuk menyahpepijat jika berlaku masalah. Bagi setiap peristiwa, anda boleh melihat mesej ralat yang diterima dan permintaan yang dihantar.
Anda juga boleh mencuba semula mana-mana peristiwa dari halaman ini.
