ふれっしゅのーと

ふれっしゅのーと

趣味に生きる30代エンジニアが心に移りゆくよしなし事をそこはかとなく書きつくるブログ

Swarm(Foursquare)のチェックイン履歴をKML形式で出力してGoogleマップで表示する

Swarm(Foursquare)とは

訪問した場所を記録できるスマホアプリです。チェックイン数を競ったりバッジを集めたりゲーム的要素もありますが、僕はもっぱら Twitter 連携できる位置情報ライフログとして2012年から愛用しています。

KMLダウンロードが公式サポートされなくなった

昔は Foursquare の公式サイトから KML 形式でダウンロードできたので、Googleマップに取り込んで過去の訪問場所を眺められたのですが、どうやら今はダウンロードできなくなってるようです。Twitter で友人が嘆いていました。

なんとかして KML 形式のデータを作成できないものか……

APIを叩けよ、さらば開かれん

調べたら Foursquare が開発者向けに API を公開していました。API を通してリクエストを送ると施設名やら緯度経度やらを返してくれるので、この情報を使ってごにょごにょすれば KML になりそうな気がします。

自分で API のドキュメントを読んでごりごり開発するのはしんどいので、先人の知恵を借ります。英語でググったら GitHub で公開されているプログラムにたどり着きました。

  1. GitHub - philgyford/foursquare-feeds: A python script for generating an iCal feed from your Foursquare checkins
  2. GitHub - riussi/4sq-exports: Command-line tool to export your Foursquare check-ins to a KML-file
  3. GitHub - jdevelop/fs4map: The simple service to export venues from Foursquare into KML files / Google Maps

Python で書かれていて かつ README も充実していたので、今回は 1. のプログラムを使っていきます。*1

foursquare-feeds を使ってみる

github.com

基本的な使い方は README にかなり丁寧に書いてあるのですが、途中で何度も引っかかり悪戦苦闘を余儀なくされました。環境構築に苦戦はつきもの。マニュアル通りにうまく進むほうが珍しいぐらいです。

ご安心ください。

この記事を読んでくださってる方々には環境構築で辛い思いをしてほしくないので、環境構築不要で foursquare-feeds を動かせるツール を作りました! !

↓ これです

github.com

上記 GitHub にアクセスして「Open in Colab」と書かれたボタンを押すと、Google Colaboratory のノートブック画面に遷移します。

あとはノートブック内の指示に従いながら、各コマンドブロックを上から順に手動実行していけば、最後に KML が手に入ります。

慣れている人はノートブックに書かれた指示だけ読んで勝手に進めてくださって構いません。以下では画面キャプチャー付きでかなり細かめに手順を解説していきます。

1. Google Colaboratory 上で foursquare-feeds が使える環境を作る

冒頭の3つのコードブロックを順に実行してください。コードブロックにマウスカーソルを載せると左側に実行ボタンが出現します。

ここでは、GitHub から foursquare-feeds をダウンロードしてきて(git clone)、そのフォルダに移動して(cd foursquare-feeds)、実行に必要なライブラリをインストールしています(pip install -r requirements.txt

pip installをすると「You must restart the runtime」と WARNING が出ますが、慌てずに指示に従って「RESTART RUNTIME」ボタンを押してください。

RESTART したら再び cd foursquare-feeds から順に実行し直してください。

二度目のpip installで WARNING がなくなれば成功です。

2. foursquare の開発者向けページで新規アプリを作る

アプリを作ると言っても一瞬ですのでご安心を。

https://foursquare.com/developers/apps にログインして、言われるがままにアプリの名前を決めてあげるだけです。

こんな感じの画面になったら成功です!(一度アプリを作っちゃったので初回作業の画面キャプチャーは取得できませんでした)

2-1. Client ID と Client Secret を取得する

アプリの管理画面に表示されている Client ID と Client Secret をこの後使うので、どこかにコピーしておいてください。

2-2. Redirect URL を登録する

アプリの管理画面で Redirect URL に「http://localhost:8000」を登録してください。*2

3. アクセストークンを入手する

アクセストークンとはAPIを叩く上で必要になる「許可証」のようなものです。こいつの取得がちょっとややこしいです。

2-1. で取得した Client ID と Client Secret を Google Colaboratory の画面の指定箇所に貼り付けて、実行してください。シングルクォーテーションの囲いは消さないように注意してください。

実行すると、URL が生成されます。

この URL にアクセスすると、エラー画面になります(想定通り)*3

大事なのはエラー画面の上部に表示されているURLです。先程コピペしたURLとは別のURLになっている(=リダイレクト)ので、このURLの「code=」以降を「#」の前までコピーしてください。

Google Colaboratory に戻り、コピーした文字列を「CODE =」の右辺に貼り付けて、実行してください。アクセストークン取得のためのURLが生成されます。

このURLにアクセスすると、ブラウザ上にアクセストークンが表示されます。ようやくアクセストークンが手に入りました。

{"access_token":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}

という形で表示されるので、右側のダブルクォーテーションの中身をコピーしておいてください。

4. 設定ファイルにアクセストークンを登録する

foursquare-feeds を実行するための設定ファイル(config.ini)にアクセストークンを登録します。下図のように sed 文の ACCESS_TOKEN という文字列を、自分のアクセストークンに書き換えてください。(ややこしいですが YourAccessTokenHere の部分は書き換えないでください)

ここでは、config_example.ini(最初から用意されている設定例のファイル)内の「YourAccessTokenHere」という文字列を sed でアクセストークンに置換して、config.ini を作成しています。

5. simplekml のバグを修正する

【2023-10-01 追記】

foursquare-feeds の generate_feeds.py で使われている simplekml にバグ(Fails with Python 3.8 #38)があり、Python 3.8 系以降では実行時に「AttributeError: module 'cgi' has no attribute 'escape'.」というエラーが出ます。2019年に修正用の PR(Update Base.py for Python3.8 #40)が立てられているのですが、開発が止まっていて、マージされていません。

この記事を書いた当初は Google Colaboratory の Python が 3.7 系だったので幸いこのバグを踏まずに済んだのですが、2023年4月に Python のバージョンが 3.10 系に上がったので、いよいよ正常に動かなくなってしまいました……

そこでバグのある /usr/local/lib/python3.X/dist-packages/simplekml/Base.py に対して修正用の PR(Update Base.py for Python3.8 #40)と同等の修正を行います。簡単な修正なので sed コマンドによる文字列置換で済ませています。

6. generate_feeds.py を実行する

準備が整ったので、foursquare のチェックイン履歴を取得して KML 形式で出力するプログラム generate_feeds.py を実行しましょう。

オプションは https://github.com/philgyford/foursquare-feeds の README を参照してください。今回は --kind kml としてKML 形式で出力しますが、他にも iCal 形式(Googleカレンダーに取り込める形式)での出力にも対応しているようです。

7. kmlファイルをダウンロードする

左ペインのフォルダアイコンを押してファイル一覧を開き、 foursquare-feeds > foursquare.kml をダウンロードしてください。

8. Googleマイマップにインポートする

Googleマイマップ を開き、新規マップを作成して、6. でダウンロードした KML ファイルを取り込んでください。

欲しかった地図の完成です!!!

長い道のりでした……

Googleロケーション履歴に引っ越そうかな

更新履歴

  • 2022-02-27:simplekmlの既知のバグについて追記
  • 2023-10-01:simplekmlの既知のバグに対する修正を適用

*1:Google 最上位に出てきたのは 2. のプログラムだったのですが、おそらく僕の使い方が悪くて、うまく動作しませんでした。3. のプログラムは README がなくて手も足も出ず。Go 言語に造詣のある人はサクッと使えるのかもしれません。

*2:ここの Redirect URL は「https://www.google.com/」でも何でもよいのですが、一応お作法ということで「http://localhost:8000」にしました。localhost を立てたり、ポートを開けたりする必要はありません。)

*3:次のようなエラー画面になったときは失敗です。2-2. で Redirect URL を登録し忘れています。

Callback uri is not valid for this consumer