이 엔드포인트는 게시물 수정 메타데이터가 포함되도록 업데이트되었습니다. 이러한 메타데이터에 대해 더 알아보려면 “Edit Posts” 기본 사항 페이지를 참고하세요. 이 엔드포인트는 Direct Messages 엔드포인트와 함께 자주 사용됩니다. 새로운 v2 Direct Messages 엔드포인트를 출시했습니다. Enterprise 및 Premium Account Activity API는 v2 일대일 Direct Message는 지원하지만, 아직 그룹 대화는 지원하지 않습니다.
Enterprise
Account Activity API를 사용하면 웹훅(webhook)을 통해 사용자 계정과 관련된 실시간 활동을 구독할 수 있습니다. 이를 통해 소유하거나 구독 중인 하나 이상의 계정에서 단일 연결을 통해 실시간 게시물, Direct Message 및 기타 계정 이벤트를 수신할 수 있습니다.
웹훅 등록에서 각 사용자 구독에 대해 아래의 모든 관련 활동을 수신하게 됩니다:
참고 - Account Activity API를 통해 홈 타임라인 데이터를 제공하지 않습니다. 이 데이터를 가져오려면 GET statuses/home_timeline을 사용하세요.
동영상 시리즈
기능 요약
- 궁금한 점이 있거나 오류가 발생하나요?
-
샘플 코드를 살펴보세요:
- Enterprise Account Activity API 대시보드는 Enterprise 티어의 Account Activity API를 사용해 웹훅 이벤트를 표시하고 Replay 기능을 제공하는 Node.js 웹 앱입니다.
- SnowBot 챗봇은 Enterprise Account Activity API 및 Direct Message API를 기반으로 구축된 Ruby 웹 앱입니다.
웹훅 및 구독 사용자 관리
- 등록된 X App - 여기에서 등록
- Bearer 토큰 - 자세히 알아보기
- Challenge-Response Check(CRC)를 통과하는 웹훅 - 자세히 알아보기
- Enterprise 계정 - [여기에서 신청]https://developer.x.com/en/products/x-api/enterprise
웹훅 관리하기
- 웹훅 추가하기
- 웹훅 조회하기
- 웹훅 제거하기
주어진 애플리케이션 컨텍스트에 대해 새 웹훅 URL을 등록하는 것부터 시작하겠습니다.저장 전에 CRC 요청을 통해 URL이 검증됩니다. 웹훅을 등록한 후에는 나중에 필요하므로 웹훅 ID를 반드시 기록해 두세요.아래 cURL 요청에서 다음 값을 수정한 뒤, 명령줄에 복사해 실행하세요.
-
URL
<URL>예:https://yourdomain.com/webhooks/twitter/ -
Consumer key
<CONSUMER_KEY>예:xvz1evFS4wEEPTGEFPHBog -
Access token
<ACCESS_TOKEN>예:370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb
구독된 사용자 관리:
- 구독 추가
- 구독 보기
- 구독 제거
모든 이벤트 유형을 수신할 수 있도록 사용자를 구독시키는 것부터 시작하겠습니다.다음 항목을 변경한 뒤 아래 cURL 요청을 명령줄에 복사해 실행하세요:
-
Webhook ID
<:WEBHOOK_ID>예:1234567890 -
Consumer key 이름
<CONSUMER_KEY>예:xvz1evFS4wEEPTGEFPHBog -
구독 중인 사용자의 access token
<SUBSCRIBING_USER'S_ACCESS_TOKEN>예:370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb
참고 문서
- Challenge-Response Check (CRC) 개요
- [Account Activity 데이터 type](/x-api/enterprise-gnip-2.0/fundamentals/account-activity#account-activity-data-object-structure
- Webhook 및 구독 관리
Account Activity API 동영상 가이드
- 웹훅 등록
- 사용자 구독 추가
- 사용자 구독 제거
- 계정 활동 수신
- 계정 활동 재생
- 질문이 있으신가요? 오류가 발생하나요?
-
샘플 코드를 살펴보세요:
- Enterprise Account Activity API 대시보드는 엔터프라이즈 티어 Account Activity API를 사용해 webhook 이벤트를 표시하고 Replay 기능을 제공하는 Node 웹 앱입니다.
- SnowBot 챗봇은 엔터프라이즈 Account Activity 및 Direct Message API 위에 구축된 Ruby 웹 앱입니다.
웹훅 시작하기
1. X 앱을 생성합니다.
- 개발자 콘솔에서 승인된 개발자 계정으로 X app을 생성합니다. 회사를 대신해 앱을 만드는 경우에는 회사용 X 계정으로 앱을 생성하는 것을 권장합니다. 개발자 계정을 신청하려면 여기를 클릭하세요.
- 앱 페이지의 permissions 탭에서 “Read, Write and Access direct messages” 권한을 활성화합니다.
- “Keys and Access Tokens” 탭에서 앱의 Consumer Key(API Key)와 Consumer Token(API Secret)을 기록해 둡니다.
- 같은 탭에서 앱의 Access Token 및 Access Token Secret을 생성합니다. 이 Access Token은 X가 계정 이벤트를 전송하는 webhook URL을 등록할 때 필요합니다.
- X Sign-in 및 X API에서 사용자 컨텍스트가 어떻게 동작하는지 잘 모른다면, Access Tokens 획득을 확인하세요. 이벤트를 수신할 계정을 추가할 때, 해당 계정의 Access Token을 사용해 구독하게 됩니다.
- 개발자 콘솔의 “Apps” 페이지에 표시되는 앱의 숫자형 ID를 기록해 둡니다. Account Activity API 액세스를 신청할 때 이 앱 ID가 필요합니다.
2. Account Activity API 접근 권한 받기
3. 웹훅 컨슈머 앱 개발
-
이벤트를 수신하기 위한 웹훅 엔드포인트로 사용할 URL을 가진 웹 앱을 만듭니다. 이는 서버에 배포되어 들어오는 X 웹훅 이벤트를 수신(listen)하는 엔드포인트입니다.
- URI *path_는 자유롭게 정할 수 있습니다. 예를 들어, 다음과 같은 예시가 유효합니다: https://mydomain.com*/service/listen_
- 여러 소스로부터 웹훅을 수신하는 경우, 일반적인 패턴은 다음과 같습니다: https://mydomain.com/webhook/twitter
- 지정한 URL에는 포트 번호를 명시할 수 없다는 점에 유의하세요 (https://mydomain.com:5000/NoWorkie).
- Securing Webhooks 가이드에서 설명한 것처럼, 첫 단계는 X Challenge Response Check(CRC) GET 요청을 수신하고, 올바르게 포맷된 JSON 응답을 반환하는 코드를 작성하는 것입니다.
- 웹훅 URL을 등록하세요. /webhooks.json?url= 엔드포인트에 POST 요청을 보내게 됩니다. 이 요청을 보내면 X가 웹 앱으로 CRC 요청을 전송합니다. 웹훅이 성공적으로 등록되면 응답에 웹훅 id가 포함됩니다. 이 웹훅 id는 이후 Account Activity API에 일부 요청을 보낼 때 필요합니다.
- X는 등록한 URL로 계정 웹훅 이벤트를 전송합니다. 웹 앱이 수신 이벤트에 대한 POST 요청을 지원하는지 확인하세요. 이 이벤트는 JSON으로 인코딩되어 전달됩니다. 예제 웹훅 JSON 페이로드는 여기를 참고하세요.
- 웹 앱이 준비되면, 다음 단계는 활동을 수신할 계정을 추가하는 것입니다. 계정을 추가(또는 삭제)할 때는 계정 id를 참조하는 POST 요청을 보내게 됩니다. 자세한 내용은 구독 추가 가이드를 참고하세요.
4. 설정 검증
- 앱과 webhook이 올바르게 구성되었는지 확인하려면, 앱이 구독하고 있는 X 계정 중 하나가 작성한 게시물에 마음에 들어요 표시를 하세요. 구독 중인 계정이 받은 각 즐겨찾기(Favorite)에 대해 webhook URL로 전송되는 POST 요청을 통해
favorite_events를 수신해야 합니다. - 구독이 추가된 후 이벤트가 전달되기 시작하기까지 최대 10초 정도 소요될 수 있습니다.
- webhook URL을 등록할 때, 웹 앱은 consumer token과 secret, 그리고 앱 소유자의 사용자 액세스 토큰과 시크릿 으로 인증해야 합니다.
- 수신되는 모든 다이렉트 메시지는 webhook을 통해 전달됩니다. 또한 POST direct_messages/events/new (message_create)를 통해 전송된 모든 다이렉트 메시지도 webhook을 통해 전달됩니다. 이는 웹 앱이 다른 클라이언트를 통해 전송된 다이렉트 메시지도 인지할 수 있도록 하기 위함입니다.
- 모든 webhook 이벤트에는 해당 이벤트가 어떤 구독에 대해 전달되었는지를 나타내는 for_user_id 사용자 ID가 포함되어 있다는 점에 유의하세요.
- 동일한 대화에서 두 사용자가 다이렉트 메시지용으로 웹 앱을 사용하고 있는 경우, webhook은 두 개의 중복 이벤트(각 사용자당 하나씩)를 받게 됩니다. 웹 앱은 이를 고려해야 합니다.
- 동일한 webhook URL을 공유하는 둘 이상의 웹 앱이 있고 동일한 사용자가 각 앱에 매핑되어 있는 경우, 동일한 이벤트가 webhook으로 여러 번(웹 앱당 한 번씩) 전송됩니다.
- 일부 경우에는 webhook이 중복 이벤트를 수신할 수 있습니다. webhook 앱은 이에 대해 허용적이어야 하며 이벤트 ID를 기준으로 중복을 제거해야 합니다.
- 퀵 리플라이(Quick Reply) 응답이 요청 직후에 바로 이어질 것이라고 가정하지 마세요. 사용자는 퀵 리플라이 요청을 무시하고 일반 다이렉트 메시지로 응답할 수 있습니다. 또한 사용자는 메시지 스레드에서 이전에 응답하지 않았던 요청에 대해 나중에 퀵 리플라이 응답을 제공할 수도 있습니다.
-
예제 코드를 참고하세요:
- Enterprise Account Activity API dashboard는 Account Activity API의 엔터프라이즈 티어를 사용해 webhook 이벤트를 표시하고, Replay 기능을 포함하는 Node 기반 웹 앱입니다.
- SnowBot chatbot은 Account Activity API와 다이렉트 메시지 API를 기반으로 구축된 Ruby 웹 앱입니다. 이 코드베이스에는 Account Activity API webhook 설정을 돕기 위한 스크립트가 포함되어 있습니다.
웹훅 보안 확보
- 챌린지-응답 검사를 통해 웹훅 이벤트를 수신하는 웹 앱의 소유권을 X가 확인할 수 있습니다.
- 각 POST 요청의 서명 헤더를 통해 수신된 웹훅의 발신자가 X인지 확인할 수 있습니다.
Challenge-Response Checks
crc_token 파라미터를 포함하여 웹 앱에 GET 요청을 보냅니다. 해당 요청을 수신하면 웹 앱은 crc_token 파라미터와 앱의 Consumer Secret(아래 상세 참고)을 기반으로 암호화된 response_token을 생성해야 합니다. response_token은 JSON으로 인코딩되어야 하며(아래 예시 참고), 3초 이내에 반환되어야 합니다. 성공하면 webhook id가 반환됩니다.
webhook URL을 등록할 때 CRC가 전송되므로, CRC 응답 코드를 구현하는 것은 필수적인 첫 단계입니다. webhook이 설정된 이후에는 마지막으로 성공적인 응답을 받은 시점으로부터 대략 24시간마다 X가 CRC를 트리거합니다. 또한, 필요한 경우 webhook id를 사용해 PUT 요청을 보내 CRC를 트리거할 수도 있습니다. CRC를 트리거하는 것은 webhook 애플리케이션을 개발하는 동안이나 새 코드를 배포한 후, 서비스를 재시작한 후에 유용합니다.
_crc_token_은 들어오는 각 CRC 요청마다 변경될 것으로 예상해야 하며, Consumer Secret을 키로 사용하는 계산에서 메시지로 사용되어야 합니다.
응답이 3초 이내에 전송되지 않거나 유효하지 않게 되는 경우, 등록된 webhook으로 이벤트 전송이 중단됩니다.
CRC 요청은 다음과 같은 경우에 발생합니다:
- webhook URL이 등록될 때.
- webhook URL을 검증하기 위해 대략 매시간 한 번씩.
- PUT 요청을 보내 CRC를 수동으로 발생시킬 수 있습니다. webhook 클라이언트를 개발할 때는 CRC 응답을 구현하는 동안 CRC를 수동으로 발생시키는 방식을 함께 계획해야 합니다.
응답 요구 사항:
crc_token과 App Consumer Secret에서 생성된 base64 인코딩 HMAC-SHA-256 해시- 유효한 response_token 값과 JSON 형식
- 3초 미만의 지연 시간
- HTTP 200 응답 코드
각 언어별 HMAC 라이브러리:
Python에서의 응답 토큰 생성 예제:
예시 JSON 응답:
다른 예시:
- 여기는 Node/JS로 작성된 CRC 응답 메서드 예시입니다.
- 여기는 Ruby로 작성된 CRC 응답 메서드 예시입니다(generate_crc_response 및 CRC 이벤트를 수신하는 /GET 라우트를 참고하세요).
선택적 시그니처 헤더 유효성 검증
x-twitter-webhooks-signature 로 해시 시그니처가 전달됩니다. 이 시그니처를 사용하여 데이터의 출처가 X인지 검증할 수 있습니다. POST 해시 시그니처는 sha256=로 시작하며, 이는 HMAC SHA-256을 사용해 X App의 Consumer Secret과 페이로드를 암호화했음을 의미합니다. GET 해시는 쿼리 파라미터 문자열 crc_token=$token&nonce=$nonce 를 기반으로 계산됩니다.
요청을 검증하는 단계
- consumer secret과 수신한 페이로드 본문을 사용하여 해시를 생성합니다.
- 생성한 해시를 base64로 인코딩된
x-twitter-webhooks-signature값과 비교합니다. 타이밍 공격에 대한 취약성을 줄이기 위해 compare_digest와 같은 메서드를 사용하세요.
추가 보안 지침
X 집계 네트워크 블록
- 199.59.148.0/22
- 199.16.156.0/22
- 192.133.77.0/26
- 64.63.15.0/24
- 64.63.31.0/24
- 64.63.47.0/24
- 202.160.128.0/24
- 202.160.129.0/24
- 202.160.130.0/24
권장 서버 구성
- ssllabs.com 테스트에서 “A” 등급
- TLS 1.2 활성화
- Forward Secrecy 활성화
- SSLv2 비활성화
- SSLv3 비활성화 (POODLE 취약점 때문에)
- TLS 1.0 비활성화
- TLS 1.1 비활성화
- TLS 압축 비활성화
- 세션 티켓 키를 주기적으로 교체하지 않는 한 Session Tickets 비활성화
- SSL 구성에서 “ssl_prefer_server_ciphers” 또는 “SSLHonorCipherOrder” 옵션을 “on”으로 설정
- 암호 스위트 목록이 다음과 같은 최신 목록인지 확인:
ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:AES256-GCM-SHA384:AES256-SHA256:AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:DES-CBC3-SHA
웹훅 및 구독 관리
웹훅 생성 및 변경
Webhook 구성 관리 엔드포인트:
웹훅 URL만 업데이트하면 안 되나요?
사용자 구독 추가 및 제거
구독 관리 엔드포인트
Account Activity API: Enterprise
주의: API를 사용하기 전에 X가 개발자 App에 대해 Account Activity API 액세스를 먼저 활성화해야 합니다. 이를 위해, 인증에 사용할 예정인 App ID를 계정 관리자 또는 기술 지원팀과 반드시 공유해 주세요.
*_ 인증에는 구독하는 사용자의 액세스 토큰이 필요합니다. _
OAuth 1.0a 사용자 컨텍스트 인증이 필요한 엔드포인트의 경우, 요청을 인증하기 위해 다음 자격 증명을 제공해야 합니다.
- Consumer Key (API Key 및 Secret)
- Access Token (Access Token 및 Secret)
- POST account_activity/webhooks: 지정된 애플리케이션 컨텍스트에 대해 새로운 웹훅 URL을 등록합니다.
- PUT account_activity/webhooks/:webhook_id: 지정된 웹훅 URL에 대해 CRC(Challenge Response Check)를 트리거합니다.
- DELETE account_activity/webhooks/:webhook_id: 웹훅을 삭제합니다.
- POST account_activity/webhooks/:webhook_id/subscriptions/all: 애플리케이션이 사용자의 계정 이벤트를 구독하도록 합니다.
- GET account_activity/webhooks/:webhook_id/subscriptions/all: 웹훅 구성이 사용자의 이벤트를 구독하고 있는지 확인합니다.
- DELETE account_activity/webhooks/:webhook_id/subscriptions/all: 제공된 사용자 컨텍스트와 애플리케이션에 대한 구독을 비활성화합니다 [사용 중단(DEPRECATED)]
유의하세요: 개발자 App이 “Read, Write, and Direct Messages”에 대해 활성화되어 있는지 확인하세요. 이 설정은 개발자 계정의 Projects & Apps 섹션에서 선택한 개발자 App의 “App permissions” 아래에서 변경할 수 있습니다. 권한 설정을 변경한 후에는 App 자격 증명을 다시 생성해야 합니다.
유의하세요: Account Activity API를 사용하기 전에 X에서 개발자 App에 대해 Account Activity API 액세스를 활성화해야 합니다. 이를 위해, 인증 목적으로 사용하려는 App ID를 계정 매니저 또는 기술 지원 팀에 반드시 공유하세요.
*_ 인증에는 해당 구독을 생성한 사용자의 액세스 토큰이 필요합니다. _
OAuth 1.0a 사용자 컨텍스트 인증이 필요한 엔드포인트에서는, 요청을 인증하기 위해 다음 자격 증명을 제공해야 합니다.
- Consumer Keys (API Key 및 Secret)
- Access Tokens (Access Token 및 Secret)
- POST account_activity/webhooks: 지정된 애플리케이션 컨텍스트에 대해 새로운 webhook URL을 등록합니다.
- PUT account_activity/webhooks/:webhook_id: 특정 webhook의 URL에 대해 챌린지 응답 검사(CRC)를 트리거합니다.
- DELETE account_activity/webhooks/:webhook_id: webhook를 삭제합니다.
- POST account_activity/webhooks/:webhook_id/subscriptions/all: 애플리케이션을 사용자의 계정 이벤트에 구독합니다.
- GET account_activity/webhooks/:webhook_id/subscriptions/all: webhook 설정이 사용자의 이벤트에 구독되어 있는지 확인합니다.
- DELETE account_activity/webhooks/:webhook_id/subscriptions/all: 제공된 사용자 컨텍스트와 애플리케이션에 대한 구독을 비활성화합니다. [사용 중단(DEPRECATED)]
유의사항: 개발자 App이 “Read, Write, and Direct Messages.”에 대해 활성화되어 있는지 확인하세요. 이 설정은 개발자 계정의 Projects & Apps 섹션에서, 선택한 개발자 App의 “App permissions” 아래에서 변경할 수 있습니다. 권한 설정을 변경한 후에는 App 자격 증명을 다시 생성해야 합니다.
재시도
Enterprise
Account Activity API 엔터프라이즈 티어의 장점 중 하나는 웹훅 이벤트에 대한 재시도 메커니즘입니다. ‘성공’을 의미하는 200 HTTP 응답 코드를 수신하지 못하면 X 서버는 재시도 메커니즘을 시작하여 5분 동안 최대 세 번까지 웹훅 이벤트를 다시 전송합니다. 이 웹훅 이벤트 재시도 서비스는 네트워크 문제가 발생했을 때와 클라이언트 측 서비스 중단 및 배포 작업 중에 안정성과 이벤트 복구를 향상하는 데 도움이 됩니다.
재시도란 무엇인가요?
재시도 타임라인
재시도 타임라인
Account Activity 데이터 객체 구조
사용 가능한 활동
페이로드 예시
위 표에 설명된 각 Account Activity 이벤트에 대한 페이로드 예시는 아래를 참조하세요.
tweet_create_events (포스트, 리트윗, 답글, 인용 트윗)
tweet_create_events (@멘션)
favorite_events
follow_events
unfollow_events
block_events
unblock_events
mute_events
unmute_events
user_event
direct_message_events
direct_message_indicate_typing_events
direct_message_mark_read_events
tweet_delete_events
Account Activity Replay API
Enterprise
Account Activity Replay API는 최대 5일 전까지의 이벤트를 복구할 수 있는 데이터 복구 도구입니다. 웹훅 서버가 이벤트를 수신하지 못한 경우, 즉 재시도 윈도우를 초과하는 기간 동안 연결이 끊겼거나, 시스템을 정상 상태로 복구하는 데 며칠이 필요한 재해 복구 상황에서 데이터를 복구하는 데 사용해야 합니다.
Account Activity Replay API는 일정 기간 동안 activities를 수집하지 못한 모든 상황을 위해 개발되었습니다. 이 API는 원래 활동이 실시간으로 전달되던 것과 동일한 웹훅으로 activities를 다시 전달합니다. 이 제품은 백필(backfill) 도구가 아닌 복구 도구이므로, 이전에 해당 이벤트의 전송이 시도된 경우에만 이벤트가 재생됩니다. Account Activity Replay API는 구독이 생성되기 이전 기간에 대한 이벤트는 전달할 수 없습니다.
Account Activity Replay API 사용하기
제한 사항
데이터 가용성 및 유형
마이그레이션 소개
- User Streams
- Site Streams
- GET direct_messages
- GET direct_messages/sent
- GET direct_messages/show
- POST direct_messages/new
- POST direct_messages/destroy
- Account Activity API enterprise 및 premium
- GET direct_messages/events/list
- GET direct_messages/events/show
- POST direct_messages/events/new
- POST direct_messages/events/destroy
- User Streams 및 Site Streams에서 새로운 웹훅 기반 서비스로 전환하는 사용자를 위한 Account Activity API 마이그레이션 가이드
- 다이렉트 메시지 REST 엔드포인트 간에 마이그레이션하는 사용자를 위한 다이렉트 메시지 마이그레이션 가이드
- Account Activity Dashboard는 Account Activity API를 시작하는 데 도움이 되는 헬퍼 스크립트를 포함한 예제 Node.js 웹 App입니다.
- SnowBot은 Account Activity API와 REST 다이렉트 메시지 엔드포인트를 사용하는 예제 챗봇입니다. Ruby로 작성되었으며, Sinatra 웹 App 프레임워크를 사용하고 Heroku에 배포되어 있습니다.
마이그레이션 가이드: User Streams/Site Streams에서 Account Activity API로 이전하기
변경 내용 요약
사용 중단된 API
대체 API
차이점 및 마이그레이션 시 고려사항
API 형식: 새로운 Account Activity API는 User Streams 및 Site Streams와 다르게 동작합니다. 웹후크(webhook)를 통해 데이터를 수신할 수 있도록 웹 앱을 수정해야 합니다. 웹후크에 대한 보다 자세한 정보는 여기에서 확인할 수 있습니다. 사용 가능한 데이터: 또 다른 주요 차이점은 전달되는 데이터와 관련이 있습니다. X는 더 이상 X에서 사용자가 팔로우하는 사람들(즉, 홈 타임라인)로부터 발생하는 이벤트를 전송하지 않습니다. 이는 의도적인 변경 사항이며, 앞으로 변경할 계획이 없습니다. 신뢰성: 스트리밍과 달리 웹후크는 전달 여부 확인과, 웹후크 URL에 도달하지 못한 POST 요청으로 전송된 활동을 재시도할 수 있는 옵션을 제공합니다. 이를 통해 짧은 연결 끊김이나 다운타임이 있더라도 앱이 모든 해당 활동을 수신하고 있다는 점을 보다 확실하게 보장할 수 있습니다.새로운 기능
사용자 구독 관리
마이그레이션 절차
아래 단계를 따라 Site Streams API에서 Account Activity API로 쉽게 마이그레이션하세요
- 필요한 웹훅(webhook) 수
- 현재/예상 애플리케이션에서 관리 중인 구독/승인된 사용자 수
- 현재 X 클라이언트 애플리케이션 수
- X로부터 원하는 지원 수준(포럼 지원 또는 관리형 엔터프라이즈 1:1 지원)
- 각 패키지의 가격
- X app 페이지의 permissions 탭에서 “Read, Write and Access direct messages”를 활성화하세요.
이 설정을 변경해도 소급 적용되지는 않으며, 이미 승인된 사용자는 승인 당시의 권한 설정을 유지합니다. 사용자가 아직 읽기, 쓰기, 다이렉트 메시지 접근 권한을 부여하지 않았다면, 해당 사용자가 애플리케이션을 다시 승인하도록 해야 합니다. - X Sign-in과 사용자 컨텍스트가 X API에서 어떻게 동작하는지 잘 모르는 경우 Obtaining Access Tokens를 검토하세요.
- “Keys and Tokens” 탭의 하단에서 X app 소유자용 액세스 토큰을 생성하세요. 같은 탭에서 Consumer Key, Consumer Secret, Access Token, Access Token Secret 값을 기록해 두세요. API를 사용하려면 이 값들이 필요합니다.
- application-only API 메서드용으로 Consumer Key와 Consumer Secret을 사용해 Bearer 토큰을 생성하세요.
- 이벤트를 수신하기 위한 웹훅으로 사용할 엔드포인트를 가진 웹 앱을 만드세요(예: https://your_domain.com/webhook/twitter 또는 https://webhooks.your_domain.com).
-
웹훅을 생성할 때 Consumer Key, Consumer Secret, Access Token, Access Token Secret을 사용하세요. 엔드포인트는 JSON 응답을 반환해야 하며, 여기에는
crc_token과 app Consumer Secret으로 생성한 base64 인코딩 HMAC SHA-256 해시인response_token이 포함되어야 합니다. - Challenge Response Check(CRC) 요구 사항에 특히 유의하여 Securing Webhooks 문서를 검토하세요.
- 웹훅이 수신 이벤트용 POST 요청과 CRC용 GET 요청을 모두 지원하는지 확인하세요.
- 웹훅의 지연 시간이 낮은지 확인하세요(POST 요청에 응답하는 데 3초 미만).
- Webhook API는 다음 두 가지 방식으로 웹훅을 보호합니다:
- X는 웹 앱과 웹훅 URL의 소유자가 동일한지 확인하기 위해 Challenge Response Check(CRC)를 수행합니다. 이는 cyclic redundancy check와는 다른 개념입니다.
crc_token이라는 파라미터가 포함된 GET 요청이 웹훅 URL로 전송됩니다. 엔드포인트는crc_token과 app Consumer Secret으로 생성한 base64 인코딩 HMAC SHA-256 해시인response_token을 포함하는 JSON 응답을 반환해야 합니다.- 각 CRC 요청마다
crc_token값은 변경될 수 있습니다.crc_token은 Consumer Secret을 키로 사용하는 계산에서 메시지로 사용해야 합니다. - 응답이 유효하지 않은 경우, 등록된 웹훅으로 이벤트 전송이 중단됩니다.
- User Streams에서 현재 사용자 구독 목록을 조회합니다.
- 다음 요청을 사용해 새로운 Account Activity API 구독을 설정합니다: POST account_activity/all/:env_name/subscriptions
- 다음 요청을 사용해 Account Activity API 구독을 확인합니다: _GET account_activity/all/:env_name/subscriptions/list _
- 다음 요청을 사용해 Site Streams에서 현재 구독 목록을 조회합니다: GET /1.1/site/c/:stream_id/info.json
- 다음 요청을 사용해 새로운 Account Activity API 구독을 설정합니다: POST account_activity/all/:env_name/subscriptions
- 다음 요청을 사용해 Account Activity API 구독을 확인합니다: _GET account_activity/all/:env_name/subscriptions/list _
- POST webhooks를 사용해 App에 webhook URL을 등록하고 webhook_id를 발급받습니다.
- 반환된 webhook_id를 사용해 POST webhooks/:webhook_id/subscriptions/all을(를) 호출하여 사용자 구독을 추가합니다.
Account Activity 대시보드 (예제 Account Activity API App)
- Account Activity Dashboard 샘플 애플리케이션을 여기에서 다운로드합니다(Node.js를 사용합니다).
- README의 지침을 따라 App을 설치하고 실행합니다.
- 애플리케이션이 실행되면 UI를 사용해 웹훅을 손쉽게 설정하고 새 구독을 생성할 수 있습니다.
사용 가능한 활동
사용 중단된 스트리밍 메시지 타입
사용 중단된 이벤트 유형
다이렉트 메시지 마이그레이션 가이드
변경 사항 요약
다음 DM 엔드포인트를 아직 사용 중이라면, 신규 엔드포인트로 마이그레이션해야 합니다.새로운 기능
- 미디어 첨부(이미지, GIF 및 비디오) 지원
- 미리 정의된 옵션 목록을 사용해 사용자에게 구조화된 응답을 요청하는 기능
- 최대 30일간 과거 Direct Message에 액세스할 수 있음
차이점 및 마이그레이션 시 고려 사항
새로운 Direct Message 객체
요약
- Direct Message 객체 구조가 완전히 새로워졌습니다.
- 사용자 객체가 간소화되었습니다.
- 새로운 정보가 포함됩니다(퀵 리플라이 응답, 첨부 파일 등).
다이렉트 메시지 보내기
content-type이 application/x-www-form-urlencoded가 아니라 application/json으로 설정되어 있다는 점에 유의하세요. 추가로, OAuth 1.0a 서명 값을 직접 생성하는 경우 JSON 본문은 서명 생성 과정에 포함되지 않는다는 점을 명심하세요. 대부분의 OAuth 라이브러리는 이미 이를 처리하고 있습니다. twurl을 사용하는 경우 최소 0.9.3 버전을 사용하고 있는지 확인하세요.
요약
- 메시지는 JSON POST 요청 본문에 정의됩니다.
- Content-Type 헤더는
application/json으로 설정해야 합니다. - OAuth 서명 생성 시 JSON 본문은 포함되지 않습니다.
다이렉트 메시지 가져오기
sender_id 프로퍼티를 참고하여 응답을 후처리해야 합니다.
페이지네이션은 이제 개별 다이렉트 메시지의 ID가 아니라 커서 값에 기반하여 이뤄집니다. 각 응답에는 커서 프로퍼티가 함께 반환됩니다. GET direct_messages/events/list는 지난 30일간의 메시지를, 해당 기간 내 메시지 개수와 관계없이 최대 30일치까지 반환합니다. 커서가 반환되지 않는다면 더 이상 반환할 메시지가 없다는 의미입니다. 개별 다이렉트 메시지에 접근하는 GET direct_messages/events/show 방식은 동일하게 유지되지만, 반환되는 다이렉트 메시지 객체의 구조는 앞서 설명한 것과 같이 변경되었습니다.
마지막으로, 다이렉트 메시지에 대한 실시간 접근은 이제 Account Activity API를 사용하는 웹훅을 통해 제공됩니다. User Streams 또는 Site Streams에서 마이그레이션하는 방법에 대한 안내는 Account Activity API 마이그레이션 가이드를 참고하십시오.
요약
- 보낸 메시지와 받은 메시지가 이제 하나의 엔드포인트에서 함께 반환됩니다.
- 최대 30일치 메시지가 반환됩니다.
- 커서 기반 페이지네이션을 지원합니다.
- 웹훅을 통해 다이렉트 메시지에 실시간으로 액세스할 수 있습니다.
다이렉트 메시지 삭제
요약
- 다이렉트 메시지를 삭제하려면 ID가 필요합니다.
- 새로운 엔드포인트에는 DELETE 요청이 필요합니다.
- 삭제된 다이렉트 메시지가 공식 X 클라이언트에 반영되는 방식은 변경되지 않습니다.
자주 묻는 질문
일반
- 속도: X의 속도로 데이터를 전달합니다.
- 단순성: 단일 웹훅 연결 하나를 통해 계정의 모든 이벤트를 전달합니다. API로 전달되는 활동에는 포스트, @멘션, 답글, 리트윗, 인용 Tweet, 인용 Tweet의 리트윗, 좋아요, 발신 Direct Message, 수신 Direct Message, 팔로우, 차단, 뮤트가 포함됩니다.
- 확장성: 관리 중인 계정의 모든 활동을 이벤트 상한이나 요청 한도의 제약 없이 수신할 수 있습니다.
webhook_id를 갖게 됩니다.
Account Activity API용 개발(Development), 스테이징(Staging), 프로덕션(Production) 환경이 필요합니다. 가능한가요?
네, 가능합니다! Account Activity API의 유료 티어(유료 프리미엄 및 엔터프라이즈)에서는 여러 개의 웹훅 URL을 등록하고, API 메서드를 통해 각 웹훅별로 구독을 별도로 관리할 수 있습니다. 또한 여러 클라이언트 App을 allowlist에 추가하여, 현재 승인된 사용자에 대한 인증 상태를 유지할 수 있습니다.
Account Activity API 설정을 단계별로 안내하는 가이드가 있나요?
물론 있습니다.
- 처음 시작하는 경우, 웹훅 시작하기 가이드를 먼저 확인하는 것을 권장합니다.
-
X Dev에서 지원하는 스크립트를 따라가 보세요:
- Account Activity API dashboard: 웹훅 이벤트를 표시하는 Node 기반 웹 앱입니다.
- SnowBot chatbot: Account Activity API와 Direct Message API 위에 구축된 Ruby 웹 앱입니다. 이 코드 베이스에는 Account Activity API 웹훅 설정을 도와주는 스크립트가 포함되어 있습니다.
- 서버가 CRC에 잘못된 토큰으로 응답한 경우. 이 경우 시스템은 액티비티를 전송하기 위한 재시도를 수행하지 않습니다.
- 웹훅 URL에 잘못된 인증서가 설정된 경우. 이 경우에도 시스템은 액티비티를 전송하기 위한 재시도를 수행하지 않습니다.
- 서버가 2XX, 4XXX, 5XXX 이외의 응답 코드를 반환하는 경우.
- gzip 사용을 지정해 놓고 실제로는 gzip으로 전송하지 않는 경우.
- gzip 사용을 지정하지 않았는데 실제 응답을 gzip으로 전송하는 경우.
/all/ 부분을 다른 Account Activity 데이터 객체로 대체해서 API가 전달하는 액티비티 범위를 제한할 수 있나요? **POST https://api.x.com/1.1/account_activity/all/:env_name/subscriptions.json
아니요, 이는 불가능합니다. 현재로서는 /all/ 제품만 제공되고 있습니다.
**사용자로부터 Direct Messages 권한을 요청하지 않고 Account Activity API를 사용할 수 있는 방법이 있나요? **
현재로서는 이 API에서 Direct Messages 활동만을 ‘필터링’하는 방법이 없기 때문에 Direct Messages 권한이 필수입니다.
Account Activity API의 샌드박스 버전이 있나요?
네, 테스트용 샌드박스 옵션을 제공합니다. 샌드박스 옵션은 단일 웹훅과 최대 15개의 구독으로 제한됩니다. 샌드박스 옵션에 대한 자세한 내용은 문서에서 확인할 수 있습니다.
**구독된 사용자를 멘션하는 게시물의 리트윗을 가져오기 위해 Account Activity API를 사용할 수 있나요? **
유감스럽게도, 이는 이 API가 제공하는 액티비티에 포함되어 있지 않습니다. 이 경우에는 대신 Streaming API 사용을 권장합니다.
tweet_create_event가 나타낼 수 있는 가능한 액티비티에는 어떤 것들이 있나요?
다음과 같은 경우 tweet_create_event 페이로드가 전송됩니다.
구독된 사용자가 다음 작업 중 하나를 수행할 때:
- 게시물 생성
- 리트윗
- 게시물에 답글 작성
- 구독된 사용자를 @멘션*할 때
- 구독된 사용자가 작성한 Tweet을 인용할 때
user\_has\_blocked라는 boolean 필드가 있으며, “true” 또는 “false”로 설정됩니다. 이 필드는 게시물 멘션에서만 노출됩니다.
Enterprise
내 앱을 allowlist에 추가하거나 이미 allowlist에 있는지 확인하려면 어떻게 해야 하나요?
Enterprise API를 통해 액세스할 수 있도록 허용 목록에 추가해 둔 X apps를 관리하려면, App ID와 함께 계정 담당자에게 문의해 주세요. App ID는 개발자 콘솔의 “Apps” 페이지로 이동하면 확인할 수 있습니다.
웹훅 3개에 대한 권한이 있는 경우, 엔터프라이즈용으로 등록한 각 App에서 웹훅 3개씩을 사용할 수 있나요?
웹훅 한도는 App 수준이 아니라 계정 수준에서 설정됩니다. 웹훅 3개에 대한 권한이 있고 엔터프라이즈용으로 등록된 App이 2개인 경우, 한 App에는 웹훅 2개를, 다른 App에는 나머지 1개를 사용할 수 있지만, 각 App마다 3개씩 사용할 수는 없습니다.
Account Activity Replay API를 사용할 때 재전달할 이벤트 유형을 지정할 수 있나요?
재생할 이벤트 유형은 지정할 수 없습니다. 지정한 날짜와 시간 범위 동안 전달된 모든 이벤트가 재생됩니다.
내 애플리케이션이 Account Activity Replay API 이벤트를 수신하지 못한 경우 재시도가 이루어지나요?
아니요, 재시도는 이루어지지 않습니다. 애플리케이션이 Account Activity Replay API에서 전송한 이벤트 수신에 실패한 경우, 동일한 기간에 대해 또 다른 Replay 작업을 제출하여 누락된 Replay 이벤트의 재전달을 시도할 수 있습니다.
부분 성공 완료 이벤트를 수신하면 어떻게 해야 하나요?
수신된 이벤트의 타임스탬프를 기록해 두고, 누락된 이벤트에 대해 다시 Replay 작업을 요청할 것을 권장합니다.
동시에 실행할 수 있는 Account Activity Replay API 작업은 몇 개까지인가요?
웹훅 하나당 동시에 실행할 수 있는 Account Activity Replay API 작업은 하나뿐입니다.
웹훅으로 전달되는 동안 Account Activity Replay API 이벤트와 실시간 프로덕션 이벤트를 어떻게 구분할 수 있나요?
Account Activity Replay API는 항상 과거의 이벤트만 전달하므로, 이벤트의 타임스탬프를 기준으로 실시간 프로덕션 이벤트와 구분할 수 있습니다.
애플리케이션에서 누락하거나 처리에 실패한 액티비티를 재전달하기 위해 Account Activity Replay API를 얼마나 빨리 사용할 수 있나요?
액티비티는 생성된 후 약 10분이 지나면 재전달이 가능해집니다.
오류 해결 가이드
코드 32
- Enterprise - 사용 중인 consumer key와 access token이 Enterprise 제품 사용을 위해 등록된 X app에 속해 있는지 확인하세요. consumer key와 access token이 없거나 allowlist에 X app을 추가해야 하는 경우에는 계정 담당자에게 문의하세요.
-
사용자 컨텍스트로 인증하는 경우,
oauth nonce,oauth_signature,oauth_timestamp가 올바르게 포함되도록 요청을 인증했는지 확인하세요. - access token에 적절한 권한 수준이 있는지 확인하세요.
-
URL이 올바른 형식으로 구성되어 있는지 확인하세요.
:env_name은 대소문자를 구분한다는 점을 유의하세요.
Code 200 - Forbidden
- Premium - API에 요청을 보내기 전에 승인된 개발자 계정이 있는지 확인하세요. 또한 요청에서 올바른 :env_name 값을 사용해야 하며, 이는 dev environments(개발 환경) 페이지에서 설정할 수 있습니다.
- Enterprise - 담당 계정 관리자가 Account Activity API에 대한 액세스 권한을 부여했는지 확인하세요.
- URI를 올바르게 구성했는지 확인하세요. 요청에 잘못된 URI를 입력한 경우 이 오류가 발생할 수 있습니다.
Code 214 - Webhook URL이 요구 사항을 충족하지 않습니다.
- HTTPS를 사용하고 있는지 확인하세요.
- Webhook URL 형식이 잘못되었을 수 있습니다.
- Getting started with webhooks 페이지의 Develop webhook consumer app 섹션에서 webhook URL을 설정하는 방법을 자세히 확인하세요.
코드 214 - CRC GET 요청의 지연 시간이 큽니다. 웹훅은 3초 이내에 응답해야 합니다.
- 이는 서버가 느리다는 의미입니다. CRC에 3초 이내에 응답하는지 확인하세요.
Code 214 - CRC GET 요청 중 200이 아닌 응답 코드(예: 404, 500 등).
- 서버가 다운된 상태입니다. 서버가 정상적으로 실행 중인지 확인하세요.
코드 214 - 이미 너무 많은 리소스가 생성되었습니다.
- Enterprise - 이미 사용 가능한 웹후크를 모두 사용했습니다. 등록된 각 App에서 GET webhooks 엔드포인트를 사용하여 웹후크가 어디에 설정되어 있는지 확인하세요.
코드 261 - 애플리케이션이 쓰기 작업을 수행할 수 없습니다.
- API와 함께 사용 중인 App에 액세스 토큰과 액세스 토큰 시크릿에 대해 올바른 권한 수준이 설정되어 있지 않습니다. X apps 대시보드의 “Keys and tokens” 탭으로 이동하여 액세스 토큰과 액세스 토큰 시크릿에 할당된 권한 수준을 확인하세요. 값이 “Read, write and Direct Messages”가 아닌 경우, “Permission” 탭에서 설정을 조정한 다음 새로운 설정이 적용되도록 액세스 토큰과 액세스 토큰 시크릿을 다시 생성해야 합니다.
- 또는 App-only 인증을 사용해 웹훅을 등록하려고 하고 있을 수 있는데, 이는 지원되지 않습니다. 대신 Enterprise Account Activity API에 대한 웹훅 등록용 API 참조 문서 섹션에 설명된 대로 사용자 컨텍스트로 인증하세요.
Account Activity API 참조 문서 인덱스
엔터프라이즈용 Account Activity API
https://api.x.com/1.1/account_activity/webhooks.json
리소스 정보
요청 예시
$ curl —request POST —url ‘https://api.x.com/1.1/account_activity/webhooks.json?url=https%3A%2F%2Fyour_domain.com%2Fwebhooks%2Ftwitter%2F0' —header ‘authorization: OAuth oauth_consumer_key=“CONSUMER_KEY”, oauth_nonce=“GENERATED”, oauth_signature=“GENERATED”, oauth_signature_method=“HMAC-SHA1”, oauth_timestamp=“GENERATED”, oauth_token=“ACCESS_TOKEN”, oauth_version=“1.0“‘
HTTP 403
https://api.x.com/1.1/account_activity/webhooks.json
리소스 정보
요청 예시
지정된 웹훅의 URL에 대해 CRC(Challenge Response Check)를 수행합니다. 검사에 성공하면
204를 반환하고 상태를 valid로 설정하여 웹훅을 다시 활성화합니다.
https://api.x.com/1.1/account_activity/webhooks/:webhook_id.json
리소스 정보
제공된 App이 제공된 사용자 컨텍스트에 대해 모든 메시지 type의 모든 이벤트를 구독하도록 합니다. 활성화가 완료되면, 요청한 사용자와 관련된 모든 이벤트는 POST 요청을 통해 해당 App의 webhook으로 전송됩니다.
현재 구독 수는 계정 구성에 따라 제한됩니다. 더 많은 구독이 필요하다면 계정 담당자에게 문의해 주시기 바랍니다.
https://api.x.com/1.1/account_activity/webhooks/:webhook_id/subscriptions/all.json
리소스 정보
요청 예시
성공 시 예시 응답
HTTP 204 NO CONTENT
현재 계정에서 활성화된 구독의 개수를 반환합니다. /count 엔드포인트는 애플리케이션 전용 OAuth가 필요하므로, 사용자 컨텍스트 대신 Bearer 토큰을 사용해 요청해야 합니다.
https://api.x.com/1.1/account_activity/subscriptions/count.json
리소스 정보
요청 예시
HTTP 401
https://api.x.com/1.1/account_activity/webhooks/:webhook_id/subscriptions/all.json
리소스 정보
요청 예시
$ curl —request GET —url https://api.x.com/1.1/account_activity/webhooks/:WEBHOOK_ID/subscriptions/all.json —header ‘authorization: OAuth oauth_consumer_key=“WHITELISTED_CONSUMER_KEY”, oauth_nonce=“GENERATED”, oauth_signature=“GENERATED”, oauth_signature_method=“HMAC-SHA1”, oauth_timestamp=“GENERATED”, oauth_token=“SUBSCRIBING_USER’S_ACCESS_TOKEN”, oauth_version=“1.0“‘ HTTP 204 NO CONTENThttps://api.x.com/1.1/account_activity/webhooks/:webhook_id/subscriptions/all/list.json
리소스 정보
매개변수
HTTP 응답 코드
예시 요청
$ curl —request GET —url https://api.x.com/1.1/account_activity/webhooks/:WEBHOOK_ID/subscriptions/all/list.json —header ‘authorization: Bearer TOKEN’ HTTP 200
HTTP 401
https://api.x.com/1.1/account_activity/webhooks/:webhook_id.json
리소스 정보
요청 예시
https://api.x.com/1.1/account_activity/webhooks/:webhook_id/subscriptions/all.json
예시 요청
https://api.x.com/1.1/account_activity/webhooks/:webhook_id/subscriptions/:user_id/all.json