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가 다른것을볼수있습니다.
텔레톤모듈관련 포스트는 여기서 마치겠으며 별도 궁금한 사항이나 지적사항이 있는경우 댓글로 남겨주시면 감사하겠습니다.
'휴지통' 카테고리의 다른 글
C# / switch~case 문 (조건문) (0) | 2022.12.20 |
---|---|
C# / for 문 (반복문) (0) | 2022.12.20 |
Python / Telethon 을 사용해보자 2장 - 세션파일 만들기 (0) | 2022.12.20 |
TELETHON 모듈을 사용해보자 1장 - API키 발급 (0) | 2022.12.20 |
Python 전역변수를 사용하는 여러가지 방법 (0) | 2022.12.20 |