色んな無料Web APIを使ってみよう!
はじめに
APIとは「アプリケーション・プログラミング・インターフェース(Application Programming Interface)」の略称で、簡単に言ってしまうと使用者がリクエストを提供者に送り、APIの提供者がリクエスト内容をもとに求められたデータを返すものです。
例として今は(値段的に)亡きX(Twitter)APIを挙げてみましょう。X APIはこんなことができます
- ポスト(ツイート)の投稿と取得、削除などの管理操作
- ユーザー情報の取得
- ツイートの検索
- etc...
これらの動作はAPIのエンドポイントにアクセスすることで行えます。エンドポイントというのは
APIエンドポイントは、リクエスト(API呼び出し)が実行される場所
で、URLの一つです。
例で挙げたものだけでも「自動でTLを取得してツイートを保存するアプリ」とか「ツイ消ししたツイートを抽出するアプリ」とかをAPI呼び出しするだけで簡単に作れちゃいますよね。これがAPIが便利たる所以です。
今回は私が今年使って便利だった無料で使えるAPIを幾つか紹介していきます。
Nominatim API
Nominatim APIとは
Nominatimは、OpenStreetMapのデータを利用した地理検索(ジオコーディング)サービスです。
主な機能としては以下が挙げられます。
- 住所から地理座標(緯度・経度)を取得(ジオコーディング)
- 地名や地点から正確な位置情報を検索
- リバースジオコーディング(座標から住所を取得)
以下の利用ポリシーの範囲内なら誰でも無料で使えます
導入と使用例
導入はほぼ必要なくエンドポイントにクエリを付けてrequestするだけです。APIキーとかは必要ありません。
試しに電通大近くのコンビニを探してもらいましょう。
import requests
def find_nearby_convenience_stores(latitude, longitude):
# Nominatim APIのエンドポイント
base_url = "https://nominatim.openstreetmap.org/search"
# リクエストパラメータ
params = {
'q': 'convenience store',
'format': 'json',
'limit': 5, # 5件まで取得
'bounded': 1, # 指定した矩形内のみ検索
'viewbox': f'{longitude-0.01},{latitude-0.01},{longitude+0.01},{latitude+0.01}'
}
# ヘッダー(APIポリシーに従う)
headers = {
'User-Agent': 'ConvenienceStoreFinder/1.0'
}
try:
# APIリクエスト
response = requests.get(base_url, params=params, headers=headers)
response.raise_for_status() # エラーハンドリング
# JSONデータの取得
stores = response.json()
#print(stores)
# 結果の処理
nearby_stores = []
for store in stores:
store_lat = float(store.get('lat'))
store_lon = float(store.get('lon'))
store_name = store.get('display_name')
nearby_stores.append({
'store_name': store_name,
'store_lat': store_lat,
'store_lon': store_lon
})
return nearby_stores
except requests.RequestException as e:
print(f"APIリクエストエラー: {e}")
return []
def main():
lat = 35.657267
lng = 139.542563 # 指定された緯度経度(電通大)
# コンビニを検索
stores = find_nearby_convenience_stores(lat, lng)
# 結果の表示
print(f"電通大近くのコンビニ {len(stores)} 店舗:")
for store in stores:
print(f"- {store['store_name']} ({store['store_lat']}, {store['store_lon']})")
if __name__ == "__main__":
main()
実行結果:
電通大近くのコンビニ 5 店舗:
- セブン-イレブン, 三鷹通り, 佐須町三丁目, 調布市, 東京都, 182-0021, 日本 (35.655493899999996, 139.55158144958935)
- セブン-イレブン, セブン-イレブン 調布小島1丁目店, 小島町一丁目, 調布市, 東京都, 182-0026, 日本 (35.653866199999996, 139.54050949999998)
- ローソン, 甲州街道, 布田一丁目, 調布市, 東京都, 182-0021, 日本 (35.6542092, 139.5474098)
- セブン-イレブン, 天神通り, 調布ケ丘一丁目, 調布市, 東京都, 182-0026, 日本 (35.655226, 139.5449588)
- セブン-イレブン, 甲州街道, 小島町一丁目, 調布市, 東京都, 182-0026, 日本 (35.656145, 139.5404372)
こんな感じで手軽に実装出来ます
Cloud Vision API
Cloud Vision APIとは
Cloud Vision APIはgoogleが提供するAPIの一つです。画像認識の精度が格段に良くOCRから被写体の判定まで大体やってくれます。
使用にはAPIキーの発行が必要で、初回なら90日間余程のことが無い限り使い切らない量のトークンが無料で使えます。それ以降も月1000トークンまでなら無料です。要は月1000回まで無料でAPIへリクエストすることが可能です。
導入と実装例
導入
導入は長くなるので以下のサイトを参照してください(投げやり)
Google Cloudへの登録
APIキーの取得
APIキーを取得したら(今回は.json)消し飛んだり公開しちゃったりしない場所に移してください(注意点参照)
こんな感じに書くと指定した画像をOCRして結果の座標群を返してくれます。
実装例
import os
from google.cloud import vision
from google.oauth2 import service_account
import cv2
import json
import numpy as np
from google.protobuf.json_format import MessageToDict
# 環境変数からAPIキーのパスを取得
api_key_path = os.getenv('CloudVisionAPIKey')
if not api_key_path:
raise ValueError("Environment variable 'CloudVisionAPIKey' is not set or empty.")
# 認証情報を読み込む
credentials = service_account.Credentials.from_service_account_file(api_key_path)
# クライアントのインスタンスを作成
client = vision.ImageAnnotatorClient(credentials=credentials)
# テキスト検出
def detect_text(image_path):
with open(image_path, 'rb') as f:
image = f.read()
# Vision APIに渡す形式に変換
image = vision.Image(content=image)
# テキスト検出
response = client.text_detection(image=image, image_context={"language_hints": ["ja", "en"]})
# レスポンスを辞書形式に変換して保存
response_dict = MessageToDict(response._pb, preserving_proto_field_name=True)
with open('OCR_response.json', 'w', encoding='utf-8') as f:
json.dump(response_dict, f, ensure_ascii=False, indent=4)
print("レスポンスをOCR_response.jsonに保存しました。")
return response
いい感じに活用するとこんな感じで認識してくれます(上のコードの実行結果ではないです)
JAXA Earth API
JAXA Earth APIとは
JAXA Earth API for Pythonは、 JAXA が保有するさまざまな地球観測データを活用するために開発されたPythonパッケージです。本APIを利用することで、各衛星データの仕様やセンサー、解像度などを気にすることなく、データを簡単に取得・処理することができます。
導入と実装例
導入は先ほどの公式サイトがめちゃくちゃ丁寧に教えてくれているのでそちら参照で、以下にテストコードと実行例を添付します。
# モジュールをロード
from jaxa.earth import je
# クエリパラメータを設定
dlim = ["2018-01-01T00:00:00","2018-01-01T00:00:00"]
ppu = 5
bbox = [110, 20, 160, 50]
# 画像を取得
def get_sattelite_image(dlim,ppu,bbox):
data = je.ImageCollection("NASA.EOSDIS_Aqua.MODIS_MYD11C1-LST.daytime.v061_global_half-monthly-normal",ssl_verify=False)\
.filter_date(dlim=dlim)\
.filter_resolution(ppu=ppu)\
.filter_bounds(bbox=bbox)\
.select("LST_2012_2021")\
.get_images()
return data
# 画像を処理して表示
def show_sattelite_image(data):
img = je.ImageProcess(data)\
.show_images()
def main():
data = get_sattelite_image(dlim,ppu,bbox)
show_sattelite_image(data)
if __name__ == "__main__":
main()
実行結果:
こんな感じで衛星から色んなデータ取得出来ます(画像は地表の温度を示しています)。使い道は思いつかないけど楽しいです。
注意点: APIキーの管理について
APIキーは第三者に絶対に見せてはいけないやつです。
これが分かるとあなたが実行したものとして勝手にリクエストが送信されることだってあります。while(True){リクエスト処理}
とかされた日にはn万の請求が行くかもです。なのでキーのパスを環境変数として保存して、例え間違えてGitHubにPublicでpushしても大丈夫なようにしましょう。
以下を参考にしてください
まとめ
APIはリクエストするだけで任意の結果が得られる便利コンテンツなのが多少分かって頂けたでしょうか?
今回紹介したもの他にも便利APIは沢山(ありがたいことに)転がっているので是非探してみてください。
Discussion