SE(しがないエンジニア)のブログ

IT技術ネタ(Azure他MS製品・セキュリティ周り)が中心です!他雑記(お馬さん 他いろいろ)もあり。

Pleasanter の一覧表示のレコードに対して更新を自動化する

ベースは以前作成したスクリプトより

かなり前ですが Python + Selenium + Chrome を利用したスクリプト(G Suite のメールログ収集スクリプト)を Github に公開しており、今回は Pleasanter 用に改変しました。単一スクリプトで環境さえあればすぐに実行可能ということもあり、今回は当ブログ上にそのまま記載してしまいます。

どんな時に利用するのか?

Pleasanter のスクリプト更新タイミングにもよるのですが、編集画面から「更新」を押下した際にデータ更新を実施する場合を想定しております。自環境で編集が必要そうなところは括弧書きしておりますので適宜変更願います。

# Python + Selenium + Chrome
#
# Pleasanter の 一覧画面から編集に入ってデータ更新を実施

# 必要なライブラリのインポートを行う
import sys
import time
import calendar
from datetime import datetime, date, timedelta
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

# コマンドラインからの引数を拾う
# args[1] none or retry
# args[2] number (minute)
args = sys.argv

# 初期値作成
login_id = "(Pleasanter Username)"
password = "(Pleasanter Password)"

# Chrome 用の WebDriver インスタンスを作成し認証画面を開く
# - 適宜パス名は変更願います
driver = webdriver.Chrome("c:/driver/chromedriver.exe")
# Pleasanter Access URL
driver.get('(Pleasanter Login URL)')


# 認証部分
time.sleep(1)
driver.find_element_by_xpath("//*[@id='Users_LoginId']").send_keys(login_id)
time.sleep(1)
driver.find_element_by_xpath("//*[@id='Users_Password']").send_keys(password)
time.sleep(1)
driver.find_element_by_xpath("//*[@id='Login']").click()

# 更新したい一覧ページへのアクセス
time.sleep(3)
driver.get('(Pleasanter Target List URL)')

# 各行のリンクを発見して配列に入れる、またリトライ用に更新時間も入れる。
urlArray = []
urlTimeArray = []

# 現在時刻取得
# - unixtime_now 現在時刻の UNIX TIMESTAMP
# - unixtime_past n分前以前のものを更新する際に利用(リトライ時に使用)
now = datetime.now()
unixtime_now = int(now.timestamp())
unixtime_past = unixtime_now - (int(args[2]) * 60)

# テーブルの要素から更新に必要なデータを収集する
# - 取得位置(3 や 11 に関しては一覧の並び順にもよる為、定義変更願います。)
tableElem = driver.find_element_by_class_name("grid")
trs = tableElem.find_elements(By.TAG_NAME, "tr")
for i in range(1, len(trs)):
	tds = trs[i].find_elements(By.TAG_NAME, "td")
	urlArray.append(tds[3].find_element_by_tag_name("a").get_attribute("href"))
	tm = tds[11].text
	datetime_tm = datetime(int(tm[0:4]),int(tm[5:7]),int(tm[8:10]),int(tm[13:15]),int(tm[16:18]),int(00),0000)
	unixtime_tm = calendar.timegm(datetime_tm.timetuple())
	urlTimeArray.append(unixtime_tm - 32400)

# urlArray の配列をベースに1行1行更新する
i = 0
if args[1] == 'none':
    # none mode
	for url in urlArray:
		time.sleep(1)
		driver.get(url)
		time.sleep(1)
		formElem = driver.find_element_by_id("MainCommands")
		buttons = formElem.find_elements_by_tag_name("button")
		buttons[1].click()
		time.sleep(3)
		driver.get('(Pleasanter Target List URL)')
else:
	for url in urlArray:
        #retry mode
		if urlTimeArray[i] < unixtime_past:
			time.sleep(1)
			driver.get(url)
			time.sleep(1)
			formElem = driver.find_element_by_id("MainCommands")
			buttons = formElem.find_elements_by_tag_name("button")
			buttons[1].click()
			time.sleep(3)
			driver.get('(Pleasanter Target List URL)')
			i = i + 1
		else:
			i = i + 1

# 終了(終了時に5秒 Wait)
time.sleep(5)
driver.close()

その後はどうすれば良いのか?

スクリプトに任意のファイル名で「.py」拡張子をつけて頂いて実行すればOKです。Windows のタスクマネージャーで組み込む場合は排他にかからないことが前提なので夜中他、ユーザーが居ない時間帯での更新をオススメします。