NAS

Telegram Bot으로 ArchiveBox에 URL을 등록해보자

mingoon.com 2020. 7. 22. 13:38
반응형

개인 NAS의 도커 목록을 클량에 올렸는데, ArchiveBox에 관심이 많으셔서 텔레그램 봇을 통해 ArchiveBox에 URL을 등록하는 쉘 스크립트를 공유한다.

https://github.com/pirate/ArchiveBox

 

pirate/ArchiveBox

🗃 The open source self-hosted web archive. Takes browser history/bookmarks/Pocket/Pinboard/etc., saves HTML, JS, PDFs, media, and more... - pirate/ArchiveBox

github.com

먼저 텔레그램 봇을 생성하여 토큰을 발급받는다.

텔레그램 봇 생성은 많은 블로그에서 검색할 수 있으니 패스~

jq를 설치한다.

텔레그램으로부터 받은 JSON 메시지를 파싱하기 위해 필요한 Command Line JSON 파서이다.

아래 URL에서 본인 OS에 맞는 방법으로 설치하면 된다.

https://stedolan.github.io/jq/download/

 

Download jq

Download jq jq is written in C and has no runtime dependencies, so it should be possible to build it for nearly any platform. Prebuilt binaries are available for Linux, OS X and Windows. The binaries should just run, but on OS X and Linux you may need to m

stedolan.github.io

쉘 스크립트

아래 스크립트를 디렉토리에 맞게 수정한다.

#!/bin/bash
USER_HOME=/home/kyo
TOKEN={텔레그램 봇 토큰}
URL="https://api.telegram.org/bot$TOKEN/getUpdates"
# 기존 수신 URL 체크를 위한 메시지 ID 저장 파일 경로
CHECK_FILE=$USER_HOME/script/data/checked-msgid.txt
RESULT_UPDATE=`curl -s $URL`
OK=`echo $RESULT_UPDATE | jq '.ok'`
if [ "true" = "$OK" ]; then
        MSG_LEN=`echo $RESULT_UPDATE | jq '.result | length'`
        for (( i=0; i<$MSG_LEN; i++ ))
        do
                # 메시지의 ID, TEXT를 가져온다.
                ELEM_MSG_ID=".result | .[$i].message.message_id"
                ELEM_MSG_TEXT=".result | .[$i].message.text"
                MSG_ID=`echo $RESULT_UPDATE | jq "$ELEM_MSG_ID"`
                MSG_TEXT=`echo $RESULT_UPDATE | jq "$ELEM_MSG_TEXT"`
                ARCHIVE_URL=""
                # 메시지가 http로 시작하는 URL인지 체크한다.
                if [[ "$MSG_TEXT" == "\"http"* ]]; then
                        echo "URL"
                        ARCHIVE_URL=`echo $MSG_TEXT | xargs`
                else
                        echo "TEXT"
                fi
                # 기존 메시지 ID 체크하는 파일을 생성한다.
                if [ ! -f "$CHECK_FILE" ]; then
                        echo "file create $CHECK_FILE"
                        touch $CHECK_FILE
                fi
                CHECK_MSG_ID="MSG_$MSG_ID"
                CHECKED=`find $CHECK_FILE -type f -print | xargs grep "$CHECK_MSG_ID"`
                CHECKED_LEN=${#CHECKED}
                if [ ! $CHECKED_LEN -gt 0 ]; then
                        echo "msg_id not found!"
                        echo $CHECK_MSG_ID >> $CHECK_FILE
                        ARCHIVE_URL_LEN=${#ARCHIVE_URL}
                        # URL이 있는 경우 docker-compose를 통해 ArchiveBox의 /bin/archive를 실행한다.
                        if [ $ARCHIVE_URL_LEN -gt 0 ]; then
                                # ArchiveBox의 docker-compose 경로를 수정한다.
                                echo $ARCHIVE_URL | docker-compose -f $USER_HOME/docker/archive/ArchiveBox/docker-compose.yml exec -T archivebox /bin/archive
                        fi
                fi
        done

fi

실행할 수 있는 권한을 준다.

chmod +x readTelegram.sh

크론 등록

주기적으로 호출하도록 crontab에 등록해준다. (예제는 10분 주기)

0,10,20,30,40,50 * * * * ~/script/readChat.sh