> ## 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.

# Guide d’intégration

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">
  ## Utilisation des téléversements reprenables
</div>

Lors de l'utilisation des endpoints Batch compliance, les développeurs peuvent téléverser par lots de grandes quantités de données X et déterminer les actions nécessaires pour s'assurer que leurs jeux de données reflètent l’intention des utilisateurs ainsi que l’état actuel du contenu sur X. Le téléversement de grandes quantités de données vers un serveur distant est une opération relativement simple lorsque les systèmes et la connectivité sont stables et fiables. Cependant, ce n’est pas toujours le cas. Certains environnements peuvent imposer un délai d’expiration de la connexion, ce qui coupe effectivement la connexion entre votre App et le serveur de téléversement après un certain temps ; vous pouvez également rencontrer des problèmes de connexion, par exemple lorsque vous essayez de téléverser un gros fichier depuis votre ordinateur portable via une connexion Wi‑Fi. Dans ces circonstances, il est préférable de téléverser de plus petites portions de ce fichier à la fois, plutôt que de s’appuyer sur une seule connexion continue.

Les endpoints Batch compliance de X s’appuient sur Google Cloud Storage pour traiter les gros fichiers. Ce type de stockage est optimisé pour différentes applications ; Cloud Storage prend en charge une technique de gestion des gros fichiers appelée téléversements reprenables.

Si le téléversement échoue à un moment quelconque, Google Cloud Storage est capable de reprendre l’opération là où elle s’est arrêtée.

<div id="creating-a-resumable-job">
  ### Création d’une tâche de téléversement reprenable
</div>

<div id="step-one">
  #### Première étape :
</div>

Tout d'abord, vous devez créer un job de conformité et préciser si vous allez téléverser des ID de Publication ou des ID d'utilisateur (en utilisant le paramètre `type`). Ajoutez également `resumable` au corps de la requête et définissez-le sur `true`. Assurez-vous de remplacer ci-dessous `$APP&#95;ACCESS&#95;TOKEN` par le App only Access Token de votre App.

```
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
}'
```

Si votre appel à l’API aboutit, vous recevrez une réponse semblable à la suivante :

```
{
   "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"
   }
}
```

Notez la valeur du champ `upload_url`, vous en aurez besoin dans les étapes suivantes.

<div id="step-two">
  #### Étape 2 :
</div>

Ensuite, vous devrez initialiser le téléversement reprenable. Pour ce faire, effectuez une requête **POST** vers upload\_url de l’étape précédente et assurez-vous d’inclure les en-têtes suivants :

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
```

Si cet appel réussit, vous recevrez un code de réponse 201. Ensuite, dans l’en-tête de la réponse, copiez la valeur de l’en-tête Location, qui aura une forme similaire à ceci :

```
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
```

Vous pouvez ensuite téléverser vos ID de Publication ou d’utilisateur à cet emplacement à partir de l’étape deux, [dans le guide de démarrage rapide](/fr/x-api/compliance/batch-compliance#getting-started-with-the-batch-compliance-endpoints).

En raison de leur complexité technique, les téléversements reprenables sont plus adaptés à une utilisation avec du code. Ce guide utilisera Node.js avec la [bibliothèque de requêtes HTTP needle](https://www.npmjs.com/package/needle).

<div id="install-the-dependencies">
  ### Installer les dépendances
</div>

Avant de continuer, vous devez avoir installé un environnement Node.js. Vous pouvez télécharger Node.js depuis son site officiel. Une fois installé, Node.js inclut un utilitaire appelé npm. Vérifiez que Node et npm sont bien installés en exécutant la commande suivante et en vous assurant qu’elle ne renvoie pas d’erreur.

`$ npm -v
6.4.1`

Un numéro de version similaire indique que votre environnement est prêt (notez que votre numéro de version peut être différent). Nous utiliserons npm pour installer la bibliothèque d’upload. Exécutez cette commande :

`$ npm install -g needle`

Tout est prêt ; aucune configuration supplémentaire n’est nécessaire.

<div id="request-a-resumable-destination">
  #### Demander une destination pour reprise de téléversement
</div>

Lors de la création d’une nouvelle tâche, définissez le paramètre `resumable` sur `true` afin d’obtenir une destination qui prend en charge un téléversement pouvant être repris. Dans le corps de la réponse, vous recevrez une valeur `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">
  #### Préparer le code pour téléverser un fichier
</div>

Par défaut, la bibliothèque créera une nouvelle destination de téléversement en fournissant un emplacement de téléversement (appelé bucket) et le nom du fichier que vous souhaitez téléverser. Puisque les endpoints de conformité par lot créent leur propre destination, nous devons indiquer à la bibliothèque que nous avons déjà un emplacement prêt à accepter notre téléversement. 

Nous devrons transmettre cette valeur à la bibliothèque de téléversement, ainsi que le nom du fichier contenant les données à téléverser. Créez un fichier et nommez‑le ***twitter-upload.js***. Ajoutez le code suivant :

```
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 est l'index du dernier octet du fichier, c'est-à-dire le nombre d'octets dans le fichier
  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 complete');
      return;
    case 308:
      return resumeUpload(response, file, url);
    default:
      console.log('Got unexpected response code: ', response.statusCode);
      return;
  }
}

async function resumeUpload(response, file, url) {
  console.log('Upload not completed, resuming');
  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('Initiating upload');
    let options = {
      headers: {
        'Content-Type': 'text/plain'
      }
    };

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

// Request 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('Starting upload to: ', resumableSessionURL);

    await uploadFile(filename, resumableSessionURL);
  } else {
    console.log('Failed to create resumable session URI');
  }

}

requestResumableSession(uploadURL).then(result => console.log('Upload complete'));
```

Enregistrez le fichier à l’emplacement le plus approprié. Ensuite, dans votre ligne de commande, exécutez le script et passez-lui deux paramètres :

1. Le premier sera l’emplacement du fichier (avec les IDs de Publication ou d’utilisateur) que vous souhaitez téléverser.
2. Le second sera l’URL de téléversement que nous avons reçue dans la réponse de l’endpoint de conformité.

Assurez-vous que l’URL est entourée de guillemets doubles, et faites de même pour le nom de votre fichier s’il contient des espaces ou d’autres caractères :

```
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"
```

Vous verrez une sortie similaire à celle-ci :

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

Vous pouvez mettre le téléversement en pause à tout moment en appuyant sur Ctrl + C ou en fermant votre terminal. Vous pourrez reprendre le téléversement là où vous l'avez interrompu en relançant la même commande ultérieurement. Une fois que le fichier a été entièrement téléversé, vous verrez le message suivant :

`Upload complete`

À ce stade, vous pourrez utiliser le [point de terminaison de statut de conformité](/fr/x-api/compliance/get-compliance-job) pour vérifier l'état de votre tâche de conformité, et vous pourrez télécharger le résultat de conformité une fois qu'il sera prêt.
