조회 수 2377 추천 수 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:
    실행시 에러가 나는 경우에는 봇에게 아무 말이나 한 번 걸어주시면 됩니다 ^^
    현재까지 잘 작동하는 것을 확인했습니다
    그리고 텔레그램은 웹버전보다는 윈도우 앱버전(포터블도 있어요)이
    더 안정적이고 살짝 더 빠른 것 같네요 :)

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
78 코드 [PHP] 이미지를 원하는 크기(원본비율 유지)로 리사이즈 하여 출력 (원본 이미지는 수정하지 않습니다) 6 이니스프리 2018.12.20 7706
77 코드 [Python] Selenium을 이용하여 특정 element를 캡처하는 스크립트 2 file 이니스프리 2019.07.03 5902
76 코드 [파이썬] Requests를 사용한 네이버 카페 크롤링 - 일정수 이상의 리플이 달린 게시글만 텔레그램 알림 3 file 이니스프리 2019.11.17 4183
75 코드 [Python] 텔레그램을 이용한 게시판 새 글 알림봇 7 이니스프리 2018.12.02 3513
74 코드 새 글 자동 댓글 스크립트 (AutoHotkey) 9 이니스프리 2017.11.26 3452
» 코드 파이썬을 이용한 텔레그램 새 글 알림 (허접합니다) 4 이니스프리 2017.11.19 2377
72 코드 [Python] 싸이월드 미니홈피 백업 스크립트 1 이니스프리 2019.11.07 2165
71 코드 [Python] url 주소로부터 IP 주소 알아내기 title: 황금 서버 (30일)humit 2020.02.20 2059
70 코드 [오토핫키] 특정 사이트에 대한 ping 테스트 결과를 실행시간과 함께 로그 파일로 저장하는 스크립트 2 이니스프리 2018.09.22 1912
69 코드 [오토핫키] 구글 드라이브의 공유링크를 이미지 호스팅을 위한 다이렉트 링크로 바꿔주는 스크립트 10 file 이니스프리 2018.09.25 1671
68 코드 엑셀 읽어서 그래프 그려주는 함수 1 국내산라이츄 2017.08.03 1423
67 코드 [Python] 네이버 모바일 이미지 검색에서의 이미지 파일을 멀티스레드로 다운받고 1개의 파일로 병합 11 file 이니스프리 2019.07.12 1376
66 코드 [아미나] Dropbox API를 이용한 이미지 호스팅 보드스킨 12 file 이니스프리 2019.07.13 1373
65 코드 [Python-Gnuboard] 파이썬으로 구현한 그누보드 자동 글쓰기 함수 1 file 이니스프리 2021.04.08 1215
64 코드 [Python] 휴일지킴이 약국을 크롤링하여 Folium 지도에 마커로 표시하는 PyQt 윈도우 앱 7 file 이니스프리 2021.03.13 1143
63 코드 [Python] 네이버 실시간 검색어 3 title: 황금 서버 (30일)humit 2020.01.23 1123
62 자료 [Autohotkey] 매분 정각에 전체화면을 캡쳐하는 스크립트 4 file 이니스프리 2020.05.22 1102
61 코드 [Python] PIL을 이용한 Animated GIF의 리사이징 file 이니스프리 2019.11.03 1099
60 코드 컴퓨터의 uuid 얻기 5 title: 황금 서버 (30일)humit 2018.01.28 1099
59 코드 클라이언트단에서 이미지 리사이징 6 file 네모 2018.05.06 1078
Board Pagination Prev 1 2 3 4 Next
/ 4