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

# Tarik pesan Bot secara massal di obrolan satu lawan satu

> Panggil API ini untuk menarik pesan Bot secara massal di obrolan satu lawan satu melalui robotCode dan processQueryKeys, cocok untuk menarik notifikasi yang salah kirim dalam 24 jam.

Gunakan API ini untuk menarik pesan Bot secara massal di obrolan satu lawan satu antara pengguna dan Bot. Kirimkan bidang bisnis seperti `robotCode` dan `processQueryKeys` melalui permintaan POST. API ini berlaku untuk skenario ketika organisasi perlu menarik pesan notifikasi yang salah dikirim dalam 24 jam.

## Permintaan

### Informasi dasar

| Bidang                      | Value                                                                                                                    |
| --------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| URL HTTP                    | [https://api.dingtalk.io/v1.0/robot/otoMessages/batchRecall](https://api.dingtalk.io/v1.0/robot/otoMessages/batchRecall) |
| Metode HTTP                 | POST                                                                                                                     |
| Tipe aplikasi yang didukung | appType-Aplikasi internal　appType-Aplikasi perusahaan pihak ketiga                                                       |
| Izin yang diwajibkan        | permission-qyapi\_robot\_sendmsg-Izin bagi Bot di organisasi Anda untuk mengirim pesan                                   |

### Header permintaan

| Nama                        | Tipe   | Wajib | Deskripsi                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| --------------------------- | ------ | ----- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| x-acs-dingtalk-access-token | String | Ya    | Kredensial akses untuk memanggil API ini. Perolehlah sebagai berikut:   - Untuk aplikasi internal, panggil API [Memperoleh access token aplikasi internal](/id/open/development/obtain-the-access-token-of-an-internal-app#). - Untuk aplikasi perusahaan pihak ketiga, panggil API [Memperoleh access token organisasi yang diotorisasi ke aplikasi pihak ketiga](https://open.dingtalk.com/document/development/obtain-the-access-token-of-the-authorized-enterprise-1#). |

### Isi permintaan

| Nama             | Tipe            | Wajib | Deskripsi                                                                                                                                                                                                                                                                                                                                                           |
| ---------------- | --------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| robotCode        | String          | Ya    | Kode Bot. Untuk detailnya, lihat [ID Bot](/id/open/development/development-robot-overview#447ec33014hrl).  Nilai ini harus cocok dengan `robotCode` yang digunakan saat memanggil API [Bot mengirim pesan obrolan grup](/id/open/development/the-robot-sends-a-group-message#).                                                                                     |
| processQueryKeys | Array of String | Ya    | Daftar pengenal pesan yang unik. Perolehlah melalui API [Kirim pesan Bot secara massal di obrolan satu lawan satu](/id/open/development/chatbots-send-one-on-one-chat-messages-in-batches#).    - Maksimal 20 entri per panggilan. - Anda dapat menarik pesan melalui `processQueryKey`-nya dalam 24 jam setelah dikirim. Pesan tidak dapat ditarik setelah 24 jam. |

### Contoh permintaan

HTTP

```http theme={"theme":{"light":"github-light","dark":"github-dark"}}
POST /v1.0/robot/otoMessages/batchRecall HTTP/1.1
Host:api.dingtalk.io
x-acs-dingtalk-access-token:8ca04016xxx
Content-Type:application/json

{
  "robotCode" : "dingXXXXXX",
  "processQueryKeys" : [ "b5fe1xxx" ]
}
```

Java

```java theme={"theme":{"light":"github-light","dark":"github-dark"}}
// File ini dibuat otomatis, jangan diedit. Terima kasih.
package com.aliyun.sample;

import com.aliyun.tea.*;
import com.aliyun.teautil.*;
import com.aliyun.teautil.models.*;
import com.aliyun.dingtalkrobot_1_0.*;
import com.aliyun.dingtalkrobot_1_0.models.*;
import com.aliyun.teaopenapi.*;
import com.aliyun.teaopenapi.models.*;

public class Sample {

    /**
     * Inisialisasi Client akun dengan Token
     * @return Client
     * @throws Exception
     */
    public static com.aliyun.dingtalkrobot_1_0.Client createClient() throws Exception {
        Config config = new Config();
        config.protocol = "https";
        config.regionId = "central";
        return new com.aliyun.dingtalkrobot_1_0.Client(config);
    }

    public static void main(String[] args_) throws Exception {
        java.util.List<String> args = java.util.Arrays.asList(args_);
        com.aliyun.dingtalkrobot_1_0.Client client = Sample.createClient();
        BatchRecallOTOHeaders batchRecallOTOHeaders = new BatchRecallOTOHeaders();
        batchRecallOTOHeaders.xAcsDingtalkAccessToken = "<your access token>";
        BatchRecallOTORequest batchRecallOTORequest = new BatchRecallOTORequest()
                .setRobotCode("dingXXXXXX")
                .setProcessQueryKeys(java.util.Arrays.asList(
                    "b5fe1xxx"
                ));
        try {
            client.batchRecallOTOWithOptions(batchRecallOTORequest, batchRecallOTOHeaders, new RuntimeOptions());
        } catch (TeaException err) {
            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                // Objek err berisi properti code dan message untuk membantu menemukan masalah
            }

        } catch (Exception _err) {
            TeaException err = new TeaException(_err.getMessage(), _err);
            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                // Objek err berisi properti code dan message untuk membantu menemukan masalah
            }

        }        
    }
}
```

Python

```python theme={"theme":{"light":"github-light","dark":"github-dark"}}
# -*- coding: utf-8 -*-
# File ini dibuat otomatis, jangan diedit. Terima kasih.
import sys

from typing import List

from alibabacloud_dingtalk.robot_1_0.client import Client as dingtalkrobot_1_0Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_dingtalk.robot_1_0 import models as dingtalkrobot__1__0_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient

class Sample:
    def __init__(self):
        pass

    @staticmethod
    def create_client() -> dingtalkrobot_1_0Client:
        """
        Inisialisasi Client akun dengan Token
        @return: Client
        @throws Exception
        """
        config = open_api_models.Config()
        config.protocol = 'https'
        config.region_id = 'central'
        return dingtalkrobot_1_0Client(config)

    @staticmethod
    def main(
        args: List[str],
    ) -> None:
        client = Sample.create_client()
        batch_recall_otoheaders = dingtalkrobot__1__0_models.BatchRecallOTOHeaders()
        batch_recall_otoheaders.x_acs_dingtalk_access_token = '<your access token>'
        batch_recall_otorequest = dingtalkrobot__1__0_models.BatchRecallOTORequest(
            robot_code='dingXXXXXX',
            process_query_keys=[
                'b5fe1xxx'
            ]
        )
        try:
            client.batch_recall_otowith_options(batch_recall_otorequest, batch_recall_otoheaders, util_models.RuntimeOptions())
        except Exception as err:
            if not UtilClient.empty(err.code) and not UtilClient.empty(err.message):
                # Objek err berisi properti code dan message untuk membantu menemukan masalah
                pass

    @staticmethod
    async def main_async(
        args: List[str],
    ) -> None:
        client = Sample.create_client()
        batch_recall_otoheaders = dingtalkrobot__1__0_models.BatchRecallOTOHeaders()
        batch_recall_otoheaders.x_acs_dingtalk_access_token = '<your access token>'
        batch_recall_otorequest = dingtalkrobot__1__0_models.BatchRecallOTORequest(
            robot_code='dingXXXXXX',
            process_query_keys=[
                'b5fe1xxx'
            ]
        )
        try:
            await client.batch_recall_otowith_options_async(batch_recall_otorequest, batch_recall_otoheaders, util_models.RuntimeOptions())
        except Exception as err:
            if not UtilClient.empty(err.code) and not UtilClient.empty(err.message):
                # Objek err berisi properti code dan message untuk membantu menemukan masalah
                pass

if __name__ == '__main__':
    Sample.main(sys.argv[1:])
```

PHP

```java theme={"theme":{"light":"github-light","dark":"github-dark"}}
<?php

// File ini dibuat otomatis, jangan diedit. Terima kasih.
namespace AlibabaCloud\SDK\Sample;

use AlibabaCloud\SDK\Dingtalk\Vrobot_1_0\Dingtalk;
use \Exception;
use AlibabaCloud\Tea\Exception\TeaError;
use AlibabaCloud\Tea\Utils\Utils;

use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\SDK\Dingtalk\Vrobot_1_0\Models\BatchRecallOTOHeaders;
use AlibabaCloud\SDK\Dingtalk\Vrobot_1_0\Models\BatchRecallOTORequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;

class Sample {

    /**
     * Inisialisasi Client akun dengan Token
     * @return Dingtalk Client
     */
    public static function createClient(){
        $config = new Config([]);
        $config->protocol = "https";
        $config->regionId = "central";
        return new Dingtalk($config);
    }

    /**
     * @param string[] $args
     * @return void
     */
    public static function main($args){
        $client = self::createClient();
        $batchRecallOTOHeaders = new BatchRecallOTOHeaders([]);
        $batchRecallOTOHeaders->xAcsDingtalkAccessToken = "<your access token>";
        $batchRecallOTORequest = new BatchRecallOTORequest([
            "robotCode" => "dingXXXXXX",
            "processQueryKeys" => [
                "b5fe1xxx"
            ]
        ]);
        try {
            $client->batchRecallOTOWithOptions($batchRecallOTORequest, $batchRecallOTOHeaders, new RuntimeOptions([]));
        }
        catch (Exception $err) {
            if (!($err instanceof TeaError)) {
                $err = new TeaError([], $err->getMessage(), $err->getCode(), $err);
            }
            if (!Utils::empty_($err->code) && !Utils::empty_($err->message)) {
                // Objek err berisi properti code dan message untuk membantu menemukan masalah
            }
        }
    }
}
$path = __DIR__ . \DIRECTORY_SEPARATOR . '..' . \DIRECTORY_SEPARATOR . 'vendor' . \DIRECTORY_SEPARATOR . 'autoload.php';
if (file_exists($path)) {
    require_once $path;
}
Sample::main(array_slice($argv, 1));
```

Go

```go theme={"theme":{"light":"github-light","dark":"github-dark"}}
// File ini dibuat otomatis, jangan diedit. Terima kasih.
package main

import (
  "os"
  util  "github.com/alibabacloud-go/tea-utils/service"
  dingtalkrobot_1_0  "github.com/alibabacloud-go/dingtalk/robot_1_0"
  openapi  "github.com/alibabacloud-go/darabonba-openapi/client"
  "github.com/alibabacloud-go/tea/tea"
)

/**
 * Inisialisasi Client akun dengan Token
 * @return Client
 * @throws Exception
 */
func CreateClient () (_result *dingtalkrobot_1_0.Client, _err error) {
  config := &openapi.Config{}
  config.Protocol = tea.String("https")
  config.RegionId = tea.String("central")
  _result = &dingtalkrobot_1_0.Client{}
  _result, _err = dingtalkrobot_1_0.NewClient(config)
  return _result, _err
}

func _main (args []*string) (_err error) {
  client, _err := CreateClient()
  if _err != nil {
    return _err
  }

  batchRecallOTOHeaders := &dingtalkrobot_1_0.BatchRecallOTOHeaders{}
  batchRecallOTOHeaders.XAcsDingtalkAccessToken = tea.String("<your access token>")
  batchRecallOTORequest := &dingtalkrobot_1_0.BatchRecallOTORequest{
    RobotCode: tea.String("dingXXXXXX"),
    ProcessQueryKeys: []*string{tea.String("b5fe1xxx")},
  }
  tryErr := func()(_e error) {
    defer func() {
      if r := tea.Recover(recover()); r != nil {
        _e = r
      }
    }()
    _, _err = client.BatchRecallOTOWithOptions(batchRecallOTORequest, batchRecallOTOHeaders, &util.RuntimeOptions{})
    if _err != nil {
      return _err
    }

    return nil
  }()

  if tryErr != nil {
    var err = &tea.SDKError{}
    if _t, ok := tryErr.(*tea.SDKError); ok {
      err = _t
    } else {
      err.Message = tea.String(tryErr.Error())
    }
    if !tea.BoolValue(util.Empty(err.Code)) && !tea.BoolValue(util.Empty(err.Message)) {
      // Objek err berisi properti code dan message untuk membantu menemukan masalah
    }

  }
  return _err
}

func main() {
  err := _main(tea.StringSlice(os.Args[1:]))
  if err != nil {
    panic(err)
  }
}
```

Node.js

```python theme={"theme":{"light":"github-light","dark":"github-dark"}}
// File ini dibuat otomatis, jangan diedit
import Util, * as $Util from '@alicloud/tea-util';
import dingtalkrobot_1_0, * as $dingtalkrobot_1_0 from '@alicloud/dingtalk/robot_1_0';
import OpenApi, * as $OpenApi from '@alicloud/openapi-client';
import * as $tea from '@alicloud/tea-typescript';

export default class Client {

  /**
   * Inisialisasi Client akun dengan Token
   * @return Client
   * @throws Exception
   */
  static createClient(): dingtalkrobot_1_0 {
    let config = new $OpenApi.Config({ });
    config.protocol = "https";
    config.regionId = "central";
    return new dingtalkrobot_1_0(config);
  }

  static async main(args: string[]): Promise<void> {
    let client = Client.createClient();
    let batchRecallOTOHeaders = new $dingtalkrobot_1_0.BatchRecallOTOHeaders({ });
    batchRecallOTOHeaders.xAcsDingtalkAccessToken = "<your access token>";
    let batchRecallOTORequest = new $dingtalkrobot_1_0.BatchRecallOTORequest({
      robotCode: "dingXXXXXX",
      processQueryKeys: [
        "b5fe1xxx"
      ],
    });
    try {
      await client.batchRecallOTOWithOptions(batchRecallOTORequest, batchRecallOTOHeaders, new $Util.RuntimeOptions({ }));
    } catch (err) {
      if (!Util.empty(err.code) && !Util.empty(err.message)) {
        // Objek err berisi properti code dan message untuk membantu menemukan masalah
      }

    }    
  }

}

Client.main(process.argv.slice(2));
```

C#

```java theme={"theme":{"light":"github-light","dark":"github-dark"}}
// File ini dibuat otomatis, jangan diedit. Terima kasih.

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;

using Tea;
using Tea.Utils;

namespace AlibabaCloud.SDK.Sample
{
    public class Sample 
    {

        /**
         * Inisialisasi Client akun dengan Token
         * @return Client
         * @throws Exception
         */
        public static AlibabaCloud.SDK.Dingtalkrobot_1_0.Client CreateClient()
        {
            AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config();
            config.Protocol = "https";
            config.RegionId = "central";
            return new AlibabaCloud.SDK.Dingtalkrobot_1_0.Client(config);
        }

        public static void Main(string[] args)
        {
            AlibabaCloud.SDK.Dingtalkrobot_1_0.Client client = CreateClient();
            AlibabaCloud.SDK.Dingtalkrobot_1_0.Models.BatchRecallOTOHeaders batchRecallOTOHeaders = new AlibabaCloud.SDK.Dingtalkrobot_1_0.Models.BatchRecallOTOHeaders();
            batchRecallOTOHeaders.XAcsDingtalkAccessToken = "<your access token>";
            AlibabaCloud.SDK.Dingtalkrobot_1_0.Models.BatchRecallOTORequest batchRecallOTORequest = new AlibabaCloud.SDK.Dingtalkrobot_1_0.Models.BatchRecallOTORequest
            {
                RobotCode = "dingXXXXXX",
                ProcessQueryKeys = new List<string>
                {
                    "b5fe1xxx"
                },
            };
            try
            {
                client.BatchRecallOTOWithOptions(batchRecallOTORequest, batchRecallOTOHeaders, new AlibabaCloud.TeaUtil.Models.RuntimeOptions());
            }
            catch (TeaException err)
            {
                if (!AlibabaCloud.TeaUtil.Common.Empty(err.Code) && !AlibabaCloud.TeaUtil.Common.Empty(err.Message))
                {
                    // Objek err berisi properti code dan message untuk membantu menemukan masalah
                }
            }
            catch (Exception _err)
            {
                TeaException err = new TeaException(new Dictionary<string, object>
                {
                    { "message", _err.Message }
                });
                if (!AlibabaCloud.TeaUtil.Common.Empty(err.Code) && !AlibabaCloud.TeaUtil.Common.Empty(err.Message))
                {
                    // Objek err berisi properti code dan message untuk membantu menemukan masalah
                }
            }
        }

    }
}
```

C

```cpp theme={"theme":{"light":"github-light","dark":"github-dark"}}
// File ini dibuat otomatis, jangan diedit. Terima kasih.

#include <alibabacloud/dingtalkrobot__1__0.hpp>
#include <alibabacloud/open_api.hpp>
#include <boost/any.hpp>
#include <darabonba/core.hpp>
#include <darabonba/util.hpp>
#include <iostream>
#include <map>

using namespace std;

Alibabacloud_Dingtalkrobot_1_0::Client createClient() {
  shared_ptr<Alibabacloud_OpenApi::Config> config = make_shared<Alibabacloud_OpenApi::Config>();
  config->protocol = make_shared<string>("https");
  config->regionId = make_shared<string>("central");
  return Alibabacloud_Dingtalkrobot_1_0::Client(config);
}

int main(int argc, char *args[]) {
  args;
  shared_ptr<Alibabacloud_Dingtalkrobot_1_0::Client> client = make_shared<Alibabacloud_Dingtalkrobot_1_0::Client>(createClient());
  shared_ptr<Alibabacloud_Dingtalkrobot_1_0::BatchRecallOTOHeaders> batchRecallOTOHeaders = make_shared<Alibabacloud_Dingtalkrobot_1_0::BatchRecallOTOHeaders>();
  batchRecallOTOHeaders->xAcsDingtalkAccessToken = make_shared<string>("<your access token>");
  shared_ptr<Alibabacloud_Dingtalkrobot_1_0::BatchRecallOTORequest> batchRecallOTORequest = make_shared<Alibabacloud_Dingtalkrobot_1_0::BatchRecallOTORequest>(map<string, boost::any>({
    {"robotCode", boost::any(string("dingXXXXXX"))},
    {"processQueryKeys", boost::any(vector<string>({
      "b5fe1xxx"
    }))}
  }));
  try {
    client->batchRecallOTOWithOptions(batchRecallOTORequest, batchRecallOTOHeaders, make_shared<Darabonba_Util::RuntimeOptions>(Darabonba_Util::RuntimeOptions()));
  }
  catch (std::exception &err) {
    if (!Darabonba_Util::Client::empty(err.code) && !Darabonba_Util::Client::empty(err.message)) {
      // Objek err berisi properti code dan message untuk membantu menemukan masalah
    }
  }
}
```

## Respons

### Isi respons

| Nama          | Tipe                  | Deskripsi                                                                                                                                                         |
| ------------- | --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| successResult | Array of String       | Daftar ID tugas pengiriman pesan yang berhasil ditarik.  **Catatan**  Ketika pesan yang dikirim oleh Bot ditarik, tidak ada pemberitahuan yang muncul di obrolan. |
| failedResult  | `Map<String, String>` | Daftar ID tugas pengiriman pesan yang gagal ditarik, beserta alasan kegagalan yang bersangkutan.                                                                  |

### Contoh isi respons

```text theme={"theme":{"light":"github-light","dark":"github-dark"}}
HTTP/1.1 200 OK
Content-Type:application/json

{
  "successResult" : [ "b5fe1xxx" ],
  "failedResult" : { }
}
```

### Kode error

Jika pemanggilan API ini mengembalikan error, temukan solusinya di dokumen [Kode error global](/id/open/development/server-api-error-codes-1) berdasarkan pesan error.

| HttpCode | Kode error                                | Pesan error | Deskripsi                                                                                                                                                                                  |
| -------- | ----------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| 400      | invalidParameter.robotCode                | %s          | Bot tidak ada. Periksa apakah Bot yang sesuai dengan `robotCode` telah dipasang di organisasi Anda.                                                                                        |
| 400      | invalidParameter.processQueryKeys.overMax | %s          | Jumlah `processQueryKeys` melebihi batas maksimal 20. Pisahkan `processQueryKeys` menjadi beberapa array yang masing-masing tidak lebih dari 20 entri dan panggil API ini secara bertahap. |
| 400      | not.allowed.robotCode                     | %s          | Pesan yang akan ditarik tidak dikirim oleh Bot yang sesuai dengan `robotCode`. Anda tidak memiliki izin untuk menarik pesan tersebut. Masukkan `robotCode` yang benar.                     |
| 400      | invalidParameter.param.invalid            | %s          | Parameter tidak valid. Periksa apakah parameter kosong.                                                                                                                                    |
| 400      | invalidParameter.processQueryKey.missing  | %s          | `processQueryKey` tidak ada.                                                                                                                                                               |
| 400      | invalid.processQueryKey                   | %s          | `processQueryKey` tidak valid. Periksa apakah `processQueryKey` sudah benar.                                                                                                               |
| 400      | robot.processQueryKey.expired             | %s          | `processQueryKey` telah kedaluwarsa. Pesan tidak dapat ditarik.                                                                                                                            |
| 400      | notRevoke.all.messages                    | %s          | Tidak semua pesan berhasil ditarik.                                                                                                                                                        |
| 500      | system.error                              | %s          | Error sistem yang tidak diketahui.                                                                                                                                                         |
