이번에는 텔레그램 챗봇을 만들기 위해서 어떤 라이브러리가 필요한지 그리고 어떻게 설치하는 과정을 나타낼 것이다!
!모듈
이때까지 자료 조사한 결과
import telegram
import bs4
import requests
import asyncio
총 위의 4가지 라이브러리가 필요하다는 사실을 알게 되었다.
위에서부터 하나씩 차례대로 설명을 하며 진행을 하도록 하겠습니다.
import telegram
이 라이브러리는 $ pip install python-telegram-bot이라는 명령어를 통해서 설치할 수 있으며 이 모듈이 있어야 텔레그램의 챗봇과 연결해서 채팅을 보낼 수 있다.
import bs4
이 라이브러리는 파이썬을 통하여 HTML과 XML파일에 있는 데이터를 추출해서 사용할 수 있게 해준다.
여기서는 requests를 통해서 주소 요청 해서 데이터를 추출할 예정이다.
$ pip install beautifulsoup4이라는 명령어를 통해서 설치할 수 있다.
자세한 내용은 여기 링크에서 볼 수 있다.
https://tedboy.github.io/bs4_doc/
import requests
이 라이브러리는 파이썬을 통해서 주소 요청 해주는 기능을 가지고 있다.
$ pip install requests이라는 명령어를 통해서 설치할 수 있다.
자세한 내용은 여기 링크에서 볼 수 있다.
https://docs.python-requests.org/en/latest/user/quickstart/
import asyncio
이 라이브러리는 비동기 방식으로 진행하기 위해서 필요하다.
$ pip install asyncio
위의 글을 통해서 어떤 라이브러리를 사용하지 정했으므로 이제 바로 만들기전에 어떻게 작동하는지 알기위해서 조금씩 예제를 만들어서 사용해봤다. 그리고 챗봇을 통해서 채팅을 보내려면 챗봇의 id를 알아야한다.
1. 그룹 하나를 생성해서 봇을 초대한다.
2. 그리고 아무 채팅이나 하나를 쳐준다.
3. https://api.telegram.org/bot{api키}/getUpdates 사이트에 들어간다.
(api키는 텔레그램 챗봇 만들기(1)에 나와있다)
4. "chat" { id" :-xx~~ 여기 써있는 숫자들이 chat id가 된다.
이 코드를 알아야 챗봇을 제어 할 수 있다.
chat id를 알고 있으므로 바로 예제를 만들어볼 예정이다.
예제 1
import telegram
import asyncio as asy
token = "api토큰 입력해주세요"
bot = telegram.Bot(token)
chat_id = "chat_id 입력해주세요"
async def sleep():
await asy.sleep(10)
async def msg1():
await bot.send_message(chat_id, text="PLZ")
await sleep()
async def msg2():
await bot.send_message(chat_id, text="hello")
await sleep()
async def main():
while True:
await msg1()
await msg2()
asy.set_event_loop_policy(asy.WindowsSelectorEventLoopPolicy())
asy.run(main())
간단하게 내가 속해있는 그룹에 챗봇이 10초마다 채팅을 보내게 된다.
"PLZ"라는 채팅을 보내고 이후 "hello"라는 채팅을 계속 반복적으로 보내는 단순한 예제다.
예제 2
import telegram
import bs4
import requests
import asyncio
async def main():
token = "api토큰을 입력해주세요"
bot = telegram.Bot(token)
url = '' #주소 선언
response = requests.get(url) #주소요청
soup = bs4.BeautifulSoup(response.text, "html.parser") #html 가져오기
news_school = soup.select('a.nttInfoBtn')
list_links = [i.attrs['data-id'] for i in news_school]
old_links = []
new_links = [link for link in list_links if link not in old_links]
i = 1
j = 1
for links in list_links:
news_school = soup.select_one(f'table > tbody > tr:nth-child({i}) > td.ta_l')
new_links = news_school.get_text()
await bot.sendMessage(chat_id="chat_id", text=new_links + "주소" + links)
i += 1
j += 1
if (j == 10): break
old_links = new_links
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
asyncio.run(main())
혹시 몰라서 주소는 안넣었다.
학교 홈페이지에서 데이터를 추출하고 링크를 보내려고 했지만, 링크를 가져오는 과정에서 에러가 있는지 잘 안됐다.
그래서 학교 공지마다 data-id 값이 다르다는 사실을 알고 데이터 id 값을 추출해서 이어 붙이는 방식으로 진행을 하니 일단 내가 원하는 값을 받는 챗봇이 만들어 졌다.
하지만 이걸 그냥 실행시키면 중복되는 링크를 받을 수 있는 상황이 생긴다.
그래서 중복되는 링크를 받는 결과를 막기 위해서 챗봇을 통해서 보낸 data-id를 old_links라고 했을 때 new_links(새로 받는 data-id 모음)와 비교해서 새로운 data-id만 보내는 방식을 진행하려고 했지만 하나의 함수에선 못하고 값을 비교하는 함수를 만들어야겠다는 생각이 들었다.
그리고 코드를 짜면서 만약 무한 반복으로 돌린다면 사이트에 과부하가 올 수 있다는 생각이 들었다. 과부하를 막기위해서 코드를 계속 실행하더라도 1시간, 1시간 반 이렇게 주기적으로 실행하는 코드로 짜야겠다는 생각이 들었다.
'기타 > [Python] 텔레그램 챗봇(Chat Bot) 만들기' 카테고리의 다른 글
텔레그램 챗봇 만들기(1) (1) | 2024.02.19 |
---|