teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

AWSでの実行結果を追記

2021/05/31 18:15

投稿

hope_mucci
hope_mucci

スコア4447

answer CHANGED
@@ -1,3 +1,90 @@
1
+ ## 追記
2
+ 実際にlambdaで同スクリプトを実行してみました。確かに同じ現象が起こります。
3
+ しかもリージョンが北米でも大阪でも結果が同様でした。
4
+
5
+ おそらくはjavascript上で返すDateがタイムゾーンなしのUTCで、ページ上での時刻処理に何らかの影響を及ぼしていると思います。(天気図HPのスクリプトはminifyされていて解析が困難です)
6
+ 起点の時間が33時間前になっていると思われます(1日と9時間)
7
+
8
+ さらに不可解な挙動が、AWS上で「ひとつ前の時間を表示」ボタンをクリックするとひとつ前の天気図ではなく最も未来の予想天気図が表示されることです。
9
+ この状態で、さらに「ひとつ前の時間を表示」ボタンをクリックすると最新の実況天気図になります。
10
+
11
+ 全く理屈が不明ですが、とりあえず「ひとつ前の時間を表示」を2回クリックすることで目的の天気図になります。
12
+
13
+ 検証コード:
14
+ ```python
15
+ #ブラウザの定義
16
+ driver = webdriver.Chrome(
17
+ "/opt/headless/python/bin/chromedriver",
18
+ options=options
19
+ )
20
+
21
+ driver.get(URL)
22
+ # scriptで画像表示処理をしているらしい。ちょっと待つ
23
+ time.sleep(3)
24
+ title = driver.title
25
+ viewdate = driver.find_element_by_css_selector('div.weather-map-time-label').text
26
+ print("title", title)
27
+ print("viewdate", viewdate)
28
+ img = driver.find_element_by_css_selector('.weather-map-viewarea img').get_attribute('src')
29
+ print("img", img);
30
+
31
+ # 1つ前の画像を押してみる
32
+ print("ひとつ前の時間を表示")
33
+ driver.find_element_by_css_selector('img[title="ひとつ前の時間を表示"]').click()
34
+ time.sleep(1)
35
+ viewdate = driver.find_element_by_css_selector('div.weather-map-time-label').text
36
+ print("viewdate", viewdate)
37
+ img = driver.find_element_by_css_selector('.weather-map-viewarea img').get_attribute('src')
38
+ print("img", img);
39
+
40
+ # 1つ前の画像を押してみる
41
+ print("ひとつ前の時間を表示")
42
+ driver.find_element_by_css_selector('img[title="ひとつ前の時間を表示"]').click()
43
+ time.sleep(1)
44
+ viewdate = driver.find_element_by_css_selector('div.weather-map-time-label').text
45
+ print("viewdate", viewdate)
46
+ img = driver.find_element_by_css_selector('.weather-map-viewarea img').get_attribute('src')
47
+ print("img", img);
48
+
49
+ imgname = "/tmp/screenshot.png"
50
+ sfile = driver.get_screenshot_as_file(imgname)
51
+ print("スクリーンショット保存: --> " + imgname)
52
+ print("成功したか?", sfile)
53
+
54
+
55
+ # 最新表示ボタンを押す
56
+ driver.find_element_by_css_selector('.contents-button').click()
57
+ time.sleep(1)
58
+ viewdate = driver.find_element_by_css_selector('div.weather-map-time-label').text
59
+ print("viewdate", viewdate)
60
+ img = driver.find_element_by_css_selector('.weather-map-viewarea img').get_attribute('src')
61
+ print("img", img);
62
+ driver.close()
63
+ ```
64
+
65
+ 実行ログ:
66
+ ```text
67
+ /var/task
68
+ title 気象庁|天気図
69
+ viewdate 2021年05月30日12時の実況
70
+ 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
71
+ ひとつ前の時間を表示
72
+ viewdate 2021年06月02日09時の予想
73
+ 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
74
+ ひとつ前の時間を表示
75
+ viewdate 2021年05月31日21時の実況
76
+ 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
77
+ スクリーンショット保存: --> /tmp/screenshot.png
78
+ 成功したか? True
79
+ viewdate 2021年05月30日12時の実況
80
+ 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
81
+ ```
82
+ なお、天気図の画像は[気象庁が公開?しているAPI](https://www.jma.go.jp/bosai/weather_map/data/list.json)でJSON形式で画像ファイル名が取得できます。このリストは画像ファイル名だけですが画像ファイルまでのパスを適切に組み合わせることにより天気図を直に取得することができます。
83
+ なので、スクリーンショットをとる必要はないのではとも思います。
84
+ (画像は直リンクできるし、JSONを返すAPIはクロスドメイン制約を無効にしているので自由につかっていいのではなかろうか、どうだろうか)
85
+
86
+ ## 以前の回答
87
+
1
88
  本当に提示のスクリプトをAWS上で実行しているのであれば、`lambda_handler`関数は実行されていないので実行時にスクリーンショットも取得されていません。
2
89
  (関数実行する文がコメントアウトされている)
3
90
  1日前にテストしたスクリーンショットを見ているだけなのでは?