본문 바로가기

휴지통

Python / Telethon 을 사용해보자 3장 - 메세지 상호작용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# In[0]:asyncio
from telethon import TelegramClient,events
import asyncio
import nest_asyncio
 
api_id = '5315315315'
api_hash = 'adbdabdabda531531adv'
client = TelegramClient('session_file', api_id, api_hash)
 
async def Run_Telethon():    
    await client.start()
    await client.run_until_disconnected()
 
@client.on(events.NewMessage)
async def handler(event):
    msgs=str(event)
    print(msgs)
    await event.reply('안녕!')
    
nest_asyncio.apply()
asyncio.run(Run_Telethon())
cs

 

위 코드는 프로그램 작동중 새로운 메세지를 수신했을때 발신자에게 '안녕!' 이라고 답장을 보내는 코드입니다.

 

 

1
2
3
from telethon import TelegramClient,events
import asyncio
import nest_asyncio
cs

 

모듈을 불러오는 구간은 2장과 별다를바가 없어보이지만 import TelegramClient 뒤에 events 가 추가되었습니다.

이는 텔레그램으로 수신받는 메세지에 상호작용하기위한모듈입니다.

 

 

1
2
3
api_id = '5315315'
api_hash = 'a6315315315313153'
client = TelegramClient('session_file', api_id, api_hash)
cs

 

초반 정적변수를 생성하는 부분은 2장과 같습니다.

 

 

1
2
3
async def Run_Telethon():    
    await client.start()
    await client.run_until_disconnected()
cs

 

await client.start()

세션파일을 열기 또는 생성합니다.

 

await client.run_until_disconnected()

세션파일이 자동으로 닫기지않도록 합니다.

 

 

1
2
3
4
5
@client.on(events.NewMessage)
async def handler(event):
    msgs=str(event)
    print(msgs)
    await event.reply('안녕!')
cs

 

@client.on(events.NewMessage)

프로그램작동중 클라이언트가 새로운메세지를 수신했을때 아래 메서드가 실행됩니다.

 

async def handler(event):

새로운메세지를 받았을때 실행될 메서드입니다. 들어가는 인자는 수신한 메세지입니다.

메서드이름은 굳이 'handler' 가 아니여도 'paper', 'tissue' 등 어떤 이름으로 바꾸어도 무관합니다.

 

msgs=str(event)

메서드 호출시 받는 인자 event의 자료형은 문자열로 변환후 출력해보면 딕셔너리같지만 type(event) 로 출력해보면 자체 클래스형태로 나온다. 그렇기에 메세지를 가공하거나 확인할때는 요로코롬 문자열로 먼저 변환해주어야한다.

 

print(msgs)

변환한 메세지를 이후 확인하기위함이다.

 

await event.reply('안녕!')

송신측에게 괄호안메세지를 답장으로 보낸다.

 

 
1
2
nest_asyncio.apply()
asyncio.run(Run_Telethon())
cs

 

nest_asyncio.apply()

이벤트 루프를 만들어줍니다.

 

asyncio.run(Run_Telethon())

메인 함수를 비동기로 호출합니다.

 

어? 이번엔 세션파일을 정상적으로 닫아주기위한 client.disconnect 가 없네요?

텔레톤모듈의 내장함수인 event 사용하게되면 별다른 메시지 상호작용이없을때 자동으로 세션이 닫기며 프로그램이 종료되게됩니다.

위에 세션을 열자마자 await client.run_until_disconnected() 를 작성해준것은 이와같은 이유입니다.

 

그렇게 모두 작성후 실행을 하게되면,

 

 

콘솔창에 아무내용도 출력되지않습니다.

단연 메인함수인 Run_Telethon() 에서는 세션파일을 열고 세션파일이 종료되지않게 하는것 외에 메세지를 출력하는 내용은 없기때문입니다.

콘솔을 닫지말고 실행되있는채로 텔레그램에서 메세지를 보내봅시다.

 

 

저장된 메세지에서 스스로에게 '안녕!' 이라고 메세지를 보내니 곧바로 '안녕!' 이라는 답장이 옵니다.

 

 

갓 생성한 채널에서 메세지를 보내보았습니다. 똑같이 답장이오네요.

콘솔창을 확인해볼까요?

 

 

되게 이것저것 출력되있습니다.

이게 다 무슨내용일까요?

 

peer_id=PeerUser(user_id=35135315315)

발신또는 수신받은측의 user_id 입니다.

 

date=datetime.datetime(2021, 10, 18, 21, 15, 33, tzinfo=datetime.timezone.utc)

메세지가 수신 또는 발신된 시간입니다.

 

message='저장한 메시지 이구요'

수신받은 메세지의 내용입니다.

 

peer_id=PeerChannel(channel_id=53153155)

채널의 경우 이렇게 user_id 가아닌 channel_id 로 나오게됩니다.

 

이 내용들은 차후 받아온 메세지를 가공하여 특정상황에만 별도 메서드들을 호출하는방식으로 사용할수있겠죠? 

그리고 위 이미지에서는 혼자서 주고받는거기때문에 발신측과 수신측의 user_id가 모두 같게나오는데

 

NewMessage.Event(original_update=UpdateNewMessage(message=Message(id=1641, peer_id=PeerUser(user_id=봇id), date=datetime.datetime(2021, 10, 18, 21, 23, 5, tzinfo=datetime.timezone.utc), message='hi', out=True, mentioned=False, media_unread=False, silent=False, post=False, from_scheduled=False, legacy=False, edit_hide=False, pinned=False, from_id=PeerUser(user_id=유저id), fwd_from=None, via_bot_id=None, reply_to=None, media=None, reply_markup=None, entities=[], views=None, forwards=None, replies=None, edit_date=None, post_author=None, grouped_id=None, restriction_reason=[], ttl_period=None), pts=3591, pts_count=1), pattern_match=None, message=Message(id=1641, peer_id=PeerUser(user_id=봇id), date=datetime.datetime(2021, 10, 18, 21, 23, 5, tzinfo=datetime.timezone.utc), message='hi', out=True, mentioned=False, media_unread=False, silent=False, post=False, from_scheduled=False, legacy=False, edit_hide=False, pinned=False, from_id=PeerUser(user_id=유저id), fwd_from=None, via_bot_id=None, reply_to=None, media=None, reply_markup=None, entities=[], views=None, forwards=None, replies=None, edit_date=None, post_author=None, g

 

봇에게 메세지를 보내어 출력한 내용입니다.

이런경우엔 수신측과 발신측의 id가 다른것을볼수있습니다.

 

텔레톤모듈관련 포스트는 여기서 마치겠으며 별도 궁금한 사항이나 지적사항이 있는경우 댓글로 남겨주시면 감사하겠습니다.