Twilio APIでOpenWeatherMap APIで取得した天気情報を毎朝モーニングコールする
2015/10/18
OpenWeatherMap APIのJsonから取得した気温と天気の情報を、TwilioのAPIを使って毎朝5時にモーニングコール設定してみました。
ソースコード詳細は、GitHubを見ていただければと思います。
デモ動画です。
※SlidShareに発表資料をアップしましたので、概要はこちらをご確認ください。
目次
OpenWeatherMap API Jsonから天気情報を取得する
Twilio APIでメッセージを送るために、次のようなXMLを動的に作成します。
[vim]
[/vim]
取得する情報は今とおよそ6時間後、12時間後の天気と気温です。
JsonをString変数へ格納
2種類のJsonをString形式で扱う事にしました。
抜粋していますので、全体はGitHub GenerateJsonString.javaを見てください。
[java]
public void setJsonData(String urlString) {
StringBuilder builder = new StringBuilder();
try {
URL url = new URL(urlString);
Object content = url.getContent();
if (content instanceof InputStream) {
BufferedReader reader = new BufferedReader(
new InputStreamReader((InputStream) content));
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
this.jsonDataString = builder.toString();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
[/java]
指定URLのContentをBufferedReaderに入れて読んだ情報をStringBuilderに追加していきます。
今の天気情報の取得
まず今の天気情報を取得するために、OpenWeatherMap APIのCurrentを取得します。
タイプは「Weather」です。
解析用のクラスは次のようになりました。
抜粋していますので、全体はGitHub WeatherJson.javaを見てください。
[java]
public class WeatherJson {
private ArrayList
public class weather {
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
private main main;
public class main {
private double temp;
public double getTemp() {
return temp;
}
public void setTemp(double temp) {
this.temp = temp;
}
}
public ArrayList
return weather;
}
public void setWeather(ArrayList
this.weather = weather;
}
public main getMain() {
return main;
}
public void setMain(main main) {
this.main = main;
}
}
[/java]
クラスの階層化や配列のところは少し調べながら作りました。
APIのURLを叩いて得られるJsonの形式にあわせて作っていく感じです。
JsonをGsonを使ってパースする
JsonのパースはGsonライブラリを使ってやりました。
抜粋していますので、全体はGitHub GenerateXMLFile.javaを見てください。
[java]
GenerateXMLFile() {
gson = new Gson();
todayString = getTodayString();
sayString = todayString.substring(0, 4) + “” + “年”
+ todayString.substring(5, 7) + “月”
+ todayString.substring(8, 10) + “日の天気をお知らせします。”;
}
public void GenerateWeatherString(String jsonString) {
WeatherJson weatherJson = gson.fromJson(jsonString, WeatherJson.class);
ArrayList<weathermap.WeatherJson.weather> weatherWeather = weatherJson
.getWeather();
WeatherJson.main weatherMain = weatherJson.getMain();
ConditionCode conditionCode = new ConditionCode();
conditionCode.setConditionString(weatherWeather.get(0).getId());
sayString += “現在の気温は” + weatherMain.getTemp() + “度。天気は”
+ conditionCode.getConditionString();
conditionCode = null;
}
[/java]
GsonのfromJsonで解析用クラスを引数に渡してJavaオブジェクト化しています。
XMLに設定するメッセージのための文字列を生成しています。
およそ6時間後と12時間後の予報の取得
OpenWeatherMAP APIの「Forecast」では3時間単位で今の時間帯を含む未来のデータが取得出来ます。
まずは、解析用クラスです。
抜粋していますので、全体はGitHub ForecastJson.javaを見てください。
[java]
public class ForecastJson {
private ArrayList list;
public class list {
private main main;
public class main {
private double temp;
public double getTemp() {
return temp;
}
public void setTemp(double temp) {
this.temp = temp;
}
}
private ArrayList
public class weather {
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
public ArrayList
return weather;
}
public void setWeather(ArrayList
this.weather = weather;
}
public main getMain() {
return main;
}
public void setMain(main main) {
this.main = main;
}
}
public ArrayList getList() {
return this.list;
}
public void setList(ArrayList list) {
this.list = list;
}
}
[/java]
先ほどの「Weather」より階層がひとつ深くなっています。
およそ6時間後と12時間後のJsonのパース
抜粋していますので、全体はGitHub GenerateXMLFile.javaを見てください。
[java]
public void GenerateForecastString(String jsonString) {
ForecastJson forecastJson = gson.fromJson(jsonString,
ForecastJson.class);
ArrayList forecastLists = forecastJson.getList();
int loopNumber = 0;
for (list forecastList : forecastLists) {
switch (loopNumber) {
case 3:
case 5:
main forecastMain = forecastList.getMain();
ArrayList
ConditionCode conditionCode = new ConditionCode();
conditionCode
.setConditionString(forecastWeather.get(0).getId());
sayString += getJpTimeString(forecastList.getDt_txt()) + “時の気温は” + forecastMain.getTemp()
+ “度。天気は” + conditionCode.getConditionString();
conditionCode = null;
break;
}
loopNumber++;
}
}
[/java]
リストの順番はOpenWeatherMAP APIの仕様を信じるとして添え字で3番目と5番目がおよそ6時間後、12時間後になるはずなのでこれでXMLメッセージ用のStringを生成しています。
XMLファイル生成
ここまでで得たStringでXMLを生成します。
XMLはTwilioの仕様どおりに作成します。
抜粋していますので、全体はGitHub GenerateXMLFile.javaを見てください。
[java]
public Document SayXMLDocument(String sayString) {
DocumentBuilder builder = null;
String voice = “alice”;
String language = “ja-jp”;
try {
builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
Document XMLDocument = builder.newDocument();
Element response = XMLDocument.createElement(“Response”);
XMLDocument.appendChild(response);
Element say = XMLDocument.createElement(“Say”);
say.setAttribute(“voice”, voice);
say.setAttribute(“language”, language);
say.appendChild(XMLDocument.createTextNode(sayString));
response.appendChild(say);
return XMLDocument;
}
public void WriteXMLFile(Document XMLDocument, String filePath) {
Transformer transformer = null;
TransformerFactory transformerFactory = TransformerFactory
.newInstance();
try {
transformer = transformerFactory.newTransformer();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
}
transformer.setOutputProperty(“indent”, “yes”);
transformer.setOutputProperty(“encoding”, “UTF-8”);
try {
transformer.transform(new DOMSource(XMLDocument), new StreamResult(
filePath));
} catch (TransformerException e) {
e.printStackTrace();
}
}
[/java]
voiceはaliceにしています。
で、やってみて思ったのですが、今のところ漢字の読み間違いはないです。
凄いですね。
Twilio APIを使って自動で電話をかける。
プログラムから電話をかける
素晴らしく簡単です。
抜粋していますので、全体はGitHub TwilioCall.javaを見てください。
[java]
public class TwilioCall {
public void doCall(Properties properties) {
TwilioRestClient client = new TwilioRestClient(
properties.getAccount_sid(), properties.getAuth_token());
List
params.add(new BasicNameValuePair(“To”, properties.getTo()));
params.add(new BasicNameValuePair(“From”, properties.getFrom()));
params.add(new BasicNameValuePair(“Url”, properties.getUrl()));
params.add(new BasicNameValuePair(“Method”, “GET”));
params.add(new BasicNameValuePair(“FallbackMethod”, “GET”));
params.add(new BasicNameValuePair(“StatusCallbackMethod”, “GET”));
params.add(new BasicNameValuePair(“Record”, “false”));
CallFactory callFactory = client.getAccount().getCallFactory();
Call call = null;
try {
call = callFactory.create(params);
} catch (TwilioRestException e) {
e.printStackTrace();
}
System.out.println(call.getSid());
}
}
[/java]
propertiesファイルから各パラメータを取得しているので、それぞれ簡単に説明を書きます。
- ACCOUNT_SID,AUTH_TOKEN
Twilioのサイトでログインして、「Show API Credentials」で表示されます。
-
To
かけたい相手の電話番号です。 -
Url
生成したXMLを置いているURLです。
mainメソッドで各処理を実行する
[java]
public static void main(String[] args) {
Properties properties = new Properties();
String filePath = properties.getFile_path();
APIURL apiUrl = new APIURL(properties.getCity(), “weather”);
GenerateJsonString generateJsonString = new GenerateJsonString();
GenerateXMLFile generateXmlFile = new GenerateXMLFile();
generateJsonString.setJsonData(apiUrl.getUrlString());
generateXmlFile.GenerateWeatherString(generateJsonString.getJsonData());
apiUrl.setUrlString(properties.getCity(), “forecast”);
generateJsonString.setJsonData(apiUrl.getUrlString());
generateXmlFile
.GenerateForecastString(generateJsonString.getJsonData());
String sayString = generateXmlFile.getSayString();
Document xmlDocument = generateXmlFile.SayXMLDocument(sayString);
generateXmlFile.WriteXMLFile(xmlDocument, filePath);
TwilioCall twilioCall = new TwilioCall();
twilioCall.doCall(properties);
}
[/java]
ほとんどはXML生成のためのコードで、Twilioは本当に数行のコードで出来ました。
毎朝5時に自動で電話をかける
root権限で実行してもらいます。
[bash]
$ sudo crontab -e
[/bash]
[vim]
0 5 * * * java -jar MorningCall.jar
[/vim]
エラー処理、ログなどはこれから実装していきます。
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
Googleナレッジパネルの申請が承認されました
今年の4/13に「Googleナレッジパネルの認証を受けるために申請してみた」が …
-
C#でOpenWeatherMap APIを使って天気情報を取得する
C#でOpenWeatherMapAPIを使って現在の天気を取得してみました。 …
-
WordPressの記事を公開日時に関係なくソート順を変更する
PostMash Customを使う WordPressのプラグインでPostM …
-
Java SE 7 Silver対策勉強をしながらメモ 2015/1/30
本日は配列です。 いつものごとくマークダウンで記載したのでそのままJetpack …
-
Google Apps ScriptでAdmin SDK Directory Serviceを使ってグループメンバー情報を出力する
GoogleAppsのGoogleGroupをメーリングリストとして使っている人 …
-
Mac OS X Yosemite にnode.js + mongodb 環境を作る
node.jsインストール nodejs.orgサイトで「INSTALL」ボタン …
-
執筆などで使えるグローバルIPアドレス
今さらなんですが、執筆などで使えるグローバルIPアドレスを調べました。 RFC5 …
-
Java SE 7 Silver対策勉強をしながらメモ 2015/2/9
練習問題2日目。 同じ問題にひっかかる。つまづく。 集中力が足りない。 途中から …
-
Java SE 7 Silver 試験対策セミナーで模擬問題の解説をマークダウンでメモってみた
Java SE 7 Silver 試験対策セミナーに行って、模擬問題にチャレンジ …
-
Chrome リモートデスクトップを使ってみる
自宅のMacをリモートで操作したい 外出用PCはWindows 8 とLinux …