とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど

開催予定の勉強会

読者登録と各種SNSのフォローもよろしくお願いいたします。

GitHub ActionsでBitlyを使った短縮URLの作成を自動化した話

弊社のDevOpsチームでは「とことんDevOps勉強会」というオンライン形式のイベントを開催しています。 オンラインイベントを開催するためには準備として、ZoomやYoutube Live、質問系のサイトなどあれこれURLを発行します。 発行したURLを短縮URL化するかどうかはそれぞれの勉強会プロジェクトの方針によって異なりますが、弊社では短縮URLを使用するようにしています。

この短縮URL作成は最初の数回は楽しく作業できるのですが、単純作業な苦手な私からすると徐々に面倒になり、自動化したい欲が高くなってきます。 今回は、このやり方が適切かということは置いておいて、こういうこともできますよ。という小ネタとして読んで頂ければ嬉しいです。

きっかけ

Bitlyの短縮URLを作成する作業を画面からポチポチするのではなく、CLIやプログラムでもっと効率化できないかと考え始めたところがきっかけでした。

bitly.com

APIの機能はあるの?

CLIや何らかのプログラミング言語を使って自動化を考える際にまず初めに思い浮かぶのはAPI機能です。 まずはbitly apiなどでググってみて何か情報が出てくるか調べてみました。すると、APIのドキュメントが最初にヒットしたので機能としては提供されているようですね。

dev.bitly.com

内容を軽くみてみた感じだと特に有料プランのみ使用できるなどの制約はなく、無料ユーザーでも使用できそうでした。

準備

公式ドキュメントのイントロダクションを眺めながら必要な準備を進めていきます。 API機能ではお馴染みのトークンの取得がまずは必要みたいです。

アクセストークンの取得方法は、Bitlyにログインして左側にあるメニューからSettings > Developer settings > APIという順番にアクセスしてください。または、次のURLからアクセスしても同じ画面に辿り着けます。

Log in to the Bitly Connections Platform

アクセストークンを発行する際にログイン時に使用しているパスワードを入力する必要があります。パスワードの入力ができたらGenerate tokenをクリックします。

画面にトークンが表示されます。Bitlyでは1つのトークンしか保持されないようですので、ボタンを押す度にアクセストークンが洗い替えられてしまいますので、注意が必要です。 もしかすると、有料版などでは複数持てたりするのかもしれませんが、今回はそこまで調べていません。

APIの実行

アクセストークンの準備ができたので実際にAPIを実行してみましょう。 再び公式ドキュメントに戻り眺めてみるとShorten a LinkCreate a Bitlinkの2種類が作成できそうでした。

もう少し読み進めて指定できるリクエストスキーマを見ていると弊社的には過去のリンクを区別できるようにタイトルを設定していたりするので、爪のCreate a Bitlinkの方が要件に合いそうなので、こちらを選択しました。

Bitly API Reference

ドキュメント上ではcurlなど複数パターンのリクエストサンプルが用意されているので、嬉しいですね。 用意されているサンプルコードをベースに書き換えていきます。

個人的には使わなそうなパラメーターを削除しています。

curl \
-H 'Authorization: Bearer {TOKEN}' \
-H 'Content-Type: application/json' \
-X POST \
-d '{
  "long_url": "{短縮したいURL}",
  "domain": "bit.ly",
  "group_guid": "{グループID}",
  "title": "タイトル",
- "tags": [
-   "bitly",
-   "api"
- ],
- "deeplinks": [
-   {
-     "app_id": "com.bitly.app",
-     "app_uri_path": "/store?id=123456",
-     "install_url": "https://play.google.com/store/apps/details?id=com.bitly.app&hl=en_US",
-     "install_type": "promote_install"
-   }
- ]
}' \
https://api-ssl.bitly.com/v4/bitlinks

改めてこんな感じになります。

curl \
-H 'Authorization: Bearer {TOKEN}' \
-H 'Content-Type: application/json' \
-X POST \
-d '{
  "long_url": "{短縮したいURL}",
  "domain": "bit.ly",
  "group_guid": "{グループID}",
  "title": "{タイトル}"
}' \
https://api-ssl.bitly.com/v4/bitlinks

{TOKEN}は、先ほど作成したアクセストークンです。動作確認用としてローカルマシン上のターミナルから実行するので、直接記述します。

{短縮したいURL}は、何か適当なものを用意してください。

{グループID}は、Bitlyの画面にアクセスした際にURLに表示されている********の部分です。

https://app.bitly.com/********/home

{タイトル}は、第NN回 とことんDevOps勉強会などと付けて区別できるように使用しています。

実際に動かしてみます。一部マスクしてますがリクエストの内容はこんな感じです。

curl \
-H 'Authorization: Bearer ***' \
-H 'Content-Type: application/json' \
-X POST \
-d '{
  "long_url": "https://virtualtech.jp/2024-05-31/",
  "domain": "bit.ly",
  "group_guid": "*****",
  "title": "執筆掲載のお知らせ"
}' \
  -s \
  https://api-ssl.bitly.com/v4/bitlinks

実行結果がこのようになり、無事に成功しました。

{
  "created_at": "2024-06-05T01:55:31+0000",
  "id": "bit.ly/*******",
  "link": "https://bit.ly/*******",
  "custom_bitlinks": [],
  "long_url": "https://virtualtech.jp/2024-05-31/",
  "title": "執筆掲載のお知らせ",
  "archived": false,
  "tags": [],
  "deeplinks": [],
  "references": {
    "group": "https://api-ssl.bitly.com/v4/groups/***********"
  }
}

ブラウザで見てみるとこのように登録されていました。

しかし、作成されているものをよく見てみるとランダムな文字列がbit.ly/*****の部分に表示されていました。 Bitlyのブラウザ上の画面ではback-halfと呼ばれる後半分のURLを任意の文字列に指定することができます。 これも、短縮後URLの視認性を上げるためにわかりやすい文字列を付与する運用をしているため、ここも変更したいです。

もう1度先ほど実行したエンドポイントのリクエストパラメーターを確認してみたところ、それらしい項目はありませんでした。 もう少しドキュメントを読み進めたり、ググったりしていると別でリクエストする必要がありました。

Bitly API Reference

最初のリクエスト同じようにサンプルコードをコピーしてから必要なところの編集を加えていきます。

curl \
-H 'Authorization: Bearer *****' \
-H 'Content-Type: application/json' \
-X POST \
-d "{
  \"custom_bitlink\": \"bit.ly/devops-writing-20240531\",
  \"bitlink_id\": \"*****"
}" \
https://api-ssl.bitly.com/v4/custom_bitlinks

内容を見てみるとbitlink_idを指定してcustom_bitlinkに書き換えることができるようです。

bitlink_idは、前のリクエストで登録された時にレスポンスされたJSONのidの項目の値を取得して貼り付けます。

実際に実行してみると無事に成功しました。

{
  "custom_bitlink": "bit.ly/devops-writing-20240531",
  "bitlink": {
    "created_at": "2024-06-05T01:55:31+0000",
    "id": "bit.ly/3Xb18Fo",
    "link": "https://bit.ly/*******",
    "custom_bitlinks": [
      "http://bit.ly/devops-writing-20240531"
    ],
    "long_url": "https://virtualtech.jp/2024-05-31/",
    "archived": false,
    "created_by": "*********",
    "client_id": "****************************************",
    "tags": [],
    "deeplinks": [],
    "references": {
      "group": "https://api-ssl.bitly.com/v4/groups/***********"
    }
  }
}

ブラウザで見ても変更されていることが確認できます。

GitHub Actionsで動かす

GitHub Actionsためにワークフローの準備をします。

.github/workflows/bitly.ymlというファイルをリポジトリ直下のディレクトリに用意します。次のソースコードを貼り付けてください。

name: Bitly

on:
  workflow_dispatch:
    inputs:
      url:
        description: "短縮したいURL"
        required: true
      title:
        description: "表示したいタイトル"
        required: true
      back-half:
        description: "バックハーフ(bit.lt/****の「****」部分)"
        required: true

jobs:
  generare:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run a one-line script
        run: echo Hello, world!
      - name: Run a multi-line script
        run: |
          response=$(curl \
          -H "Authorization: Bearer ${{ secrets.BITLY_ACCESS_TOKEN }}" \
          -H 'Content-Type: application/json' \
          -X POST \
          -d '{
            "long_url": "${{ github.event.inputs.url }}",
            "domain": "bit.ly",
            "group_guid": "${{ secrets.BITLY_GROUP_GUID }}",
            "title": "${{ github.event.inputs.title }}"
          }' \
          -s \
            https://api-ssl.bitly.com/v4/bitlinks)

          id=$(echo $response | jq -r '.id')

          curl \
          -H "Authorization: Bearer ${{ secrets.BITLY_ACCESS_TOKEN }}" \
          -H 'Content-Type: application/json' \
          -X POST \
          -d "{
            \"custom_bitlink\": \"bit.ly/${{ github.event.inputs.back-half }}\",
            \"bitlink_id\": \"${id}\"
          }" \
            https://api-ssl.bitly.com/v4/custom_bitlinks

GitHub Actionsを実行する方法は手動実行を想定しています。 GitHub Actionsで手動実行するためにはworkflow_dispatchをつけることで実行できます。 また、実行時に入力パラメーターとして渡したいものはinputsに定義することで可能です。

on:
  workflow_dispatch:
    inputs:
      url:
        description: "短縮したいURL"
        required: true
      title:
        description: "表示したいタイトル"
        required: true
      back-half:
        description: "バックハーフ(bit.lt/****の「****」部分)"
        required: true

inputsに定義した値は${{ github.event.inputs.xxxxx }}で呼び出すことができます。

${{ secrets.BITLY_ACCESS_TOKEN }}${{ secrets.BITLY_GROUP_GUID }}などは固有の情報であるため、今回はシークレット情報に登録しています。

GitHubの画面に移動してからActionsのタブを開きます。

サイドメニューでBitlyを選択します。

画面右端あたりにあるRun workflowをクリックします。先ほど定義したパラメーターを入力してから実行ボタンを押すと処理が開始されます。

おわりに

業務効率化という視点で小ネタとしてご紹介しました。GitHub Actionsを使い慣れていくためには場数を踏んで使っていくしかないのですが、このような小ネタなどで使う機会を増やしてみるといいかもしれませんね。 ぜひ、Bitlyを実際に使っている方は試してみてはいかがでしょうか。