Zealy 문서

자동 번역 · 영어로 읽기

API

외부 플랫폼에서 작업 자동화

작성자 Fredrika

API
이 페이지에서

개요

이 가이드는 API 퀘스트에 관한 것입니다. 전체 API 문서는 여기.

API 퀘스트는 외부 플랫폼에서 퀘스트를 자동화하는 데 사용됩니다. 사용자가 등록했거나 구매했는지 확인하거나, Github 이슈에 PR을 열었는지 확인하거나, Reddit 지원을 추가하는 데 사용할 수 있습니다. 가능성은 무궁무진합니다. 시작하고 기능을 사용해 보실 수 있도록 다른 Zealy 커뮤니티와 파트너십을 맺는 데 사용할 수 있는 기본 엔드포인트를 제공합니다. 설정 방법은 아래에서 자세히 알아보세요.

기본 사항

"API" 태스크 생성

  1. 클릭: 'Add task'.
  2. 선택: 'Api'.
  3. 호출할 엔드포인트와 필요한 경우 API 키를 정의하세요.
  4. 사용자 식별 방법을 선택하세요. 다음에서 선택할 수 있습니다: 이메일, Twitter, Discord, 지갑 주소, 또는 Zealy Connect.
  • 선택하는 경우 지갑 연결, 사용할 네트워크도 선택할 수 있습니다.

새 블록체인

  • 선택하는 경우 Zealy Connect, 다음 단계를 따르세요:

    1. 리디렉션 URL 정의: 이 URL은 인증에 사용됩니다. 사용자가 귀하의 시스템에서 인증할 수 있도록 이 URL로 리디렉션합니다.

    Zealy Connect API TASK

    1. 커뮤니티 시크릿 생성: 커뮤니티 시크릿 생성은 다음에 필요합니다 Zealy Connect 작동하려면 다음에서 시크릿을 생성할 수 있습니다. Zealy Connect 설정 under the Integrations 섹션 커뮤니티 설정에서.

    Community Secret

API가 어떻게 작동해야 하는지에 대한 자세한 내용은 다음을 참조하세요 API 문서 Zealy Connect 관리에 대한 안내는 다음을 참조하세요: Zealy Connect 문서.

Domino 연동

Domino는 Web3 Zapier입니다. 이를 통해 Zealy의 기능을 확장하고 기본적으로 지원되지 않는 작업을 자동으로 검토할 수 있습니다. 예:

  • 사용자의 Twitter 이름이나 소개에 특정 단어가 포함되어 있는지 확인
  • 사용자의 NFT 및 토큰 잔액 확인
  • 사용자가 Discord에서 특정 수의 사람을 초대했는지 확인
  • 그리고 더 많은 것들

다음을 확인하세요: 문서 통합을 위해.

엔드포인트 테스트

엔드포인트를 구성할 때 엔드포인트가 예상대로 작동하는지 확인하기 위해 다음 테스트를 자동으로 실행합니다:

  1. 호출이 10초를 초과하지 않는지 확인
  2. 사용자에게 표시할 수 있도록 오류 메시지가 올바른 형식인지 확인
  3. 예상치 못한 상태 코드가 아닌지 확인하세요. 엔드포인트는 200 또는 400만 반환해야 합니다.

커스텀 엔드포인트 생성

요청

API 태스크를 커스텀 POST 엔드포인트와 함께 사용할 수 있으며, 다음 본문을 받습니다:

POST https://domain.com/endpoint
{
  /**
   * The user id on Zealy
   */
  userId: string;
  /**
   * Your community id on Zealy, if you use the endpoint
   * on multiple communities this might be useful
   */
  communityId: string;
  /**
   * Your community's subdomain on Zealy, if you use the endpoint
   * on multiple communities this might be useful
   */
  subdomain: string;
  /**
   * The id of the quest
   */
  questId: string;
  /**
   * This will be generated on every claim as a way to look up an error.
   * It will also be displayed for the user when a claim fails.
   */
  requestId: string;
  /**
   * Accounts will be sent if at least one identification method has been configured
   */
  accounts?: {
    /**
     * The user's email address
     */
    email?: string;
    /**
     * The user's Ethereum wallet address that he has authenticated with
     */
    wallet?: string;
    /**
     * The user's Discord id and handle
     */
    discord?: {
      id: string;
      handle: string;
    };
    /**
     * The user's Twitter id and username
     */
    twitter?: {
      id: string;
      username: string;
    };
    /**
     * Your platform user ID stored as part of the Zealy Connect integration
    */
    zealy-connect: string
  };
}

태스크 생성 시 설정한 API 키로 보호할 수 있습니다. API 키는 다음과 같이 헤더로 전송됩니다:

Headers
{
  "X-Api-Key": apiKey,
}

응답

사용자가 작업을 성공적으로 수행했다면 다음을 반환해야 합니다: 200 status. 그러면 사용자가 해당 퀘스트를 성공적으로 클레임합니다.

RESPONSE 200
{
  "message": "User completed the action"
}

그렇지 않으면, 400 status를 응답에 포함하고 본문에 메시지를 함께 반환해야 합니다. 메시지는 생성된 requestId 와 함께 표시되어 여러분과 사용자가 문제를 디버깅하는 데 도움이 됩니다. 가능한 한 자세하게 작성하세요.

RESPONSE 400
{
  "message": "We could not find a user with email kenny@zealy.io"
}

코드 예시

// server.js
//
// Use this sample code to handle quest verification in your endpoint.
//
// 1) Paste this code into a new file (server.js)
//
// 2) Install dependencies
//   npm install express
//
// 3) Run the server on http://localhost:3000
//   node server.js
 
const express = require('express');
const app = express();
 
const apiKey = '5888a6800dbac634e52d8504f097e064'; // Replace with your API key configured in Zealy task
 
app.post('/claim', express.raw({ type: 'application/json' }), (req, res) => {
  const payload = req.body;
  const headers = req.headers
 
  if (apiKey !== headers['x-api-key']) {
    throw new Error('Invalid API Key')
  }
 
 
  const success = true; // Replace with custom logic
 
  if (!success) {
    return res.status(400).send({
      message: 'Validation failed' // Replace with custom error message - will be displayed to the user
    })
  }
 
  return res.status(200).send({
    message: "Quest completed"
  })
});
 
app.listen(3000, () => console.log('Running on port 3000'));

ngrok을 사용한 로컬 테스트

로컬에서 커스텀 엔드포인트를 개발하고 테스트할 때는 Zealy가 API 요청을 보낼 수 있도록 로컬 서버를 인터넷에 노출하는 방법이 필요합니다. ngrok은 localhost로의 보안 터널을 생성하는 도구로, 이 용도에 적합합니다. 다음 단계에 따라 ngrok을 설정하고 엔드포인트를 테스트하세요:

1단계: ngrok 설치 ngrok 웹사이트에서 ngrok을 다운로드하세요. 사용 중인 운영 체제에 맞는 설치 안내를 따르세요.

2단계: ngrok 설정 무료 ngrok 계정에 가입하고 ngrok 대시보드에서 authtoken을 받으세요. 터미널에서 ngrok authtoken YOUR_AUTH_TOKEN을 실행하여 ngrok 계정을 연결하세요. YOUR_AUTH_TOKEN은 ngrok 대시보드의 토큰으로 바꾸세요.

3단계: 로컬 서버 시작 엔드포인트를 호스팅하는 로컬 서버가 실행 중인지 확인하세요. 예를 들어 서버가 Node.js 앱이라면 node server.js를 실행할 수 있습니다.

4단계: ngrok으로 로컬 서버 노출 새 터미널 창을 열고 다음 명령으로 로컬 서버의 포트(예: 3000)에 ngrok 터널을 시작하세요: ngrok http http://127.0.0.1:3000. ngrok은 터미널에 포워딩 URL을 표시합니다(예: https://abc123.ngrok.io). 이것이 Zealy가 로컬 서버에 접근하는 데 사용할 공개 URL입니다.

5단계: Zealy에서 API 작업 구성 Zealy에서 API 작업을 설정할 때 ngrok 포워딩 URL을 엔드포인트 URL로 사용하세요. 필요한 경로를 추가해야 합니다. 예: https://abc123.ngrok.io/claim.

참고: ngrok URL은 임시이며, 커스텀 서브도메인을 지원하는 유료 구독이 없는 한 ngrok을 재시작할 때마다 변경됩니다. ngrok을 재시작할 때마다 Zealy의 엔드포인트를 업데이트해야 합니다.

이 단계를 따르면 프로덕션 서버에 배포하기 전에 로컬 개발 환경에서 커스텀 엔드포인트를 쉽게 테스트하고 디버그할 수 있습니다.

Zealy Connect 연동

Zealy Connect를 사용하면 작업 설정 시 지정한 URL로 사용자를 리디렉션합니다. 다음 쿼리 파라미터가 포함됩니다:

  • zealyUserId: Zealy 시스템에서 사용자를 귀하의 플랫폼과 연결하는 데 사용되는 고유 식별자입니다.
  • callback: 인증이 완료된 후 사용자가 작업을 클레임할 수 있도록 다시 리디렉션할 URL입니다.
  • signature: 요청의 진위를 확인하여 Zealy에서 발생한 것임을 보장하는 데 사용되는 SHA-256 해시입니다.

다음은 시작점으로 사용할 수 있는 전체 예시 엔드포인트입니다:

 
const YOUR_COMMUNITY_SECRET = "fdb68b155a1ccf2e636c7cd7e0816530"; // Replace with your secret generated in Settings > Integrations > Zealy Connect
 
app.get("/connect", (req, res) => {
  // Extract the query parameters
  const { zealyUserId, signature, callbackUrl } = req.query;
 
  /**
   * Verifying signature to ensure the request is coming from Zealy
   */
  const fullUrl = new URL(
    `${req.protocol}://${req.get("host")}${req.originalUrl}`
  );
  fullUrl.searchParams.delete("signature");
 
  const hmac = crypto.createHmac("sha256", YOUR_COMMUNITY_SECRET);
  hmac.update(fullUrl.toString());
  const generatedSignature = hmac.digest("hex");
 
  if (generatedSignature !== signature){
    return res.status(400).send("Invalid signature");
  }
 
  /**
   * Redirect to login if the user is not authenticated
   */
  if (!req.session.user) {
    res.redirect(`/login?redirect=${encodeURIComponent(req.originalUrl)}`); // Redirect back after the user logs in
  }
 
  /**
   * Save the Zealy User ID (optional)
  */
  // await updateUser(req.session.user.id, { zealyId: zealyUserId });
 
 
  /**
   * Redirect Back to Zealy
   */
  const userId = req.session.user.id; // Replace with your platform user ID
 
  const callbackWithParams = new URL(callbackUrl as string);
  callbackWithParams.searchParams.append("identifier", userId);
 
  const hmac = crypto.createHmac("sha256", YOUR_COMMUNITY_SECRET);
  hmac.update(callbackWithParams.toString());
  const callbackSignature = hmac.digest("hex");
 
  callbackWithParams.searchParams.append("signature", callbackSignature);
 
  res.redirect(callbackWithParams.toString());
});

1. 서명 검증

애플리케이션이 가장 먼저 해야 할 일은 커뮤니티 시크릿을 사용해 서명을 검증하는 것입니다. 이 검증을 통해 호출이 실제로 저희로부터 온 것이며 변조되지 않았음을 확인할 수 있습니다.

서명을 생성하기 위해 SHA256 해시 알고리즘을 사용합니다. 이를 검증하려면 다음 접근 방식을 사용할 수 있습니다:

const fullUrl = new URL(
  `${req.protocol}://${req.get("host")}${req.originalUrl}`
);
fullUrl.searchParams.delete("signature");
 
const hmac = crypto.createHmac("sha256", YOUR_COMMUNITY_SECRET);
hmac.update(fullUrl.toString());
const generatedSignature = hmac.digest("hex");
 
const isSignatureValid = generatedSignature === req.query.signature;

2. Zealy User ID 사용

다음 단계는 원하는 작업에 따라 다르지만, 일반적으로 고객은 플랫폼에서 현재 사용자를 로그인시키고 플랫폼의 사용자 ID를 Zealy User ID와 연결합니다. 아래는 예시입니다:

  /**
   * Redirect to login if the user is not authenticated
   */
  if (!req.session.user) {
    res.redirect(`/login?redirect=${encodeURIComponent(req.originalUrl)}`); // Redirect back after the user logs in
  }
 
  /**
   * Save the Zealy User ID (optional)
  */
  // await updateUser(req.session.user.id, { zealyId: zealyUserId });
 

3. Zealy로 리디렉션

마지막 단계는 사용자가 작업을 클레임할 수 있도록, 저희가 제공하는 callback 쿼리 파라미터를 사용하여 플랫폼의 사용자 ID와 함께 사용자를 Zealy로 다시 리디렉션하는 것입니다. 또한 호출이 귀하로부터 왔으며 수정되지 않았음을 검증할 수 있도록 서명을 생성해야 합니다. 아래 예시를 참조하세요:

const callbackWithParams = new URL(callbackUrl as string);
callbackWithParams.searchParams.append("identifier", connectedUserId); // Set it to your platform user ID
 
const hmac = crypto.createHmac("sha256", YOUR_COMMUNITY_SECRET);
hmac.update(callbackWithParams.toString());
const callbackSignature = hmac.digest("hex");
 
callbackWithParams.searchParams.append("signature", callbackSignature);
 
res.redirect(callbackWithParams.toString());

4. Zealy

콜백을 받으면 서명을 검증하고 플랫폼의 사용자 ID를 저장하여 API 작업 본문의 일부로 전송할 수 있도록 합니다.

이제 사용자는 해당 작업 및 동일한 리디렉션 URL을 사용하는 Zealy Connect를 사용하는 다른 모든 작업을 클레임할 수 있습니다. 사용자가 모든 작업마다 연결할 필요가 없도록 이를 기억합니다.

사용자의 Zealy Connect 연결을 삭제해야 하는 경우, Delete Zealy Connect for Member API 경로를 사용할 수 있습니다. 이 경로를 통해 특정 멤버의 Zealy Connect 연결을 제거할 수 있습니다. 이 경로를 호출한 후 사용자는 Zealy Connect 기능을 다시 사용하려면 계정을 다시 연결해야 합니다.

FAQ