ユニフォーム・リソース・ロケータ(一般的にはURLと呼ばれるもの)は、インターネット上のコンテンツの存在場所を示すアドレスです。URLには、ウェブページのアドレスの後に、一見ランダムな文字が長く続くことが多々あります。見た目が美しくなく、覚えづらいものです。これを整えるには、URL短縮ツールが使えます。

URLを短縮すると、アドレスの共有がしやすくなり、ユーザーによる不正確な情報の入力の可能性を下げるなど、いくつものメリットがあります。URLに1文字でも欠けていると、間違ったページが表示されてしまったり、そもそもページが表示されなかったりして、まったく使い物にならなくなります。

例えば、https://example.com/blog-url-shorteners/48bfefiahl9adikhttps://example.com/url-shortenersと短縮した例を考えてみましょう。どちらを共有しやすいか、あるいはどちらの方がタイピング中のミスにつながりやすいかは、想像に難くありません。

URL短縮機能の強みは、長いURLを整理するだけではありません。URL短縮機能は、以下のようなあらゆることに活用することができます。

  • 検索エンジンでのランキング向上:コンテンツ制作者、企業、スタートアップ企業の多くが、ウェブサイト、ブログ、SNSでコンテンツを公開しています。検索エンジンは特定のキーワードを含むリンクを好む傾向があり、それに応じてランク付けが多少変動することもあります。既知のプラットフォームから生成された短いURLは、コンテンツの上位表示を助ける要素になり得ます。
  • リンクのトラフィックの追跡Bitlyのような有料URL短縮サービスを使えば、リンクをクリックしたユーザーを追跡することができます。流入トラフィックの分析や、それに応じたコンテンツの調整に有用です。

URL短縮の2つの方法─PythonライブラリとAPI

今回の記事では、以下の2つの方法でPythonを使ったURL短縮ウェブアプリの構築を行います。

pyshortenersモジュールを開発に組み込むことで短いURLを生成することができます。一方、Bitly APIモジュールでは、短いURLを生成しながら、URLごとのクリック数、クリックされたURLの場所、URLのカスタマイズなど、付随する機能を利用可能です。

今回の説明を読み進めるには、Pythonについての基本的な知識が必要になります。また、Pythonがシステムにインストールされている必要がありますので事前にご確認ください。

プロジェクト環境のセットアップ

URL短縮ウェブアプリを作成する前に、Pythonウェブアプリの開発を容易にする軽量フレームワークであるFlaskのインストールを含め、プロジェクトの環境をセットアップしていきましょう。

以下のステップから始めます。

  • url-shortenerのような名前でプロジェクトフォルダを作成します。
  • そのフォルダの中にmain.pyという空のファイルを作成します。
  • Pythonライブラリのインストールをシステムから独立したものにするために、プロジェクトの仮想環境を作成します。ターミナルでpython -m venv myenvというコマンドを使って環境を構築します(この場合、環境ファイルはmyenvディレクトリに配置されることになります)。
  • お使いのオペレーティングシステムに対応するコマンドを使って仮想環境を有効にします(<myenv>の部分は前のステップで作成したディレクトリの名前になります)。
    • Windows<myenv>Scriptsactivate.bat
    • Linux/macOSsource <myenv>/bin/activate
  • コマンドpip install flaskを使ってFlaskをインストールします。
  • プロジェクトフォルダ内にtemplatesという名前のフォルダを作成します(FlaskはこのディレクトリからHTMLテンプレートを取得することになります)。

ここまでのターミナルでの作業は以下のようになります。

Pythonプロジェクト環境を作成するためにターミナルに入力したコマンド
macOSターミナルでの様子(Pythonプロジェクトのここまでの進捗)

pyshortenersライブラリを使用してURL短縮ウェブアプリを構築する

プロジェクトの環境が整ったので、pyshortenersライブラリを使って最初のURL短縮ツールを作成します。

以下のコマンドでpyshortenersライブラリをインストールします。

pip install pyshorteners

ウェブアプリケーションの基本的なユーザーインターフェースの作成

次に、長いURLを入力して短いURLを生成するために必要となる、ラベルと入力フィールドのある基本的なフォームをHTMLで作成します。

templatesフォルダにform.htmlファイルを作成し、そのファイルに以下のコードを入力し保存します。

<!DOCTYPE html>
<html lang="en">
<head>
  <title>URL短縮ツール</title>
</head>
<body>
  <h1>URLを楽々短縮</h1>
  <form method="post" action="/">
    <label for="url">「https://」で始まるURLを入力してください</label>
    <input type="url"
      name="url"
      id="url"
      placeholder="https://www.xyz.com"
      pattern="https://.*" size="50"
        value="{{old_url}}"
      required  
    >
    <button type="submit" value="submit">短縮実行</button>
    <br>
    <label>短縮後のURL</label>
    <input name="generated_url" value="{{new_url}}" style="margin-top: 10px; margin-left:35px" size="50"></input>
  </form>
</body>
</html>

上記のコードにより、2つのラベル、2つの入力フィールド、1つのボタンのあるフォームができます。

urlという最初の入力フィールドに長いURLを入力します。もう1つのフィールドは短いURLを生成するためのものです。

url入力フィールドには以下の属性があります。

  • name:要素(例:URL)を識別
  • placeholder:URLの例を示す
  • pattern:URLのパターンを指定する(https://.*
  • required:送信前にURLの入力を確認する
  • value:元のURLを表示する

2番目の入力フィールドはvalue属性がnew_urlに設定されています。new_urlmain.pyファイルからpyshortenersライブラリによって生成される短いURLです(次のセクションで説明します)。

入力フォームは以下のスクリーンショットのようになります。

URLを短縮するウェブフォームのスクリーンショット
URL短縮用のウェブフォーム

pyshortenersを使ったURLの短縮

フォームができたので、Pythonとpyshortenersを使ってURL短縮の機能を追加しましょう。

長いURLを短いURLに変換するコードを追加し、ウェブアプリケーションを実行します。先ほど作成したmain.pyファイルに移動し、以下のコードを入力して保存してください。

from flask import Flask, render_template, request
import pyshorteners
app = Flask(__name__)
 
@app.route("/", methods=['POST', 'GET'])
def home():
  if request.method=="POST":
    url_received = request.form["url"]
    short_url = pyshorteners.Shortener().tinyurl.short(url_received)
    return render_template("form.html", new_url=short_url, old_url=url_received)
  else:
    return render_template('form.html')
 
if __name__ == "__main__":
 app.run() 

上のコードでは、pyshortenersライブラリと以下のモジュールをFlaskフレームワークからインポートしています。

  • Flask:以前紹介したFlaskフレームワークそのもの
  • render_templatetemplatesフォルダからHTMLファイルの出力を生成するためのテンプレートレンダリングパッケージ
  • request:ユーザーがHTTPリクエストの一部としてフロントエンドからバックエンドに送信するすべてのデータを含む、Flaskフレームワークのオブジェクト

次に、フォームで送信されたURLを受け取り、短いURLを出力するhome()という関数を作成します。app.route()デコレータを使用して、アプリを実行するために特定のURLルートに関数をバインドし、POST/GETメソッドでリクエストを処理します。

home()関数の中にはif-else条件文があります。

ifステートメントでは、request.method=="POST"の場合、url_receivedという変数に、フォームで送信されるURLであるrequest.form["url"]がセットされます。urlは、先に作成したHTMLフォームで定義した入力フィールドの名前になります。

次に、short_urlという変数がpyshorteners.Shortener().tinyurl.short(url_received)にセットされます。
ここでは、pyshortenersライブラリの2つのメソッド、.Shortener().short()が使用されています。.Shortener()関数はpyshortenersクラスのインスタンスを作成し、.short()関数はURLを引数として受け取り、それを短縮する役割を果たします。

short()関数であるtinyurl.short()は、pyshortenersライブラリの数あるAPIのひとつです。osdb.short()も同じ目的で使用することができます。

render_template()関数は、HTMLファイルテンプレートであるform.htmlをレンダリングし、引数を通してURLをフォームに送り返すのに使われます。引数new_urlshort_urlに、old_urlurl_receivedに設定されます。ifステートメントのスコープはここで終了します。

elseステートメントでは、リクエストメソッドが POST以外の場合、form.html HTMLテンプレートだけがレンダリングされます。

pyshortenersライブラリを使用したURL短縮ウェブアプリのデモ

pyshorteners URL短縮アプリケーションのデモを確認します。アプリケーションを実行した後、アプリケーションのデフォルトルートであるhttp://127.0.0.1:5000/を開いてみましょう。

ウェブフォームの最初のフィールドに好きなリンクを貼り付けます。

ウェブフォームに貼り付けた短縮URLのスクリーンショット
pyshortenersライブラリを使用してURL短縮機能をテストする

「短縮実行」ボタンをクリックすると、「短縮後のURL」フィールドにドメインとしてtinyurlが入った、短いURLが出力されます。

ウェブフォームで返された短いURLを示すスクリーンショット
pyshortenersライブラリを使用したURL短縮の結果

Bitly APIモジュールを使用してURL短縮ウェブアプリを構築する

このセクションでは、Bitly APIを使用してURL短縮アプリケーションを開発します。前述したように、Bitly APIモジュールでもURLを短縮でき、クリック数、場所、使用したデバイスの種類(PCやモバイルなど)といった詳しい分析データの確認も可能です。

以下のコマンドを使用してBitly APIをインストールします。

pip install bitly-api-py3

Bitly APIを使用するにはアクセストークンが必要です。Bitlyにサインアップすることで取得できます。

サインアップ完了後、Bitlyにログインしてダッシュボードを表示します。

Bitlyダッシュボードのスクリーンショット

左サイドバーの「Settings」をクリックし、「Developer settings」の下にある「API」セクションをクリックします。

下の画像のように、「Generate token」ボタンの上のフィールドにパスワードを入力してアクセストークンを生成します。アプリのコードで使用できるようにトークンを保管しておいてください。

Bitly APIのアクセストークン生成画面
Bitly APIのアクセストークンを生成する

Bitly APIを使ったURLの短縮

Bitlyからトークンを取得したので、今度はBitly APIを使用してURLを短縮するコードをウェブアプリに記述します。

pyshortenersセクションで作成したものと同じフォームを使用しますが、main.pyファイルに以下のようにいくつかの変更を加えます。

from flask import Flask, render_template, request
import bitly_api
app = Flask(__name__)
 
bitly_access_token = "37b1xxxxxxxxxxxxxxxxxxxxxxxxxx"
 
@app.route("/", methods=['POST', 'GET'])
def home():
  if request.method=="POST":
    url_received = request.form["url"]
    bitly = bitly_api.Connection(access_token=bitly_access_token)
    short_url = bitly.shorten(url_received)
    return render_template("form.html", new_url=short_url.get('url'), old_url=url_received)
  else:
    return render_template('form.html')
 
if __name__ == "__main__":
 app.run() 

上のコードからわかるように、bitly_apiimport bitly_apiを使ってインポートされます。アクセストークンはbitly_access_token = "37b1xxxxxxxxxxxxxxxxxxxxxxxx"のようにbity_access_token変数に保存されます。

home()関数はURLを短縮するためのもので、if-else条件文を含みます。

ifステートメントでは、メソッドまたはリクエストがPOSTの場合、フォームで送信されたURLがurl_received変数に設定されます。

bitly_api.Connection(access_token=bitly_access_token)関数はBitly APIに接続し、先ほど保存したアクセストークンを引数として渡します。

URLを短縮するには、url_received変数を引数として渡し、short_urlという変数に保存するかたちでbitly.shorten()関数を使用します。

最後に、作成したフォームがレンダリングされ、render_template()関数を使用してフォームに表示されるURLが送り返されます。これでifステートメントが完了します。

elseステートメントでは、render_template()関数を使用してフォームのレンダリングを行います。

Bitly APIを使用したURL短縮ウェブアプリのデモ

Bitly API URL 短縮アプリケーションのデモを確認するために、アプリケーションを実行した後、アプリケーションのデフォルトルートであるhttp://127.0.0.1:5000/に移動します。

ウェブフォームの最初のフィールドに任意のリンクを貼り付けます。

BitlyのURL短縮APIウェブフォームのスクリーンショット
Bitly APIを使用したURL短縮機能をテストする

「短縮実行」をクリックすると、ウェブアプリケーションの2番目のフィールドにbit.lyをドメインとする短いURL が生成されるはずです。

Bitly APIが返す短縮URLのスクリーンショット
Bitly APIを使用したURL短縮の結果

PythonアプリケーションとBitly APIを組み合わせて簡単にURLを短縮することができます。

まとめ

URL短縮機能を使うと、短いURLを簡単に共有でき、見た目もすっきりします。今回の記事ではURL短縮機能とその利点、そしてpyshortenersとBitly APIを使ってPythonでURL短縮ウェブアプリケーションを構築する方法をご紹介しました。pyshortenersライブラリを使えば短いURLを生成でき、Bitly APIでは短いURLの生成だけでなく詳細な分析データも確認できます。

これで便利なアプリケーションの完成です。Kinstaのウェブアプリケーションホスティングサービスを使ってさまざまなアイデアをお試しください。今回ご紹介したようなPythonアプリをKinstaのプラットフォームで稼働させるには、Flaskの活用例をご覧ください。

Adarsh Chimnani

Adarsh is a web developer (MERN stack), passionate about game-level designing (Unity3D), and an anime enthusiast. He enjoys absorbing knowledge just out of curiosity, implementing what he has learned in the real world, and sharing that knowledge with others.