V2 Account Activity API
이제 Pro에서 Account Activity API v2를 이용할 수 있습니다!
개요
이 API는 사용자 행동에 즉시 반응하거나 사용자 활동을 기반으로 최신 상태를 유지해야 하는 애플리케이션을 구축할 때 주로 사용됩니다. 웹훅 등록 시 각 사용자 구독에 대해 아래에 나열된 관련 모든 활동을 수신합니다:
활동 유형
- 게시물 (사용자가 작성)
- 게시물 삭제 (사용자가 수행)
- @멘션 (사용자에 대한)
- 답글 (사용자에게 또는 사용자로부터)
- 리포스트 (사용자가 수행 또는 사용자에 대한)
- 인용 게시물 (사용자가 작성 또는 사용자에 대한)
- 인용 게시물의 리포스트 (사용자가 수행 또는 사용자에 대한)
- 좋아요 (사용자가 누름 또는 사용자에 대한)
- 팔로우 (사용자가 함 또는 사용자에 대한)
- 언팔로우 (사용자가 함 또는 사용자에 대한)
- 차단 (사용자가 함 또는 사용자에 대한)
- 차단 해제 (사용자가 함 또는 사용자에 대한)
- 뮤트 (사용자가 함 또는 사용자에 대한)
- 뮤트 해제 (사용자가 함 또는 사용자에 대한)
- 다이렉트 메시지 전송 (사용자가 보냄)
- 다이렉트 메시지 수신 (사용자가 받음)
- 입력 중 표시 (사용자에게)
- 읽음 확인 (사용자에게)
- 구독 철회 (사용자가 수행)
기능 요약
| 등급 | 가격 | 고유 구독 수 | 웹훅 수 |
|---|---|---|---|
| Pro | 월 $5,000 | 3 | 1 |
| Enterprise | 영업팀에 문의 | 5,000+ | 5+ |
구독 관리
Account Activity API v2는 현재 User Auth 2.0을 지원하지 않습니다. 이 문제를 해결 중이며, OAuth 2.0 지원 시 문서를 업데이트하겠습니다.
1. X 앱 만들기
- 앱 페이지의 권한 탭에서 “Read, Write, and Access direct messages”를 활성화합니다.
- “Keys and Access Tokens” 탭에서 앱의 Consumer Key (API Key), Consumer Token (API Secret), Bearer Token 값을 기록해 둡니다.
- 앱의 액세스 토큰과 Access Token Secret을 생성합니다. 이는 사용자 계정 구독에 필요합니다.
- X 로그인과 사용자 컨텍스트에 익숙하지 않다면 액세스 토큰 받기를 참고하세요.
- 개발자 포털의 “Apps” 페이지에서 앱의 숫자형 id를 기록해 둡니다. 이는 Account Activity API 액세스를 신청할 때 필요합니다.
2. Account Activity API 액세스 얻기
3. 웹훅 등록
- 웹훅이 JSON으로 인코딩된 이벤트 페이로드를 포함하는 POST 요청을 처리하도록 구성되어 있는지 확인하세요.
- 구독 관리를 위해 필요하므로 웹훅 등록 응답에서 webhook_id를 확인하세요.
4. 설정 검증
- 사용자 계정을 webhook에 구독하세요(아래 “구독 추가” 참조).
- 앱이 구독한 X 계정 중 하나가 올린 게시물을 좋아요하세요.
- POST 요청을 통해 webhook URL로 favorite_events 페이로드가 전달되어야 합니다.
- 참고: 구독을 추가한 후 이벤트가 전달되기 시작하기까지 최대 10초가 걸릴 수 있습니다.
중요 참고 사항
- 인증: 사용자를 구독할 때 해당 사용자의 계정에 대한 consumer key, consumer secret, access token, access token secret을 사용하십시오.
- 다이렉트 메시지: 모든 수신 및 발신 다이렉트 메시지(POST /2/dm_conversations/with/:participant_id/messages로 전송됨)는 웹훅을 통해 전달되어 앱이 모든 DM 활동을 파악할 수 있도록 합니다.
- 이벤트 중복:
- 두 명의 구독된 사용자가 같은 DM 대화에 있는 경우 웹훅은 중복 이벤트를 수신합니다(사용자당 1개). 이를 구분하려면 for_user_id 필드를 사용하십시오.
- 여러 앱이 동일한 웹훅 URL과 사용자를 공유하는 경우 이벤트가 여러 번 전송됩니다(앱당 1회).
- 앱은 간헐적으로 발생하는 중복을 처리하기 위해 event ID를 사용해 이벤트를 중복 제거해야 합니다.
- 예제 코드: 웹훅 이벤트를 표시하는 웹 앱은 Account Activity API 설정을 참고하십시오.
구독 사용자 관리 (v2 API)
설명: 지정된 webhook을 통해 이벤트를 수신하도록 인증 사용자에게 구독을 추가합니다.
인증: OAuthUser(구독 대상 사용자를 나타내며, 3-legged OAuth 플로우 필요).
- Consumer Key: 예: xvz1evFS…
- 액세스 토큰: 예: 370773112-GmHxMAgYyLbN…
| 매개변수 | 설명 |
|---|---|
| webhook_id | 구독을 연결할 webhook의 ID. |
bash
- 성공(200 OK):
- JSON
- 실패 (400 Bad Request):
| 이유 | 설명 |
|---|---|
| WebhookIdInvalid | 제공된 webhook_id를 찾을 수 없거나 앱과 연동되어 있지 않습니다. |
| DuplicateSubscriptionFailed | 해당 사용자에 대한 구독이 지정된 webhook_id에 이미 존재합니다. |
| SubscriptionLimitExceeded | 애플리케이션이 모든 webhook 전반에서 구독 한도에 도달했습니다. |
엔드포인트: GET /2/account_activity/webhooks/:webhook_id/subscriptions/all
설명: 인증 중인 사용자가 지정된 웹훅에 구독되어 있는지 확인합니다.
인증: OAuthUser(3-legged OAuth 플로우 필요).
경로 매개변수:
| 매개변수 | 설명 |
|---|---|
| webhook_id | 확인할 웹훅의 id. |
bash
- 성공(200 OK):
- JSON
- 실패(400 Bad Request):
| 이유 | 설명 |
|---|---|
| WebhookIdInvalid | 제공된 webhook_id를 찾을 수 없거나 앱과 연동되어 있지 않습니다. |
엔드포인트: DELETE /2/account_activity/webhooks/:webhook_id/subscriptions/:user_id/all
설명: 특정 사용자 ID의 구독을 비활성화하여 웹훅으로의 이벤트 전송을 중지합니다.
인증: OAuth2 앱 전용 베어러 토큰.
- 베어러 토큰: 예: AAAAAAAAAAAA0%2EUifi76ZC9Ub0wn…
| 매개변수 | 설명 |
|---|---|
| webhook_id | 구독이 포함된 웹훅의 ID입니다. |
| user_id | 구독을 해지할 사용자의 숫자 ID입니다. |
bash
- 성공(200 OK):
- JSON
- 실패(400 Bad Request):
| 이유 | 설명 |
|---|---|
| SubscriptionNotFound | 지정된 user_id와 주어진 webhook_id에 해당하는 구독이 존재하지 않습니다. |
| WebhookIdInvalid | 제공된 webhook_id를 찾을 수 없거나 앱과 연결되어 있지 않습니다. |
설명: 지정된 webhook에 현재 구독된 모든 사용자 ID의 목록을 가져옵니다.
인증: OAuth2 앱 전용 베어러 토큰
경로 매개변수:
| 매개변수 | 설명 |
|---|---|
| webhook_id | 구독을 조회할 대상 webhook의 ID |
bash
- 성공(200 OK):
- JSON
- 실패 (400 Bad Request):
| 이유 | 설명 |
|---|---|
| WebhookIdInvalid | 제공된 webhook_id를 찾을 수 없거나 앱과 연결되어 있지 않습니다. |
엔드포인트: GET /2/account_activity/subscriptions/count
설명: 활성 구독의 총 개수와 인증 애플리케이션에 대해 프로비저닝된 한도를 반환합니다.
인증: OAuth2 앱 전용 베어러 토큰
요청:
bash
- 성공(200 OK):
- JSON
| 매개변수 | 설명 |
|---|---|
| webhook_id | 재생을 시작할 웹훅의 id |
| 매개변수 | 설명 |
|---|---|
| from_date | 이벤트 제공을 시작할 가장 이른 UTC 타임스탬프로, ‘yyyymmddhhmm’ 형식이어야 합니다. 타임스탬프는 분 단위 정밀도이며 포함적입니다(예: 12:00은 00분을 포함). 유효한 시간은 UTC 기준 최근 24시간 이내여야 하며, 현재 시점보다 최소 31분 이전이어야 합니다. from_date와 to_date는 약 2시간 이내 범위로 지정하는 것을 권장합니다. |
| to_date | 이벤트 제공을 종료할 가장 늦은 UTC 타임스탬프로, ‘yyyymmddhhmm’ 형식이어야 합니다. 타임스탬프는 분 단위 정밀도이며 배타적입니다(예: 12:30은 해당 시의 30분을 포함하지 않음). 유효한 시간은 UTC 기준 최근 24시간 이내여야 하며, 현재 시점보다 최대 10분 이전이어야 합니다. |
| Reason | Description |
|---|---|
| QueryParamInvalid | from_date가 현재 시각 기준으로 24시간을 초과해 과거입니다. |
| QueryParamInvalid | from_date가 to_date보다 더 최근입니다. |
| QueryParamInvalid | from_date가 미래 시점입니다. |
| QueryParamInvalid | to_date가 미래 시점입니다. |
| QueryParamInvalid | from_date 또는 to_date의 형식이 올바르지 않습니다. |
| CrcValidationFailed | CRC 검증 중 webhook URL에서 잘못된 응답이 반환되었습니다. |
| ReplayConflictError | 지정된 webhook에 대한 재실행 작업이 이미 진행 중입니다. |
| WebhookIdInvalid | 제공된 webhook_id가 유효하지 않거나 앱과 연결되어 있지 않습니다. |
작업 완료 메시지
계정 활동 데이터 객체 구조
| 객체 | 상세 |
|---|---|
| for_user_id | 이벤트와 관련된 사용자 구독을 식별합니다. |
| is_blocked_by | (조건부) 언급한 사용자가 구독된 사용자에게 차단된 경우에만 게시물 언급 이벤트에서 표시됩니다. |
| source | 활동을 수행하는 사용자(예: 팔로우, 차단, 음소거를 하는 사용자). |
| target | 활동의 대상 사용자(예: 팔로우되거나 차단되거나 음소거되는 사용자). |
사용 가능한 활동
| 메시지 유형 | 세부 정보 |
|---|---|
| tweet_create_events | 게시물, 리포스트, 답글, @멘션, 인용 게시물 또는 인용 게시물의 리포스트에 대한 게시 상태. |
| favorite_events | 사용자와 대상이 포함된 좋아요 이벤트. |
| follow_events | 사용자와 대상이 포함된 팔로우 이벤트. |
| unfollow_events | 사용자와 대상이 포함된 언팔로우 이벤트. |
| block_events | 사용자와 대상이 포함된 차단 이벤트. |
| unblock_events | 사용자와 대상이 포함된 차단 해제 이벤트. |
| mute_events | 사용자와 대상이 포함된 음소거 이벤트. |
| unmute_events | 사용자와 대상이 포함된 음소거 해제 이벤트. |
| user_event | 사용자가 앱 권한을 제거할 때 발생하는 해지 이벤트(구독 자동 삭제). |
| direct_message_events | 보낸/받은 메시지에 대한 DM 상태. |
| direct_message_indicate_typing_events | 사용자와 대상이 포함된 DM 입력 중 이벤트. |
| direct_message_mark_read_events | 사용자와 대상이 포함된 DM 읽음 이벤트. |
| tweet_delete_events | 규정 준수를 위한 삭제된 게시물 알림. |
| spaces_events | 현재는 지원되지 않습니다. 곧 제공될 예정입니다. |
페이로드 예시
tweet_create_events (게시물, 리포스트, 답글, 인용 게시물)
tweet_create_events (@멘션)
favorite_events
follow_events
언팔로우_이벤트
block_events
차단 해제_이벤트
mute_events
unmute_events
user_event
direct_message_events
direct_message_indicate_typing_events
direct_message_mark_read_events
tweet_delete_events
장문 게시물 지원
- full_text: 280자 제한을 넘는 모든 문자를 포함한 게시물의 전체 텍스트
- entities: 전체 텍스트에 나타나는 모든 엔터티(예: 해시태그, URL, 사용자 멘션, 심볼). 280번째 문자 이후의 항목도 포함됨
- display_text_range: 전체 텍스트를 고려한 표시 문자 범위
Account Activity API 레거시 엔터프라이즈에서 v2로 마이그레이션하기
자주 묻는 질문
- 속도: X의 속도로 데이터를 전달합니다.
- 단순성: 단일 웹훅 연결로 게시물, @멘션, 답글, 리포스트, 인용 트윗, 좋아요, DM, 팔로우, 차단, 뮤트 등 모든 계정 이벤트를 제공합니다.
- 확장성: 관리 중인 계정의 모든 활동을 요청 한도나 이벤트 상한 없이 지원합니다(Enterprise 티어).
Account Activity API 참조 색인
| 목적 | V2 엔드포인트 |
|---|---|
| 애플리케이션을 계정 이벤트에 구독시킵니다 | POST /2/account_activity/webhooks/:webhook_id/subscriptions/all |
| 현재 활성화된 구독 수를 반환합니다 | GET /2/account_activity/subscriptions/count |
| 웹훅이 특정 계정에 구독되어 있는지 확인합니다 | GET /2/account_activity/webhooks/:webhook_id/subscriptions/all |
| 현재 활성화된 구독 목록을 반환합니다 | GET /2/account_activity/webhooks/:webhook_id/subscriptions/all/list |
| 앱 전용 OAuth를 사용해 구독을 비활성화합니다 | DELETE /2/account_activity/webhooks/:webhook_id/subscriptions/:user_id/all |
| 재생 작업을 생성합니다 | POST /2/account_activity/replay/webhooks/:webhook_id/subscriptions/all |