나루의 갱신 통지를 LINE에서 받는다.

배경으로 한 일



갱신 빈도가 낮은 소설을 일일이 육안으로 갱신 확인하는 것이 귀찮았으므로, 최신화의 갱신을 검지해 통지를 LINE로 받을 수 있는 툴을 작성했다.

프로그램 실행 환경


  • macOS Big Sur 버전 1.5

  • 사용한 기술 및 언어


  • LINE Notify
  • 나로 소설 API
  • Python3.9.1
  • crontab (프로그램 정기 실행에 사용)

  • 코드 전체



    나로 API로 최신 화수의 취득을 실시해, 갱신되고 있었을 경우 LINE Notify로 갱신 통지를 실시한다.

    syosetu_notify.py
    import requests
    from bs4 import BeautifulSoup
    import re
    
    def main():
    
        #通知用LINE Notifyの設定
        notify_url = 'https://notify-api.line.me/api/notify'
        notify_token = 'ここにトークンを貼り付け'
        headers = {"Authorization" : "Bearer "+ notify_token}
    
        #前回のプログラム実行時に保存された最新話の確認
        f = open('/path/to/current_chapter_syosetu.txt', 'r')
        previous_chapter_number = f.readline()
        f.close()
    
        #小説の最新話の話数を取得する
        res = requests.get('https://api.syosetu.com/novelapi/api/?of=ga&ncode=小説コード')
        soup = BeautifulSoup(res.text, 'html.parser')
        text = soup.get_text()
        current_chapter = re.search('general_all_no: [0-9]+', text)
        current_chapter_text = current_chapter.group()
        current_chapter_num_search = re.search('[0-9]+', current_chapter_text)
        current_chapter_number = current_chapter_num_search.group()
    
        #保存された話数とサイトから取得した話数が異なっていれば更新されたと判断する
        if current_chapter_number != previous_chapter_number:
    
            #最新話の更新通知メッセージ
            notify = '最新話'+current_chapter_number+'が更新されました!'
            payload = {"message" : notify}
            requests.post(notify_url, headers = headers, params = payload)
    
            #Line通知時に、トーク内に小説のリンクを貼る(任意)
            syosetu_link = 'https://ncode.syosetu.com/小説コード/'
            payload = {"message" : syosetu_link}
            requests.post(notify_url, headers = headers, params = payload)
    
            #保存する話数を更新
            f = open('/path/to/current_chapter_syosetu.txt','w')
            f.write(current_chapter_number)
            f.close()
    
    if __name__ ==  '__main__' :
        main()
    
    
    

    LINE Notify의 설정 부분


        #通知用LINE Notifyの設定
        notify_url = 'https://notify-api.line.me/api/notify'
        notify_token = 'ここにトークンを貼り付け'
        headers = {"Authorization" : "Bearer "+ notify_token}
    

    토큰 얻기



    LINE Notify에 로그인하여 내 페이지로 이동하면 화면 하단에 토큰을 발행 할 수있는 양식이 있습니다. 토큰 발행 버튼을 눌러 LINE Notify와 연동할 토크를 선택한다(선택한 토크에 통지가 송신된다). 그 후 발행된 토큰을 notify_token 부분에 붙여넣는다.



    현재 저장된 최신 이야기 확인


        #前回のプログラム実行時に保存された最新話の確認
        f = open('/path/to/current_chapter_syosetu.txt', 'r')
        previous_chapter_number = f.readline()
        f.close()
    
    current_chapter_syosetu.txt 에 갱신전의 최신 이야기수를 보존한다.syosetu_notify.py 의 최초 실행시에 current_chapter_syosetu.txt 가 비어있는 상태와 화수의 비교를 할 수 없기 때문에 미리 화수를 기입해 둔다. 2번째 이후의 실행에서는 자동으로 갱신되기 때문에 만지지 않아도 된다.previous_chapter_numbercurrent_chapter_syosetu.txt 에서 읽은 화수가 저장된다.

    최신 이야기 수 얻기


        #小説の最新話の話数を取得する
        res = requests.get('https://api.syosetu.com/novelapi/api/?of=ga&ncode=小説コード')
        soup = BeautifulSoup(res.text, 'html.parser')
        text = soup.get_text()
        current_chapter = re.search('general_all_no: [0-9]+', text)
        current_chapter_text = current_chapter.group()
        current_chapter_num_search = re.search('[0-9]+', current_chapter_text)
        current_chapter_number = current_chapter_num_search.group()
    

    나로 소설 API



    자세한 안내는 여기 .
    이번에는 특정 소설에 대해 API를 사용하여 최신 이야기를 얻고 있습니다.https://api.syosetu.com/novelapi/api/?of=ga&ncode=小説コード 정보of 파라미터의 ga 로 이야기의 총수, ncode 파라미터로 소설 마다 할당된 ID를 지정한다.
    소설의 ID는, 나로의 사이트에서 해당하는 작품의 소설 정보를 참조한다.current_chapter_number 에 API로 취득한 최신 화수(정확하게는 총 화수)가 저장된다.

    이야기 수 비교


        #保存された話数とサイトから取得した話数が異なっていれば更新されたと判断する
        if current_chapter_number != previous_chapter_number:
    
            #最新話の更新通知メッセージ
            notify = '最新話'+current_chapter_number+'が更新されました!'
            payload = {"message" : notify}
            requests.post(notify_url, headers = headers, params = payload)
    
            #LINE通知時に、トーク内に小説のリンクを貼る(任意)
            syosetu_link = 'https://ncode.syosetu.com/小説コード/'
            payload = {"message" : syosetu_link}
            requests.post(notify_url, headers = headers, params = payload)
    
            #保存する話数を更新
            f = open('/path/to/current_chapter_syosetu.txt','w')
            f.write(current_chapter_number)
            f.close()
    

    위의 previous_chapter_numbercurrent_chapter_number를 비교하여 양자의 값이 다르면 소설이 갱신되었다고 간주하여 LINE으로 통지한다.
    그 후 갱신된 화수를 current_chapter_syosetu.txt 에 덧쓰기한다.notify 이나 syosetu_link 의 부분은 LINE 토크중에 메세지로서 표시되는 부분이며 적절히 만나서 문제 없다.

    crontab



    이상의 프로그램을 crontab로 자동 실행한다. 나로 API는 이 기사의 집필 시점(2021년 8월 1일)에서 액세스수에 특별히 제한은 없지만, 프로그램을 달릴 때마다 사이트에 액세스가 발생하는 것은 확실하기 때문에, 실행 간격은 만큼( 자신의 경우는 하루 1회 페이스).

    후리카리



    만든 후 조사해 보니 메일을 통해 통지를 받을 수 있는 서비스는 이미 존재하는 것 같았다. 뭐 LINE에서 받을 수 있는 것이 지금 바람일까라고 하는 것으로 하나.

    좋은 웹페이지 즐겨찾기