予定表に従ってfoursquareに自動チェックインする

ここまでの作業で、

  • チェックイン予定表(日時と場所(スポット))
  • サーバからのチェックイン

を作ったので、これらをまとめて自動チェックインを実現する。具体的には、上記の機能をサーブレットで次のようにまとめて、

  • チェックイン予定表を検索し、条件にあった予定を抽出する。
     条件:予定日時が現在時刻より前(=予定時刻が過ぎている)で、未チェックインの予定
  • 抽出した予定の地点にチェックインする
     チェックイン完了後、ステータスをチェックイン済に変更する

このサーブレットを一定時間ごと(例えば1分ごと)に実行することで、自動チェックインを実現する。なお、これらの処理はすべてサーバ側で行われるので、一連の処理に際しモバイル機器は不要で、「予定」を変更したい場合にのみ使えばOK。サーブレットの処理部分のコードは以下のイメージ。

// Java
// PersistenceManager をインスタンス化
PersistenceManager pm=PMF.get().getPersistenceManager();

// 日時の比較用
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tokyo"));// 今日&現在時刻
SimpleDateFormat sdfCurDate = new SimpleDateFormat("yyyy/MM/dd");
String curDate =sdfCurDate.format(cal.getTime()); // 今日の日付の文字列表現
SimpleDateFormat sdfCurTime = new SimpleDateFormat("HH:mm");
String curTime =sdfCurTime.format(cal.getTime()); // 現在の時刻の文字列表現

// クエリ文字列を組み立て
String query = "select from " + SpotPlan.class.getName() + " where chk_status =='plan' & chk_mode=='auto' & spot_date =='" + curDate + "' & spot_time<'" + curTime + "'";
// クエリ実行
List<SpotPlan>plans = (List<SpotPlan>)pm.newQuery(query).execute();

// チェックインパラメータ用の変数
String venueID = "";
String shout = "";
String broadcast = "";
String checkinID = "";

for(SpotPlan plan:plans){ // 対象が複数ある場合は繰り返し処理
  venueID = plan.getSpot_id(); // データストアに保存した内容を取得
  shout = plan.getChk_msg();
  broadcast = plan.getChk_bcast(); // 実際はもう少し配慮が必要
  if (shout.equals("na")) shout = "";
  // foursquareのスポットに対する処理
 if ( (plan.getSpot_type()).equals("frsq") ){
    // チェックイン実行 - 成功するとfoursquareからcheckinIDが返される。
    // このIDを使ってチェックインの詳細にアクセスできる。
    checkinID = checkinFoursquare(venueID, shout, broadcast);
    if (checkinID != null){ // チェックイン成功
      plan.setChk_status("checkin"); // ステータスその他を更新する
      plan.setChk_id(checkinID);
      plan.setChk_memo("autocheckin");
      plan.setChk_date(curDate);
      plan.setChk_time(curTime);
    }
  }
}
pm.close(); // データストア更新

このサーブレットをcronとして登録し、定期的に実行する。

カテゴリー: Development, Location Service タグ: , , パーマリンク