Vai al contenuto principale

Lavorare con i caricamenti riprendibili

Quando si utilizzano gli endpoint di conformità batch, gli sviluppatori possono caricare in batch grandi quantità di dati di X e capire quali azioni sono necessarie per garantire che i propri dataset riflettano l’intento degli utenti e lo stato attuale dei contenuti su X. Caricare grandi quantità di dati su un server remoto è un’operazione relativamente semplice quando i sistemi e la connettività sono stabili e affidabili. Tuttavia, non è sempre così. Alcuni ambienti possono imporre un timeout di connessione, interrompendo di fatto la connessione tra la tua App e il server di upload dopo un determinato periodo di tempo; potresti anche riscontrare problemi di connessione, ad esempio quando cerchi di caricare un file di grandi dimensioni dal tuo laptop tramite una connessione Wi‑Fi. In queste circostanze, è preferibile caricare porzioni più piccole di quel file alla volta, anziché mantenere un’unica connessione continua. Gli endpoint di conformità batch di X si basano su Google Cloud Storage per elaborare file di grandi dimensioni. Questo tipo di storage è ottimizzato per varie applicazioni; Cloud Storage supporta una tecnica per gestire file di grandi dimensioni chiamata caricamenti riprendibili. Se il caricamento dovesse fallire in qualsiasi momento, Google Cloud Storage è in grado di riprendere l’operazione dal punto in cui era stata interrotta.

Creazione di un processo riprendibile

Primo passaggio:

Per prima cosa devi creare un job di conformità e specificare se caricherai ID del Post o id utente (utilizzando il parametro type). Inoltre, aggiungi resumable al body e impostalo su true. Assicurati di sostituire $APP_ACCESS_TOKEN qui sotto con il tuo App only 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
}'
Se la chiamata all’API va a buon fine, riceverai una risposta simile alla seguente:
{
   "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"
   }
}
Annota il valore di upload_url; ti servirà nei passaggi successivi.

Secondo passaggio: 

Successivamente, devi avviare il caricamento riprendibile. Per farlo, effettua una chiamata POST a upload_url dal passaggio precedente e assicurati di includere le seguenti intestazioni: 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
Se questa chiamata va a buon fine, riceverai un codice di risposta 201. Quindi, nell’intestazione della risposta, copia il valore dell’intestazione Location, che sarà simile a questo:
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
Puoi quindi caricare gli id dei tuoi Post o Utenti in questa posizione a partire dal secondo passaggio, come indicato nella guida di Avvio rapido. Dato il loro livello di complessità tecnica, gli upload riprendibili sono preferibilmente usati tramite codice. Questa guida utilizzerà Node.js con la libreria di richieste needle.

Installa le dipendenze

Prima di procedere, assicurati di avere un ambiente Node.js installato; puoi scaricare Node.js dal sito ufficiale. Una volta installato, Node.js include un’utilità chiamata npm; verifica che sia Node che npm siano installati eseguendo il seguente comando ed assicurati che non restituisca errori. $ npm -v 6.4.1 Un numero di versione come questo indica che l’ambiente è pronto (nota che il tuo numero di versione potrebbe essere diverso). Utilizzeremo npm per installare la libreria di upload. Esegui questo comando: $ npm install -g needle Tutto pronto; non è richiesta alcuna configurazione aggiuntiva.

Richiedere una destinazione con ripresa

Quando crei un nuovo job, imposta il parametro resumable su true per ottenere una destinazione che supporti il caricamento con ripresa. Nel payload della risposta riceverai un valore 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"

Prepara il codice per caricare un file

Per impostazione predefinita, la libreria creerà una nuova destinazione di caricamento accettando una posizione di upload (chiamata bucket) e il nome del file che desideri caricare. Poiché gli endpoint di conformità batch creano una propria destinazione, dovremo indicare alla libreria che abbiamo già una posizione pronta ad accettare il nostro upload. Dovremo passare questo valore alla libreria di upload, insieme al nome del file contenente i data da caricare. Crea un file e chiamalo twitter-upload.js. Aggiungi il codice seguente:
const needle = require('needle');
const fs = require('fs');
const path = require('path');

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

async function uploadFile(file, url) {
  // rangeEnd è l'indice dell'ultimo byte nel file, ovvero il numero di byte nel file
  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('Caricamento completato');
      return;
    case 308:
      return resumeUpload(response, file, url);
    default:
      console.log('Ricevuto codice di risposta imprevisto: ', response.statusCode);
      return;
  }
}

async function resumeUpload(response, file, url) {
  console.log('Caricamento non completato, ripresa in corso');
  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('Avvio caricamento');
    let options = {
      headers: {
        'Content-Type': 'text/plain'
      }
    };

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

// Richiedi URL di sessione ripristinabile
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('Avvio caricamento verso: ', resumableSessionURL);

    await uploadFile(filename, resumableSessionURL);
  } else {
    console.log('Impossibile creare URI di sessione ripristinabile');
  }

}

requestResumableSession(uploadURL).then(result => console.log('Caricamento completato'));
Salva il file dove è più opportuno. Quindi, dalla riga di comando, esegui lo script passando due parametri:
  1. Il primo è il percorso del file (con gli ID di Post o User) che desideri caricare.
  2. Il secondo è l’URL di upload ricevuto dalla risposta dell’endpoint di compliance.
Assicurati che l’URL sia racchiuso tra virgolette doppie e fai lo stesso per il nome del file se contiene spazi o altri caratteri:
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"
Vedrai un output simile al seguente: Starting upload to: https://storage.googleapis.com/twttr-tweet-compliance/<redacted> Upload not completed, resuming Initiating upload Puoi mettere in pausa il caricamento in qualsiasi momento premendo Ctrl + C o chiudendo il terminale. Potrai riprendere il caricamento da dove l’avevi interrotto eseguendo lo stesso comando in un secondo momento. Una volta che il file è stato caricato completamente, vedrai il seguente messaggio: Upload complete A questo punto potrai utilizzare il compliance status endpoint per verificare lo stato del tuo job di conformità e scaricare il relativo risultato quando sarà pronto.
I