Owl Life

파이썬으로 웹페이지 크롤링을 해보자. (2) 텔레그램으로 메시지 보내기 본문

Python

파이썬으로 웹페이지 크롤링을 해보자. (2) 텔레그램으로 메시지 보내기

Owl Life 2019. 11. 12. 00:40
반응형

  이번 시간에는 앞서 구현한 크롤링 모듈을 일정 시간마다 시스템에서 자동으로 실행 하도록 실습 해보겠습니다. 그리고 새로운 글을 찾았을때 텔레그램과 연동해서 메시지를 전달 하는 기능을 구현해보도록 하겠습니다.

 

크롤링 실행 주기 설정

  주기적으로 어떤 프로그램이나 스크립트를 실행 할 때에는 crontab 을 많이 사용합니다. 본 포스팅에서도 이 서비스를 이용하여 주기적으로 앞에서 만든 크롤링 모듈을 실행 해보도록 하겠습니다.

 

주기적으로 실행 되었다는것을 나타내기 위하여 clien_crawler.py 파일의 main 메서드에 현재의 시간을 기록하는 코드를 추가하겠습니다.

from datetime import datetime

if __name__ == '__main__':
    print('start - ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
    crawled_data = fetch_clien_latest_data()
    add_new_items(crawled_data)

또한, fetch_clien_latest_data() 메서드의 print(title) 코드도 더이상 불필요하기 때문에 삭제하였습니다.

 

자동 실행될 스크립트 파일 생성

  crontab에 의하여 실행될 스크립트 파일을 root project에 위치시킵니다. 필자는 start_crawling.sh 파일명으로 아래처럼 코드를 작성하였습니다.

#!/bin/bash

source ~/PycharmProjects/MyVirtualEnv/bin/activate
python3 ~/PycharmProjects/a/ClienCrawlingDjango/clien_crawler.py

  MyVirtualEnv라는 별도의 가상 환경을 사용하고 있기 때문에 액티베이션 시키는 코드를 첫줄에 추가하였습니다. 그 이후에 python3 로 clien_crawler.py 파일을 실행 시키는 코드를 작성하였습니다. 만약 가상 환경을 사용하지 않는다면 'source~' 줄은 추가하지 않아도 됩니다.

 

  이제 이 스크립트를 실행하기 위하여  crontab 을 편집해보겠습니다. 터미널에서 crontab -e 명령어를 입력합니다. 그러면 에디터 창이 보이는데, 그 창에 crontab 관련 규칙과 실행할 명령어를 입력합니다.

$ crontab -e

#여기부터 에디터 입력창
*/1 * * * * ~/PycharmProjects/a/ClienCrawlingDjango/start_crawling.sh >> ~/PycharmProjects/a/ClienCrawlingDjango/crontab_log.txt 2>&1

  crontab 의 주기 설정 방법은 링크를 참고 부탁드립니다. 위 코드는 1분마다 크롤링을 하는 코드를 작성하였기 때문에 가장 앞쪽에 '분' 단위 룰을 나타내는곳에 */1 을 설정하였습니다. 5분마다 설정하고 싶다면 */5 라고 설정하시면 됩니다.

 

'>>' 오퍼레이터는 print되는 문자들을 별도의 로그 파일에 기록하기 위함입니다. '>'는 덮어쓰기 작업이고, '>>'는 파일에 추가하는 작업입니다.  오랜 시간이 지나면 파일의 크기가 커지기 때문에 주기적으로 삭제해야 합니다.

 

  입력을 완료 하였으면 저장 후 터미널로 돌아옵니다. 정상적으로 추가 되었는지 확인하려면 crontab -l 명령어를 입력해보면 리스트를 확인 할 수 있습니다.

$ crontab -l
*/1 * * * * ~/PycharmProjects/a/ClienCrawlingDjango/start_crawling.sh >> ~/PycharmProjects/a/ClienCrawlingDjango/crontab_log.txt 2>&1

 

  몇분 정도의 시간 뒤에 로그 파일을 열어 보았습니다. 아래처럼 정상적으로 스크립트 파일이 실행되었고, 정확히 1분 간격으로 크롤링이 진행 되었음을 확인 할 수 있습니다.

start - 2019-11-11 13:26:00
start - 2019-11-11 13:27:01
start - 2019-11-11 13:28:02
start - 2019-11-11 13:29:03

 

텔레그램으로 메세지 전송하기

텔레그램으로 메시지를 전송하는 코드를 먼저 살펴보겠습니다. clien_crawler.py 파일에 추가하였습니다.

def send_noti_to_telegram(items):
    if len(items) == 0:
        return

    bot_token = '1034490xxxxxx'
    bot_chat_id = '-10010000000'

    for item in items:
        bot_message = "\[클리앙] " + item['title'] + \
                      "\n" + item['link']

        send_text = 'https://api.telegram.org/bot' + bot_token + \
                    '/sendMessage?chat_id=' + bot_chat_id + \
                    '&parse_mode=Markdown&text=' + bot_message

        requests.get(send_text)
        sleep(1)
        
        
if __name__ == '__main__':
    print('start - ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
    crawled_data = fetch_clien_latest_data()
    db_inserted_items = add_new_items(crawled_data)
    send_noti_to_telegram(db_inserted_items)

 

  main 함수를 보면 디비에 추가된 항목을 리스트로 전달받고 send_noti_to_telegram() 메서드를 호출하고 있습니다. 이 메서드에서는 텔레그램으로 전달할 메시지를 빌드하고, requests 를 통하여 전달하고 있습니다.

 

여기에서 필요한게 bot token과 bot chat id 입니다. 어떻게 획득 할 수 있는지 한번 살펴보겠습니다.

 

텔레그램 bot token / bot chat id 획득하기

텔레그램을 실행 후 검색창에서 'BotFather'를 입력합니다.

 

  선택 후 대화를 시작합니다. 대화 창에서 /newbot 을 입력합니다. 그러면 새로운 봇 이름을 입력하라는 메시지가 전달됩니다. 새로운 봇 이름을 입력합니다.

  본 포스팅에서 사용할 예제에서는 'clien_test_bot' 으로 입력하겠습니다. 정상적으로 입력이 되면 이제 'bot'으로 끝나는 사용자 이름을 입력하라는 메시지가 전달됩니다. 똑같이 'clien_test_bot' 으로 입력하겠습니다. 완료되면 bot token 을 받을 수 있습니다.

숫자 9953으로 시작하는게 bot token 입니다.

이제 새로운 채널을 하나 생성해야 합니다. 아래처럼 아이콘을 클릭 후 "New Channel"을 선택합니다.

 

채널 이름은 "clien_test_channel" 로 입력하였습니다. 원하시는 채널 이름을 입력하시면 됩니다.

입력을 완료하면 우측 상단에 있는 "Next" 버튼을 클릭합니다. 완료되면 채널이 하나 생성되는것을 확인 할 수 있습니다.

 

생성한 채널의 관리자로 텔레그램 봇을 추가하기

  bot chat id을 알기 위해서는 봇을 채널의 관리자로 추가 하여야 합니다. 관리자로 추가 하는 방법은 채널의 우측의 Info 에서 관리자 또는 Administrators를 클릭합니다.

  Add Admin 을 클릭 후, 조금전에 생성한 clien_test_bot 을 검색 후 추가 해줍니다.

  선택 후 추가 권한을 선택하는 창이 한번 더 보이는데 "Add Subscribers"를 FALSE 로 선택 하여야 합니다. 완료하면 아래처럼 관리자가 두명인것을 확인 할 수 있습니다. Shun은 본인 계정이고, clien_test_bot은 관리자 권한을 위임받은 봇입니다.

 

bot chat id 받기

이제 bot chat id 를 알아보도록 하겠습니다.

아래 URL 에 API 내용을 붙여 넣기 하여 인터넷 주소창에 입력하고 이동 해 봅니다.

https://api.telegram.org/bot[이부분]/getUpdates

 

위와 같이 입력을 하면 봇과 관련된 여러 정보들이 보여집니다. 만약 result에 아무런 정보가 보이지 않는다면 좀 기다렸다가 다시 시도 해보시기 바랍니다. bot chat id는 -1001173133632라는 것을 알 수 있습니다.

 

텔레그램으로 메시지 보내기

주소창에 아래처럼 입력을 해보겠습니다.

https://api.telegram.org/bot995398932:AAHsc4J34GC1UY59oUX0HrX6tcxs7sCTXjI/sendMessage?chat_id=-1001173133632&text=Hello

그러면 텔레그램 채널로 Hello가 입력 되는것을 확인 할 수 있습니다.

 

이제 저 URL을 python 코드상에서 적절히 조합을 하면 텔레그램으로 메시지를 손쉽게 전송 할 수 있습니다.

bot token과 bot chat id 둘다 알았으니 코드를 업데이트하고 실행해보겠습니다.

def send_noti_to_telegram(items):
    if len(items) == 0:
        return

    bot_token = '995398932:AAHsc4J34GC1UY59oUX0HrX6tcxs7sCTXjI'
    bot_chat_id = '-1001173133632'

    for item in items:
        bot_message = "\[클리앙] " + item['title'] + \
                      "\n" + item['link']

        send_text = 'https://api.telegram.org/bot' + bot_token + \
                    '/sendMessage?chat_id=' + bot_chat_id + \
                    '&parse_mode=Markdown&text=' + bot_message

        requests.get(send_text)
        sleep(1)

 

실행을 해보니 새로운 글이 2건 등록되었습니다.(PyCharm Console에서 확인)

해당 2건은 DB에 추가 후 텔레그램으로 푸쉬가 오는것을 확인 할 수 있습니다. (텔레그램 채널 확인)

 

TIP

  만약, bot_message에 & 문자를 가진 url을 포함한다면 그대로 전송할시에 정상적으로 노출이 되지 않을수 있습니다.

이럴 경우에는 아래처럼 UTF-8 문자로 변경하면 정상적으로 전송이 됩니다.

bot_message.replace('&', '%26')

 

 

여기까지 텔레그램으로 메시지를 보내는 기능을 살펴보았습니다.

반응형
Comments