Jello's development blog

Jello's development blog

RescueTime 자동화하기 3

소스코드 만들기

RescueTime 정보를 얻어오기

API 요청을 보내서 RescueTime에서 정보를 가져오는 코드를 python으로 작성해 보았다.

import requests

def get_rescuetime_daily_summary_feed():
    try:
        response = requests.get(
            url="https://www.rescuetime.com/anapi/daily_summary_feed",
            params={
                "key": RESCUETIME_ACCESS_TOKEN,
            },
        )
        print('Response HTTP Status Code: {status_code}'.format(
            status_code=response.status_code))

        return response.json()
    except requests.exceptions.RequestException:
        print('HTTP Request failed')

단순하게 requests package를 이용해서 주소에 GET 요쳥을 보내고, json으로 된 response를 python의 dictionary 형식으로 만들어서 반환하는 함수이다.

Pushbullet에 push 보내기

API 요청을 보내서 Pushbullet의 특정 사용자에게 push를 보내는 코드를 python으로 작성해 보았다.

def push_to_pushbullet(title, body):
    try:
        response = requests.post(
            url="https://api.pushbullet.com/v2/pushes",
            headers={
                "Access-Token": PUSHBULLET_ACCESS_TOKEN,
                "Content-Type": "application/json; charset=utf-8",
            },
            data=json.dumps({
                "title": title,
                "body": body,
                "type": "note"
            })
        )
        print('Response HTTP Status Code: {status_code}'.format(
            status_code=response.status_code))
    except requests.exceptions.RequestException:
        print('HTTP Request failed')

title에는 제목이 들어가고, body에는 RescueTime에서 얻어온 정보가 잘 정리되어 보내질 것이다.

보기 쉽게 변환하여 push 보내기

이제 정보를 가져오고, push를 보내는 함수까지 만들었으니, 보낼 메시지를 만드는 함수가 필요하다. 다음 두 함수는 각각 오늘의 생산적/비생산적 시간을 요약해주는 함수, n일 간의 생산성을 비교해주는 함수이다.

def send_date_info(data):
    title = '오늘({})의 RescueTime'.format(data['date'])

    body = '\n'
    body += 'Total Time : {}\n'.format(data['total_duration_formatted'])
    body += 'Productivity Pulse : {}\n'.format(data['productivity_pulse'])
    body += 'Productive : {}%, {}\n'.format(
        data['all_productive_percentage'],
        data['all_productive_duration_formatted']
    )
    body += 'Distracting : {}%, {}\n'.format(
        data['all_distracting_percentage'],
        data['all_distracting_duration_formatted']
    )
    body += 'Neutral : {}%, {}\n'.format(data['neutral_percentage'], data['neutral_duration_formatted'])

    push_to_pushbullet(title, body)


def send_productivity_change_info(data, date_range):
    title = '{}일 간 Productivity Pulse 변화'.format(date_range)
    filtered_data = data[:date_range]
    filtered_data.reverse()

    buffered_data = {}
    count = 0
    body = '\n'
    for i in filtered_data:
        body += ' ' + str(i['productivity_pulse'])

        if count != 0:
            variation = i['productivity_pulse'] - buffered_data['productivity_pulse']
            body += '({})'.format(variation)
        if count+1 != date_range:
            body += ' -'

        buffered_data = i
        count += 1

    push_to_pushbullet(title, body)

전체 코드는 github repository에서 확인해 볼 수 있다.

테스트

작성한 코드가 잘 돌아가는지 테스트해보았다.

$ python app.py [pushbullet token] [rescuetime token]

Response HTTP Status Code: 200
Response HTTP Status Code: 200
Response HTTP Status Code: 200
test

매우 잘 돌아가서 기뻤다.

crontab 사용하여 자동화하기

Unix 계열의 운영체제에는 대부분 crontab이라는 스케줄러가 있다.
명령어를 특정 시간에 주기적으로 실행시켜주는데, 지금까지 만든 것에 적용하면 아주 좋은 시너지가 날 것 같다.

사용법을 간단히 설명하자면, 아래와 같이 시간 포멧과 명령어를 입력하면 해당 시간마다 명령어를 실행해준다.

$ crontab -e
[분] [시] [일] [월] [요일] [명령어]

에를 들어서, 매일 2시 5분과 3시 5분에 test.sh shell script를 실행시키고 싶다면, 아래와 같이 하면 된다.

5 2,3 * * * /PATH/test.sh

나의 경우에는 클라우드 서버에 git repository를 clone한 뒤, crontab으로 매일 0시 1분에 나의 pushbullet으로 push를 보내도록 해 놓았다. 0분으로 설정하지 않은 것은, Rescuetime이 데이터를 갱신하는 버퍼 시간을 준 것이다.

먼저 서버 shell으로 들어간 뒤, 알맞은 디렉토리에 git repository를 clone한다.

$ git clone https://github.com/guswnsxodlf/rescuetime-pushbullet

그 뒤에 pip dependency들을 설치한다.

$ pip install -r requirements.txt

crontab을 설정한다. Linux에서는 crontab을 처음 실행하면 자동으로 editor를 선택하라는 메시지가 뜬다. 여기서 자신이 사용하는 editor를 설정해주면 된다.

$ crontab -e

---------[EDITOR]---------
1 0 * * * /[PATH]/bin/python /home/[PATH]/app.py [Pushbullet token] [RescueTime token]

:wq

여기서 서버의 시간을 확인해야 하는데, 서버의 timezone이 한국이 아닌 곳으로 설정되어 있다면 뜬금없는 시간대에 알림이 날아올 수 있다. timedatectl 명령어로 이 os의 timezone을 확인해 볼 수 있다.

$ timedatectl
$ sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

이제부터 매일 자정에 나의 컴퓨터 사용 패턴을 받아볼 수 있게 되었다!

정해진 시간에 알림이 온다

사진은 직접 요청을 보낸거라 자정이 지난 시간이지만, 앞으로 crontab에서 자동으로 요청을 보내고, 알림이 올 것이다.

마치며

귀찮은 업무를 자동화하기로 마음 먹고 난 뒤에 두 번째 자동화이다. 첫 번째는 너무나도 쓸데가 없어서 사용하지 않고 있지만 이번에는 유용하게 사용할 것 같다. crontab이 아니었다면 조금 더 수고를 했을텐데, 간편한 명령어가 있어서 정말 좋았다. 무엇을 하기 전에 먼저 어떤 도구를 사용해야 할 지 고민하는 시간이 많으면 많을수록 좋은 것 같다. 앞으로 다른 귀찮은 것들도 자동화 해봐야겠다.