HSPでrss利用して地震情報を取得する
1.概要
ネットからの情報取得方法は、色々ありますが、HTMLタグを1つずつ解析して必要な情報を
抜き出す方法や、xmlやjsonなどで提供されていれば、提供ファイルを読み込んで展開する方法があります。
ファイルとして提供されているものは、処理が比較的簡単です。今回は、xmlでrssとして配信されている
gooの地震情報を取得して見ます。
2.利用方法 goorss.exe起動します。使い方は、ただこれだけです。一定時間毎に 受信もできますが、頻繁に地震は発生しないのでタイマー割り込みによる部分は実装していません。 定期的に更新ボタンをクリックして手動で更新して下さい。 2021年3月初旬までは、気象庁のホームページの地震情報をスクレイピングしていましたが、サイトの大幅リニューアルが 行われたため(以前のサイトがなくなった)、取得することができなくなってしまいました。 rssは簡単に取得できて便利なのですが、情報量が少ないためタイトルから該当情報へリンクして確認する方式となります。
3.ソースコード プログラムは、HSP言語で作成しています。HSP3には、便利なモジュールが標準で提供されていて、rssを扱うモジュール(mod_rss.as)があります。 rssload命令で指定したURLのxmlファイルを受信して、foreachループで 内容を取得していきます。表示部分は、HTMLタグを生成して行っています。震源地を表示するために最初の1件目で震源地を表す画像パスを取得して 画像を表示し、本日分は青色のリンクとし、本日以外はグレー表示としています。
4.ダウンロード 提供するソースコードのライセンスは、CC0 (クレジット表示不要、改変可、商用可) とします。自由に利用して頂いてかまいません。 尚、データの取得やプログラム実行において損害等が生じた場合は、筆者は一切の責任も負いません。全て自己責任でお願いします。
紹介したrss地震情報取得 (goorss.exe)は、下記よりダウンロードして下さい。
ダウンロード
■関連記事
・HSPでgoogleニューストピックスを取得する
2.利用方法 goorss.exe起動します。使い方は、ただこれだけです。一定時間毎に 受信もできますが、頻繁に地震は発生しないのでタイマー割り込みによる部分は実装していません。 定期的に更新ボタンをクリックして手動で更新して下さい。 2021年3月初旬までは、気象庁のホームページの地震情報をスクレイピングしていましたが、サイトの大幅リニューアルが 行われたため(以前のサイトがなくなった)、取得することができなくなってしまいました。 rssは簡単に取得できて便利なのですが、情報量が少ないためタイトルから該当情報へリンクして確認する方式となります。
3.ソースコード プログラムは、HSP言語で作成しています。HSP3には、便利なモジュールが標準で提供されていて、rssを扱うモジュール(mod_rss.as)があります。 rssload命令で指定したURLのxmlファイルを受信して、foreachループで 内容を取得していきます。表示部分は、HTMLタグを生成して行っています。震源地を表示するために最初の1件目で震源地を表す画像パスを取得して 画像を表示し、本日分は青色のリンクとし、本日以外はグレー表示としています。
;**************************************************************************** ;* ;* goo rss地震情報の取得・表示 (goorss.hsp) Ver1.0 ;* ;* <処理の概要> ;* 本プログラムは、goo rss地震配信情報を受信して表示するものである。 ;* ;* 出典: goo天気 RSS配信情報 ;* URL http://weather.goo.ne.jp/earthquake/index.rdf ;* ;* ;**************************************************************************** #include "mod_rss.as" #include "sqlele.hsp" ;***** 実行ファイル自動作成 (追加) **** #packopt type 0 #packopt name "goorss" #packopt runtime "hsprt" #packopt manifest "app.manifest" #packopt icon "SetDisp.Ico" #packopt hide 1 #module #uselib "kernel32.dll" #cfunc CreateMutex "CreateMutexA" int,int,sptr #cfunc GetLastError "GetLastError" ;***** 二重起動防止 ***** #deffunc wexapend str prm1 strname=prm1 ;***** 名前の文字列が省略された場合 ***** if strlen(strname)==0 : strname="HSP340ONIWND" ;Default String ret=CreateMutex(0,1,strname) ;二重起動か? if GetLastError()==0 : return 0 ;同じジョブが起動していない if GetLastError()==183 : return 1 ;既に起動している return -1 #global ;***** 起動ディレクトリ取得 ***** sdim Startdir,512 if hspstat&1=0 { Startdir=dir_exe+"¥¥" : chdir dir_exe } else { Startdir=dir_cur+"¥¥" } chdir Startdir ;***** データベース存在確認 ***** exist Startdir+"setting¥¥goorss.ini" if strsize ==-1 { dialog "データベースファイルが見つかりません。",0 : end } await wexapend "goorss" : if stat : end ;***** データベースオープン ***** sql_open Startdir+"setting¥¥goorss.ini" ;***** 画面表示位置設定 ***** sql_q "SELECT * FROM TValu WHERE ID = "+1 xpos=sql_i("wxpos") : ypos=sql_i("wypos") if (xpos<0 or xpos>ginfo_dispx) : xpos=0 if (ypos<0 or ypos>ginfo_dispy) : ypos=0 *main screen 0,420,460,0,xpos,ypos font "メイリオ",12,0 pos 38,430 : objmode 2 : objsize 60,22 : button "更新",*movpos Today = str(gettime(0))+"年"+str(gettime(1))+"月"+str(gettime(3))+"日" onexit *owari pos 0, 0 : axobj ie, "Shell.Explorer.2", 440, 420 if stat == -1 { dialog "ActiveXコントロールの配置に失敗しました。", 1 end } url="http://weather.goo.ne.jp/earthquake/index.rdf" rssload desc, link, url, 100 if stat == 1 : dialog "取得に失敗しました。" : stop if stat == 2 : dialog "RSSではありません。" : stop title "goo -地震情報" sdim strtemp,128 : sdim code,5000 code = "<html><head><style>*{margin:0;padding:0;}</style>¥n" code+= "<meta http-equiv=¥"Content-Type¥" content=¥"text/html; charset=shift-jis¥">¥n" code+= "<meta http-equiv=¥"Content-Script-Type¥" content=¥"text/javascript¥">¥n" code+= "<meta http-equiv=¥"Content-Style-Type¥" content=¥"text/css¥">¥n" code+= "<style type=¥"text/css¥">¥n" code+= ".pad {¥n" code+= " padding-left: 5px;¥n" code+= "}¥n" code+= ".intoro {¥n" code+= " font-family : Meiryo;¥n" code+= " font-size:8pt;¥n" code+= " cursor:hand;¥n" code+= " a { text-decoration:underline; } code+= " a:link { text-decoration:none; color:#000099; }¥n" code+= " a:visited { text-decoration:none; color:#000099; }¥n" code+= " a:active { text-decoration:none; color:#000099; }¥n" code+= " a:hover { text-decoration:underline; color:#dd0000; }¥n" code+= "}¥n" code+= ".nmmode {¥n" code+= " font-family : Meiryo;¥n" code+= " font-size:8pt;¥n" code+= " cursor:hand;¥n" code+= "}¥n" code+= ".fmerea1 {¥n" code+= " font-family : Meiryo;¥n" code+= " font-size:10pt;¥n" code+= " color:#000099;¥n" code+= " padding-left:10px;¥n" code+= "}¥n" code+= ".fmerea2 {¥n" code+= " font-family : Meiryo;¥n" code+= " font-size:10pt;¥n" code+= " color:#aaaaaa;¥n" code+= " padding-left:10px;¥n" code+= "}¥n" code+= "</style></head><body style=¥"overflow:auto;¥" bgcolor=¥"#ffffff¥">¥n" ;***** 最初の1件目の画像ファイル名を取得する ***** foreach desc if cnt<1 : continue if cnt==1 { s=instr(link(cnt),0,"2") eqimg = "https://weather.goo.ne.jp/images/earthquake/" + strmid(link(cnt),s,14) + ".png" break } loop ;***** 震源地の画像を表示 ***** code+= "<center><a href=¥"" + link(cnt) + "¥" target=¥"_blank¥"><img src=¥"" + eqimg + "¥" width=350 height=200 border=0 align=¥"absmiddle¥"></a></center><br>¥n" p=0 : c=0 foreach desc if cnt<1 : continue p++ sd=instr(desc(cnt),0,"(") ed=instr(desc(cnt),0,"時") cpdate = strmid(desc(cnt),sd+1,(ed-sd-4)) ;***** 記事のタイトル長さ制限 ***** q=strlen(desc(cnt)) s=instr(desc(cnt),0,"-") strtemp=strmid(desc(cnt),9,q-19) ;***** 記事番号 ***** if p<10 { no = "0" + p }else{ no = p } ;***** 本日発生分のみ青色リンクとする ***** if Today==cpdate { c++ code+= "<span class=¥"fmerea1¥">" + no + "." + " </span>" code+= "<a href=¥"" + link(cnt) + "¥" target=¥"_blank¥" class=¥"intoro¥">" + strtemp + "</a><br>¥n" }else{ code+= "<span class=¥"fmerea2¥">" + no + "." + " </span>" code+= "<a href=¥"" + link(cnt) + "¥" target=¥"_blank¥" class=¥"nmmode¥" style=¥"color:#aaaaaa¥">" + strtemp + "</a><br>¥n" } loop code += "</body></html>¥n" ie -> "Navigate" "about:blank" doc = ie("Document") doc -> "write" code color 255,255,255 : boxf 118,430,300,454 font "Meiryo UI",12,1 color 0,124,48 : pos 120,432 : mes "本日の地震発生回数:" + c + "回" gsel 0,1 stop *movpos xpos=ginfo_wx1 : ypos=ginfo_wy1 goto *main *owari await ;***** 終了処理 (DB CLOSE) ***** wx=str(ginfo_wx1) ; 現在の画面左上 X 座標取得 wy=str(ginfo_wy1) ; 現在の画面左上 y 座標取得 ;***** 終了位置をDBへ保存 ***** sql_q "UPDATE TValu SET wxpos=" + prm_text(wx) + ", wypos=" + prm_text(wy)+ " WHERE ID="+1 sql_close end
4.ダウンロード 提供するソースコードのライセンスは、CC0 (クレジット表示不要、改変可、商用可) とします。自由に利用して頂いてかまいません。 尚、データの取得やプログラム実行において損害等が生じた場合は、筆者は一切の責任も負いません。全て自己責任でお願いします。
紹介したrss地震情報取得 (goorss.exe)は、下記よりダウンロードして下さい。
ダウンロード
■関連記事
・HSPでgoogleニューストピックスを取得する
コメント
コメントを投稿