조회 수 2516 추천 수 0 댓글 4
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form
라이선스 MIT

안녕하세요?

 

파이썬(파이썬 텔레그램 봇 패키지 포함), 텔레그램, 그리고 크론탭을 이용해서 

 

어느 게시판이나 새 글이 작성되면 텔레그램으로 그 제목을 알려주는 코드입니다.

 

장터에 물건이 등록되거나 핫딜이 뜨면 밖에서도 바로 받아볼 수 있도록 하려는 취지에서 만들어봤네요 ^^

 

RSS 생성 사이트를 활용할 수도 있고 안드로이드 앱 중에도 새 글 알림 앱이 있지만 

 

일부 RSS 생성 사이트의 비싼 플랜을 제외하면 1시간 이내 단위로 검색할 수 있는 방법은 없는 것으로 알고 있습니다.

 

 

제가 파이썬을 제대로 책이나 수업을 통해 배운 것이 아니기 때문에 매우 허접하고 지저분하지만

(간신히 작동은 하지만 파이썬 유저분들께서 제가 잘못 짠 부분을 지적해주시면 감사하겠습니다 ㅠㅠ)

 

Vultr의 Ubuntu 16.04 x64 환경에서 크론탭에 넣고 텔레그램 알림이 잘 작동하는 것을 확인했습니다.

 

우선 파이썬, Requests, BeautifulSoup4, 파이썬 텔레그램 봇 패키지가 설치되어 있고

 

텔레그램에서 봇 파더로 뉴봇을 생성해야 합니다.

 


# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import requests
from bs4 import BeautifulSoup
import os

import telegram

bot = telegram.Bot(token='*1')
chat_id = bot.getUpdates()[-1].message.chat.id

BASE_DIR = os.path.dirname(os.path.abspath(__file__))

session = requests.Session()
headers = {"User-Agent":"Mozzila/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit 537.36 (KHTML, like Gecko) Chrome",
           "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"}

req = requests.get('*2')
req.encoding = 'utf-8'

html = req.text
soup = BeautifulSoup(html, 'html.parser')
posts = soup.select('*3')
latest = posts[0].text

with open(os.path.join(BASE_DIR, 'latest1.txt'), 'r') as f_read:
    before = f_read.read()
    f_read.close()
    if before != latest:
        bot.sendMessage(chat_id=chat_id, text=latest)
        with open(os.path.join(BASE_DIR, 'latest1.txt'), 'w+') as f_write:
            f_write.write(latest)
            f_write.close()

 

 

앞부분은 인코딩 때문에 넣었고 

 

해당 사이트에서 유저에이전트가 파이썬으로 뜨면 차단될 수 있기 때문에 

 

헤더를 변경하였습니다.

(제대로 변경되었는지 www.whatismybrowser.com에서 확인하긴 했는데 솔직히 이 부분은 잘 모르겠네요 ㅠㅠ)

 

*1 : 텔레그램 봇 파더에서 생성된 토큰

 

*2 : 해당 게시판의 URL

 

*3 : 게시판 제목의 CSS 셀렉터 (ex. td.fz_subject > a 이런 식으로 써주시면 됩니다) 

 

이렇게 입력하시면 됩니다.

 

 

그리고 크론탭에 * * * * * python 파일명.py 형식으로 넣어주시면 1분마다 검색해서 

(아시겠지만 1분 이하 간격으로 하려면 & sleep을 이용해서 반복하여 기입하면 됩니다)

 

새 글이 있는 경우에만 사용자가 생성한 텔레그램 봇 계정으로 알림(새 글 제목)이 도착합니다.

 

 

아마도 처음 돌릴 때 latest1.txt 파일이 없으면 에러가 발생할 수 있으니 

 

vi 등 에디터를 이용하여 아무 내용이나 latest1.txt를 만들어주셔야 할 것입니다.

(처음에 한 번은 잘못된 알림이 올거에요)

 

 

그럼 남은 주말 즐겁게 보내시고 편안한 밤 되세요 ^-^

 

항상 감사드립니다!

 

 

참조 문서 및 블로그:

파이썬으로 웹 크롤러 만들기, 한빛미디어, 라이언 미첼

https://kimdoky.github.io/diary/2017/08/26/Telegram_bot.html

https://beomi.github.io/2017/04/20/HowToMakeWebCrawler-Notice-with-Telegram/

 

  • profile
    이니스프리 2017.11.19 21:11
    추신:
    게시판 가장 위에 공지글이 들어간 경우에는
    latest = posts[0].text 이 부분에서
    숫자를 바꿔줘야 합니다.
    공지글이 한 개이면 posts[1], 두 개이면 posts[2] 이런 식으로요 ^^
  • profile
    title: 황금 서버 (30일)humit 2017.11.19 21:26
    with를 이용해서 open을 하시면 따로 close를 하지 않으셔도 됩니다 :)
    그리고 보통 Accept에 해당하는 헤더는 명시를 하지 않으셔도 데이터를 가져오는데에는 문제가 없습니다.
  • profile
    이니스프리 2017.11.19 21:38
    앗 그렇군요 ^-^ 군대에서 바쁘실텐데 리플 달아주셔서 감사합니다!
    제가 파이썬을 제대로 공부한게 아니라 실은 책만 여러 권 사놓고 제대로 정독하지를 못하다보니
    역시 미흡한 부분이 많네요 ㅠㅠ
    다음엔 좀 더 제대로 공부하고 짜볼게요~
    내일모레 계속 눈내리고 춥다는데 humit 님께서도 군대에서 항상 건강하시길 기원합니다!
  • profile
    이니스프리 2017.11.22 00:06
    추신2:
    실행시 에러가 나는 경우에는 봇에게 아무 말이나 한 번 걸어주시면 됩니다 ^^
    현재까지 잘 작동하는 것을 확인했습니다
    그리고 텔레그램은 웹버전보다는 윈도우 앱버전(포터블도 있어요)이
    더 안정적이고 살짝 더 빠른 것 같네요 :)

  1. 매우 특이한 버그

  2. 내가 만든 함수 모음집 2

  3. 내가 만든 사칙연산 계산기

  4. 내가 만든 함수 모음집

  5. 클라이언트단에서 이미지 리사이징

  6. HEX를 RGB로, RGB를 HEX로 바꾸는 PHP 코드

  7. c 이진트리 전,중,후위 알고리즘

  8. html 초보가 만든 자소서

  9. Hello, World!를 출력해보자

  10. 아주 간단한 기초 C++

  11. 미완성 받아쓰기 (C)

  12. Cmd 에서 서비스 시작 / 종료하기

  13. CMD로 로컬 연결 고정 IP 설정하기

  14. 컴퓨터의 uuid 얻기

  15. 유튜브에 약간의 기능을 추가 해주는 크롬 확장 프로그램.

  16. 사이트 서버 이전 (또는 미러링 사이트 구축) 쉽게하는 스크립트

  17. 새 글 자동 댓글 스크립트 (AutoHotkey)

  18. 파이썬을 이용한 텔레그램 새 글 알림 (허접합니다)

  19. 브라우저 언어에 따라 다른 폴더를 사용하는 PHP 코드

  20. Git 저장소에서 자동으로 받아 업데이트하는 쉘 스크립트

Board Pagination Prev 1 2 3 4 Next
/ 4