मुख्य सामग्री पर जाएं

रिज़्यूमेबल uploads के साथ काम करना

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

रिज़्यूमेबल जॉब बनाना

चरण एक:

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

चरण दो:

इसके बाद, आपको रिज़्यूमेबल अपलोड को आरंभ करना होगा। ऐसा करने के लिए, पिछले चरण के 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 में दिए गए दूसरे चरण से आगे के निर्देशों का पालन करके अपने पोस्ट या उपयोगकर्ता id इस स्थान पर अपलोड कर सकते हैं। तकनीकी रूप से जटिल होने के कारण, रिज़्यूमेबल uploads का इस्तेमाल कोड के साथ करना सबसे बेहतर होता है। इस गाइड में needle request library के साथ Node.js का उपयोग किया जाएगा.

डिपेंडेंसी इंस्टॉल करें

आगे बढ़ने से पहले, आपके सिस्टम पर 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 की आवश्यकता नहीं है।

रिज़्यूमेबल डेस्टिनेशन का अनुरोध करें

नई जॉब बनाते समय, resumable पैरामीटर को true पर सेट करें, ताकि आपको ऐसा डेस्टिनेशन मिल सके जो रिज़्यूमेबल अपलोड का समर्थन करता हो। रिस्पॉन्स पेलोड में, आपको upload_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"

फ़ाइल अपलोड करने के लिए कोड तैयार करें

डिफ़ॉल्ट रूप से, लाइब्रेरी अपलोड लोकेशन (जिसे 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 का उपयोग कर सकेंगे, और पूरा होने पर compliance result डाउनलोड कर सकेंगे।