GandiのドメインAPIを使ってドメイン名の登録状況を確認できるPythonコードを書いた


#背景

Gandi.netというドメインレジストラをちゃんと使い始めたのですが、ドメインに最近はまってます。ドキュメンテーションを読んでいたら、Gandiが提供するAPIがあったので少し遊んでみました。

Gandi.netでドメイン取得をすると何が得なのか特徴をここで簡単にまとめてますので、Gandi.netとはなんぞや? という人はこちらからどうぞ。

- [ドメイン名取得するならこれからはGandi.netが良いと思った理由](https://qiita.com/infraneko_12/items/084b291dc08496198ecc)


##ドメイン登録に関する API

このドキュメンテーションを参考にしました。

- [Gandi.net API (beta)](https://api.gandi.net/docs/)



###APIキーの取得方法

APIキーはGandiのウェブサイトに自分のアカウントでログインすると取得できます。

![スクリーンショット 2019-08-12 15.46.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293176/ee1bfc8a-a4ac-0f35-6199-a5929ecebc2e.png)

ログイン後にアカウント設定ページに移動し、「ユーザーアカウントとセキュリティ設定を管理」をクリック。

![スクリーンショット 2019-08-12 15.46.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293176/758ce87d-40a5-5a06-3a58-b8694604b595.png)

セキュリティ設定ページにある「APIキーを生成」をクリックして使用しているアカウントのパスワードを入力するとAPIキーを取得することができます。


##Gandi ドメインAPIを使ったドメイン名の登録状況の確認


ここではPythonを使った簡易コードを書きました。

```
headers = {'authorization': 'Apikey <your api key>'}
```
この箇所の\<your api key\>を上のステップで取得した自分のAPIキーに置き換えてください。


```python:domain-availability.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Domain availability
# Terminology: TLD = Top Level Domain such as .com, .net, .org and etc..

import requests
import json

def check_availability():
    url = "https://api.gandi.net/v5/domain/check"
    domainname = input("Enter a domain name: ") # type only name part excluding ".TLD"
    tlds = {1: ".com", 2: ".net", 3: ".org", 4: ".io", 5: ".info", 6: ".jp"} # feel free to add any TLDs
    for key in tlds:
        querystring = {"name":domainname + tlds[key]}
        headers = {'authorization': 'Apikey <your api key>'}
        response = requests.request("GET", url, headers=headers, params=querystring)
        data = response.text
        data_json = json.loads(data)
        print(json.dumps(data_json, indent=2))
```

走らせるとこのような感じになります。

```
>>> check_availability()
ドメイン名に使用したい文字列を入力してください: testdomainreg
{
  "grid": "A",
  "taxes": [
    {
      "type": "service",
      "rate": 0,
      "name": "notax"
    }
  ],
  "products": [
    {
      "prices": [
        {
          "max_duration": 10,
          "discount": false,
          "price_before_taxes": 1493,
          "duration_unit": "y",
          "price_after_taxes": 1493,
          "min_duration": 1,
          "options": {
            "period": "golive"
          }
        }
      ],
      "status": "available",
      "process": "create",
      "name": "testdomainreg.com",
      "taxes": [
        {
          "type": "service",
          "rate": 0,
          "name": "notax"
        }
      ]
    }
  ],
  "currency": "JPY"
}
{
  "currency": "JPY",
  "products": [
    {
      "prices": [
        {
          "price_before_taxes": 2108,
          "max_duration": 10,
          "duration_unit": "y",
          "options": {
            "period": "golive"
          },
          "discount": false,
          "min_duration": 1,
          "price_after_taxes": 2108
        }
      ],
      "process": "create",
      "status": "available",
      "taxes": [
        {
          "rate": 0,
          "type": "service",
          "name": "notax"
        }
      ],
      "name": "testdomainreg.net"
    }
  ],
  "taxes": [
    {
      "rate": 0,
      "type": "service",
      "name": "notax"
    }
  ],
  "grid": "A"
}
........
```

###英語の用語確認

APIを叩くと当然といえば当然ですが、全て結果が英語で返されるので最低限以下の単語や用語の意味を知っておくと便利です。


- taxes: 税
- rate: 料率
- vat: value added tax の略で付加価値税という意味。日本国内にいる人は関係ないです
- type: 種類
- grid: 割引レートのことをGandiでは英語で"grid"と言っているようです。A-Eまでがあり、Eだとかなり値下げ率で毎年ドメイン名を購入できるとのこと。([参考](https://docs.gandi.net/ja/billing/price_rates/index.html))
- currency: 通貨
- products: 製品 (ここではドメイン名のこと)
- process: 行うアクションのこと。上では create とあるので「ドメイン名の作成」を表す。transfer とあれば「ドメイン名移管」の意味。
- status: そのドメイン名の現在の状況 (登録できるなら available、できないなら unavailable)
- max_duration: 登録できる最大年数
- price_before_taxes / price_after_taxes: 税抜き、税込み金額のこと。日本にいる人は気にしなくて大丈夫です。
- discount: 割引

ちなみに以下のコードで登録したいドメイン名を入力すれば上のような結果が返ってくるようにしました。

```python:check-availability.py
def check_availability():
    url = "https://api.gandi.net/v5/domain/check"
    domainname = input("登録したいドメイン名を入力してください: ") # Give a if condition to show an error message if there are spaces or any other characters that we can't accept
    querystring = {"name":domainname}
    headers = {'authorization': 'Apikey <your API key>'}
    response = requests.request("GET", url, headers=headers, params=querystring)
    data = response.text
    data_json = json.loads(data)
    print(json.dumps(data_json, indent=2))
```

```
>>> check_availability()
Enter a domain name: testdomainreg.io
{
  "taxes": [
    {
      "name": "notax",
      "type": "service",
      "rate": 0
    }
  ],
  "grid": "A",
  "currency": "JPY",
  "products": [
    {
      "name": "testdomainreg.io",
      "taxes": [
        {
          "name": "notax",
          "type": "service",
          "rate": 0
        }
      ],
      "prices": [
        {
          "price_before_taxes": 3825,
          "duration_unit": "y",
          "max_duration": 10,
          "min_duration": 1,
          "options": {
            "period": "golive"
          },
          "price_after_taxes": 3825,
          "discount": false
        }
      ],
      "process": "create",
      "status": "available"
    }
  ]
}

```

APIのドキュメンテーションを見ると、ドメイン名の登録、更新やDNSレコードの書き換えなど必要なことは全てできるようです。

このAPIを使って簡単にドメイン名登録サービスを作ることもできそうで面白いですね。