回答編集履歴

1

AWSでの実行結果を追記

2021/05/31 18:15

投稿

hope_mucci
hope_mucci

スコア4447

test CHANGED
@@ -1,3 +1,177 @@
1
+ ## 追記
2
+
3
+ 実際にlambdaで同スクリプトを実行してみました。確かに同じ現象が起こります。
4
+
5
+ しかもリージョンが北米でも大阪でも結果が同様でした。
6
+
7
+
8
+
9
+ おそらくはjavascript上で返すDateがタイムゾーンなしのUTCで、ページ上での時刻処理に何らかの影響を及ぼしていると思います。(天気図HPのスクリプトはminifyされていて解析が困難です)
10
+
11
+ 起点の時間が33時間前になっていると思われます(1日と9時間)
12
+
13
+
14
+
15
+ さらに不可解な挙動が、AWS上で「ひとつ前の時間を表示」ボタンをクリックするとひとつ前の天気図ではなく最も未来の予想天気図が表示されることです。
16
+
17
+ この状態で、さらに「ひとつ前の時間を表示」ボタンをクリックすると最新の実況天気図になります。
18
+
19
+
20
+
21
+ 全く理屈が不明ですが、とりあえず「ひとつ前の時間を表示」を2回クリックすることで目的の天気図になります。
22
+
23
+
24
+
25
+ 検証コード:
26
+
27
+ ```python
28
+
29
+ #ブラウザの定義
30
+
31
+ driver = webdriver.Chrome(
32
+
33
+ "/opt/headless/python/bin/chromedriver",
34
+
35
+ options=options
36
+
37
+ )
38
+
39
+
40
+
41
+ driver.get(URL)
42
+
43
+ # scriptで画像表示処理をしているらしい。ちょっと待つ
44
+
45
+ time.sleep(3)
46
+
47
+ title = driver.title
48
+
49
+ viewdate = driver.find_element_by_css_selector('div.weather-map-time-label').text
50
+
51
+ print("title", title)
52
+
53
+ print("viewdate", viewdate)
54
+
55
+ img = driver.find_element_by_css_selector('.weather-map-viewarea img').get_attribute('src')
56
+
57
+ print("img", img);
58
+
59
+
60
+
61
+ # 1つ前の画像を押してみる
62
+
63
+ print("ひとつ前の時間を表示")
64
+
65
+ driver.find_element_by_css_selector('img[title="ひとつ前の時間を表示"]').click()
66
+
67
+ time.sleep(1)
68
+
69
+ viewdate = driver.find_element_by_css_selector('div.weather-map-time-label').text
70
+
71
+ print("viewdate", viewdate)
72
+
73
+ img = driver.find_element_by_css_selector('.weather-map-viewarea img').get_attribute('src')
74
+
75
+ print("img", img);
76
+
77
+
78
+
79
+ # 1つ前の画像を押してみる
80
+
81
+ print("ひとつ前の時間を表示")
82
+
83
+ driver.find_element_by_css_selector('img[title="ひとつ前の時間を表示"]').click()
84
+
85
+ time.sleep(1)
86
+
87
+ viewdate = driver.find_element_by_css_selector('div.weather-map-time-label').text
88
+
89
+ print("viewdate", viewdate)
90
+
91
+ img = driver.find_element_by_css_selector('.weather-map-viewarea img').get_attribute('src')
92
+
93
+ print("img", img);
94
+
95
+
96
+
97
+ imgname = "/tmp/screenshot.png"
98
+
99
+ sfile = driver.get_screenshot_as_file(imgname)
100
+
101
+ print("スクリーンショット保存: --> " + imgname)
102
+
103
+ print("成功したか?", sfile)
104
+
105
+
106
+
107
+
108
+
109
+ # 最新表示ボタンを押す
110
+
111
+ driver.find_element_by_css_selector('.contents-button').click()
112
+
113
+ time.sleep(1)
114
+
115
+ viewdate = driver.find_element_by_css_selector('div.weather-map-time-label').text
116
+
117
+ print("viewdate", viewdate)
118
+
119
+ img = driver.find_element_by_css_selector('.weather-map-viewarea img').get_attribute('src')
120
+
121
+ print("img", img);
122
+
123
+ driver.close()
124
+
125
+ ```
126
+
127
+
128
+
129
+ 実行ログ:
130
+
131
+ ```text
132
+
133
+ /var/task
134
+
135
+ title 気象庁|天気図
136
+
137
+ viewdate 2021年05月30日12時の実況
138
+
139
+ img http://www.jma.go.jp/bosai/weather_map/data/png/20210530050231_0_Z__C_010000_20210530030000_MET_CHT_JCIspas_JCP600x581_JRcolor_Tjmahp_image.png
140
+
141
+ ひとつ前の時間を表示
142
+
143
+ viewdate 2021年06月02日09時の予想
144
+
145
+ img http://www.jma.go.jp/bosai/weather_map/data/png/20210531065231_0_Z__C_010000_20210531000000_MET_CHT_JCIfsas48_Rjp_JCP600x581_JRcolor_Tjmahp_image.png
146
+
147
+ ひとつ前の時間を表示
148
+
149
+ viewdate 2021年05月31日21時の実況
150
+
151
+ img http://www.jma.go.jp/bosai/weather_map/data/png/20210531140801_0_Z__C_010000_20210531120000_MET_CHT_JCIspas_JCP600x581_JRcolor_Tjmahp_image.png
152
+
153
+ スクリーンショット保存: --> /tmp/screenshot.png
154
+
155
+ 成功したか? True
156
+
157
+ viewdate 2021年05月30日12時の実況
158
+
159
+ img http://www.jma.go.jp/bosai/weather_map/data/png/20210530050231_0_Z__C_010000_20210530030000_MET_CHT_JCIspas_JCP600x581_JRcolor_Tjmahp_image.png
160
+
161
+ ```
162
+
163
+ なお、天気図の画像は[気象庁が公開?しているAPI](https://www.jma.go.jp/bosai/weather_map/data/list.json)でJSON形式で画像ファイル名が取得できます。このリストは画像ファイル名だけですが画像ファイルまでのパスを適切に組み合わせることにより天気図を直に取得することができます。
164
+
165
+ なので、スクリーンショットをとる必要はないのではとも思います。
166
+
167
+ (画像は直リンクできるし、JSONを返すAPIはクロスドメイン制約を無効にしているので自由につかっていいのではなかろうか、どうだろうか)
168
+
169
+
170
+
171
+ ## 以前の回答
172
+
173
+
174
+
1
175
  本当に提示のスクリプトをAWS上で実行しているのであれば、`lambda_handler`関数は実行されていないので実行時にスクリーンショットも取得されていません。
2
176
 
3
177
  (関数実行する文がコメントアウトされている)