弊社のDevOpsチームでは「とことんDevOps勉強会」というオンライン形式のイベントを開催しています。 オンラインイベントを開催するためには準備として、ZoomやYoutube Live、質問系のサイトなどあれこれURLを発行します。 発行したURLを短縮URL化するかどうかはそれぞれの勉強会プロジェクトの方針によって異なりますが、弊社では短縮URLを使用するようにしています。
この短縮URL作成は最初の数回は楽しく作業できるのですが、単純作業な苦手な私からすると徐々に面倒になり、自動化したい欲が高くなってきます。 今回は、このやり方が適切かということは置いておいて、こういうこともできますよ。という小ネタとして読んで頂ければ嬉しいです。
きっかけ
Bitlyの短縮URLを作成する作業を画面からポチポチするのではなく、CLIやプログラムでもっと効率化できないかと考え始めたところがきっかけでした。
APIの機能はあるの?
CLIや何らかのプログラミング言語を使って自動化を考える際にまず初めに思い浮かぶのはAPI機能です。
まずはbitly api
などでググってみて何か情報が出てくるか調べてみました。すると、APIのドキュメントが最初にヒットしたので機能としては提供されているようですね。
内容を軽くみてみた感じだと特に有料プランのみ使用できるなどの制約はなく、無料ユーザーでも使用できそうでした。
準備
公式ドキュメントのイントロダクションを眺めながら必要な準備を進めていきます。 API機能ではお馴染みのトークンの取得がまずは必要みたいです。
アクセストークンの取得方法は、Bitlyにログインして左側にあるメニューからSettings > Developer settings > API
という順番にアクセスしてください。または、次のURLからアクセスしても同じ画面に辿り着けます。
Log in to the Bitly Connections Platform
アクセストークンを発行する際にログイン時に使用しているパスワードを入力する必要があります。パスワードの入力ができたらGenerate token
をクリックします。
画面にトークンが表示されます。Bitlyでは1つのトークンしか保持されないようですので、ボタンを押す度にアクセストークンが洗い替えられてしまいますので、注意が必要です。 もしかすると、有料版などでは複数持てたりするのかもしれませんが、今回はそこまで調べていません。
APIの実行
アクセストークンの準備ができたので実際にAPIを実行してみましょう。
再び公式ドキュメントに戻り眺めてみるとShorten a Link
とCreate a Bitlink
の2種類が作成できそうでした。
もう少し読み進めて指定できるリクエストスキーマを見ていると弊社的には過去のリンクを区別できるようにタイトルを設定していたりするので、爪のCreate a Bitlink
の方が要件に合いそうなので、こちらを選択しました。
ドキュメント上では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度先ほど実行したエンドポイントのリクエストパラメーターを確認してみたところ、それらしい項目はありませんでした。 もう少しドキュメントを読み進めたり、ググったりしていると別でリクエストする必要がありました。
最初のリクエスト同じようにサンプルコードをコピーしてから必要なところの編集を加えていきます。
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を実際に使っている方は試してみてはいかがでしょうか。