Zum Hauptinhalt springen

Arbeiten mit fortsetzbaren Uploads

Bei der Verwendung der Batch-Compliance-endpoints können Entwickler große Mengen an X data stapelweise hochladen und ermitteln, welche Maßnahmen erforderlich sind, damit ihre Datensätze die Nutzerintention und den aktuellen Zustand der Inhalte auf X widerspiegeln. Das Hochladen großer Datenmengen auf einen Remote-Server ist eine relativ unkomplizierte Aufgabe, wenn Systeme und Konnektivität stabil und zuverlässig sind. Das ist jedoch nicht immer der Fall. Einige Umgebungen können ein Verbindungs-Timeout erzwingen und damit die Verbindung zwischen Ihrer App und dem Upload-Server nach einer festgelegten Zeit trennen; außerdem können Verbindungsprobleme auftreten, etwa wenn Sie versuchen, eine große Datei von Ihrem Laptop über eine WLAN-Verbindung hochzuladen. In solchen Fällen ist es sinnvoll, kleinere Teile der Datei nacheinander hochzuladen, statt eine einzige durchgehende Verbindung zu nutzen. Die Batch-Compliance-endpoints von X stützen sich auf Google Cloud Storage, um große Dateien zu verarbeiten. Diese Art von Speicher ist für verschiedene Anwendungsfälle optimiert; Cloud Storage unterstützt eine Technik zur Verwaltung großer Dateien, die als fortsetzbare Uploads bezeichnet wird. Falls der Upload an irgendeiner Stelle fehlschlägt, kann Google Cloud Storage den Vorgang an der Stelle fortsetzen, an der er unterbrochen wurde.

Erstellen eines fortsetzbaren Jobs

Schritt eins:

Erstellen Sie zunächst einen Compliance-Job und geben Sie an, ob Sie Post-IDs oder Benutzer-IDs hochladen (mithilfe des Parameters type). Fügen Sie außerdem resumable zum Body hinzu und setzen Sie es auf true. Ersetzen Sie den unten stehenden $APP_ACCESS_TOKEN durch Ihr 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
}'
Wenn Ihr API-Aufruf erfolgreich ist, erhalten Sie eine Antwort wie die folgende:
{
   "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"
   }
}
Notieren Sie sich den Wert aus upload_url; Sie benötigen ihn in den folgenden Schritten.

Schritt zwei: 

Als Nächstes müssen Sie den fortsetzbaren Upload starten. Senden Sie dazu einen POST-Aufruf an die upload_url aus dem vorherigen Schritt und stellen Sie sicher, dass Sie die folgenden Header einschließen: 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
Wenn dieser Aufruf erfolgreich ist, erhalten Sie den Statuscode 201. Kopieren Sie anschließend im Response-Header den Wert des Location-Headers, der ungefähr so aussieht:
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
Sie können anschließend Ihre Post- oder User-IDs an diesem Speicherort hochladen, indem Sie ab Schritt zwei den Anweisungen aus dem Schnellstart folgen. Aufgrund ihrer technischen Komplexität eignen sich wiederaufnehmbare Uploads am besten in Verbindung mit Code. In dieser Anleitung wird Node.js mit der Needle-Request-Bibliothek verwendet.

Installieren Sie die Abhängigkeiten

Bevor Sie fortfahren, sollten Sie eine Node.js-Umgebung installiert haben; Sie können Node.js von der offiziellen Website herunterladen. Nach der Installation steht das Dienstprogramm npm zur Verfügung. Vergewissern Sie sich, dass sowohl Node als auch npm installiert sind, indem Sie den folgenden Befehl ausführen, und achten Sie darauf, dass dabei kein Fehler auftritt. $ npm -v 6.4.1 Eine ähnliche Versionsnummer zeigt an, dass Ihre Umgebung bereit ist (Ihre Versionsnummer kann abweichen). Wir verwenden npm, um die Upload-Bibliothek zu installieren. Führen Sie diesen Befehl aus: $ npm install -g needle Alles ist eingerichtet; zusätzliche Konfiguration ist nicht erforderlich.

Resumable-Ziel anfordern

Wenn Sie einen neuen Job erstellen, setzen Sie den Parameter resumable auf true, um ein Ziel zu erhalten, das fortsetzbare Uploads unterstützt. In der Antwortnutzlast erhalten Sie den Wert 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"

Bereiten Sie den Code für das Hochladen einer Datei vor

Standardmäßig erstellt die Bibliothek ein neues Upload-Ziel, indem sie einen Upload-Speicherort (Bucket) und den Namen der Datei entgegennimmt, die Sie hochladen möchten. Da die Batch-Compliance-endpoints ihr eigenes Ziel erstellen, müssen wir der Bibliothek mitteilen, dass bereits ein Speicherort bereitsteht, der unseren Upload akzeptiert. Diesen Wert müssen wir zusammen mit dem Namen der Datei, die die hochzuladenden data enthält, an die Upload-Bibliothek übergeben. Erstellen Sie eine Datei und nennen Sie sie twitter-upload.js. Fügen Sie den folgenden Code hinzu:
const needle = require('needle');
const fs = require('fs');
const path = require('path');

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

async function uploadFile(file, url) {
  // rangeEnd ist der Index des letzten Bytes in der Datei, d.h. Anzahl der Bytes in der Datei
  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('Upload abgeschlossen');
      return;
    case 308:
      return resumeUpload(response, file, url);
    default:
      console.log('Unerwarteter Antwortcode erhalten: ', response.statusCode);
      return;
  }
}

async function resumeUpload(response, file, url) {
  console.log('Upload nicht abgeschlossen, wird fortgesetzt');
  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('Upload wird initialisiert');
    let options = {
      headers: {
        'Content-Type': 'text/plain'
      }
    };

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

// Fortsetzbare Sitzungs-URL anfordern
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('Upload wird gestartet zu: ', resumableSessionURL);

    await uploadFile(filename, resumableSessionURL);
  } else {
    console.log('Erstellung der fortsetzbare Sitzungs-URI fehlgeschlagen');
  }

}

requestResumableSession(uploadURL).then(result => console.log('Upload abgeschlossen'));
Speichern Sie die Datei dort, wo es am meisten Sinn ergibt. Rufen Sie anschließend in Ihrer Befehlszeile das Skript auf und übergeben Sie zwei Parameter:
  1. Der erste ist der Speicherort der Datei (mit den Post- oder User-IDs), die Sie hochladen möchten.
  2. Der zweite ist die Upload-URL, die wir aus der Antwort des Compliance-endpoints erhalten haben.
Stellen Sie sicher, dass die URL in doppelte Anführungszeichen gesetzt ist, und verfahren Sie ebenso mit dem Dateinamen, wenn er Leerzeichen oder andere Zeichen enthält:
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"
Sie sehen eine Ausgabe ähnlich der folgenden: Starting upload to: https://storage.googleapis.com/twttr-tweet-compliance/<redacted> Upload not completed, resuming Initiating upload Sie können den Upload jederzeit pausieren, indem Sie Strg+C drücken oder Ihr Terminal schließen. Sie können den Upload später an derselben Stelle fortsetzen, indem Sie denselben Befehl erneut ausführen. Sobald die Datei vollständig hochgeladen wurde, sehen Sie die folgende Meldung: Upload complete An diesem Punkt können Sie das Compliance-Status-Endpoint verwenden, um den Status Ihres Compliance-Jobs zu überprüfen, und das Compliance-Ergebnis nach Abschluss herunterladen.
I