V2 웹훅 API
개요
기능 요약
| 티어 | 가격 | 웹훅 수 |
|---|---|---|
| 셀프 서비스 Pro | 월 $5,000 | 1 |
| 엔터프라이즈 | 영업팀에 문의 | 5개 이상 |
Webhook을 지원하는 제품
웹후크 관리
1. Webhook Consumer 앱 개발
- 이벤트를 수신하는 webhook 엔드포인트로 동작할, 공개적으로 접근 가능한 HTTPS URL을 가진 웹 앱을 만드세요.
- URI의 path는 전적으로 자유입니다. 다음 예시는 유효합니다: https://mydomain.com/service/listen
- 여러 소스의 webhook을 수신하는 경우 일반적인 패턴은 다음과 같습니다: https://mydomain.com/webhook/twitter
- 지정한 URL에는 포트 번호를 포함할 수 없습니다(https://mydomain.com:5000/NoWorkie).
- 첫 단계로 X Challenge Response Check(CRC) GET 요청을 수신하고 올바르게 형식화된 JSON으로 응답하는 코드를 작성하세요.
- webhook URL을 등록하세요. JSON 본문에 URL을 포함하여 /2/webhooks 엔드포인트에 POST 요청을 보냅니다. 이 요청을 보내면 X가 CRC 요청을 웹 앱으로 전송합니다.
- webhook이 성공적으로 등록되면 응답에 webhook id가 포함됩니다. 이 webhook id는 이후 webhook을 지원하는 제품에 요청할 때 필요합니다.
- X는 등록한 URL로 이벤트가 포함된 POST 요청을 전송합니다. 이러한 이벤트는 JSON으로 인코딩됩니다. webhook JSON 페이로드 예시는 여기에서 확인하세요.
선택 사항: 테스트용 xurl 사용
xurl 프로젝트의 최신 버전을 설치하고 권한을 구성한 뒤, 다음을 실행하세요:
- 웹훅 URL을 등록할 때 웹 앱은 CRC 검사 암호화를 위해 앱의 consumer secret을 사용해야 합니다.
- 수신되는 모든 다이렉트 메시지는 웹훅으로 전달됩니다. POST /2/dm_conversations/with/:participant_id/messages로 전송된 다이렉트 메시지도 웹훅으로 전달됩니다. 이는 다른 클라이언트를 통해 전송된 다이렉트 메시지도 웹 앱이 파악할 수 있도록 하기 위함입니다.
- 동일한 웹훅 URL을 공유하는 웹 앱이 둘 이상이고 각 앱에 동일한 사용자가 매핑되어 있는 경우, 동일한 이벤트가 웹 앱별로 한 번씩 웹훅에 여러 차례 전송됩니다.
- 일부 경우 웹훅이 중복 이벤트를 수신할 수 있습니다. 웹훅 앱은 이를 허용하도록 설계되어야 하며 이벤트 ID를 기준으로 중복을 제거해야 합니다.
-
예제 코드:
- Account Activity API 설정: Account Activity API의 엔터프라이즈 티어를 사용해 웹훅 이벤트를 표시하는 Node 웹 앱.
2. 웹후크 보안
- 챌린지-응답 검사를 통해 웹후크 이벤트를 수신하는 웹 앱의 소유권을 X가 확인할 수 있습니다.
- 각 POST 요청의 서명 헤더를 통해 수신된 웹후크의 출처가 X임을 확인할 수 있습니다.
3. Webhooks API
https 콜백 URL을 JSON 본문에 포함해 전달해야 합니다.지정된 애플리케이션 컨텍스트에 대해 새 웹훅 URL을 등록하는 것부터 시작하겠습니다. 인증: OAuth2 앱 전용 베어러 토큰
- 베어러 토큰
<BEARER_TOKEN>예:AAAAAAAAAAAA0%2EUifi76ZC9Ub0wn...
- URL
<URL>예:https://yourdomain.com/webhooks/twitter/
| 이유 | 설명 |
|---|---|
CrcValidationFailed | 콜백 URL이 CRC 검사에 올바르게 응답하지 않았습니다(예: 타임아웃, 잘못된 응답). |
UrlValidationFailed | 제공된 콜백 URL이 요건을 충족하지 않습니다(예: https가 아님, 형식이 올바르지 않음). |
DuplicateUrlFailed | 해당 콜백 URL에 대해 애플리케이션에 이미 웹훅이 등록되어 있습니다. |
WebhookLimitExceeded | 애플리케이션이 허용된 웹훅 구성의 최대 개수에 도달했습니다. |
-
베어러 토큰
<BEARER_TOKEN>예:AAAAAAAAAAAA0%2EUifi76ZC9Ub0wn... -
URL
<URL>예:https://yourdomain.com/webhooks/twitter/
webhook_id를 사용해 웹훅 구성을 삭제합니다. ID는 POST /2/webhooks 생성 응답이나 GET /2/webhooks 목록 응답에서 확인할 수 있습니다.
인증:
OAuth2 앱 전용 베어러 토큰
- 베어러 토큰
<BEARER_TOKEN>예:AAAAAAAAAAAA0%2EUifi76ZC9Ub0wn...
| 매개변수 | 설명 |
|---|---|
webhook_id | 삭제할 웹훅의 ID입니다. |
| 이유 | 설명 |
|---|---|
WebhookIdInvalid | 제공된 webhook_id를 찾을 수 없거나 앱과 연결되어 있지 않습니다. |
valid로 설정하여 웹훅을 재활성화합니다.
인증:
OAuth2 앱 전용 베어러 토큰
- 베어러 토큰
<BEARER_TOKEN>예:AAAAAAAAAAAA0%2EUifi76ZC9Ub0wn...
| 매개변수 | 설명 |
|---|---|
webhook_id | 검증할 웹훅의 ID입니다. |
valid 필드는 검사 시도 이후의 상태를 반영합니다. CRC 검사가 성공하면 webhook의 상태가 valid로 업데이트됩니다. 현재 상태는 GET /2/webhooks로 확인할 수 있습니다.
| 이유 | 설명 |
|---|---|
WebhookIdInvalid | 제공된 webhook_id를 찾을 수 없거나 앱과 연결되어 있지 않습니다. |
CrcValidationFailed | 콜백 URL이 CRC 확인 요청에 올바르게 응답하지 않았습니다. |
4. CRC 검사
- 웹훅을 처음 등록할 때 (
POST /2/webhooks) - X에서 매시간 유효성 검사를 수행할 때
PUT /2/webhooks/:id로 수동 검증을 실행할 때
- 메시지로 crc_token을 사용합니다.
- 키로 앱의 consumer secret을 사용합니다.
- HMAC-SHA-256 해시를 생성합니다.
- 결과를 Base64로 인코딩합니다.
샘플 앱
- 간단한 웹훅 서버
- CRC 검증에 응답하고 POST 이벤트를 처리하는 방법을 보여주는 단일 Python 스크립트입니다.
- Account Activity API 샘플 대시보드
- bun.sh로 작성된 웹 앱으로, 웹훅과 구독을 관리하고 앱 내에서 실시간 이벤트를 직접 수신할 수 있습니다.