배치 컴플라이언스 엔드포인트를 사용하는 과정은 일반적으로 다음의 5단계로 이루어집니다:
- 컴플라이언스 작업 생성
- 게시물 id 또는 사용자 id 목록 준비
- 게시물 id 또는 사용자 id 목록 업로드
- 컴플라이언스 작업 상태 확인
- 결과 다운로드
이 섹션에서는 명령줄을 사용해 각 단계를 수행하는 방법을 설명합니다. 다양한 프로그래밍 언어의 샘플 코드를 보려면 X API v2 샘플 코드 GitHub 저장소를 방문하세요.
이 가이드를 완료하려면 요청을 인증할 키와 토큰 세트가 필요합니다. 다음 단계를 따라 키와 토큰을 생성할 수 있습니다:
- 개발자 계정에 등록하고 승인을 받습니다.
- 개발자 포털에서 Project와 연결된 Developer 앱을 생성합니다.
- App의 “Keys and tokens” 페이지로 이동해 필요한 자격 증명을 생성합니다. 모든 자격 증명은 안전한 위치에 보관하세요.
먼저 컴플라이언스 작업을 생성하고 type 매개변수로 게시물 ID를 업로드할지, 사용자 ID를 업로드할지 지정해야 합니다. 필요에 따라 name 매개변수로 작업 이름을 지정할 수도 있습니다.
이 요청을 인증하려면 앱 전용을 사용해야 합니다. 이를 위해 아래의 $APP_ACCESS_TOKEN을 [개발자 포털]의 X App에서 생성할 수 있는 App Access Token으로 바꾸세요.
curl --request POST 'https://api.x.com/2/compliance/jobs' \ --header 'Authorization: Bearer $APP_ACCESS_TOKEN' \ --header 'Content-Type: application/json' \ --data-raw '{"type": "tweets"}'
API 호출이 성공하면 다음과 유사한 응답을 받습니다:
{
"data": {
"download_expires_at": "2021-08-18T19:42:55.000Z",
"status": "created",
"upload_url": "https://storage.googleapis.com/twttr-tweet-compliance/1425543269983784962/submission/1202726487847104512_1425543269983784962?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=complianceapi-public-svc-acct%40twttr-compliance-public-prod.iam.gserviceaccount.com%2F20210811%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20210811T194255Z&X-Goog-Expires=900&X-Goog-SignedHeaders=content-type%3Bhost&X-Goog-Signature=355e4c4739ae508304d3df15b4e13e64b6c7752d8d79d73676a4d8e60dc5241f83924ad2a1f8b7bddcc768062bb9c64d39b8e8f7cce7f66ffbea9f9ed33a4da975b3a2c127fb738c1c1ff3c3964bd4d9dc0706e6c8a70e67522160ea774e090d2793e06f890d1158ce86be3031c1c471b74f961b6f18743a28730611000336286ad0111b41fb5d14aa813ff00cf06b3572dc68d0b3c6fdc07f25c1b1196c1af4325a9ead68994944bbef0d2123585ea051deb9765aa7f5832446440bc9ba76af327b69df1fd7b1a99bd4419c128f1f697dbbacbc62bbc7c2c9aebc82a2128be0ed05d48a54d814162daad1232a0d13081e9543ab8557f567149af82281193f37",
"created_at": "2021-08-11T19:42:55.000Z",
"resumable": false,
"id": "1425543269983784962",
"type": "tweets",
"download_url": "https://storage.googleapis.com/twttr-tweet-compliance/1425543269983784962/delivery/1202726487847104512_1425543269983784962?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=complianceapi-public-svc-acct%40twttr-compliance-public-prod.iam.gserviceaccount.com%2F20210811%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20210811T194255Z&X-Goog-Expires=604800&X-Goog-SignedHeaders=host&X-Goog-Signature=0a11dd5a3c5adb508f32ce904568abada863dc9499ba2adeafb3452ccee0dcb3dade17910dbc502dcbe54c130ac4d8638eb176c8b7344de068139b06c970794efa6312f0a5149f40da441eafcaf475f670c93ca73951999902a531d34dfab1e5490918929e5b06ae803b5604e0c0c26852255ccdbc79a2c1e2eefe924e5e6bf5b6603a7f287d1621333b9548ec6cc203716070528bebc2e67c12e92b1f4e54471db92c15a54799f2b855ae224250ca44c47993fd7d79a4940a0f68fe09f73fc8b291e88cfd10ade860b4b35c2b964d1777c1d93cd300c313138d9ca90aa8b3ecd3bf9dc73d3ebe32ba7634228fe07e1e4ecdda57cd94c802afc520162735d5a3",
"upload_expires_at": "2021-08-11T19:57:55.000Z"
}
}
upload_url, download_url, 그리고 id 필드의 값을 메모해 두세요. 다음 단계에서 필요합니다.
2단계: 게시물 ID 또는 사용자 ID 목록 준비
각 줄에 하나의 게시물 ID 또는 사용자 ID가 포함되도록, 게시물 ID 또는 사용자 ID로만 구성된 텍스트 파일을 만듭니다. 텍스트 파일의 내용은 다음과 같을 수 있습니다:
1417856744319971329
1415457498803232770
1415348607813832708
1413515358766452738
…
…
참고: 위 파일에는 게시물 ID 또는 사용자 ID 중 하나만 포함되어야 하며, 둘을 섞을 수 없습니다.이 URL로 PUT 요청을 보내 파일을 직접 업로드할 수 있습니다. 해당 URL은 이미 인증 토큰으로 서명되어 있으므로 App 액세스 토큰을 다시 전달해 인증할 필요가 없습니다. 텍스트 파일 업로드임을 나타내기 위해 Content-Type 헤더를 포함하고, 아래의 $FILE_LOCATION을 파일의 경로로 바꾸세요.
curl -X PUT \
-H "Content-Type: text/plain" \
--data-binary @$FILE_LOCATION \
"https://storage.googleapis.com/twitter-compliance/customer_test_object_123456_d8ske9.json?X-Goog-Algorithm=\nGOOG4-RSA-SHA256&X-Goog-Credential=example%40example-project.iam.gserviceaccount\n.com%2F20181026%2Fus-central-1%2Fstorage%2Fgoog4_request&X-Goog-Date=20181026T18\n1309Z&X-Goog-Expires=900&X-Goog-SignedHeaders=host&X-Goog-Signature=247a2aa45f16\n9edf4d187d54e7cc46e4731b1e6273242c4f4c39a1d2507a0e58706e25e3a85a7dbb891d62afa849\n6def8e260c1db863d9ace85ff0a184b894b117fe46d1225c82f2aa19efd52cf21d3e2022b3b868dc\nc1aca2741951ed5bf3bb25a34f5e9316a2841e8ff4c530b22ceaa1c5ce09c7cbb5732631510c2058\n0e61723f5594de3aea497f195456a2ff2bdd0d13bad47289d8611b6f9cfeef0c46c91a455b94e90a\n66924f722292d21e24d31dcfb38ce0c0f353ffa5a9756fc2a9f2b40bc2113206a81e324fc4fd6823\na29163fa845c8ae7eca1fcf6e5bb48b3200983c56c5ca81fffb151cca7402beddfc4a76b13344703\n2ea7abedc098d2eb14a7"
상태 코드 200은 업로드가 성공적으로 완료되었음을 나타냅니다.
대용량 업로드는 처리에 시간이 걸릴 수 있습니다. 1단계에서 받은 작업 ID를 지정하여 콘텐츠 컴플라이언스 작업 엔드포인트에서 상태를 조회할 수 있습니다.
아래의 APP_ACCESS_TOKEN을 앱 액세스 토큰으로, ID를 1단계에서 받은 작업 ID로 각각 바꾸세요.
curl --request GET 'https://api.x.com/2/compliance/jobs/$ID' \ --header 'Authorization: Bearer $APP_ACCESS_TOKEN'
응답에는 해당 작업에 대한 정보가 포함됩니다.
{
"data": {
"upload_expires_at": "2021-08-05T01:50:11.000Z",
"type": "tweets",
"resumable": false,
"download_url": "https://storage.googleapis.com/twttr-tweet-compliance/1423095206576984067/delivery/1202726487847104512_1423095206576984067?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=complianceapi-public-svc-acct%40twttr-compliance-public-prod.iam.gserviceaccount.com%2F20210805%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20210805T013511Z&X-Goog-Expires=604800&X-Goog-SignedHeaders=host&X-Goog-Signature=09de4feae68a6d4449eb7ce1f8f3551996552e7fba103005b3bd50ab318bb5215e4f5396ef29d17755deb6bf172b9d1dab61a04b249d39e87f6e2dbb31632b7e5f2d35f4f534e1f1522c9d7958b8745dd62471deb8d6992c80fd418628404f5f14eda3f557adf709403058910ea009e0c88ce81458ec9b915016a5c5901e2365b130db00b18fcb7da1b082e1a5c75f7bf7eeab8783675d1b6a56441ac6e9ffc972b1278a5853d2b94dda55e1a6e2068bc0ddd3cddc9213ec9cebb7cb5be931977bb28dda12c7c5e69d1f876b243f0f224076bf1b81149603319a2fc9cb82337bdbe05e7bbf184bcbdc17d43b3f5efbae72ea386d955ca10e702e00df31aabf32",
"id": "1423095206576984067",
"status": "expired"
"created_at": "2021-08-05T01:35:11.000Z",
"upload_url": "https://storage.googleapis.com/twttr-tweet-compliance/1423095206576984067/submission/1202726487847104512_1423095206576984067?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=complianceapi-public-svc-acct%40twttr-compliance-public-prod.iam.gserviceaccount.com%2F20210805%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20210805T013511Z&X-Goog-Expires=900&X-Goog-SignedHeaders=content-type%3Bhost&X-Goog-Signature=ba08f588bea3873aa0465cf22015e583c2851a5ff14891d22430b1127288728f1aa303673e6895694e7017739871ff5ae59bbcde7d4ac7a14aaaafba98ad22ca818e99fb3ec7eaaf74b3ecfecbfb33711869b2e85d7666609276666ef4a8b396ae9616743a0cbd773962e5850f2942cd76be7373d608a140e041ca8492017d43fac9220fa145d0b2ecaf9f752d71fc8c4b81b67c5c22aa59ac87666f7d83714fdace72894d2911a3e36dd42028d0222e71054d6b28c8ef63d0f0000f228c8680bab9c8011b87d1a6c9a60e8cc9e8b6a83abf7c47a57772746c83b19849f5b4c938ccd0922990da5f2a81ff806edcb4667bb402fb1f1f6f5162768e0661648b21",
"download_expires_at": "2021-08-12T01:35:11.000Z"
}
}
완료 상태는 결과를 다운로드할 수 있음을 의미합니다. 참고: 상태의 다른 값은 created, complete, in_progress, failed, expired입니다
작업 완료 상태를 받으면 다운로드_url 필드에 표시된 URL(1단계에서 생성된 주소)에서 컴플라이언스 결과를 다운로드할 수 있습니다. 이 URL에는 이미 인증 토큰이 서명되어 있으므로 App 액세스 토큰을 다시 전달해 인증할 필요가 없습니다.
curl --request GET \
'https://storage.googleapis.com/twttr-tweet-compliance/1423047488781488129/delivery/1202726487847104512_1423047488781488129?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=complianceapi-public-svc-acct%40twttr-compliance-public-prod.iam.gserviceaccount.com%2F20210804%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20210804T222534Z&X-Goog-Expires=604800&X-Goog-SignedHeaders=host&X-Goog-Signature=8ed0fe9e9748f6be5e7e052f6635c8b5cbe62fb2d3a165278b922b28a48fb79b02d74f0bd31b4fdb32532bc6746c6082aaff2154cdab4b59c4c6561ff2c840e5f32dd13c09ff5b52376dfac1b7f97807c72209d2844a6c078b71fddf22a5493f88118802e98a60e16ce5715fce0242baddd17d4598d31be59393e1dacd22fc1eeb532572cc4e784402c5fbeb84a22dd308922e937a26fa99cb717bb26fb61b657403010121a996691814b7aeb00bc05ed25f15d394fd46899dd9390be6d5da44960e81d8018318c325c70b39d0a4fc9d65fea2b8b3355d4c7dd7c386eac1d9c09233462bde40fa3f4023d1cd6470b0346f9f36d74665dde3f716940312019703'
결과에는 JSON 객체 집합이 포함됩니다(각 줄에 하나의 객체). 각 객체에는 게시물 또는 사용자 id, 게시물 또는 사용자의 생성 날짜(날짜별로 정리된 게시물을 찾는 데 유용), 필요한 조치, 컴플라이언스 조치의 사유, 그리고 해당 조치의 날짜가 포함됩니다:
{"id":"1265324480517361664","action":"delete","created_at":"2019-10-29T17:02:47.000Z","redacted_at":"2020-07-29T17:02:47.000Z","reason":"삭제됨"}
{"id":"1263926741774581761","action":"delete","created_at":"2019-10-29T17:02:47.000Z","redacted_at":"2020-07-29T17:02:47.000Z","reason":"보호 설정"}
{"id":"1265324480517361669","action":"delete","created_at":"2019-10-29T17:02:47.000Z","redacted_at":"2020-07-29T17:02:47.000Z","reason":"계정 정지"}
코드는 각 JSON 라인을 파싱하여 게시물 또는 사용자 id를 찾고, 해당 id를 가진 게시물과 사용자를 데이터세트에서 삭제해 준수 상태를 유지할 수 있습니다. 업로드한 id에 해당하는 JSON 객체가 없으면 해당 id는 준수 상태로 간주할 수 있습니다.
참고: 모든 컴플라이언스 이벤트에 redacted_at 필드가 포함되는 것은 아닙니다.