-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtsunami.py
127 lines (106 loc) · 5.05 KB
/
tsunami.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import requests
import time
# 表示済みのIDを追跡するセット
seen_ids = set()
def speak_bouyomi(text='ゆっくりしていってね', voice=0, volume=-1, speed=-1, tone=-1):
try:
res = requests.get(
'http://localhost:50080/Talk',
params={
'text': text,
'voice': voice,
'volume': volume,
'speed': speed,
'tone': tone
}
)
return res.status_code
except Exception as e:
print(f"棒読みちゃんへの送信中にエラーが発生しました: {e}")
return None
def fetch_tsunami_data():
url = "https://api-v2-sandbox.p2pquake.net/v2/history"
params = {
"codes": "552",
"limit": 1
}
try:
response = requests.get(url, params=params)
response.raise_for_status()
data = response.json()
if not data: # データが空配列の場合
return # 読み上げずに終了
for item in data:
# IDを取得
item_id = item.get("id")
# すでに表示済みのIDはスキップ
if item_id in seen_ids:
continue
# 初めてのIDとしてセットに追加
seen_ids.add(item_id)
if item.get("cancelled", False):
message = "津波予報が解除されました。"
print(message)
speak_bouyomi(message)
print("\n\n") # idごとに2行の改行を追加
continue # 解除された場合はスキップ
warning_levels = ["大津波警報", "津波警報", "津波注意報"]
warnings = {level: [] for level in warning_levels}
for area in item.get("areas", []):
grade = area['grade']
arrival_time_raw = area['firstHeight'].get('arrivalTime', '不明')
arrival_time = arrival_time_raw
if arrival_time != "不明" and len(arrival_time_raw.split("/")) == 3:
try:
date_part, time_part = arrival_time_raw.split(" ")
day = int(date_part.split("/")[-1]) # 日のみ抽出
hour, minute = time_part.split(":")[:2] # 時と分を抽出
arrival_time = f"{day}日{hour}時{minute}分"
except ValueError:
arrival_time = "不明"
condition = area['firstHeight'].get('condition')
# 特殊な条件による追加メッセージ
additional_message = ""
if condition == "ただちに津波来襲と予測":
additional_message = "ただちに津波来襲と予測されます"
elif condition == "津波到達中と推測":
additional_message = "津波到達中と推測されます"
elif condition == "第1波の到達を確認":
additional_message = "第1波の到達を確認しました"
# 到達予測のメッセージフォーマット
if not additional_message and arrival_time != "不明":
additional_message = f"早いところで、{arrival_time}ごろ到達とみられます"
area_info = {
"地域": area['name'],
"予想の高さ": area.get('maxHeight', {}).get('description', '不明'),
"到達予測": additional_message
}
if grade == "MajorWarning":
warnings["大津波警報"].append(area_info)
elif grade == "Warning":
warnings["津波警報"].append(area_info)
elif grade == "Watch":
warnings["津波注意報"].append(area_info)
for grade_name in warning_levels:
if warnings[grade_name]:
message_lines = [
f"{grade_name} が発表されました。",
f"{grade_name} が発表されている地域をお伝えします。"
]
for info in warnings[grade_name]:
region_message = (
f"{info['地域']}、予想の高さ {info['予想の高さ']}、{info['到達予測']}"
)
message_lines.append(region_message)
full_message = "\n".join(message_lines)
print(full_message)
speak_bouyomi(full_message)
print("\n\n") # idごとに2行の改行を追加
except requests.RequestException as e:
error_message = f"エラーが発生しました: {e}"
print(error_message)
speak_bouyomi(error_message)
if __name__ == "__main__":
while True:
fetch_tsunami_data()
time.sleep(2)