pebbleを使ってエレベータからタイムカードを押すシステム

pebbleを使ってエレベータからタイムカードを押すシステム:

  • 他ブログからの移行、昔の記事です。
  • 今はなきpebble watchというスマートウォッチが好きでした。
  • 誰でもアプリを自作できる環境があったため、一部のユーザに熱く愛されていましたが2017年にFitbitに買収され消滅。
  • だがしかし!有志の皆様がRebbleという形でOS開発を継続していて、一応まだ使えます(自分はもう使ってないですが...)

どうも、しゅーいっちです。

はっきり言って自分の環境でしか使えないやり方なんですが、うまく動いて嬉しかったのでその方法です。


状況

  • 退勤管理のサイトを開くのに2分位かかる
  • 自分は常にギリギリに来るやつ
  • 社外ネットワークからクリックするとわかるようになっている
  • リモートデスクトップは繋がらないようになっている


mechanizeでタイムカードをクリックする

まずはクリックする部分です。社外ネットワークだとバレるので、職場の自分の端末にクリックするスクリプトを入れておきます。

ブラウザの挙動を自動化するmechanizeというgemを使いました。
mechanize

所定のURLにアクセスして所定のフォームを選んだりパスワードを入力したりしてクリック、さらに移動して所定のボタンをクリック、のように連続して記述していきます。

退勤時にも使っているので出勤と退勤の切り分けしてますが、そこは今回の話とは直接関係ないです。でも消すのが面倒だったのでそのまま残してます。

サイトが遅いので、出勤してこれを走らせるだけでもかなり時間の節約なります。2分が8秒くらいになります。

click.rb
require "mechanize" 
 
def stamp_time_card(mode="s_go") 
  agent = Mechanize.new 
  agent.user_agent_alias = 'Mac FireFox' 
 
  # select your section 
  page = agent.get("ログインURL") 
  form = page.form("form2") 
  form.field_with(:name => "lgid").option_with(:value => "XX").click 
 
  # load uid options and submit 
  uid_page = form.submit( form.button_with(:name => "s_change") ) 
  uid_form = uid_page.form("form2") 
  uid_form.field_with(:name => "uid").option_with(:value => "XX").click 
  uid_form.field_with(:name => "_word").value = "XXXXXXXXXX" 
  agent.submit(uid_form) 
 
  # move to timecard url and click btn 
  time_card_page = agent.get("つぎのページのURL") 
  time_card_form = time_card_page.form("_form") 
 
  # taikin or shukkin 
  if mode == "s_leave" 
    puts "Are you sure you taikin?" 
    puts "[Y/n]" 
    if gets.chomp == "Y" 
      time_card_form.submit( time_card_form.button_with(:name => mode) ) 
    else 
      puts "so bad... keep working!" 
    end 
  else 
    time_card_form.submit( time_card_form.button_with(:name => mode) ) 
  end 
end 


メールをトリガーにする

するというか、しました。新しくgmailアカウントを作って、そこに特定の件名のメールが特定の時間内に来ていたら上のスクリプトが実行されるようにすることにしました。

gmailをチェックしてくれるgmailというgemと、chatworkに投稿してくれるchatworkというgemを使いました。chatworkのAPIは、成功した時にマイチャットにお花を投稿してくれる部分にしか使ってないです。

午前9時から9時31分までの31分の間、20秒毎にメールチェックします。ほんとは5秒くらいでやっときたいのですが、小心者なのでなんとなく20秒にしています。

check_mail.rb
require 'gmail' 
require 'chatwork' 
require './click_timecard.rb' 
 
ChatWork.api_key = "CHATWORKのAPIキー" 
 
def chat(text) 
  ChatWork::Message.create( room_id: "xxxxxxx", body: text ) 
end 
 
begin 
  gmail = Gmail.connect("メアド@gmail.com", "パスワード") 
  puts "login OK." if gmail.logged_in? 
 
  t = Time.now 
  nine = Time.new(t.year, t.month, t.day, "+9") 
  nine_thirtyone = nine + 1900 
 
  100.times do 
    if Time.now.between?(nine, nine_thirtyone) 
      if gmail.inbox.count(:on => Date.today, :subject => "出勤したよing!!!") > 0 
        shukkin = true 
        stamp_time_card 
        chat("(F)") 
      else 
        puts Time.now 
      end 
    end 
    break if shukkin 
    sleep 20 
  end 
rescue => e 
  puts(e) 
ensure 
  gmail.logout 
end 


Automatorでスクリプトを実行するアプリ作成

職場で使っているのがOSXのSnow leopardです。そいつのAutomatorにApplescriptでスクリプトを起動するだけのアプリを作って保存します。

launchClickApp.scpt
on run {input, parameters} 
 
    tell application "Terminal" 
        activate 
        do script "cd /Users/rubyスクリプトまでのパス/time_card && ruby check_the_shukkin_mail.rb && exit" 
    end tell 
 
    return input 
end run 


毎朝定時に自動起動させる

で、そのアプリを平日の午前9時になったら毎朝起動するように設定します。自分が使っているのはcronnixというGUIのアプリです。
cronnix


メールを送るだけのウェブアプリを作る

アプリと言っていいのかわかりませんが、URLにアクセスがあるとメールが送られるだけです。

さくらのVPSにdokku-altを入れてsinatraでやりました。
さくらのナレッジ:Dockerを使ったミニPaaSのdokkuをパワーアップさせた「Dokku Alternative」を試す

send_mail.rb
require 'sinatra' 
require 'mandrill' 
 
def send_mail 
  m = Mandrill::API.new 'APIキー' 
  message = { 
    :subject=> "出勤したよing!!!", 
    :from_name=> "shukkinApp", 
    :text=>"出勤したよing!!!", 
    :to=>[ 
      { 
        :email=> "メアド@gmail.com", 
        :name=> "おれおれ" 
      } 
    ], 
    :from_email=>"送信元メアド@gmail.com" 
  } 
  sending = m.messages.send message 
  puts sending 
end 
 
get "/長いURLパス" do 
  send_mail 
  "yay!" 
end 
普通にメールを送ろうとしたらタイムアウトするので(もう詳細覚えてない)、MandrillのAPIを使うgemを使いました。1日1万2千通まで無料で遅れますが、1日1通、週5,6通しか送信していません。

mandrill


pebble app作成

一番簡単そうなsimplyjsのチュートリアルアプリをcloudpebble上で編集する方法でやりました。

http://simplyjs.io/
https://cloudpebble.net/

SELECTボタン(真中のボタン)を押すとさくらVPSのURLにアクセスするだけです。

letMailSent.js
# https://cloudpebble.net/ 
 
simply.on('singleClick', function(e) { 
  // console.log(util2.format('single clicked $button!', e)); 
  if (e.button == "select"){ 
      ajax({ url: 'アクセスするとメールが送られるappのURL' }, function(){ 
        simply.text({ body: 'Mail sent!' }); 
      }); 
    } 
}); 
 
simply.setText({ 
  title: 'My SHUKKIN App', 
  body: 'PRESS SELECT for Shukkin', 
}, true); 


結果

動きました。かなり快適です。エレベータの中で焦っている同僚を尻目にカチリとボタンを押す快感、相当やばいです。


問題点

  • oh my zshのアップデートでたまに止まっている(ギリギリで画面見てめっちゃ焦る)
  • pebbleが壊れた(液晶が映らなくなった。交換品がそろそろ届く)
  • カードキーが導入されることになった(どうやら自分がその担当らしい)
というかPebbleなしでもできます。

が、あると嬉しいです。

コメント

このブログの人気の投稿

投稿時間:2021-06-17 22:08:45 RSSフィード2021-06-17 22:00 分まとめ(2089件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)