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件目で震源地を表す画像パスを取得して 画像を表示し、本日分は青色のリンクとし、本日以外はグレー表示としています。
	;****************************************************************************
	;*
	;*    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ニューストピックスを取得する

コメント

このブログの人気の投稿

Excelアドインで日本語形態素解析

階層構造JSONファイルの作成

HSPでコマンドプロンプトを制御する

TOP