#やりたいこと
画像ファイルをスライドショー表示しているサイネージに、ログインが必要な外部サービスの画面を一緒に表示したい。ちょっと分かりにくいですが、整理すると以下のような感じです。
- 既存サイネージは画像ファイルをスライドショーで表示する仕組み
- サイネージに表示したい画面がある外部サービスはログインが必要
- 外部サービス上ではデータをリアルタイムで可視化しているので画面は逐次更新されている
- このログインが必要な逐次更新される画面をサイネージに表示したい
#使用するもの
- Selenium
- Python
- Chrome
- タスクスケジューラ(Windows10)
#全体の流れ
- Seleniumを使って、Chromeを起動
- 外部サービスにアクセスして自動ログイン(Seleniumで)
- 表示したい画面に移動して画像キャプチャ(Seleniumで)
- サイネージ公開用のフォルダに画像を保存(Seleniumで)
- 上記の流れを、タスクスケジューラを使用して定期的に実行
*SeleniumやPythonなどの環境構築は別途調べてもらえると良いと思います
#ソースコード
ファイル名、保存先、ログイン情報などは、適当に読み替えてもらえると助かります。
import os
import sys
import time
import datetime
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import chromedriver_binary
# File Name
now = datetime.datetime.now()
filename = "image/screen_" + now.strftime('%Y%m%d_%H%M%S') + ".png"
FILENAME = os.path.join(os.path.dirname(os.path.abspath(__file__)), filename)
# set driver and url
options = Options()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
url = 'https://xxxx/xxxx/'
driver.get(url)
# ID/PASSを入力(ここはサイトごとに要調整)
id = driver.find_element_by_name("xxxx-xxxx")
id.send_keys("xxxx")
password = driver.find_element_by_name("xxxx-xxxx")
password.send_keys("xxxx")
time.sleep(1)
# ログインボタンをクリック(ここはサイトごとに要調整)
login_button = driver.find_element_by_name("xxxx")
login_button.click()
# get width and height of the page
w = driver.execute_script("return document.body.scrollWidth;")
h = driver.execute_script("return document.body.scrollHeight;")
# set window size
driver.set_window_size(1920,1080)
time.sleep(1)
# Get Screen Shot
print ("Get Screen Shot")
driver.save_screenshot(FILENAME)
# Close Web Browser
driver.quit()
#まとめ
とりあえず、やりたいことは上記の流れで出来た。あとは、現在はローカル環境でやってるので、これをサーバー環境に移行したい。だいたいの流れは理解出来てきたので、あとは調べてやればなんとかなる感じ。
#ちょっとだけ注意点
自分の環境では、サイネージ公開用フォルダをネットワークドライブに割り当ててたのですが、タスクスケジューラでpythonを直接自動起動した場合はネットワークドライブへのアクセスが上手くいかなかったので、別途、バッチファイルを作成して、バッチ上でネットワークドライブを割り当ててから、pythonを起動するようにしたら上手くいきました。なので、現状はバッチファイルを定期実行するような仕組みになってます。