不要なBundlesをAPIで一括削除する

:::note alert
2023年5月1日を持ちまして、株式会社KDDIウェブコミュニケーションズのTwilioリセール事業が終了したため、本記事に記載されている内容は正確ではないことを予めご了承ください。
:::

# はじめに

みなさん、こんにちは。
KDDIウェブコミュニケーションズのTwilio事業部エバンジェリストの高橋です。

今回は、電話番号を購入する際に作成した Bundles のなかで、Twilio からリジェクトされたもの、もしくは下書きとして保存されている不要なものを、API を使って一括で削除する方法について説明します。
実は今までは一度作成された Bundles を削除することはできませんでした。 Bundles の情報には個人情報なども含まれるため、削除機能が切望されていたのですが、ようやく <font color='red'>API でのみ</font> 削除できるようになりました。
↓こんな感じで、ゴミが残ってしまっているのが気持ち悪い。
![スクリーンショット 2020-10-17 10.42.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/2b5ecc17-e1a2-da28-6bd0-ca8356fdbfa6.png)

管理コンソールからは未だに削除はできないので、削除したい方は以下の方法を参考にしていただけると幸いです。

# 準備

API ドキュメントは、[こちら](https://jp.twilio.com/docs/phone-numbers/regulatory/api/bundles)にあります。
今回は Node.js を使って実施します。Node.js 以外の言語は、上記ドキュメントを参考にご自分で作成してください。
<font color='red'>＜重要＞
本プログラムは、サブアカウントもすべて精査して、Bundlesが`draft`もしくは、`twilio-rejected`のものを削除します。
本プログラムによって起こった事象については一切責任を持ちませんので、自己責任でお願いします。
</font>

## 今回利用した実行環境

Node.js

```sh
% node -v
v12.8.0
% npm list twilio
Users/katsumi
└── twilio@3.50.0
```

twilio ライブラリのバージョンが低いと削除ができない可能性がありますので、適宜バージョンアップしてから実施してください。

## コード

```javascript
const accountSid = 'ACxxxxxxxxxxxxxxxxxxxxxxx';  // ご自分の環境に合わせてください
const authToken = 'xxxxxxxxxxxxxxxxxxxxxx';  // ご自分の環境に合わせてください
const client = require('twilio')(accountSid, authToken);

client.api.accounts.list()
.then(async accounts => {
    for (account of accounts) {
        await execSubAccount(account);
    };
})
.catch((err) => {
    console.error(`*** ERROR ***\n${err}`);
});

const execSubAccount = (async account => {
    console.log(`${account.friendlyName} [${account.sid}]==============`);
    const subAccount = require('twilio')(account.sid, account.authToken);
    await subAccount.numbers.regulatoryCompliance.bundles
    .list()
    .then(async bundles => {
        for (bundle of bundles) {
            if (bundle.status === 'draft' || bundle.status === 'twilio-rejected') {
                // 書きかけデータとリジェクトされたデータ
                console.log(`${bundle.sid} status:${bundle.status}`);
                await removeBundle(subAccount, bundle.sid);
            }
        }
    })
    .catch((err) => {
        console.error(`*** ERROR ***\n${err}`);
    });
});

const removeBundle = (async (subAccount, bundleSid) => {
    return new Promise(async (resolve, reject) => {
        await subAccount.numbers.regulatoryCompliance.bundles(bundle.sid).remove()
        .then(() => {
            console.log('done.');
            resolve();
        })
        .catch((err) => {
            reject(err);
        });    
    });
});
```

上記のコードを適当な名前（例：`delUnApprovedBundlesAllSubAccount.js`）で保存します
1〜2行目には、ご自分のマスターアカウントの AccountSid と AuthToken を指定してください。
それぞれ、[管理コンソール](https://jp.twilio.com/console)にログインすることで確認ができます。

## 実行

AccountSid と AuthToken を書き換えたら、以下のコマンドで実行できます（ファイル名は、先程保存したものに読み替えてください）。

```sh
% node delUnApprovedBundleAllSubAccount.js
MainAccount [ACxxxxxxxxxxxxxxxxxxxxxxxxx]==============
BU56dfcbbd5d5057a2ba46cd3c7f6da63d status:draft
done.
BU90a89bf9ad971c588b91b92cd4db8489 status:draft
done.
BU46bd21620555b317ae43c6e240ef1902 status:draft
done.
BU185afbab7dec686eb7472cceda522d64 status:draft
done.
BUd0bd5e97ff5a2a8cae91b4b87221dff4 status:draft
done.
BU7eba157c47c1648da3eb1acb7fabaec7 status:twilio-rejected
done.
（中略）
SubAccount [ACxxxxxxxxxxxxxxxxxxxxxxxxxx]==============
BUa7fecbe3ec9c632faa8882c6f2753914 status:draft
done.
（中略）
```

# まとめ

ようやくですが、皆さんからのご要望が多かった Bundles の削除ができるようになりましたので、気になる方はぜひご自分で削除していただければと思います。

---
### Twilio（トゥイリオ）とは

https://cloudapi.kddi-web.com
Twilioは音声通話、メッセージング（SMS/チャット）、ビデオなどの 様々なコミュニケーション手段をアプリケーションやビジネスへ容易に組み込むことのできるクラウドAPIサービスです。初期費用不要な従量課金制で、各種開発言語に対応しているため、多くのハッカソンイベントやスタートアップなどにも、ご利用いただいております。

自己紹介|　
:--|:--
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/b51a8b88-abd5-ce5e-195a-de3564ba2ae6.png" height='200' width='150'/>|高橋克己（Katsumi Takahashi） 自称「<font color='red'>赤い芸人</font>」<br />グローバル・インターネット・ジャパン株式会社　代表取締役<br />株式会社KDDIウェブコミュニケーションズ　Twilio事業部エバンジェリスト<br /><br />2001年より大手通信事業者の法人サービスの教育に携わり、企業における電話のしくみや重要性を研究。2016年よりTwilio事業部にジョインし、Twilioを使ったスマートコミュニケーションの普及活動を精力的に行っている。<br />2019 Twilio Champions