HSPでgoogleニューストピックスを取得する
1.概要
日常、テレビのワイドショーや報道番組でも色んなニュースを観ますが、ネットをやっていると
テレビもあまり観なくなり、世界の様子や世間の話題などに疎くなってしまいます。PCで作業をしていると、時間を忘れて
今、どんなことが起こっているのかさえも分からなくなってきています。今回は、ニュースに関心を持ってもらうために
rss配信情報を受信してgoogleのニューストピックスを表示するものを作成して見ました。
rssは、OutLookに設定しておけば、常に最新の情報を取得してきますが、すぐに、いっぱい溜まってしまい
見るのがだんだんうっとおしくなってしまいます。そこで、最新の10件のみを取得して表示するようにしました。
2.利用方法 gnews.exe 起動します。起動と同時にニューストピックスの先頭から10件のタイトル情報を取得して表示します。 更新頻度が頻繁ではないので、最新情報を取得する場合は、手動で更新アイコンボタンをクリックして 取得するようにして下さい。
3.ソースコード ソースコードは下記の通りです。別記事で紹介している「HSPでrss利用して地震情報を取得する」と、ほぼ同じです。 違いは、画面をscreen命令ではなく、bgscr命令として作成してある点です。そのため、マウスドラッグで画面を 移動できる処理を加えてあります。プログラムは、HSP言語で作成しています。HSP3には、便利なモジュールが標準で提供されていて、rssを扱うモジュール(mod_rss.as)があります。 そのため、情報を取得する部分の処理が簡単に実装できます。
4.ダウンロード 提供するソースコードのライセンスは、CC0 (クレジット表示不要、改変可、商用可) とします。自由に利用して頂いてかまいません。 尚、データの取得やプログラム実行において損害等が生じた場合は、筆者は一切の責任も負いません。全て自己責任でお願いします。
紹介したrss地震情報取得 (goorss.exe)は、下記よりダウンロードして下さい。
ダウンロード
■関連記事
・HSPでrss利用して地震情報を取得する
2.利用方法 gnews.exe 起動します。起動と同時にニューストピックスの先頭から10件のタイトル情報を取得して表示します。 更新頻度が頻繁ではないので、最新情報を取得する場合は、手動で更新アイコンボタンをクリックして 取得するようにして下さい。
3.ソースコード ソースコードは下記の通りです。別記事で紹介している「HSPでrss利用して地震情報を取得する」と、ほぼ同じです。 違いは、画面をscreen命令ではなく、bgscr命令として作成してある点です。そのため、マウスドラッグで画面を 移動できる処理を加えてあります。プログラムは、HSP言語で作成しています。HSP3には、便利なモジュールが標準で提供されていて、rssを扱うモジュール(mod_rss.as)があります。 そのため、情報を取得する部分の処理が簡単に実装できます。
;****************************************************************************
;*
;* google ニュースの取得・表示 (gnews.hsp)
;*
;* <処理の概要>
;* 本プログラムは、googleのニュースRSS配信情報を受信して
;* 最新トップニュースを表示するものである。
;*
;* 出典: googleニュース RSS配信情報
;* URL https://news.google.com/news/rss/headlines/section/
;* topic/WORLD.ja_jp/%E5%9B%BD%E9%9A%9B?ned=jp&hl=ja&gl=JP
;*
;*
;****************************************************************************
#include "mod_rss.as"
#include "sqlele.hsp"
;***** 実行ファイル自動作成 (追加) ****
#packopt type 0
#packopt name "gnews"
#packopt runtime "hsprt"
#packopt manifest "app.manifest"
#packopt icon "script.ico"
#packopt hide 1
#pack "about.png"
#pack "update3.png"
#pack "batsu2.png"
#uselib "user32.dll"
#func GetWindowRect "GetWindowRect" int,int
#func GetSystemMetrics "GetSystemMetrics" int
#func MoveWindow "MoveWindow" int,int,int,int,int,int
#func global SetWindowLong "SetWindowLongA" int , int , int
#cfunc global GetWindowLong "GetWindowLongA" int , int
#define global GWL_STYLE 0xFFFFFFF0
#define global WS_SYSMENU 0x00080000
#define global WS_MAXIMIZEBOX 0x00010000
#define global WS_MINIMIZEBOX 0x00020000
#define SM_CXSCREEN $00000000
#define SM_CYSCREEN $00000001
#define obj_wmnclbtndown sendmsg hwnd,$00A1,2,0
;***** カーソルの形状を変更 *****
#module
#uselib "user32.dll"
#func LoadCursorFromFile "LoadCursorFromFileA" var
#func LoadCursor "LoadCursorA" int,int
#func SetClassLong "SetClassLongA" int,int,int
#func SetCursor "SetCursor" int
#define IDC_ARROW $00007F00
#deffunc chengecur int prm1,str prm2,int prm3
UserMode = prm1 : if UserMode<0 : return -1
sdim Curfname,260
Curfname = prm2 ;カーソルファイル名
resourceID = prm3 ;リソースID (0~
;UserMode=$200 でカーソルファイル名が設定されていた場合は、
;ユーザーカーソルを設定
if (UserMode==$200)&(strlen(Curfname)!0) {
LoadCursorFromFile varptr(Curfname)
hcurwnd=stat
SetClassLong hwnd,-12,hcurwnd
SetCursor hcurwnd
sdim Curfname,0
return 0
}
;リソースIDに対応するカーソルを設定 (object Mode) (ID=0~28)
hinst=0 : lpszCursor=IDC_ARROW
if resourceID>=5 : resourceID+=123
LoadCursor hinst,resourceID+lpszCursor
hcurwnd=stat
;if UserMode==$100 {
; hCld=hwnd
; }else{
hCld=objinfo(UserMode,2)
;}
SetClassLong hCld,-12,hcurwnd
SetCursor hcurwnd
sdim Curfname,0
return 0
#global
#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¥¥gnews.ini"
if strsize ==-1 {
dialog "データベースファイルが見つかりません。",0 : end
}
await
wexapend "gnews" : if stat : end
;***** データベースオープン *****
sql_open Startdir+"setting¥¥gnews.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
buffer 2,20,20,0 : picload "update3.png",0
buffer 3,11,11,0 : picload "batsu2.png",0
*main
bgscr 0,300,320,0,xpos,ypos
SetWindowLong hwnd,GWL_STYLE,$B0000|GetWindowLong(hwnd,GWL_STYLE)
color 64,64,64 : boxf 0,0,300,30
font "Meiryo UI",12,1
color 255,255,255 : pos 20,8 : mes "世界 - 最新 - Google ニュース"
color 64,64,64 : boxf 0,270,300,320
pos 280,10 : objsize 11,11 : objimage 3,0,0,0,11 : button "",*owari
pos 20,285 : picload "about.png",1
pos 120,285 : objsize 30,30 : objimage 2,0,0,30,30 : button "",*movpos
chengecur 0,"",14
onexit *owari
onclick gosub *move
color 255,220,100 : boxf 0,30,300,270
font "Meiryo UI",24,1
color 200,0,0 : pos 75,100 : mes "データ取得中!"
pos 0, 30 : axobj ie, "Shell.Explorer.2", 300, 240
if stat == -1 {
dialog "ActiveXコントロールの配置に失敗しました。", 1
end
}
url="https://news.google.com/news/rss/headlines/section/topic/WORLD.ja_jp/%E5%9B%BD%E9%9A%9B?ned=jp&hl=ja&gl=JP"
rssload desc, link, url, 11
title "google - ニュース"
sdim strtemp,128 : sdim code,5000
code = "<html><head>¥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+= ".fmerea {¥n"
code+= " font-family : Meiryo;¥n"
code+= " font-size:10pt;¥n"
code+= " color:#000099;¥n"
code+= "}¥n"
code+= "</style></head><body style=¥"overflow:auto;¥" bgcolor=¥"#ffdc64¥">¥n"
if stat == 1 {
dialog "取得に失敗しました。"
code += "</body></html>¥n"
stop
}
if stat == 2 {
dialog "RSSではありません。"
code += "</body></html>¥n"
stop
}
p=0
foreach desc
if cnt<1 : continue
p++
;***** 記事のタイトル長さ制限 *****
q=strlen(desc(cnt))
if q>40 {
strtemp=strmid(desc(cnt),0,38)+"....."
}else{
strtemp=desc(cnt)
}
;***** 記事番号 *****
if p<10 {
no = "0" + p
}else{
no = p
}
code+= "<span class=\"fmerea\">" + no + "." + " </span>"
code+= "<a href=\"" + link(cnt) + "\" target=\"_blank\" class=\"intoro\">" + strtemp + "</a><br>\n"
loop
code += "</body></html>¥n"
ie -> "Navigate" "about:blank"
doc = ie("Document")
doc -> "write" code
gsel 0,1
;***** 10分毎に更新 *****
;wait 1000*60 : goto *main
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
*move
;***** マウスの左クリックボタンで移動 *****
if wparam == 1 {
obj_wmnclbtndown
;***** 画面終端位置の取得と制御 *****
dim rc,4
GetWindowRect hwnd,varptr(rc)
w = rc(2)-rc(0)
h = rc(3)-rc(1)
GetSystemMetrics SM_CXSCREEN : CSX=stat
GetSystemMetrics SM_CYSCREEN : CSY=stat
if rc(0)<0 : rc(0)=0
if rc(1)<0 : rc(1)=0
if rc(2)>CSX : rc(0)=CSX-w
if rc(3)>CSY : rc(1)=CSY-h-30
MoveWindow hwnd,rc(0),rc(1),w,h,1
}
return
4.ダウンロード 提供するソースコードのライセンスは、CC0 (クレジット表示不要、改変可、商用可) とします。自由に利用して頂いてかまいません。 尚、データの取得やプログラム実行において損害等が生じた場合は、筆者は一切の責任も負いません。全て自己責任でお願いします。
紹介したrss地震情報取得 (goorss.exe)は、下記よりダウンロードして下さい。
ダウンロード
■関連記事
・HSPでrss利用して地震情報を取得する


コメント
コメントを投稿