> ## Documentation Index
> Fetch the complete documentation index at: https://generaltranslation.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# इंटीग्रेशन गाइड

export const Button = ({href, children}) => {
  return <div className="not-prose group">
    <a href={href}>
      <button className="flex items-center space-x-2.5 py-1 px-4 bg-primary-dark dark:bg-white text-white dark:text-gray-950 rounded-full group-hover:opacity-[0.9] font-medium">
        <span>
          {children}
        </span>
        <svg width="3" height="24" viewBox="0 -9 3 24" class="h-6 rotate-0 overflow-visible"><path d="M0 0L3 3L0 6" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"></path></svg>
      </button>
    </a>
  </div>;
};

<div id="working-with-resumable-uploads">
  ## रिज़्यूमेबल uploads के साथ काम करना
</div>

Batch compliance endpoints का उपयोग करते समय, डेवलपर X डेटा की बड़ी मात्रा को बैच में अपलोड कर सकते हैं और यह समझ सकते हैं कि यह सुनिश्चित करने के लिए कौन-सी कार्रवाई आवश्यक है कि उनके डेटासेट उपयोगकर्ता की मंशा और X पर मौजूद सामग्री की वर्तमान स्थिति को दर्शाएँ। किसी रिमोट सर्वर पर बड़ी मात्रा में डेटा अपलोड करना तब अपेक्षाकृत सीधी प्रक्रिया होती है, जब सिस्टम और कनेक्टिविटी स्थिर और विश्वसनीय हों। हालांकि, ऐसा हमेशा नहीं होता। कुछ परिवेश कनेक्शन टाइमआउट लागू कर सकते हैं, जिससे तय समय के बाद आपके ऐप और अपलोड सर्वर के बीच का कनेक्शन प्रभावी रूप से कट जाता है; आपको कनेक्शन से जुड़ी समस्याएँ भी आ सकती हैं, उदाहरण के लिए जब आप अपने लैपटॉप से wi-fi कनेक्शन के ज़रिए कोई बड़ी फ़ाइल अपलोड करने का प्रयास कर रहे हों। ऐसी परिस्थितियों में, उस फ़ाइल के छोटे-छोटे हिस्सों को एक बार में अपलोड करना अधिक उपयुक्त होता है, बजाय इसके कि एक ही लगातार कनेक्शन बनाए रखा जाए।

X के batch compliance endpoints बड़ी फ़ाइलों को प्रोसेस करने के लिए Google Cloud Storage पर निर्भर करते हैं। इस प्रकार का स्टोरेज कई तरह के अनुप्रयोगों के लिए अनुकूलित है; Cloud Storage बड़ी फ़ाइलों को प्रबंधित करने की एक तकनीक का समर्थन करता है, जिसे रिज़्यूमेबल uploads कहा जाता है।

अगर अपलोड किसी भी चरण पर विफल हो जाता है, तो Google Cloud Storage उस प्रक्रिया को वहीं से फिर शुरू कर सकता है, जहाँ वह रुकी थी।

<div id="creating-a-resumable-job">
  ### रिज़्यूमेबल जॉब बनाना
</div>

<div id="step-one">
  #### चरण एक:
</div>

सबसे पहले, आपको एक compliance job बनानी होगी और यह निर्दिष्ट करना होगा कि आप पोस्ट IDs अपलोड करेंगे या उपयोगकर्ता IDs (type parameter का उपयोग करके)। इसके अलावा, body में resumable जोड़ें और उसे true पर सेट करें। ध्यान रखें कि नीचे दिए गए \$APP\_ACCESS\_TOKEN को अपने ऐप-ओनली 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",
   "resumable": true
}'
```

यदि आपकी 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 का मान नोट कर लें, आगे के चरणों में इसकी आवश्यकता होगी।

<div id="step-two">
  #### चरण दो:
</div>

इसके बाद, आपको रिज़्यूमेबल अपलोड को आरंभ करना होगा। ऐसा करने के लिए, पिछले चरण के upload\_url पर **POST** कॉल करें और सुनिश्चित करें कि उसमें निम्नलिखित हेडर शामिल हों:

Content-Type: text/plain

Content-Length: 0

x-goog-resumable: start

```
curl --request POST \
'https://storage.googleapis.com/twttr-tweet-compliance/1430227686685757442/submission/1202726487847104512_1430227686685757442?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=complianceapi-public-svc-acct%40twttr-compliance-public-prod.iam.gserviceaccount.com%2F20210824%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20210824T175707Z&X-Goog-Expires=900&X-Goog-SignedHeaders=content-length%3Bcontent-type%3Bhost%3Bx-goog-resumable&X-Goog-Signature=890d958f9c7dcb7f238e4971b59da5afc5b8329fb197c67b5930fe0f9dfe180afe2d4bec341111809b88ccfab46ab1f81f4242abc1af7b67c6e8977c52e6d486f5f43ce6a37a7a6530d25f15e2bcd9bb54655fe4ee22b26f8886ba71b67b7b11afd1198d658d1b6f0c41260f55260a260e1be0239977feba43dce40bc0e8e6293a4a3a3f7ee0afc74d3d2f7f2d3d514f108d5887a52ac85760385e5b9bb67cd26bfcf6b1c19151ea8111e217a29407722dc0dc9ab373334e88c18159546237ec9334f9a1e33717dc82800c6a45bba82706d5aece84ecdf3fcac52b21c8a3085a639047cf2707a8b9e4c296fc7cf05edbb110f07b89e38f0f5ea77e8b313cade7' \
--header 'Content-Type: text/plain' --header \
 'Content-Length: 0' --header \
 'x-goog-resumable: start
```

यदि यह कॉल सफल होती है, तो आपको 201 रिस्पॉन्स कोड मिलेगा। फिर, रिस्पॉन्स header में location header का मान कॉपी करें, जो कुछ इस तरह दिखेगा:

```
https://storage.googleapis.com/twttr-tweet-compliance/1430227686685757442/submission/1202726487847104512_1430227686685757442?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=complianceapi-public-svc-acct%40twttr-compliance-public-prod.iam.gserviceaccount.com%2F20210824%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20210824T175707Z&X-Goog-Expires=900&X-Goog-SignedHeaders=content-length%3Bcontent-type%3Bhost%3Bx-goog-resumable&X-Goog-Signature=890d958f9c7dcb7f238e4971b59da5afc5b8329fb197c67b5930fe0f9dfe180afe2d4bec341111809b88ccfab46ab1f81f4242abc1af7b67c6e8977c52e6d486f5f43ce6a37a7a6530d25f15e2bcd9bb54655fe4ee22b26f8886ba71b67b7b11afd1198d658d1b6f0c41260f55260a260e1be0239977feba43dce40bc0e8e6293a4a3a3f7ee0afc74d3d2f7f2d3d514f108d5887a52ac85760385e5b9bb67cd26bfcf6b1c19151ea8111e217a29407722dc0dc9ab373334e88c18159546237ec9334f9a1e33717dc82800c6a45bba82706d5aece84ecdf3fcac52b21c8a3085a639047cf2707a8b9e4c296fc7cf05edbb110f07b89e38f0f5ea77e8b313cade7&upload_id=ADPycds-_Ow7aqcpbG4XguXSVAgd_2fy-XiDA2qm-It9PCwBlZhF4e2bfOAQzEmRJ4T_l6jU6LfYdfrKa_KlFFBOyx3PjYzrxQ
```

इसके बाद आप [quick start guide](/hi/x-api/compliance/batch-compliance#getting-started-with-the-batch-compliance-endpoints) में दिए गए दूसरे चरण से आगे के निर्देशों का पालन करके अपने पोस्ट या उपयोगकर्ता id इस स्थान पर अपलोड कर सकते हैं।

तकनीकी रूप से जटिल होने के कारण, रिज़्यूमेबल uploads का इस्तेमाल कोड के साथ करना सबसे बेहतर होता है। इस गाइड में [needle request library](https://www.npmjs.com/package/needle) के साथ Node.js का उपयोग किया जाएगा.

<div id="install-the-dependencies">
  ### डिपेंडेंसी इंस्टॉल करें
</div>

आगे बढ़ने से पहले, आपके सिस्टम पर Node.js environment इंस्टॉल होना चाहिए; आप Node.js इसकी वेबसाइट से प्राप्त कर सकते हैं। इंस्टॉल होने के बाद, Node.js में npm नाम की एक utility शामिल होती है; यह सुनिश्चित करने के लिए कि Node और npm दोनों इंस्टॉल हैं, नीचे दिया गया कमांड चलाएँ और पक्का करें कि इससे कोई error न आए।

`$ npm -v
6.4.1`

इस तरह का version number यह दर्शाता है कि आपका environment तैयार है (ध्यान दें कि आपका version number अलग हो सकता है)। हम upload library इंस्टॉल करने के लिए npm का उपयोग करेंगे। यह कमांड चलाएँ:

`$ npm install -g needle`

अब सब तैयार है; किसी अतिरिक्त configuration की आवश्यकता नहीं है।

<div id="request-a-resumable-destination">
  #### रिज़्यूमेबल डेस्टिनेशन का अनुरोध करें
</div>

नई जॉब बनाते समय, `resumable` पैरामीटर को `true` पर सेट करें, ताकि आपको ऐसा डेस्टिनेशन मिल सके जो रिज़्यूमेबल अपलोड का समर्थन करता हो। रिस्पॉन्स पेलोड में, आपको `upload&#95;url` वैल्यू मिलेगी।

```
"upload_url":\
"https://storage.googleapis.com/compliance_tweet_ids/customer_test_object_12950882_GlYjiE?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=193969463581-compute%40developer.gserviceaccount.com%2F20200618%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20200618T184154Z&X-Goog-Expires=900&X-Goog-SignedHeaders=content-type%3Bhost&X-Goog-Signature=b7bdcf32479b08715be91ed47b06471b8acdcdb319f8e4f423bf3a3056dfa03ed83e47446f33338e292967a15c08fa5ba34395edaf057a2ac975b88e710ca994adb023a9e1673a7c58ce2fa0d73537f72812af78e92b708dfe6b907a7d75bd0f6cfa61fec867e80ac83ced0725d1ee59787c9dbca50d41f7b0f513dad63a7564136b1a70042a2ec6ba6b697cbe480a4405362f7a08255a5e8205aa7baa562f99e6a092f0420f33d67ffaeb132f877fbaf16c969630b5f173e8a3f31c473707241fa4e28f4bed13fb2ea01d3af1c449321a2e6ee9ec1e331b447cabcfc6f9d1f99f564d180f0cc1d28ea54972c996102c67c6501c6c16a00c13d17756f960e0e1"
```

<div id="prepare-the-code-to-upload-a-file">
  #### फ़ाइल अपलोड करने के लिए कोड तैयार करें
</div>

डिफ़ॉल्ट रूप से, लाइब्रेरी अपलोड लोकेशन (जिसे bucket कहा जाता है) और उस फ़ाइल का नाम स्वीकार करके, जिसे आप अपलोड करना चाहते हैं, एक नया अपलोड गंतव्य बनाती है। क्योंकि batch compliance endpoints अपना गंतव्य खुद बनाते हैं, इसलिए हमें लाइब्रेरी को बताना होगा कि हमारे पास पहले से ही अपलोड स्वीकार करने के लिए एक लोकेशन तैयार है। 

हमें यह वैल्यू अपलोड लाइब्रेरी को देनी होगी, साथ ही उस फ़ाइल का नाम भी जिसमें अपलोड किया जाने वाला डेटा है। एक फ़ाइल बनाएँ और उसका नाम ***twitter-upload.js*** रखें। निम्नलिखित कोड जोड़ें:

```
const needle = require('needle');
const fs = require('fs');
const path = require('path');

const [, scriptName, filename, uploadURL] = process.argv;
if (!filename || !uploadURL) {
  console.error(`Usage: node ${path.basename(scriptName)} filename upload_url`);
  process.exit(-1);
}

async function uploadFile(file, url) {
  // rangeEnd फ़ाइल में अंतिम बाइट का इंडेक्स है, यानी फ़ाइल में कुल बाइट्स की संख्या
  const rangeEnd = (await fs.promises.stat(file)).size;

  let options = {
    headers: {
      'Content-Range': `bytes */${rangeEnd}`,
    },
  };

  const response = await needle('put', url, null, options);

  switch (response.statusCode) {
    case 200:
    case 201:
      console.log('अपलोड पूर्ण');
      return;
    case 308:
      return resumeUpload(response, file, url);
    default:
      console.log('अप्रत्याशित रिस्पॉन्स कोड मिला: ', response.statusCode);
      return;
  }
}

async function resumeUpload(response, file, url) {
  console.log('अपलोड पूरा नहीं हुआ, फिर से शुरू हो रहा है');
  if (response.headers.range) {
    let resumeOffset = Number(response.headers.range.split('-')[1]) + 1;

    let options = {
      headers: {
        'Content-Range': `bytes ${resumeOffset}-${rangeEnd-1}/${rangeEnd}`,
        'Content-Length': `${rangeEnd-resumeOffset}`,
      },
    };

    let readStream = fs.createReadStream(file, {start: resumeOffset});
    return needle('put', url, readStream, options);
  } else {
    console.log('अपलोड शुरू किया जा रहा है');
    let options = {
      headers: {
        'Content-Type': 'text/plain'
      }
    };

    let readStream = fs.createReadStream(file);
    return needle('put', url, readStream, options);
  }
}

// Resumable session URL का अनुरोध करें
async function requestResumableSession(url) {
  const options = {
    headers: {
      'Content-Type': 'text/plain',
      'Content-Length': '0',
      'x-goog-resumable': 'start',
    },
  };

  const res = await needle('post', url, null, options);
  if (res.statusCode === 201) {
    const resumableSessionURL = res.headers['location'];
    console.log('यहाँ अपलोड शुरू हो रहा है: ', resumableSessionURL);

    await uploadFile(filename, resumableSessionURL);
  } else {
    console.log('Resumable session URI बनाने में विफल');
  }

}

requestResumableSession(uploadURL).then(result => console.log('अपलोड पूर्ण'));
```

फ़ाइल को वहाँ सहेजें जहाँ यह सबसे उपयुक्त लगे। इसके बाद, अपनी कमांड लाइन में स्क्रिप्ट चलाएँ और दो पैरामीटर दें:

1. पहला उस फ़ाइल का स्थान होगा (जिसमें वे पोस्ट या उपयोगकर्ता id हों) जिसे आप अपलोड करना चाहते हैं।
2. दूसरा वह अपलोड URL होगा जो हमें compliance endpoint के रिस्पॉन्स से मिला था।

सुनिश्चित करें कि URL डबल-कोट्स में हो, और अगर आपके फ़ाइल नाम में स्पेस या अन्य वर्ण हों, तो उसके लिए भी यही करें:

```
node twitter-upload.js compliance_upload.txt\
"https://storage.googleapis.com/compliance_tweet_ids/customer_test_object_12950882_GlYjiE?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=193969463581-compute%40developer.gserviceaccount.com%2F20200618%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20200618T184154Z&X-Goog-Expires=900&X-Goog-SignedHeaders=content-type%3Bhost&X-Goog-Signature=b7bdcf32479b08715be91ed47b06471b8acdcdb319f8e4f423bf3a3056dfa03ed83e47446f33338e292967a15c08fa5ba34395edaf057a2ac975b88e710ca994adb023a9e1673a7c58ce2fa0d73537f72812af78e92b708dfe6b907a7d75bd0f6cfa61fec867e80ac83ced0725d1ee59787c9dbca50d41f7b0f513dad63a7564136b1a70042a2ec6ba6b697cbe480a4405362f7a08255a5e8205aa7baa562f99e6a092f0420f33d67ffaeb132f877fbaf16c969630b5f173e8a3f31c473707241fa4e28f4bed13fb2ea01d3af1c449321a2e6ee9ec1e331b447cabcfc6f9d1f99f564d180f0cc1d28ea54972c996102c67c6501c6c16a00c13d17756f960e0e1"
```

आपको इस तरह का आउटपुट दिखाई देगा:

`Starting upload to:  https://storage.googleapis.com/twttr-tweet-compliance/<redacted>
Upload not completed, resuming
Initiating upload`

आप किसी भी समय Ctrl + C दबाकर या अपनी कमांड लाइन बंद करके अपलोड रोक सकते हैं। बाद में जब आप वही कमांड फिर से चलाएंगे, तो आप अपलोड को वहीं से फिर शुरू कर सकेंगे जहाँ आपने उसे छोड़ा था। फ़ाइल पूरी तरह अपलोड हो जाने पर, आपको निम्न संदेश दिखाई देगा:

`Upload complete`

इस बिंदु पर, आप अपने compliance job की स्थिति जांचने के लिए [compliance status endpoint](/hi/x-api/compliance/get-compliance-job) का उपयोग कर सकेंगे, और पूरा होने पर compliance result डाउनलोड कर सकेंगे।
