Python
Selenium
shell
自動化

色々面倒くさいから全部自動化や。

とりあえずSelenium

導入

https://www.seleniumhq.org/

ここで導入
今回はPythonを使うことにする

どこで使う?

  • 勤怠

コーディング

事前にChromeドライバなどは用意しておく

python
from selenium import webdriver
import os
from os.path import abspath,dirname
from random import randrange

if os.name == 'posix':
    path = abspath(dirname(__file__)+'./mac/chromedriver')
else:
    path = abspath(dirname(__file__)+'\win\chromedriver.exe')

browser = webdriver.Chrome(executable_path=path)
browser.get('出勤する画面のURL')
browser.implicitly_wait(3)
el = browser.find_element_by_id('ID')
el.send_keys('ここにID')
el = browser.find_element_by_id('PW')
el.send_keys('ここにPW')
el = browser.find_element_by_id('ログインボタン')
el.click()
el = browser.find_element_by_id('出勤ボタン')
el.click()
browser.close()

少し解説

if os.name == 'posix':

mac は 'posix' になるため、OSの判断に利用している

abspath(dirname(__file__)+'./mac/chromedriver')

まどろっこしいが、絶対パスに変換する為に行う

browser.get('出勤する画面のURL')

URL入力すると遷移するよ

el = browser.find_element_by_id('ID')

Element の id を取得できるよ

el.send_keys('ここにID')

キーボード入力できるよ

el.click()

クリックできるよ

browser.close()

ブラウザを閉じるよ

定期的に実行したい

http://minto.tech/windows-taskscheduler/2/

Windowsのタスクスケジューラを利用して指定した時間(毎日平日9:00など)に実行できる

余談

タスクスケジューラに指定した時間をランダムで実行するモード的なのもがあるからそれで勤怠を切ると時間がバラバラになる。

パソコンの消費電力の事を考える

タスクスケジューラに スリープモードを解除して実行する という項目があるので、
それにチェックを入れましょう。

___電源ボタンを押すとスリープにする設定にしておくと、勤怠切れたあとにボタンを押すことでスリープにできるよ

(ここも自動化してもいいけど、勤怠が実行されたかどうかの判別として残している)

日報作成

コーディング

予めテンプレートを用意しておく

template.md
# TODO

# 内容

# 参考URLリスト

# 日報内容

# コメント

Makefileで作るよ

Makefile
init:
    -date "+%Y%m" | xargs -t -I\{\} mkdir -p Report/\{\}
     $(eval FOLDER := `date "+%Y%m"`)
    -date "+%Y%m%d" | xargs -t -I\{\} cp -n template.md Report/${FOLDER}/\{\}.md

解説

date "+%Y%m" | xargs -t -I\{\} mkdir -p Report/\{\}

月ごとに保存 Report/201809/20180901.md のようにするため
mkdir -p は存在しなければ作成し、存在していてもエラーを出さないオプション

-

Makefile特有の エラーが発生しても続行する という機能

$(eval FOLDER :=date "+%Y%m")

フォルダ名を変数に格納

-date "+%Y%m%d" | xargs -t -I\{\} cp -n template.md Report/${FOLDER}/\{\}.md

本日の日報を作成する

日報を半自動入力

Seleniumでもいいが、どのみち時間などの入力をしないといけないので Javascript でなんとかする

こうしたい

javascript
$('#daily_reportゴニョゴニョ').text("\n\n");
$('#daily_reportゴニョゴニョ').text("\n");
$('#daily_reportゴニョゴニョ').text("\n");
$('#daily_reportゴニョゴニョ').text("");
$('#daily_reportゴニョゴニョ').text("");
$('#daily_reportゴニョゴニョ').val(1);
$('#daily_reportゴニョゴニョ').val("0.0");
$('#daily_reportゴニョゴニョ').val("0.0");
$('#daily_reportゴニョゴニョ').val(286);

ひたすらjQueryで打ち込む

jQuery非対応の場合は以下を追記

javascript
var script = document.createElement("script");
script.setAttribute("src", "https://code.jquery.com/jquery-3.3.1.js");
script.addEventListener("load", function() {
var script = document.createElement("script");
document.body.appendChild(script);
}, false);
document.body.appendChild(script);

こんなのも自動生成

とりあえず Python 使う

python
import sys
import datetime
import pyperclip

fileName = ""
args = sys.argv

try:
    args[1]
    fileName = args[1] + ".md"
except:
    fileName = datetime.date.today().strftime("%Y%m%d.md")

dailyreport = ["","","","特になし",""]
idx = 999

for line in open("Report/"+fileName[:6]+"/"+fileName, 'r'):
    if line.find("#") != -1:
        if line.find("TODO") != -1:
            idx = 0
        elif line.find("内容") != -1:
            idx = 1
        elif line.find("日報内容") != -1:
            idx = 2
        elif line.find("コメント") != -1:
            idx = 4
        else:
            idx = 999
    else:
        if idx is not 999:
            dailyreport[idx] = dailyreport[idx] + line.replace("\n", "\\n")
out =   'var script = document.createElement("script");\n'\
        'script.setAttribute("src", "https://code.jquery.com/jquery-3.3.1.js");\n'\
        'script.addEventListener("load", function() {\n'\
        'var script = document.createElement("script");\n'\
        'document.body.appendChild(script);\n'\
        '}, false);\n'\
        'document.body.appendChild(script);\r\n'

out +=   "$('#daily_reportゴニョゴニョ').text(\""+dailyreport[0]+"\");\n"\
        "$('#daily_reportゴニョゴニョ').text(\""+dailyreport[1]+"\");\n"\
        "$('#daily_reportゴニョゴニョ').text(\""+dailyreport[2]+"\");\n"\
        "$('#daily_reportゴニョゴニョ').text(\""+dailyreport[3]+"\");\n"\
        "$('#daily_reportゴニョゴニョ').text(\""+dailyreport[4]+"\");\n"\
        "$('#daily_reportゴニョゴニョ').val(1);\n"\
        "$('#daily_reportゴニョゴニョ').val(\"0.0\");\n"\
        "$('#daily_reportゴニョゴニョ').val(\"0.0\");\n"\
        "$('#daily_reportゴニョゴニョ').val(286);\n"

print(out)
pyperclip.copy(out)

サクッとスパゲティコード(idxのことはほっといてくれ)

ま、とにかく使えるコードが書けたのでOK

微解説

pyperclip.copy(out)

最終行に書かれてるこれで自動でクリップボードに入れてくれるので、楽ちん

args = sys.argv

try:
    args[1]
    fileName = args[1] + ".md"
except:
    fileName = datetime.date.today().strftime("%Y%m%d.md")

ここで標準入力でもファイル名を指定できる
昨日の日報を忘れていたり、深夜残業した場合に利用できる

最後

Makefileに追記

reports:
    python3 src/createDailyReport.py

以上

さいごに

個人的に使用するもので時間かけて冗長化とかオブジェクト指向とか考えると勉強という意味では良いが、勤務時間という少ない時間を利用して作るのなら簡易的に 使えるコード を書いたほうがいい。

最近、できるかどうかを試すだけなのに何故か変数名で迷ったり もしかしたら を考えすぎて時間がかかる。時間をかけていいのはできるかどうか試すときではなく、思ったことが出来た時に製品化する時であったりする場合がいいのかもしれない。

昔、なんでもやってみて試して、スパゲッティコードを作ってた時の伸びしろは今以上のものだったはず・・・