Zealy Belgeleri

Otomatik çeviri · İngilizce oku

Webhook'lar

Zealy'nin Yeteneklerini Webhook Bağlantılarıyla Geliştirin.

Yazan louis, Fredrika, benjamin

Webhook'lar
Bu sayfada

Bir Zealy webhook'u, dokuz topluluk olayından biri tetiklendiğinde seçtiğiniz bir URL'ye HTTP POST gönderir; bunlar arasında bir üyenin katılması, bir görev talebinin başarılı veya başarısız olması, bir sprintin başlaması ve bir kullanıcının yasaklanması yer alır. Her yük bir olay kimliği, tür, veri, milisaniye cinsinden zaman damgası ve isteğin gerçek olduğunu kanıtlayan gizli anahtarı taşır.

Temeller

Zealy şunları sağlar: webhook'lar veri oluşturulduğunda veya güncellendiğinde HTTP push bildirimleri almanızı sağlar. Bu, Zealy üzerine entegrasyonlar oluşturmanıza olanak tanır. CI derlemelerini tetikleyebilir, görev verileri üzerinde hesaplamalar yapabilir veya belirli koşullarda mesaj gönderebilirsiniz – ne derseniz artık.

Webhook'larınızı kurmak için lütfen Ayarlar > Entegrasyonlar > Zapier & Webhook'lar bölümünü ziyaret edin.

Bir Webhook nasıl çalışır?

Bir Webhook push'u basitçe seçtiğiniz URL'ye gönderilen bir HTTP POST isteğidir. Push, veri güncellendiğinde Linear tarafından otomatik olarak tetiklenir. Bir yükün hangi verileri içerdiğine dair bir örnek için bkz. Webhook Yükü.

Webhook tüketiciniz basit bir HTTP uç noktasıdır. Aşağıdaki koşulları karşılamalıdır:

  • Herkese açık bir HTTPS, localhost olmayan URL'de erişilebilir olmalıdır
  • Zealy Webhook push'una (HTTP POST isteği) bir HTTP 200 ("OK") yanıtıyla yanıt vermelidir

Bir teslimat başarısız olursa (yani sunucu kullanılamıyor, yanıt 5 saniyeden uzun sürdü, yanıt gövdesi 5000 bayttan büyüktü veya 200 dışında bir HTTP durum koduyla yanıt verdi), push 15 kez yeniden denenir. Burada üstel geri çekilme gecikmesi kullanılır: deneme yaklaşık 10 dakika sonra, ardından 30 dakika sonra ve bu şekilde yeniden denenir. Webhook URL'si yanıt vermemeye devam ederse webhook Zealy tarafından devre dışı bırakılabilir ve manuel olarak yeniden etkinleştirilmelidir.

Bir Webhook'un POST gerçekten Zealy tarafından oluşturulduğundan emin olmak için, isteğin gövdesine secret alanında eklenen rastgele bir gizli anahtar oluştururuz.

Webhook'lar hakkında ek bilgi için birkaç iyi kaynak var:

Bunu ne için kullanabilirim?

  • Zapier ile entegre olun
  • Özel ödülleri otomatikleştirin
  • İnceleme bekleyen görevleri Telegram'da bildirin

Ve çok daha fazlası!

Zealy Webhook'larına başlarken

  1. Hangi olayları izlemek istediğinizi belirleyin.
  2. Olay verisi POST isteklerini almak için bir webhook uç noktası işlevi geliştirin.
  3. Uç noktanızı Zealy içinde Ayarlar > Entegrasyonlar > Zapier & Webhook'lar bölümündeki Webhook'lar Panosu'nu kullanarak kaydedin.
  4. Webhook uç noktanızı güvence altına alın.

Basit bir Webhook tüketicisi oluşturma

Basit HTTP(S) uç noktalarını dağıtmanın kolay bir yolunu sunan Netlify Functions gibi bir şey kullanmayı düşünebilirsiniz: 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'));

Ayarlarda yapılandırma

Webhook'u ve izlemesi gereken olayları Ayarlar > Entegrasyonlar > Webhook'lar bölümünde ayarlayın.

Webhook yükü

Webhook HTTP yükü, hem HTTP başlıklarında hem de istek gövdesinde bilgi içerecektir.

Yük aşağıdaki HTTP başlıklarıyla gönderilecektir:

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
}

Olay başına EventData alanı:

// 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;
};

Ortak varlıklar:

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
};

Webhook'ları güvence altına alma

Bir webhook oluşturmak, isteğin Zealy webhook'larından geldiğini doğrulamak için kullanabileceğiniz rastgele bir gizli anahtar oluşturur. Webhook inceleme panelinin sağ üst köşesindeki gizli anahtarı kopyalayın ve POST isteğinin gövdesinde ayarlanan gizli anahtarın aynı olduğunu doğrulayın.

Gizli anahtarın sızması durumunda, aynı sayfadan yeniden oluşturabilirsiniz.

Gizli anahtarı kopyala düğmesi ve Webhook'u düzenle, Devre dışı bırak, Test olayı tetikle, Gizli anahtarı yeniden oluştur ve Webhook'u sil seçeneklerini listeleyen açık bir menü içeren webhook inceleme paneli

Webhook'ları test etme

Webhook'un inceleme panelinden manuel olarak bir test olayı tetikleyebilirsiniz. Sağ üst köşedeki düğmeye tıklayın ve 'Test olayı gönder' seçeneğini seçin. İzlenen olay türleri arasından bir olay türü seçebileceksiniz. Sahte verilerle bir olay tetiklenecek ve durum gösterilecektir.

Hata ayıklama

Webhook'lar sayfasından webhook'a tıklarsanız webhook tarafından tetiklenen tüm geçmiş olayların günlüklerini görebilirsiniz. Duruma göre filtreleme yaparak, bir sorun çıkması durumunda hata ayıklamak için günlükleri kullanabilirsiniz. Her olay için alınan hata mesajını ve gönderilen isteği görebilirsiniz.

Bu sayfadan herhangi bir olayı da yeniden deneyebilirsiniz.

Topluluğa katılma olaylarını listeleyen webhook olay günlüğü; bir olayın teslimat denemeleri, istek yükü ve hata yanıtı gösteriliyor

SSS