Archive for the 'XMLlib' Category

2012/06/16 インターネットのサービスを利用して日本国内の明日の天気予報を取得する

Livedoorの「お天気Webサービス」を呼び出して、日本国内の天気予報を取得するAppleScriptの改良(?)版です。構文確認(コンパイル)および実行には、仏Satimage SoftwareのフリーのOSAX「XMLLib OSAX」を必要とします。

# 「コンパイル」という言葉にだまされてか、AppleScriptのことを「インタプリタ型言語ではない」と勘違いしている人がたまにいますが、AppleScriptは逐次実行型のインタプリタ型言語です(内部で中間コードに置き換えることをコンパイルと呼んでいるだけです)

天気予報を取得して、その対象日付を求めます(最初のバージョンもここまでやっていました)。

問題はこの日付の文字列フォーマットがそのままではAppleScriptのdateオブジェクトに変換できなかったので……Googleで検索したら、あっさり海外(ドイツ?)で見つかりました。得られた文字列をdateオブジェクトに変換して、日付情報を取得。天気予報日付がcurrent dateの翌日になっていることを確認して値を返します。

明確に「明日」の天気予報を求めるように試してみましたが……はたしてどうでしょう?(これ、あんまりテストしていないもので、、、)

→ このバージョンのAPIが廃止になったので、REST APIを呼び出すように変更しています

スクリプト名:インターネットのサービスを利用して日本国内の明日の天気予報を取得する
–東京の明日の天気を求める
set aRec to getTomorrowWeatherForecast(63) of me –東京

–>
(*
{title:”東京都 東京 - 明日の天気”, yohouDate:”Sun, 17 Jun 2012 00:00:00 +0900″, yohouSakuseiDate:”Sat, 16 Jun 2012 17:00:00 +0900″, yohou:”雨のち曇”, descText:”東京地方と伊豆諸島では、明日昼前にかけて竜巻などの激しい突風、急な強い雨、落雷に注意して下さい。また、伊豆諸島では、強風や高波、濃霧による視程障害に注…
[PR]きょうは洗濯できるかな?“}

*)

on getTomorrowWeatherForecast(cityCode)
  set aDate to current date
  
set aDateNum to day of aDate
  
set dList to {“today”, “tomorrow”}
  
  
repeat with i in dList
    set j to contents of i
    
    
set aRes to getWeatherForecast(cityCode, j) of me
    
set yStr1 to yohouDate of aRes
    
set yStr2 to yohouSakuseiDate of aRes
    
    
set yObj1 to parse_RFC2822_date_string(yStr1) of me –予報対象日付
    
set yObj2 to parse_RFC2822_date_string(yStr2) of me –予報作成日付
    
    
set bDate to day of yObj1
    
    
if aDateNum + 1 = bDate then
      return aRes
    end if
  end repeat
  
  
return false
  
end getTomorrowWeatherForecast

–インターネットのサービスを利用して日本国内の天気予報を取得する
on getWeatherForecast(cityCode, relativeDateString)
  
  
set aURL to “http://weather.livedoor.com/forecast/webservice/rest/v1?” –Livedoor Weather Forecast Service
  
set aCity to (“city=” & cityCode as string) & “&”
  
set aDay to “day=” & relativeDateString
  
  
set allURL to aURL & aCity & aDay
  
  
set XMLbody to XMLOpen allURL
  
set the_root to XMLRoot XMLbody
  
  
set res1 to contents of first item of (XMLGetText (XMLXPath the_root with “/lwws/title”))
  
set res2 to contents of first item of (XMLGetText (XMLXPath the_root with “/lwws/forecastdate”))
  
set res3 to contents of first item of (XMLGetText (XMLXPath the_root with “/lwws/publictime”))
  
set res4 to contents of first item of (XMLGetText (XMLXPath the_root with “/lwws/telop”))
  
set res5 to contents of first item of (XMLGetText (XMLXPath the_root with “/lwws/description”))
  
  
set wRec to {title:res1, yohouDate:res2, yohouSakuseiDate:res3, yohou:res4, descText:res5}
  
  
return wRec
  
end getWeatherForecast

–RFC2022形式の日付文字列をdateオブジェクトに
on parse_RFC2822_date_string(ts)
  –引用元:
  
–http://www.j-schell.de/node/121
  
  
– parses a date string using PHP strtotime.
  
– Returns an AppleScript date
  
– Time is in your local time zone
  
–limits:
  
–19. Jan 2038 03:14:07 UTC
  
–13. Dec 1901 20:45:52 UTC
  
  
set php_cmd to “php -r “
  
set php_script to ?
    “$x = @strtotime($argv[1]);
    if ($x === false)
      print \”error\”;
    else
      print (@date ( \”Y-n-j-G-i-s\”, $x ));”
  set php_script to quoted form of php_script
  
set php_arg to quoted form of ts
  
  
set sh_script to php_cmd & php_script & ” “ & php_arg
  
–log sh_script
  
  
set dt to (do shell script sh_script)
  
  
– let us throw an error if parsing went wrong
  
– change the if line if you need something else
  
– return false
  
– may be an alternative if you want to react on problems
  
– without a try … on error block.
  
if dt = “error” then
    error “Handler parse_date_string could not parse string “” & ts & “”” number -30720
  end if
  
set the_date to current date
  
set day of the_date to 1
  
set {year of the_date, month of the_date, day of the_date, hours of the_date, minutes of the_date, seconds of the_date} to every word of dt
  
return the_date
end parse_RFC2822_date_string

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2012/06/09 インターネットのサービスを利用して日本国内の天気予報を取得する

Livedoorの「お天気Webサービス」を呼び出して、日本国内の天気予報を取得するAppleScriptです。

AppleScriptで、天気予報を取得してiCalやOutlook(Entourage)のスケジュールを変更したり、メールの文面を変更するなどの処理は……それほど難しくもないので、さっくり書いてみました。

「お天気Webサービス」の内容についてはこちらを詳細な仕様についてはこちらを実際に返ってくるXMLのデータ内容についてはこちらを参照してください。

実行には、仏SATIMAGE SOFTWAREのXMLLib OSAXを必要とします。なんでこれ、Appleがお買い上げしてMac OS X標準装備にしないのか不思議なぐらい有用で便利でお気楽で手放せません。

本ルーチンについての問題は、天気予報が出されるタイミングによって希望日が「今日」なのか「明日」なのかが微妙に変わってくる点で、そのあたりは今後のブラッシュアップが必要、といったレベルです。

スクリプト名:インターネットのサービスを利用して日本国内の天気予報を取得する
–東京の今日の天気を求める
set aRec to getWeatherForecast(63) of me

–>
(*
{title:”東京都 東京 - 今日の天気”, yohouDate:”Fri, 08 Jun 2012 00:00:00 +0900″, yohouSakuseiDate:”Fri, 08 Jun 2012 17:00:00 +0900″, yohou:”晴のち曇”, descText:”伊豆諸島では、強風や高波に注意して下さい。

日本の東に中心を持つ高気圧が、東日本をおおっています。また、四国沖から東シナ海をとおり大陸に前線がのびてい…
[PR]きょうは洗濯できるかな?“}

*)

–インターネットのサービスを利用して日本国内の天気予報を取得する
on getWeatherForecast(cityCode)
  set aURL to “http://weather.livedoor.com/forecast/webservice/rest/v1?” –Livedoor Weather Forecast Service
  
set aCity to (“city=” & cityCode as string) & “&”
  
set aDay to “day=today”
  
  
set allURL to aURL & aCity & aDay
  
  
set XMLbody to XMLOpen allURL
  
set the_root to XMLRoot XMLbody
  
  
set res1 to contents of first item of (XMLGetText (XMLXPath the_root with “/lwws/title”))
  
set res2 to contents of first item of (XMLGetText (XMLXPath the_root with “/lwws/forecastdate”))
  
set res3 to contents of first item of (XMLGetText (XMLXPath the_root with “/lwws/publictime”))
  
set res4 to contents of first item of (XMLGetText (XMLXPath the_root with “/lwws/telop”))
  
set res5 to contents of first item of (XMLGetText (XMLXPath the_root with “/lwws/description”))
  
  
set wRec to {title:res1, yohouDate:res2, yohouSakuseiDate:res3, yohou:res4, descText:res5}
  
  
return wRec
  
end getWeatherForecast

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/03/10 XMLからXPathで指定した階層のテキストを取得する

AppleScriptで真剣にXMLを扱おうとする場合に、揃えておくべきものがいくつかあります。

まずは、対象となるXMLデータを編集するなりブラウズするための「XMLエディタ」。とくに、XML中の場所(パス)を特定する「XPath」を表示する機能は必須です。

XPathの表示機能があるフリーのMac OS X用XMLエディタは、探した範囲では「XMLSpear」1本でした(フリーでなければいくつかありましたが……)。XMLSpearはJavaで作ってあってAppleScriptからコントロールできないものですが、この際文句は言えません。

xmlspear01.jpg

次に、Satimage SoftwareのXMLLib OSAX。XMLの操作を行うのに、XMLLib OSAXは欠かせません。他の言語処理系で常識的にある機能をAppleScriptに提供するフリーのOSAXです。これを、スクリプトエディタをいったん終了させ、~/Library/ScriptingAdditionsフォルダに入れておきます。→ XMLLib OSAXダウンロードページ

あとはまあ、こんな風にXMLファイルを読み込んでXPathを指定してデータを取り出したりすることになります。もう、XMLLibはMac OS Xに標準搭載してほしいぐらい役立ちまくっています。

下記サンプルは、~/Library/Preferencesにあるcom.apple.applescript.plistファイルを処理させてみたものです(同じファイルを指定して実行してみても、結果は人によって違います)。

xml02.jpg

ちなみに、XMLLib OSAXはUTF-8のXMLにしか対応していないようなので、風変りなSJISのXML書類などに遭遇してしまった場合には、iconvコマンドなどで変換&XML中のエンコーディング指定部分をUTF-8に置換してから読み込んでみてください。

スクリプト名:XMLからXPathで指定した階層のテキストを取得する
set anXMLfile to choose file
set XMLbody to XMLOpen anXMLfile
set the_root to XMLRoot XMLbody
set aXMLRes to XMLGetText (XMLXPath the_root with /plist/dict[1]/dict[1]/key“)
> {”Garage Band”, “GifBuilder”, “Image Capture Scripting”, “Image Capture Scripting.app”, “InDesign 2.0.2″, “Script Etitor”}

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に