とらのメモ

IT関係やガジェットについての雑記

出勤のあれこれな処理をワンクリックで済ませる

作業ログです

プロローグ

弊社は勤務形態としてリモートワークが認められているのだが、

  • 出勤と退勤時に出勤したことをメールで通知
  • 社内システムにログインしてステータスを変更
  • 勤務開始、終了時間を記録
  • Teamsをオンラインに変更

という感じで出勤前の寝起きで色々やらないといけないのが面倒臭い。
なので、これらをワンクリック(スクリプト実行なので実際はダブルクリック)で行えるようにしていく作業ログ。

Teams

PC起動時に自動で開くように設定すればヨシ。


あと退席中だとサボってるように見えるので(実際5分以上無操作状態はサボっている気がする) 、
常にオンライン状態が維持されるようにF13を入力し続けるスクリプトを作る。

メインPCがMacなので、F13を1回入力するコードをAppleScriptで書く。

tell application "System Events"
    key code 105
end tell

あとは適当にAutomatorでループさせる。
ネットで見かけた情報によると、5分(300秒)無操作状態だと退席中状態になるようなので 、 200秒に1回入力することでオンラインを維持している。

これでTeamsの問題は解決した。


出退勤メールについて

Pythonでメールサーバーに自動で送信するようにしてあげればいい。
smtplibライブラリを使えば割と簡単。

参考: Pythonでのメール送信

出退勤を同じスクリプトで処理したいので、分岐の基準として15時を境に出勤退勤とする。

  • 0:00 ~ 14:59 出勤
  • 15:00 ~ 23:59 退勤 という感じ。

コードは省略。


この時に取得した時間をExcelに書き込んでやれば出退勤の時間記録も問題ない。

import datetime as datetime  
import openpyxl

jst = timezone(timedelta(hours=+9), 'JST')  
nowtime = datetime.now(jst)

f = "ファイル.xlsx"
wb = openpyxl.load_workbook(filename=f) 
  
if not wb.sheetnames:  
    raise Exception("The Excel was saved in an incorrect format")  
  
# シートの読み込み  
sheet = wb[f'{nowtime.month}月']

# シートへ値の代入  
cell = sheet.cell(column=5, row=nowtime.day)  
cell.number_format = 'h:mm'  
cell.value = correct_time.time()

wb.save(file_path)

細部は省略したけど、大体こんな感じ。


勤怠管理システムにログインしてステータスを変更

chrome-driverをインストールして、自動操作ができる環境を作る。
(サイトバレ回避のためにちょっとコード書き換えてます。)

from selenium import webdriver  
from selenium.webdriver.common.by import By  
import os  
from dotenv import load_dotenv  
  
def login_portal(status=0):  
    # 環境変数から読み出し    
    load_dotenv()  
    username = os.environ['USER']  
    password = os.environ['PASSWARD']  
  
    driver = webdriver.Chrome()  
    driver.get('https://勤怠管理システム')  
  
    # ログイン情報入力  
    form = driver.find_element(By.NAME, "email")  
    form.send_keys(username)  
    form = driver.find_element(By.NAME, "password")  
    form.send_keys(password)  
  
    # ログインボタン クリック  
    button = driver.find_element(By.XPATH, "/html/body/section[2]/div/form/button")  
    button.click()  
    card = driver.find_element(By.XPATH, '//*[@id="modal-open"]')  
    card.click()  
  
    # 在席状態を変更  
    """
  省略
  """
  
    # 送信  
    finish_button = driver.find_element(By.XPATH, '//*[@id="status-submit"]/footer/input')  
    finish_button.click()  
  
    driver.close()  
  
if __name__ == '__main__':  
    login_portal(status=0)

これで自動操作ができるChromeが立ち上がって、ログイン処理と操作を自動でしてくれる。


以上。

作業ログでした。