개요


업무 자동화는 필자가 어릴 때부터 많은 관심을 가지고 있었던 분야이다.

이 페이지에서는 업무 자동화의 달인이 되기 위한 과정에서 얻은 인사이트 등을 정리합니다.

 

업무 자동화에 대한 생각 정리


업무 자동화의 전문가가 되고 싶은 이유

어떻게 하면 내가 다른 일을 하는동안 반복적인 업무를 자동화시킬  수 있을까?

사람은 나이가 들수록 챙겨야할 것도 많고, 어느 것 하나에 집중하는 것도 점점 어려워 진다.

 

부동산도 계속 찾아봐야 되고,

여행 가려면 항공권도 잘 찾아봐야 하고,

물건을 사려면 계속 중고 사이트를 찾아봐야 하고,

성경도 읽고 기도도 해야 하고,

회사일도 해야 하고,

자격증도 따야 하고,

 

뭔가 해법이 필요했다. 

굳이 내가 할 필요없이 기계가 할 수 있는 일은 맡겨두면 나만 할 수 있는 일에 더 집중할 수 있을 것이다.

 

그렇다면 내가 할 필요없이 기계가 더 잘하는 일은 무엇일까?

1. 24시간 키워드 모니터링 & 알림

 

그렇다면 업무 자동화를 구현하는데 주의할 점은 무엇일까?

1. 가장 중요한 것은 배보다 배꼽이 더 커서는 안된다는 사실이다.

- 자동화 도구를 만드는 것이 기능을 단순화할지라도 1시간 내, 최대 8시간 내에 끝나야 한다.
(그래야 효과가 제일 좋다.)

- 아무리 자동화 도구를 정교하게 만들었다고 하더라도, 너무 많은 시간이 들었다면 그냥 매일 모니터링하는 것이 낫다.

 

업무 자동화를 구현하기 위해 필요한 지식


1. Basic programming concepts: This includes understanding of data types, variables, loops, control structures, functions, and more. A good understanding of these concepts is essential to write efficient and effective code.

2. Scripting languages: Scripting languages such as Python, Perl, or Bash are often used for task automation. These languages are relatively easy to learn, and can be used to automate a wide range of tasks, from simple file operations to complex data processing.

3. API and library usage: Automation often requires accessing data from various sources or integrating with other applications. Knowledge of APIs (Application Programming Interfaces) and libraries can help you in such scenarios.

4. Regular expressions: Regular expressions are a powerful tool for text processing and pattern matching. Knowledge of regular expressions can be useful in tasks such as data extraction and validation.

5. Automation frameworks: Automation frameworks such as Selenium or PyAutoGUI can be used to automate tasks that require interaction with a graphical user interface (GUI).

나는 크롬 개발자 도구, Chrome Extension, Node.js 등으로 개발해보고자 한다.

 

업무 자동화를 해보자.


새 글 키워드 알림 - List API가 JSON 형식인 Case (JS Snippets)

// Bot Name
const BOT_NAME = 'Your Bot Name'

// Telegram Bot Setting
const BOT_TOKEN = '427974507:AAGDfHLYyrZvv-7z82igox6C0gnlDmZEmQg';
const CHAT_ID = '834447866';

// URL to check for new posts
const BOARD_URL = 'https://www.example.com/board';

// Keywords to trigger notification
const KEYWORDS = ['keyword1', 'keyword2', 'keyword3'];

// Minimum Datetime
const MIN_DATETIME = dateToText(new Date());

// Interval
const INTERVAL_SECOND = 10;

// List to keep track of already notified posts
let notifiedPosts = [];

// Function date to text
function dateToText(date) {
    const year = date.getFullYear();
    const month = (date.getMonth() + 1).toString().padStart(2, '0');
    const day = date.getDate().toString().padStart(2, '0');
    const hours = date.getHours().toString().padStart(2, '0');
    const minutes = date.getMinutes().toString().padStart(2, '0');
    const seconds = date.getSeconds().toString().padStart(2, '0');
    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}

// Function to send Telegram message
function sendTelegramMessage(message) {
  fetch(`https://api.telegram.org/bot${BOT_TOKEN}/sendMessage?chat_id=${CHAT_ID}&text=${message}`)
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(error => console.error(error));
}

// Function to check for new posts
function checkForNewPosts() {
  console.log('Monitring...');
  fetch(BOARD_URL)
    .then(response => response.text())
    .then(data => {
      // Extract post information from board HTML
      // TODO : data에서 list 객체를 추출하는 로직 작성
      const posts = data
      
      // Check each post for keywords
      for (let post of posts) {
        // TODO : list item 객체에서 항목 추출하는 로직 작성
        const post_id = post.id
        const post_title = post.title
        const post_url = post.url
        const post_datetime = post.created_datetime
        
        if (!notifiedPosts.includes(post_id) && 
        	KEYWORDS.some(keyword => post_title.includes(keyword)) &&
            post_datetime >= MIN_DATETIME) {
          notifiedPosts.push(post_id);
          sendTelegramMessage(`<<${BOT_NAME}>> \n New post on board: ${post_title} \n ${post_url}`);
        }
      }
    })
    .catch(error => console.error(error));
}

// Run checkForNewPosts every N seconds
setInterval(checkForNewPosts, INTERVAL_SECOND * 1000);

새 글 키워드 알림 - List API가 HTML 형식인 Case (JS Snippets)

// Bot Name
const BOT_NAME = 'Your Bot Name'

// Telegram Bot Setting
const BOT_TOKEN = '427974507:AAGDfHLYyrZvv-7z82igox6C0gnlDmZEmQg';
const CHAT_ID = '834447866';

// URL to check for new posts
const BOARD_URL = 'https://www.example.com/board';

// Keywords to trigger notification
const KEYWORDS = ['keyword1', 'keyword2', 'keyword3'];

// Minimum Datetime
const MIN_DATETIME = dateToText(new Date());

// Interval
const INTERVAL_SECOND = 10;

// List to keep track of already notified posts
let notifiedPosts = [];

// Function date to text
function dateToText(date) {
    const year = date.getFullYear();
    const month = (date.getMonth() + 1).toString().padStart(2, '0');
    const day = date.getDate().toString().padStart(2, '0');
    const hours = date.getHours().toString().padStart(2, '0');
    const minutes = date.getMinutes().toString().padStart(2, '0');
    const seconds = date.getSeconds().toString().padStart(2, '0');
    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}

// Function to send Telegram message
function sendTelegramMessage(message) {
  const msg = encodeURIComponent(message);
  fetch(`https://api.telegram.org/bot${BOT_TOKEN}/sendMessage?chat_id=${CHAT_ID}&text=${msg}`)
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(error => console.error(error));
}

// Function to check for new posts
function checkForNewPosts() {
  console.log('Monitoring...');
  fetch(BOARD_URL)
    .then(response => response.text())
    .then(data => {
      // parse the HTML response
      const parser = new DOMParser();
      const htmlDoc = parser.parseFromString(data, 'text/html');

      // find the specific list
      // TODO : data에서 list 객체를 추출하는 selector 작성
      const posts = Array.from(htmlDoc.querySelectorAll('table tr'))
      
      // Check each post for keywords
      for (let post of posts) {
        // TODO : list item 객체에서 항목 추출하는 로직 작성
        const post_id = post.querySelector('.id').innerText.trim();
        const post_title = post.innerText
        const post_url = post.querySelector('.url').innerText.trim();
        const post_datetime = post.querySelector('.created_datetime').innerText.trim();
        
        if (!notifiedPosts.includes(post_id) && 
        	KEYWORDS.some(keyword => post_title.includes(keyword)) &&
            post_datetime >= MIN_DATETIME) {
          notifiedPosts.push(post_id);
          sendTelegramMessage(`<<${BOT_NAME}>> \n New post on board: ${post_title} \n ${post_url}`);
        }
      }
    })
    .catch(error => console.error(error));
}

// Run checkForNewPosts every N seconds
setInterval(checkForNewPosts, INTERVAL_SECOND * 1000);
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기