반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

<Telegram 패키지 관련 지난 글>

 

2021.04.03 - [파이썬 패키지/텔레그램(Telegram)] - [Python / Telegram] 파이썬으로 Telegram bot 사용하는 법 (feat. 공시정보알림 탤레그램 봇 소개)

2021.12.05 - [파이썬 패키지/텔레그램(Telegram)] - [Python/Telegram] 파이썬으로 텔레그램 채널 관리 봇(bot) 사용하는 법_1편.채널 추가 및 관리자로 봇 추가(코딩 ㄴㄴ)


 

오늘은 지난 시간 생성한 채널에 봇을 이용해서 메시지를 보내는 방법을 포스팅 해보겠습니다.

 

 

1. 대화방의 chat_id 파악하기

 

지난 시간 텔레그램 봇을 생성하고, 채널도 생성하셨다면 이제 코딩을 할 시간입니다.

 

시작 전에 살포시 import를 해주겠습니다.

 

# 만약 설치가 안되어 있으면 터미널 창에 pip install python-telegram-bot 입력
import telegram

 

봇이 채팅을 할 수 있도록 하려면 2가지 정보가 필요합니다.

 

 

1) 봇의 토큰 정보

 

가장 기본적으로 필요한 봇 토큰과 토큰을 이용해서 봇을 불러오는 코드입니다.

#토큰을 변수에 저장 (대략 이렇게 생겼음: '0123456789:AABBCCDDGdv1mI8zOcd9d7d7q87q9qQ')
bot_token = '각자 생성한 봇의 고유 토큰 입렵(타인에게 노출하지 말 것)'

#telegram 패키지의 Bot 함수를 사용하여 내가 만든 bot 객체화
bot = telegram.Bot(token = bot_token)

 

만약 봇의 토큰 정보를 모르시는 분들은 텔래그램 관련 지난 글 중, 첫번째 글을 참고해주세요.

 

 

2) chat_id

 

오늘의 핵심은 chat_id의 개념입니다.

 

텔레그램의 대화방은 각각 고유한 chat_id를 가지고 있습니다.

우리가 봇을 이용해서 메시지를 보내기 위해서는 대화방의 chat_id를 알아야만 하죠.

 

chat_id를 알기 위해서는 일단 대화방에서 우리가 아무말이나 입력해서 전송해야합니다.

 

우선 여러분들이 만드신 봇(저의 경우엔 DART)의 대화방에 들어가셔서 아무말이나 입력해보세요.

 

그런 후에 아래의 코드를 실행합니다. (물론 위의 코드들이 선행되어야 합니다)

 

# bot과의 채팅 정보 및 메세지 업데이트
updates = bot.getUpdates()

# updates에 들어있는 내용 하나씩 꺼내어 출력
for i in updates :
    print(i)
    print('\n')

 

출력 결과는 이렇게 생겼습니다. 아주 길다란 딕셔너리 형태입니다. 

{'message': {'photo': [], 'chat': {'first_name': 'Sangwoo', 'type': 'private', 'id': 1516137537}, 'entities': [], 'channel_chat_created': False, 'new_chat_members': [], 'caption_entities': [], 'message_id': 255, 'new_chat_photo': [], 'delete_chat_photo': False, 'text': '여기는 봇과의 대화방', 'date': 1638625002, 'group_chat_created': False, 'supergroup_chat_created': False, 'from': {'first_name': 'Sangwoo', 'is_bot': False, 'language_code': 'ko', 'id': 1516137537}}, 'update_id': 899725563}

 

이걸 정리해서 보면 아래와 같은 구조를 갖고 있어요. 중요하게 볼 부분은 바로 chat 안의 id입니다.

저기 보이는 숫자가 제 봇 채팅방의 고유한 id인 것입니다. (단, 봇 토큰이 없으면 저 아이디를 알아도 채팅을 보낼 권한이 없답니다.)

 

참고로 type은 private, 즉 개인톡방입니다. 다음에 배울 채널 대화방은 channel이라고 나와요.

봇 채팅방의 chat_id

 

동일하게 여러분들이 지난 시간 만드신 채널에도 아무 채팅이나 전송한 후에 같은 코드를 실행하시면 아래와 같은 결과를 얻으실 수 있습니다.

채널 채팅방의 chat_id

 

2. 봇으로 메시지 보내기

 

여기까지 하셨으면 메시지를 보내는 방법은 너무나도 간단합니다.

 

# 위에서 파악한 코딩유치원 채널 id
chat_id = '-1001415675502'

#위에서 얻은 chat id로 bot이 메세지를 보냄.
bot.sendMessage(chat_id = chat_id, text="봇으로 보내는 메시지")

 

첫 메시지가 제가 직접 입력한 것이고, 두 번째 메시지가 위의 코드로 전송한 메시지 입니다. 

 

이렇게 봇으로 메시지를 보내는 방법을 이용하면 아래와 같은 프로젝트도 가능하답니다.

 

2021.04.05 - [파이썬 패키지/텔레그램(Telegram)] - [Python/Telegram] 원하는 주제의 네이버 뉴스 텔레그램으로 5분마다 전송 받기

 

[Python/Telegram] 원하는 주제의 네이버 뉴스 텔레그램으로 5분마다 전송 받기

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다. 코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도

coding-kindergarten.tistory.com

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 


 

오늘은 텔레그램 채널을 생성하고 지난 시간에 생성했던 자신만의 텔레그램 봇을 관리자로 추가하는 방법과 그렇게 생성한 채널에 봇을 이용해서 글, 사진, 링크 등을 보내는 방법을 포스팅 해보겠습니다.

 

저의 경우엔 실시간으로 정보를 받는 것을 목적으로 했기에 스마트폰에 텔레그램 어플을 설치해서 사용했습니다.

(사용해보진 않았지만 컴카톡처럼 컴퓨터용 텔레그램 앱이 있다고 더라구요)

 

1. 채널 생성하는 법

 

1) 텔레그램 채널 목록창에서 우측 하단의 연필 모양의 버튼을 클릭합니다.

 

2) 클릭하시면 아래와 같은 화면이 나올텐데, 채널 만들기를 클릭해주세요.

    (연필 모양을 클릭했을 때, 연락처 동기화에 대한 팝업창이 뜨는데 저는 하지 않았습니다)

 

3) 채널명과 채널 설명을 원하시는데로 작성하시고 우측 상단의 체크모양을 클릭해주세요.

 

4) 다음으로는 채널 공개/비공개를 선택하는 단계입니다. 

     이 부분은 추후에도 변경가능하므로 일단 비공개를 선택 후, 우측 상단의 체크 버튼을 눌러주세요.

 

5) 구독차를 추가하는 단계이지만, 그런거 없으니깐 바로 우측 하단의 버튼을 누르시고 다음단계로 넘어가주세요.

 

6) 채널이 완성되었습니다.

 


2. 채널 관리자로 봇을 추가하는 법

 

1) 방금 전 생성된 채널의 채널명이 있는 부분을 클릭하면 설정창이 출력됩니다.

 

 

출력된 설정창에서 관리자 탭을 클릭해주세요.

 

2) 관리자 추가 탭을 클릭해주세요.

 

3) 우측 상단의 검색 버튼을 클릭해주세요.

각자 생성하셨던 봇의 이름을 검색해서 선택해주세요.

(저는 DART 공시정보 프로젝트를 하던 중에 생성했던지라 이름이 DART입니다)

 

4) 관리자 권한 설정부분이 있으나, 어차피 제가 조정하는 봇이니 그냥 쿨하게 전권을 주고 우측상단의 체크버튼을 클릭해줍니다.

 

5) 여기까지 완료하셨으면 여러분들이 만드신 봇이 채널의 관리자가 된 것을 확인하실 수 있답니다.

 


사진으로 인해서 너무 글이 길어질 듯하여 2편에서 파이썬으로 방금 생성한 채널을 다루는 방법을 포스팅 하겠습니다.

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

<관련 글>

 

2021.05.20 - [파이썬 프로젝트] - 일론 머스크 트위터 실시간 크롤링을 통한 비트코인 매매 수익률 검증 (feat. Tesla has Diamond Hands)

2021.05.20 - [파이썬 프로젝트] - 일론 머스크 트위터 실시간 크롤링을 통한 도지코인 매매 수익률 검증 (feat. How much is that Doge in the window?)

 


 

오늘은 최근 코인 열풍의 가장 중심에 있는 테슬라의 CEO인 일론 머스크의 트위터를 실시간 크롤링해보았습니다.

 

이 프로젝트는 일론 머스크의 말 한마디에 비트코인과 도지코인의 가격이 급등락하는 비이성적인 상황을 이용해서 코인 투자를 해보면 어떨까라는 생각에서 시작하였습니다.

 

이 프로젝트의 목적은 다음과 같습니다.

 

"일론 머스크 트위터를 실시간으로 감시하여, 새로운 트윗에 올라 왔을 때 텔레그램 봇을 이용해서 나에게 알려준다"

 

근 시일 내로 네이버 클라우드 플랫폼을 이용해서, 오늘 만든 코드를 계속 실행시켜줄 나만의 서버를 만들고,  텔래그램 채널을 만들어서 다른 사람들도 이용할 수 있는 서비스로 만들 계획입니다.

 


 

<2021년 5월 16일 글 수정>

 

이 글을 작성한 다음날 우연히 제가 생각하던 서비스를 이미 텔래그램 채널로 구현해놓은 것을 발견하여 공유하고자 합니다.

 

먼저 텔레그램 앱을 휴대폰에 설치하신 후, 아래와 같이 elon musk twitter 채널을 검색해 줍니다.

 

 

위의 채널을 클릭하고 들어가서 화면 화단의 알림켜기를 눌러주시면 실시간으로 일론 머스크 관련 트위터를 받아 보실 수 있습니다.

참고로, Elon Musk 개인 트위터 뿐만 아니라 SpaceX의 트위터도 실시간으로 알려주는 것으로 파악됩니다.

 

 


 

<혼자 진행했던 파이썬 프로젝트 코드>

 

오늘은 일단 컴퓨터에서 파이썬 코드가 돌아갈 때, 제 개인 텔레그램 봇을 이용해 메시지를 보내는 것 까지 해보았습니다.

 

전공자가 아니라서 코드가 매우 지저분 할 수 있다는 점 양해바랍니다.

 

#step1.라이브러리 불러오기

#웹 크롤링을 위한 패키지
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

#사용자에게 메시지 전송을 위한 패키지
import telegram

#주기적으로 프로그램을 작동시키기 위한 패키지
from apscheduler.schedulers.blocking import BlockingScheduler

#step2.텔레그램 봇 불러오기

#토큰을 변수에 저장
bot_token = '자신의 텔레그램 봇 토큰 입력'

#telegram 패키지의 Bot 함수를 사용하여 내가 만든 bot 사용
bot = telegram.Bot(token = bot_token)

#bot과의 채팅 정보 및 메세지 업데이트
#예전(불과 어제)의 정보를 못 불러오는 것으로 파악됨. 프로그램 시작 전에 bot에게 아무 메시지나 보내주어야함

#가장 최근에 온 메세지의 정보 중, chat id만 가져옴 (이 chat id는 사용자(나)의 계정 id임)
chat_id = bot.getUpdates()[-1].message.chat.id

#위에서 얻은 chat id로 bot이 메세지를 보냄.
bot.sendMessage(chat_id = chat_id, text="Elon Musk의 트위터 실시간 크롤링이 시작 되었습니다") 


#step3.주기적으로 명령을 실행할 스케쥴러 생성
sched = BlockingScheduler()

#step4.기존에 보냈던 메시지를 담아둘 리스트 만들기
old_contents = []

#step5.트위터 메시지 크롤링 함수 만들기 (매개변수는 이전에 수집해둔 메시지가 담긴 리스트)
def get_content(old_contents=[]):

	#크롬드라이버로 일론 머스크 트위터 접속
    url = 'https://twitter.com/elonmusk'
    driver = webdriver.Chrome('크롬 드라이버의 디렉토리(경로) 입력')
    driver.get(url)
    time.sleep(3)

    contents = []

    for i in range(10):
        
        try:
            twitter = driver.find_element_by_xpath(f'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/div[1]/div/div[2]/div/div/div[2]/section/div/div/div[{i}]/div/div/article/div/div/div/div[2]/div[2]/div[2]/div[1]/div/span')
            contents.append(twitter.text)

        except:
            pass
   
    time.sleep(3)

    new_contents=[]

    for content in contents:
        if content not in old_contents:
            new_contents.append(content)
    
    return new_contents

#step6.텔레그램 메시지 전송 함수 만들기
def send_contents():
    global old_contents
    new_contents = get_content(old_contents)

    if new_contents:
        for content in new_contents:
            bot.sendMessage(chat_id=chat_id, text=content)
    else:
        # pass
        bot.sendMessage(chat_id=chat_id, text='새로운 트윗 없음')
        # else일 때 아무것도 안보내고 싶으면 그냥 pass로 바꾸면 됨. 실제 사용 때는 pass로 할 것

    old_contents += new_contents.copy()
    # old_contents = list(set(old_contents))

#step7.최초 시작, 스케쥴러 세팅 및 작동
send_contents()

# hours는 시, minutes는 분, seconds는 초
sched.add_job(send_contents, 'interval', seconds=10)

sched.start()

 

<새로 배운 점>

 

1. 정적 크롤링 방식으로는 twitter에서 막아둔 것인지 크롤링이 되지 않음  --> 실제 사용자가 클릭하 듯 동적 크롤링 방식 이용

 

2. css selector로 선택하기 어려운(아직 내가 잘 몰라서) 부분을 xpath의 규칙을 이용해 선택해서 크롤링 함

 

사용한 코드

for i in range(10):
        
        try:
            twitter = driver.find_element_by_xpath(f'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/div[1]/div/div[2]/div/div/div[2]/section/div/div/div[{i}]/div/div/article/div/div/div/div[2]/div[2]/div[2]/div[1]/div/span')
            contents.append(twitter.text)

        except:
            pass

 

일론 머스크 트위터의 4, 5, 6번째 메시지의 xpath

 

# //*[@id="react-root"]/div/div/div[2]/main/div/div/div/div[1]/div/div[2]/div/div/div[2]/section/div/div/div[4]/div/div/article/div/div/div/div[2]/div[2]/div[2]/div[1]/div/span

 

# //*[@id="react-root"]/div/div/div[2]/main/div/div/div/div[1]/div/div[2]/div/div/div[2]/section/div/div/div[5]/div/div/article/div/div/div/div[2]/div[2]/div[2]/div[1]/div/span

 

# //*[@id="react-root"]/div/div/div[2]/main/div/div/div/div[1]/div/div[2]/div/div/div[2]/section/div/div/div[6]/div/div/article/div/div/div/div[2]/div[2]/div[2]/div[1]/div/span

 

 

<해결 못 한 점>

 

send_contents 함수에서 실행되는 get_contents가 실행될 때 마다 크롬 창이 떠서 불편함

 

#크롬 드라이버 실행 시 (창 뜨지 않는 옵션 추가)

 

options = webdriver.ChromeOptions()

options.add_argument("headless")

options.add_argument("--disable-gpu")

options.add_argument("lang=ko_KR")



driver = webdriver.Chrome('크롬 드라이버 경로', chrome_options=options)

 

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 지난번 계획했던 원하는 주제의 네이버 뉴스 텔레그램으로 주기적으로 전송 받는 프로젝트를 완료해서 공유할 겸 글을 씁니다.

 

<해당 프로젝트 관련된 이전 글>

2021.04.03 - [파이썬 프로젝트] - Python으로 Telegram bot 사용하는 법 (feat. 공시정보알림 탤레그램 봇 소개)

2021.04.04 - [파이썬 패키지] - 파이썬 텔레그램 봇 개념 총정리(python-telegram-bot)

 

전체 코드는 아래와 같으니, 필요하신 분들은 마음껏 가져다 쓰셔도 됩니다. 최대한 자세하게 주석을 달아놓았으니 보고 모르시는 것 있으시면 댓글로 질문해주세요. 개선에 대한 아이디어도 환영입니다!

 

#step1.라이브러리 불러오기
import requests
from bs4 import BeautifulSoup as bs
import telegram
import schedule
import time

#step2.새로운 네이버 뉴스 기사 링크를 받아오는 함수
def get_new_links(old_links=[]):
    
    # (주의) 네이버에서 키워드 검색 - 뉴스 탭 클릭 - 최신순 클릭 상태의 url
    url = f'https://search.naver.com/search.naver?where=news&query={query}&sm=tab_opt&sort=1&photo=0&field=0&pd=0&ds=&de=&docid=&related=0&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so%3Add%2Cp%3Aall&is_sug_officeid=0'
    
    # html 문서 받아서 파싱(parsing)
    response = requests.get(url)
    soup = bs(response.text , 'html.parser')

    # 해당 페이지의 뉴스기사 링크가 포함된 html 요소 추출
    news_titles = soup.select('a.news_tit')
    
    # 요소에서 링크만 추출해서 리스트로 저장
    list_links = [i.attrs['href'] for i in news_titles]
    
    # 기존의 링크와 신규 링크를 비교해서 새로운 링크만 저장
    new_links = [link for link in list_links if link not in old_links]
    
    return new_links


#step3.새로운 네이버 뉴스 기사가 있을 때 텔레그램으로 전송하는 함수
def send_links():
    
    # 함수 내에서 처리된 리스트를 함수 외부에서 참조하기 위함
    global old_links
    
    # 위에서 정의했던 함수 실행
    new_links = get_new_links(old_links)

    # 새로운 메시지가 있으면 링크 전송
    if new_links:
        for link in new_links:
            bot.sendMessage(chat_id=chat_id, text=link)
    # 없으면 패스
    else:
        pass
    
    # 기존 링크를 계속 축적하기 위함
    old_links += new_links.copy()


# 실제 프로그램 구동
if __name__ == '__main__':

    #토큰을 변수에 저장
    bot_token ='자신이 생성한 봇의 토큰 정보'

    bot = telegram.Bot(token = bot_token)

    #가장 최근에 온 메세지의 정보 중, chat id만 가져옴 (이 chat id는 사용자(나)의 계정 id임)
    chat_id = bot.getUpdates()[-1].message.chat.id

    #step4.검색할 키워드 설정
    query = input('크롤링 할 뉴스기사 키워드를 입력하세요: ')

    #위에서 얻은 chat id로 bot이 메세지를 보냄.
    bot.sendMessage(chat_id = chat_id, text=f"{query}를 주제로 뉴스 기사 크롤링이 시작 되었습니다") 
    
    #step5.기존에 보냈던 링크를 담아둘 리스트 만들기
    old_links = []

    # 주기적 실행과 관련된 코드 (hours는 시, minutes는 분, seconds는 초)
    job = schedule.every(10).seconds.do(send_links)
    
    while True:
        
        schedule.run_pending()
        time.sleep(1)

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

 

오늘은 컴퓨터가 사용자에게 메세지를 보내줄 수 있도록 해주는 python-telegram-bot이라는 파이썬 패키지를 공부해보겠습니다.

 

이 패키지를 확실히 공부해두면 향후에 제가 계획하고 있는 '실시간 뉴스 기사 크롤링 및 메세지 전달' 프로젝트를 보다 쉽게 할 수 있을 것 같아서 정리해보았습니다. 참고로 이번 글을 따라오시려면 지난 시간의 글을 참고하셔서 telegram 앱을 휴대폰에 설치하셔야합니다.

 

2021.04.03 - [파이썬 프로젝트] - Python으로 Telegram bot 사용하는 법 (feat. 공시정보알림 탤레그램 봇 소개)

 


설치 및 import 방법

import할 모듈이 여러가지가 있는데, 사용할 기능에 따라 선택적으로 import 하시면 됩니다. 잘 모를 때는 일단 그냥 다 import 하시는 것을 추천드립니다.

#텔레그램 모듈 설치(pip와 conda 두 가지중에 하나 선택해서 설치) 
pip install python-telegram-bot --upgrade 
conda install -c conda-forge python-telegram-bot 

#텔레그램 모듈 import
import telegram 
from telegram.ext import Updater
from telegram.ext import CommandHandler
from telegram.ext import MessageHandler, Filters

 

<참고. import telegram이 잘 안될 때>

case1. 설치가 잘 되지 않았을 때

터미널 창에서 pip list나 conda list를 입력하면 설치된 파이썬 패키지들을 확인해볼 수 있습니다. python-telegram-bot이 잘 설치되있는지 확인해주세요. 주의할 점은 vscode에서 현재 프로젝트에 사용중인 환경이 anaconda인지 python인지 확인하고, 거기에 맞는 명령어로 설치해야한다는 것입니다.

 

case2. 설치가 되어 있는데도 되지 않을 때

 

cmd창에 AttributeError: partially initialized module 'telegram' has no attribute 'Bot' (most likely due to a circular import)라고 출력될 때가 있습니다. 이 경우는 현재 실행중인 파이썬 파일(.py)의 이름이 telegram.py로 되어 있는 경우입니다.

 

 

 

 

 

패키지 작동 구조

 

 

Updater: User(사용자)로부터 새로운 명령이나 메시지가 왔는지 주기적으로 확인

Queue: Updater를 통해 받은 명령이나 메시지를 임시저장

Dispatcher: Queue에 저장된 명령이나 메시지를 분류하여 Handler의 목적에 맞게 전달

Handler: 각 요청에 대하여 맡은 역할을 수행

 

 

텔레그램 명령어 처리

텔레그램에는 /명령어 형식으로 채팅을 치면 그것에 맞는 행동을 bot이 실행합니다. 아래 코드는 그런 기능을 구현할 수 있는 기초 코드라고 할 수 있겠습니다. 주석을 자세히 달아두었으니 참고하세요.

#step1.telegram 패키지의 Updater, CommandHandler 모듈 import
from telegram.ext import Updater
from telegram.ext import CommandHandler

#step2.Updater(유저의 입력을 계속 모니터링하는 역할), Dispatcher
updater = Updater(token='발급받은 bot_token 입력', use_context=True)
dispatcher = updater.dispatcher

#step3./start 명령어가 입력되었을 때의 함수 정의
def start(update, context):
    context.bot.send_message(chat_id=update.effective_chat.id, text="반가워요!")

#step4.위에서 정의한 함수를 실행할 CommandHandler 정의
start_handler = CommandHandler('start', start) #('명렁어',명령 함수)

#step5.Dispatcher에 Handler를 추가
dispatcher.add_handler(start_handler)

#step6.Updater 실시간 입력 모니터링 시작(polling 개념)
updater.start_polling()

 

 

텔레그램 메시지 처리

아래의 코드는 사용자가 전송한 메세지를 다시 되돌려 주는 코드입니다. 추후에 def echo를 조금 바꿔서 뉴스 기사의 링크를 보내주도록 해주면 제가 원하는 기능을 구현할 수 있을 것 같네요. 참고로 Filters 모듈은 MessageHandler에서 명령어는 되돌려 주지 않고, 텍스트만 되돌려주도록 걸러주는 필터 역할을 할 때 사용합니다.

#step1.telegram 패키지의 Updater, CommandHandler 모듈 import
from telegram.ext import Updater
from telegram.ext import MessageHandler, Filters

#step2.Updater(유저의 입력을 계속 모니터링하는 역할), Dispatcher
updater = Updater(token='발급받은 bot_token 입력', use_context=True)
dispatcher = updater.dispatcher

#step3.메시지가 입력되었을 때의 함수 정의
def echo(update, context):
    user_id = update.effective_chat.id
    user_text = update.message.text
    context.bot.send_message(chat_id=user_id, text=user_text)

#step4.위에서 정의한 함수를 실행할 CommandHandler 정의
echo_handler = MessageHandler(Filters.text & (~Filters.command), echo) #(메시지&명령어 제외, 함수)

#step5.Dispatcher에 Handler를 추가
dispatcher.add_handler(echo_handler)

#step6.Updater 실시간 입력 모니터링 시작(polling 개념)
updater.start_polling()

 


오늘은 여기까지 정리해보고, 다음에는 원하는 주제의 네이버 뉴스 기사를 실시간으로 모니터링 해서, 새로 올라오는 기사의 링크를 텔레그램 봇으로 사용자에게 전송해주는 프로젝트를 해보겠습니다.

 

혹시 필요하신 분들은 공유해놓은테니 또 찾아주세요!

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

저는 최근에 '파이썬으로 전자공시를 실시간으로 받을 수는 없을까'하는 생각이 들었습니다.

 

계속해서 공시정보를 모니터링을 새로운 내용이 있을 때, 저에게 메세지를 보내주는 것이죠.

 

직접 개발해 보려고 공부하던 중, 메시지를 보내는 방법으로 n번 방 사건으로 유명해졌던 텔레그램을 알게되었습니다.

결론적으론 공부하다가 이미 만들어진 것이 있어서 잘 사용하고 있지만, 공부했던 것이 아쉬워서 정리해놓는 겸 포스팅 해봅니다.


텔레그램 공시정보알림 서비스

 

코딩 내용에는 관심 없으실 분을 위해 먼저 서비스를 소개 드리겠습니다. '공시정보알림'이라는 텔래그램 봇인데 아주 유용해서 공유드립니다. 좋은 서비스를 무료로 제공해 주시는 chumy님께 감사의 인사 드립니다.

 

 

https://blog.naver.com/chumy/220548115079

 

텔레그램용 금감원 DART 푸쉬 서비스

2015.11.27 사용자 1000명을 넘었습니다.많은 관심에 감사드립니다. 최근에 파이썬 언어를 공부중이다. 2주...

blog.naver.com

https://m.blog.naver.com/chumy/220717965137

 

텔레그램용 공시정보 봇 업데이트

텔레그램용 공시정보 봇에 새로운 구독 기능이 생겼습니다. 텔레그램용 공시정보 봇에 대한 기본정보 안내...

blog.naver.com


 

지금부터는 파이썬으로 텔레그램 봇 이용하는 법을 정리해보겠습니다.

1. 텔레그램 봇(telegram bot) 만들기

 

시작하기 전에 아래의 두가지 개념이 다른 것을 알아야 합니다.

 

계정 : 하나의 주체 (사용자 or 봇)

채널: 오픈 채팅방

텔레그램에서 BotFather를 검색하면 아래와 같은 이미지와 아이디의 bot이 나옵니다. (비슷한거 많으니 주의할 것)

 

해당 BotFather를 클릭해서 들어간 후, 채팅창에 /start를 입력하고 /newbot을 입력하면, 봇의 이름아이디를 지어달라고 요구하는데, 원하는 것으로 하면 됩니다. 저는 봇의 이름은 DART, 아이디는 swdart_bot으로 하였습니다. (DART_bot이라고 했다가 한 번 거절당함)

 

여기까지 하면 새로운 나만의 봇을 만들 수 있습니다.

그러면 token 정보가 포함된 메시지를 회신해 주는데, 이는 나중에 파이썬에서 해당 봇에 접근할 수 있게 해주는 키입니다.

보안상 이미지는 모자이크 처리했고 대충 아래형식처럼 생겼습니다. 1234567890:h1jh12hj35v5jh43hjb436bkj6jk6

현재 봇은 생성된 상태이지만 봇은 저에 대한 정보가 없는 상태입니다. 만드신 봇을 검색해서 들어간 후에, 아무 메세지나 보내면 내 계정에 대한 정보가 봇에게 인식됩니다.

 

2. 파이썬으로 텔레그램 봇과 채팅해보기

#텔레그램 모듈 설치 (pip와 conda 두 가지중에 하나 선택해서 설치)
pip install python-telegram-bot --upgrade 
conda install -c conda-forge python-telegram-bot

import telegram #텔레그램 모듈 import

bot_token = '만든 봇으로부터 받은 토큰 정보' #토큰을 변수에 저장

bot = telegram.Bot(token = bot_token) # telegram 모듈의 Bot 함수를 사용하여 bot_token으로 접근 가능한 bot 생성

updates = bot.getUpdates() #bot과의 채팅 정보 및 메세지 업데이트

for i in updates :
    print(i) #update_id와 message로 크게 두 가지 정보가 딕셔너리 형태로 저장
    print(i.message) # 내역중 message 정보를 출력

chat_id = bot.getUpdates()[-1].message.chat.id

# 앞에서 사용한 bot.getUpdates 함수는 list 형식을 리턴
# list 문법에 의해 [-1]은 가장 마지막에 저장된, 즉, 가장 최근에 온 메세지의 정보를 가리킴
#message 정보 안에서 chat id만 가져옴

bot.sendMessage(chat_id = chat_id, text="야, 아무말이나 던져봐") #위에서 얻은 chat id로 메세지를 보냄.

<참고. import telegram이 잘 안될 때>

 

case1. 설치가 잘 되지 않았을 때

 

vscode에서 현재 프로젝트에 사용중인 환경이 anaconda인지 python인지 확인하고, 거기에 맞게 설치할 것

 

case2. 설치가 되어 있는데도 되지 않을 때

 

pip list나 conda list로 확인해보았을 때, python-telegram-bot이 잘 설치되어 있는데도 안되는 경우는 현재 실행중인 파이썬 파일(.py)의 이름이 telegram.py로 되어 있는 경우입니다.

AttributeError: partially initialized module 'telegram' has no attribute 'Bot' (most likely due to a circular import)

 

okky.kr/article/687902

 

OKKY | 파이썬 pip 및 텔레그램 모듈 설치관련 질문입니다.

import telegram bot telegram.Bot(token 1113056609:AAFjEaq2gQMQ5XH5g-ChaFYhdxxxxxx ) print(bot.getUpdate()) 위와같이 테스트 코드를 작성하였습니다. telegram 모듈을 사용하기위해  https://python-teleg

okky.kr


 

일단 여기까지 정리해보았고, 다음에는 원하는 주제의 기사를 네이버에서 검색하여, 지정한 주기마다 새로 올라온 기사들의 링크를 텔레그램으로 보내주는 것을 해볼 예정입니다.

유력 대선후보들의 이름으로 기사를 검색해서, 대선테마주에 적용해보면 어떨까하는 생각도 듭니다.

반응형

+ Recent posts