Dokumentasi Zealy

Diterjemah secara automatik · Baca dalam bahasa Inggeris

Webhook

Tingkatkan Keupayaan Zealy dengan Sambungan Webhook.

Oleh louis, Fredrika, benjamin

Webhook
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:

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

  1. Kenal pasti peristiwa yang anda mahu pantau.
  2. Bangunkan fungsi titik akhir webhook untuk menerima permintaan POST data peristiwa.
  3. Daftarkan titik akhir anda dalam Zealy menggunakan Papan Pemuka Webhooks di Settings > Integrations > Zapier & Webhooks.
  4. 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.

Panel periksa webhook dengan butang Copy secret dan menu terbuka yang menyenaraikan Edit webhook, Disable, Trigger test event, Regenerate secret dan Delete webhook

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.

Senarai log peristiwa webhook Join community events, dengan cubaan penghantaran, muatan permintaan dan respons ralat bagi satu peristiwa dipaparkan

Soalan Lazim