macやiPhoneのショートカットでConoHaのAPIを触る

# はじめに
この記事は [Conoha Calendar 2023](https://qiita.com/advent-calendar/2023/conoha) 3日目の記事になります。
内容はiPhoneやMacのショートカット.appでAPIを触るという内容です。

今回はMacで作業しますが、iPhoneでもできると思います。

リクエストして帰ってきた**レスポンスの一部は省略しています**。

# トークンの取得
ショートカット.appを新規で作成し、
「URL」を選択し、`https://identity.tyo1.conoha.io/v2.0/tokens`にします。
![スクリーンショット 2023-11-24 18.16.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201995/cf98e0b4-04fb-b1b0-5cb0-13dc807f8c76.png)

次に「URLの内容を取得」を配置して次のように入力します。
![スクリーンショット 2023-11-27 15.11.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201995/1c428d87-3fb4-a5d6-a1ab-967fec93bd15.png)


APIユーザー名、パスワードはConoHaのコントロールパネルで確認できます。

ここで動作確認をします。
正しく入力できているなら、以下が取得できるはずです。(jsonを整形して見やすくしています。)

```
{
	"access": {
		"metadata": {
			"roles": [
				"",
				""
			],
			"is_admin": 0
		},
                (** 省略 **)
		"token": {
			"audit_ids": [
				""
			],
			"issued_at": "2023-11-27T06:08:37.257323",
			"id": "[APIトークン]",
			"tenant": {
				"tyo1_image_size": "50GB",
				"enabled": true,
				"id": "",
				"sin1_image_size": "50GB",
				"sjc1_image_size": "50GB",
				"description": "",
				"name": "",
				"domain_id": "gnc"
			},
			"expires": "2023-11-28T06:08:37Z"
		}
	}
}
```

この先では [APIトークン] を使用しますので、コピーしておいてください。
(うまくやればできると思いますが、jsonの特定の文字列を抜き出す方法が分からなかった...)

Q:テナントIDなくてもトークン発行されるみたいだけど
A:テナントIDないと使えないAPIがあるっぽい。
権限的な関係みたいなので、とりあえず入れてトークン発行したほうが良さそう。

https://www.conoha.jp/docs/identity-post_tokens.php

# 入金サマリーを取得する
上の項で取得したトークンを使います。

まず、「URL」 を`https://account.tyo1.conoha.io/v1/[テナントID]/payment-summary`にします。
コントロールパネルのAPIのところに、エンドポイントの一覧があるのでそれコピペでOKです。

次に「URLの内容を取得する」を下に配置します。
表示を増やすを押して、項目を増やします。

方法を`GET`にして

| キー | 値 |
|:-:|:-:|
| X-Auth-Token | [APIトークン]|

を入力します。

入力するとこんな感じになるはずです。
![スクリーンショット 2023-11-27 14.40.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201995/cc54903e-2758-ee4c-b010-0c7c9c36cd8b.png)

実行してみると

```
{
	"payment_summary": {
		"total_deposit_amount": 2768
	}
}
```

の方な感じのが返ってくるはずです。

https://www.conoha.jp/docs/account-payment-summary.php

# VM一覧を取得する

先の「入金サマリーを取得する」を改変しましょう。

URLを`https://compute.tyo1.conoha.io/v2/[テナントID]/servers`に書き換えます。


```
{
	"servers": [
		{
			"id": "[ServerID]",
			"links": [
				{
					"rel": "self",
					"href": "https://compute.tyo1.conoha.io/v2/[テナントID]/servers/[ServerID]"
				},
				{
					"rel": "bookmark",
					"href": "https://compute.tyo1.conoha.io/[テナントID]/servers/[Server]"
				}
			],
			"name": "[ServerName]"
		}
	]
}
```

サーバーが一台しかないのでこれだけですが、サーバが複数台ある場合はこれが増えていきます。

https://www.conoha.jp/docs/compute-get_flavors_detail.php

# VM詳細を取得

先のものを使いまわします。

URLを先程のレスポンスにあった`https://compute.tyo1.conoha.io/v2/[テナントID]/servers/[ServerID]`にします。

実行すると

```
{
	"server": {
		"OS-EXT-STS:task_state": null,
		"OS-EXT-SRV-ATTR:hypervisor_hostname": "[収容ホスト]",
		"status": "ACTIVE",
		"OS-DCF:diskConfig": "AUTO",
		"metadata": {
		},
		"hostId": "",
		"addresses": {

		},
		"image": {
			"id": "",

		},
		"user_id": "",
		"OS-EXT-STS:power_state": 1,
		"security_groups": [
  
		],
		"updated": "2023-11-20T07:15:59Z",
		"links": [
			{
				"rel": "self",
				"href": "https://compute.tyo1.conoha.io/v2/[テナントID]/servers/[ServerID]"
			},
			{
				"rel": "bookmark",
				"href": "https://compute.tyo1.conoha.io/[テナントID]/servers/[ServerID]"
			}
		],
		"OS-EXT-STS:vm_state": "active",
		"name": "150-95-175-236",
		"OS-EXT-SRV-ATTR:host": "[収容ホスト]",
		"OS-EXT-AZ:availability_zone": "nova",
		"id": "",
		"progress": 0,
		"OS-EXT-SRV-ATTR:instance_name": "tyo1-00107dfc",
		"key_name": "",
		"OS-SRV-USG:launched_at": "2021-06-07T08:37:46.000000",
		"OS-SRV-USG:terminated_at": null,
		"accessIPv4": "",
		"accessIPv6": "",
		"tenant_id": "",
		"os-extended-volumes:volumes_attached": [],
		"config_drive": "True",
		"flavor": {
			"id": "294639c7-72ba-43a5-8ff2-513c8995b869",
			"links": [
				{
					"rel": "bookmark",
					"href": "https://compute.tyo1.conoha.io/[テナントID]/flavors/[flavorID]"
				}
			]
		},
		"created": "2017-10-05T10:51:18Z"
	}
}
```

こんな感じで取得できます。

https://www.conoha.jp/docs/compute-get_vms_detail_specified.php

# オブジェクトストレージに画像を上げてみる
コントロールパネルのAPIページのObject Storage ServiceのエンドポイントのURLをコピーして、URLのところにペーストして書き換えます。

コンテナは「public」を作成してある前提で進めます。

ショートカット.appの書類の中にある「ファイルを選択」を追加します。
追加したファイルでアップロードするファイルを指定します。
ファイルは一番上に配置しておきましょう。

今回はPC内にあった画像をアップロードします。
(テキストファイルがうまくアップロードできなかった...)

「URLの内容を取得」で方法をPUTにして、本文を要求をファイルにします。
ファイルをクリックして、変数を選択>ファイルを選択します。

あと、URLの後ろにファイル名を入れます。
`https://object-storage.tyo1.conoha.io/v1/nc_a2489b5e4b524766864468250e18d5e6/public/aa11.png`みたいにします。
ファイル名はアップロードするファイルの名前にすることをおすすめしますが、何でもいいです。
ただ、元がpngなのにjpgにしたりするのはやめておきましょう。

![スクリーンショット 2023-11-27 22.12.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201995/7c4d0b91-c3ca-4623-7be7-18e915446fc5.png)

レスポンスは帰ってこないみたいですが、
![スクリーンショット 2023-11-27 22.27.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201995/4667baee-4725-52a0-485b-709d09922936.png)

URLをブラウザで開くと画像が見れますが、web publishingする必要があります。

URLを末尾の`ファイル名.拡張子`(上の画像なら`mirai.png`)を消して、
「ファイル」を削除して、「URLの内容を取得」の方法を`POST`にします
ヘッダを

| キー | 値 |
|:-:|:-:|
| X-Auth-Token | [APIトークン]|
| X-Container-Read | .r:* |

になるようにします。(X-Container-Readを追加)

忘れずに「本文を要求」を `JSON`にして実行します。

![スクリーンショット 2023-11-28 13.25.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201995/9ba422eb-8f20-efd8-c6ec-729f9b1452fb.png)

(自分の環境ではコンテナ`public`はすでに公開状態のため、新しく`pub2`を作成して実行しました。)

これでアップロードした画像が見れるはずです。

https://www.conoha.jp/docs/swift-object_upload.php

https://www.conoha.jp/docs/swift-web_publishing.php

なお、5Gを超えるファイルのアップロードは[dynamic large objects](https://www.conoha.jp/docs/swift-dlo.php)や[static Large Object](https://www.conoha.jp/docs/swift-slo.php)を利用したほうが良さそうです。
ただし、ショートカット.appでできるか試していないので、curlが使える環境のほうが良さそうです。

# 最後に
curlを使わずともショートカット.appで色々出来そうですね。
鯖を起動させたり停止させたり再起動させたり。

今年はまともな記事ができました(たぶん

明日は skworks33さんの記事が出ます。

# スペシャルサンクス & 参考
[ｺﾉﾊﾁｬﾝ](https://twitter.com/MikumoConoHa)[ｶﾜｲｲ](https://twitter.com/search?q=%23%E6%B8%85%E6%A5%9A%E3%81%8B%E3%82%8F%E3%81%84%E3%81%84&src=hashtag_click&f=live)ﾔｯﾀｰ!!

https://www.conoha.jp/docs/

Jsonを整形するのに利用しました

https://tools.m-bsys.com/dev_tools/json-beautifier.php