ふれっしゅのーと

ふれっしゅのーと

趣味に生きる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 のノートブック画面に遷移します。

f:id:fffw2:20211110000612p:plain

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

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

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

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

f:id:fffw2:20211110001728p:plain

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

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

f:id:fffw2:20211110002151p:plain

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

f:id:fffw2:20211110003005p:plain

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

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

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

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

f:id:fffw2:20211110004029p:plain

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

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

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

2-2. Redirect URL を登録する

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

f:id:fffw2:20211110004703p:plain

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

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

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

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

f:id:fffw2:20211110010010p:plain

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

f:id:fffw2:20211109012106p:plain

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

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

f:id:fffw2:20211110012015p:plain

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

{"access_token":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}

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

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

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

f:id:fffw2:20211110013417p:plain

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

5. generate_feeds.py を実行する

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

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

f:id:fffw2:20211110014500p:plain

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

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

f:id:fffw2:20211110014643p:plain

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

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

欲しかった地図の完成です!!! f:id:fffw2:20211110015341p:plain

長い道のりでした……

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

更新履歴

  • 2022-02-27:simplekmlの既知の問題について追記

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

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

*3:次のようなエラー画面になったときは失敗です。2-2. で Redirect URL を登録し忘れています。
f:id:fffw2:20211109010345p:plain:w320
Callback uri is not valid for this consumer

*4: 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 系(2022年2月27日現在)なので、今はこのエラーは出ませんが、いつか Python のバージョンが上がると、残念ながら正常に動かなくなってしまいます。そうなった場合は /usr/local/lib/python3.X/dist-packages/simplekml/Base.py に対して上記 PR と同じ修正を自分で行えば、エラーが解消します。