コンテンツにスキップ

Forsquare API

サイト

トークン

アプリの作成

「プロジェクトを作成」を実施。これがアプリとなってClient IDとClient Secretが得られる。

APIキー

「Generate API Key」押下で作成。閉じると再表示は不可なのでメモしておく。

OAuth(手動)

Authentication

  • トークンがqueryとしてログに記録されても困らないwebサーバーを用意して「Redirect URL」に設定
  • https://foursquare.com/oauth2/authenticate?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=YOUR_REGISTERED_REDIRECT_URIにブラウザでアクセスして「許可」
  • リダイレクト先URLに遷移して、そのときのURL末尾のcode=***をメモ
  • https://foursquare.com/oauth2/access_token?client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=authorization_code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI&code=CODEにアクセス

これでtokenが表示される

API

curl --request GET \
     --url https://api.foursquare.com/v3/places/search \
     --header "Authorization: $FSQ_APP_API_KEY" \
     --header 'accept: application/json'

緯度経度・検索文字列追加

curl --request GET \
     --url 'https://api.foursquare.com/v3/places/search?query=%E3%81%8A%E5%8F%B0%E5%A0%B4&ll=35.6325714%2C139.7738516' \
     --header "Authorization: $FSQ_APP_API_KEY" \
     --header "accept: application/json"

Get User Detail

curl --request GET \
     --url "https://api.foursquare.com/v2/users/self?v=20240109&oauth_token=$FSQ_OAUTH_TOKEN" \
     --header "accept: application/json"

任意のユーザーの情報であれば以下。

curl --request GET \
     --url "https://api.foursquare.com/v2/users/${USER_ID}?v=20240109&oauth_token=$FSQ_OAUTH_TOKEN" \
     --header "accept: application/json"

Get User Checkins

curl --request GET \
     --url "https://api.foursquare.com/v2/users/self/checkins?v=20231010&limit=5&offset=0&oauth_token=$FSQ_OAUTH_TOKEN" \
     --header 'accept: application/json'

offsetからlimit件数分のチェックイン一覧。
レスポンスの基本的な構造は以下の通り。(shoutはコメントが無ければキーも無い)

{
    "response": {
        "checkins": {
            "count": 総チェックイン数,
            "items": [
                {
                    "id": "チェックインID",
                    "shout": "コメント",
                    ...
                    "venue": {
                        "id": "ヴェニューID",
                        "name": "ヴェニュー名",
                        ...
                    },
                    "photos": {
                        ...
                    }
                }
}

このチェックインIDでdetailsを取得する。

photos

photosに関しては以下。

"photos": {
    "count": 枚数,
    "items": [
        {
            "id": "...",
            "prefix": "https://fastly.4sqi.net/img/general/",
            "suffix": "/.........jpg",
            "width": width,
            "height": height,
        }
    ]
}

このときの画像のリンクは prefix + width + "x" + height + suffix でアクセスできる。
(厳密にはwidth x heightは指定した値に拡縮・トリミングされる)

location

旧シェア文字列のアドレスの「港区, 東京都」は venue.location.formattedAddress に配列要素の一つとしてセットされている。

"venue": {
    "location": {
        "address": "台場一丁目",
        "postalCode": "135-0091",
        "cc": "JP",
        "city": "東京",
        "state": "東京都",
        "country": "日本",
        "formattedAddress": [
            "台場一丁目",
            "港区, 東京都",
            "135-0091"
        ]
    },

ただし、locationの要素のpostalCodeが無い場合は3つ目の"135-0091"相当が、addressが無い場合は1つ目の"台場一丁目"が無いため、配列要素は固定ではない。
(2番目の"港区, 東京都"が無いパターンの有無は不明)

また、formattedAddress自体が無いヴェニューもある。

Get Check-in Details

CheckinsでチェックインのIDが取れたらDetailsでシェア用URLなども取れる

curl --request GET \
     --url "https://api.foursquare.com/v2/checkins/$CHECKIN_ID?v=20231010&oauth_token=$FSQ_OAUTH_TOKEN" \
     --header 'accept: application/json'

このレスポンスにアクセス可能なresponse.checkin.checkinShortUrlがある。
Twitterなどのシェアを有効にしているとsharesフィールドが追加される。
レスポンスの基本的な構造は以下の通り。

{
  "response": {
    "checkin": {
      "id": "チェックインID",
      "shout": "233日記念日",
      :
      ,
      "user": {
      },
      "venue": {
      },
      "photos": {
      },
      "checkinShortUrl": "https://www.swarmapp.com/.../checkin/...",
      "shares": {
        "twitter": true
      }
    }
  }
}

Get Place Details

APIはv2がすでに無くなりv3を使う必要がある。
Get Place Details

curl --request GET \
     --url "https://api.foursquare.com/v3/places/${PLACE_ID}?fields=social_media" \
     --header "Authorization: ${FSQ_APP_API_KEY}" \
     --header "accept: application/json"

?fields=で返すフィールドを指定できる。
TwitterIDなどのソーシャルメディア情報であれば?fields=social_mediaを指定。

{
  "social_media": {
    "twitter": "3rdhakatadaruma"
  }
}