
๋จผ์ , ๋งค์ฃผ ํ๊ฐ์ฉ ์ฌ๋ฆฐ๋ค๋ ์ฝ์์ ๋ชป์ง์ผ์ ์ฃ์กํฉ๋๋ค. ๊ทธ๋๋ง ๊พธ์คํ๊ฒ 10์ผ๊ฐ๊ฒฉ์ผ๋ก ์ฌ๋ฆฌ๋ ํฌ์คํ ์ ๋ ๋ฆ๊ฒ ์ฌ๋ ธ๋ค์. ํ๋ด์ ๋ง์ง๋ง ํฌ์คํ ๊น์ง ์ต์ ์ ๋คํด๋ณด๊ฒ ์ต๋๋ค.
์ด๋ฒ ํฌ์คํ ์์ ๋ค๋ฃฐ๊ฒ์ Telegram API key ๋ฐ๊ธ๋ฐ๊ธฐ์ Python-telegram-bot ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ๋ฒ ์ ๋๋ค.
๋ง์ง๋ง์๋ ์ ๊ธ ์๋ฆผ ๋ด ์ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
ํ
๋ ๊ทธ๋จ ๋ด์ ๋ง๋ค๋ ค๋ฉด, ๋จผ์ ํ
๋ ๊ทธ๋จ ๊ณ์ ์ ๋ฐ๊ธ๋ฐ๊ณ BotFather์์ ์๋ด?์ ํตํด์ APIํค๋ฅผ ๋ฐ์์ผ ํฉ๋๋ค.

๋ํ์๋ ๊ฒ์์ "BotFather"๋ฅผ ๊ฒ์ํ์ฌ '/start'๋ฅผ ์
๋ ฅํ๋ฉด ์์ ๊ฐ์ ๋ช
๋ น์ด ๋ฆฌ์คํธ๋ฅผ ์๋ตํด์ค๋๋ค.

๋ค์์ BotFather ๋ํ์ฐฝ์ '/newbot' ์ ์
๋ ฅํ๋ฉด, BotFather๊ฐ ์ ๋ด์ ์ด๋ฆ์ ์์ฒญ ํฉ๋๋ค.
๋ด์ ์ด๋ฆ์ ์ ๋ ฅํด์ค๋๋ค. ์ด ๋ด์ ์ด๋ฆ์ ์ฑํ ๋ฐฉ์์ ๋ณด์ด๋ ์ด๋ฆ์ด๊ณ ๋์ค์ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ง์ผ์ผํ ๊ท์น์ ๋ด ์ด๋ฆ ๋ง์ง๋ง์ 'bot'์ผ๋ก ๋๋์ผ ํฉ๋๋ค.
์ ๋ 'alarm2bot'์ผ๋ก ์ด๋ฆ์ ์
๋ ฅํ์์ต๋๋ค. BotFather๊ฐ ๋ด์ด๋ฆ์ ๋ฐ์๋๋ฆฌ๋ฉด API KEY๋ฅผ ํฌํจํ ์๋ต์ ์ค๋๋ค.
'Use this token to acces the HTTP API:' ์ ๋ํ๋๋ ๋ฌธ์์ด์ด API KEY ์
๋๋ค.
์ด KEY๋ 'aaaaaaaaa:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' ์ ๊ฐ์ด ํํ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด KEY๋ BotFather์๊ฒ ์ฌ์์ฒญํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
ํ
๋ ๊ทธ๋จ API ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์นํ๊ธฐ
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋งํฌ :https://github.com/python-telegram-bot/python-telegram-bot
Jupyter notebook ์
์์ !pip install python-telegram-bot ์
๋ ฅํ์ฌ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํฉ๋๋ค.
import telegram
์ ๋ผ์ธ์ ์ ๋ ฅํ์์๋ ์๋ฌ๋ฉ์์ง๊ฐ ๋์ค์ง ์์๋ค๋ฉด, ์ค์น์ ์ฑ๊ณตํ ๊ฒ์ ๋๋ค.
API_KEY = 'aaaaaaaaa:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
bot = telegram.Bot(token = API_KEY) #bot์ ์ ์ธํฉ๋๋ค.
์์ ๊ฐ์ด alarm2bot ์ด๋ฆ์ผ๋ก ๋ฐ๊ธ๋ฐ์ API ํค๋ฅผ API_KEY ์ ์ ์ฅํด๋๊ณ bot์ผ๋ก ์ ์ธํด์ค๋๋ค.
์ด์ bot ์ ์ด๋ ํ ๋ช
๋ น์ด๋ฅผ ํธ์ถํ๋ค๊ณ ํ๋ฉด, alarm2bot์ ์ฐ๊ฒฐ๋์ด ์๋ API_KEY ํค์ ํจ๊ป ๋ฉ์์ง๋ฅผ Telegram ์๋ฒ์ ์ ์กํ๊ฒ ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ์ ์ Telegram ์ผ๋ก ๋์๊ฐ์ ํค๋ฅผ ๋ถ์ฌ ๋ฐ์ ๋ด์ด๋ฆ์ผ๋ก ๋ํ์๋๋ฅผ ๊ฒ์ํ๊ณ , ๋์ ๋ด์ ๋ง์ ๊ฑธ์ด๋ด
๋๋ค. ์ ๋ alarm2bot์๊ฒ ๋ง์ "์๋
๋ด"์ผ๋ก ๋ง์ ๊ฑธ์ด๋ณด์์ต๋๋ค.

Telegram API๋ฅผ ํตํด "์๋ ๋ด"์ผ๋ก ์์ ํ ๋ฉ์์ง๋ฅผ ๋ฐ์๋ณด๊ฒ ์ต๋๋ค.
updates = bot.getUpdates()
updates
[<telegram.update.Update at 0x7f423804ee80>]
getUpdates()๋ฅผ ์คํํด์ฃผ๋ฉด bot์ด ๊ฐ์ง๊ณ ์๋ API_KEY ๋ฅผ ํตํด์ ์์ ํ ๋ฉ์์ง๋ฅผ ๋ฐ์์ต๋๋ค. ์ด ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํด๋ด ์๋ค.
for i in updates:
print(i)
{'message': {'date': 1519368212, 'delete_chat_photo': False, 'new_chat_members': [], 'text': '์๋ ๋ด?', 'chat': {'type': 'private', 'id': 3*******8 , 'first_name': 'Jinhwan'}, 'photo': [], 'from': {'language_code': 'ko-KR', 'id': 3*******8, 'first_name': 'Jinhwan'}, 'group_chat_created': False, 'message_id': 4, 'entities': [], 'new_chat_photo': [], 'new_chat_member': None, 'channel_chat_created': False, 'supergroup_chat_created': False}, 'update_id': 812204986}
์์ ๊ฐ์ Jsonํํ์ ๋ฉ์์ง๋ฅผ ํ์ธ ํ ์ ์์ต๋๋ค. 'text' ํญ๋ชฉ์๋ alarm2me ๋ด์ "์๋
๋ด?" ๋ฉ์์ง๊ฐ ์ ํ ์๋ค์. ๊ทธ๋ฆฌ๊ณ ์ ์ผ ์ค์ํ chat_id๋ฅผ ์ ์ด ๋์ต๋๋ค.
'chat': {'type': 'private', 'id': 3*******8 ์์ id ๋ค์ ์ซ์๊ฐ ๋ฐ๋ก chat_id ๊ฐ ๋ฉ๋๋ค. ์ด chat_id ๋ฅผ ์๊ณ ์์ด์ผ Telegram API๋ฅผ ํตํด์ ์ํ๋๋ํ์ฐฝ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค.
๋ค์์ ๋ด์ผ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ด ๋ณด๊ฒ ์ต๋๋ค.
chat_id = "3*******8"
bot.sendMessage(chat_id = chat_id, text="์๋
ํ์ธ์, alarm2me ๋ด์
๋๋ค.")

์ด์ Telegram API ๋ฅผ ํตํด ๋ฉ์์ง ๋ณด๋ด๋ ๋ฒ์ ์์์ต๋๋ค!
์ด์ ํฌ์คํ ํ์ด์ฌ ์นํฌ๋กค๋ง๋ด ๋ง๋ค๊ธฐ -3- ์ํธํํ๋ด์ค์ฌ์ดํธ ํฌ๋กค๋ง ์์ ์ฌ์ฉ ํ์๋ feedparser๋ฅผ ํ์ฉํด์ ์ต์ ๊ธ ๋ถ๋ฌ์ค๋ ์ฝ๋๋ฅผ ๋ค์ํ๋ฒ ๋ณด๊ฒ ์ต๋๋ค.
import feedparser
feed = feedparser.parse("https://www.coindesk.com/feed/")
coindesk_urls = [] #coindesk url๋ค์ ๊ฐ์ ธ์์ ์ ์ฅ์์ผ์ค ๊ฐ์ฒด
for entry in feed['entries']:
coindesk_url.append(entry['link'])
coindesk_url๋ก ์ ์ฅ๋์ด ์๋ url๋ค์ด ์ด์ ์ ๋ฐ์๋ ๊ธ์ธ์ง ๋น๊ตํด์ผํฉ๋๋ค.
feedparser ๋ก ๋ถ๋ฌ ๋ค์๋ url๋ค์ ์ ์ฅํ๋ ๊ฒ์ ๋ค์ ๊บผ๋ด์, old_urls ๊ณผ new_url์ ๊ตฌ๋ณํด ๋ณด๊ฒ ์ต๋๋ค.
with open("coindesk_news.txt", "r", encoding="utf8") as f:
old_urls = f.read().split("\n")
'https://www.coindesk.com/bitfinex-suspends-sale-select-ico-tokens-citing-sec-concerns/',
( ์ค๋ต )
'https://www.coindesk.com/ledgerx-cboe-cftcs-trojan-horse-sec-turf-war/',
์ด์ ํฌ์คํธ๋ถํฐ ์ค์ตํ๋ ํ๊ฒฝ์ด ๋์ผํ๋ค๋ฉด coindesk_news.txt ๋ฅผ ๊ทธ๋๋ก ๋ถ๋ฌ ์ฌ ์ ์์ต๋๋ค. ๋ง์ฝ์ ๊ฒฝ๋ก๊ฐ ๋ค๋ฅด๊ฑฐ๋ Jupyter notebookํ๊ฒฝ์ด ๋ฌ๋ผ์ก๋ค๋ฉด ํ์ด์ฌ ์นํฌ๋กค๋ง๋ด ๋ง๋ค๊ธฐ -3- ์ํธํํ๋ด์ค์ฌ์ดํธ ํฌ๋กค๋ง ์ ์๋ ์ฝ๋๋ฅผ ๋ค์ํ๋ฒ ์คํ ํด๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
์ ๊ธ ์๋ฆผ์ด์ ํ๋ก์ธ์ค๋ฅผ ๋ค์ํ๋ฒ ์ ๋ฆฌํด๋ณด๋ฉด,
feedparser๋ฅผ ํตํด์ ์ต์ ๊ธ์ url๋ค์ ๊ฐ์ ธ์จ๋ค.requests์ lxml๋ก ์ ๊ธ url์ ์ ๋ชฉ๊ณผ ๋ณธ๋ฌธ์ ๊ฐ์ ธ์จ๋ค.์ด์ , ์๊ธ ์๋ฆผ์ด ํ๋ก์ธ์ค์ค 2๋ฒ ๊ณผ์ ์ ๋ํ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
new_urls = []
for new in coindesk_urls:
if new not in old_urls:
print("Updated", url)
else:
pass
"Updated" ์๋ก ์ ๋ฐ์ดํธ๋ url์ด ์ถ๋ ฅ
์๋ก ๋ณด์ด๋ url๋ค๋ง ์ถ๋ ฅ๋์ด ๋ณด์ฌ์ง์ ํ์ธํ์์ต๋๋ค. ๋ค์์๋ print ๋์ new_urls๋ฆฌ์คํธ์ ์ถ๊ฐํ๋๋ก ๋ณ๊ฒฝ ํ ๊ฒ์
๋๋ค.
๋ค์์, for ๋ฐ๋ณต๋ฌธ ์์ print ๋์ 'url ์
๋ฐ์ดํธ' ์ 'ํ
๋ ๊ทธ๋จ ๋ฉ์์ง ๋ณด๋ด๊ธฐ' ๊ธฐ๋ฅ์ด ์ถ๊ฐ ๋์ด์ผ ํฉ๋๋ค. ๋จผ์ old_urls ์ ํฌํจ๋์ด ์์ง ์์ url๋ค๋ง coindesk_news.txt์ ์ถ๊ฐ ์ ์ฅ ํ๊ฒ ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ๋ง๋ค send_news ํจ์์ ๋ํ ๋ถ๋ถ์ ์ฃผ์์ผ๋ก๋ง ์ด์ง ์ธ๊ธํ๊ฒ ์ต๋๋ค.
new_urls = []
for new in coindesk_urls:
if new not in old_urls:
with open("coindesk_news.txt", "a") as f:
f.write(new + "\n")
# news_text = get_news_article(new)
# bot.sendMessage
else:
pass
์์ ์ฝ๋๋ฅผ ์คํํ๋ฉด, coindesk_news.txt์ ์๋ url ๋ค์ด ์ถ๊ฐ๋์ด ์์์ ํ์ธ ํ ์ ์์ต๋๋ค.
์ด์ url์ ๋ฐ์์, coindesk ๋ด์คํ์ด์ง์ ์ ๋ชฉ๊ณผ ๋ณธ๋ฌธ์ ์ถ์ถํ๊ณ ํ ๋ ๊ทธ๋จ์ผ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ํจ์๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
def get_news_article(url):
from lxml import html
import requests
resp = requests.get(url)
lxml_html = html.fromstring(resp.text)
# ์ ๋ชฉ ์ถ์ถํ๊ธฐ
news_title = [lxml_html.find_class("article-top-image-section-inner")[0].text_content().strip() + "\n\n"] ##1
# ๋ณธ๋ฌธ ์ถ์ถํ๊ธฐ
lxml_end_point = lxml_html.cssselect("em")
lxml_end_point = lxml_end_point[0]
end_parent = lxml_end_point.getparent()
body_lxml = []
for elem in end_parent.itersiblings(preceding=True):
body_lxml.append(elem)
news_body = [t.text_content() for t in body_lxml[::-1]]
news_title.extend(news_body)
return news_title
์ด get_news_article ํจ์์ coindesk ๋ด์ค url์ ๋ฃ์ผ๋ฉด ์ ๋ชฉ๊ณผ ๋ณธ๋ฌธ์ด ํฌํจ๋์ด ์๋ ๋ฆฌ์คํธ๋ฅผ ๋ฆฌํดํฉ๋๋ค.
'# ์ ๋ชฉ์ถ์ถํ๊ธฐ' ๋ถ๋ถ์ 4์ฅ์์ ๋ค๋ฃจ์์ด์ผ ํ๋๋ฐ ๊ทธ๋ฅ ๋์ด๊ฐ์๋ค์, ์ฃ์กํฉ๋๋ค.
์ ๋ชฉ๋ถ๋ถ์ ๊ฐ๋ฐ์๋๊ตฌ์์ html ๊ตฌ์กฐ๋ฅผ ์ฝ๊ฒ ํ์ธ ํ ์ ์์ต๋๋ค.
lxml์์ find_class๋ก ์ฝ๊ฒ ํด๋น ์์น๋ฅผ ์ฐพ์์ text๋ฅผ ์ถ์ถํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ strip() ์ text_content() ๊ฒฐ๊ณผ์ ๊ฐํ๋ฌธ์("\n")์ด ๋ถ๋ ๊ฒฝ์ฐ๊ฐ ์์ด ์ด๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด ์ฌ์ฉํ์์ต๋๋ค.
coindesk ๋ด์ค url ์ ํ๋ ๋ฃ์ด์ ๊ฒฐ๊ณผ๊ฐ ์ ๋๋ก ๋์ค๋์ง ์ดํด๋ด ๋๋ค.
news = get_news_article("https://www.coindesk.com/bitcoin-low-fees-why-happening-why-matters/")
print("\n".join(news))
Bitcoin Fees Are Down Big: Why It's Happening and What It Means
26 down to $3.
The average cost of
๋ด์น๊น์ ํ ๋ ๊ทธ๋จ์ผ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ณด๊ฒ ์ต๋๋ค.
bot.sendMessage(chat_id = "3*******8", text=news)
BadRequest Traceback (most recent call last)
(์ค๋ต )
BadRequest: Message is too long
์ด๋ฐ ํ๋ฒ์ ๋ณด๋ผ ์ ์๋ ๋ฉ์์ง๊ฐ ์ ํ๋์ด ์์ต๋๋ค. Telegram API ๋ฌธ์๋ฅผ ํ์ธํด๋ณด๋ 4000์ ์ ๋ ์ ํ์ด ์์ต๋๋ค. 'Current maximum length is 4096 UTF8 characters'
4000์์ฉ ๋๋์ด์ ๋ฉ์์ง๋ฅผ ๋ฆฌ์คํธ๋ฅผ ๋ฌถ์ด์ฃผ๋ ํจ์๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
def text_barn_maker(post_lines, max_char = 4000):
cumulated = 0
_text = ''
text_barn = []
for t in post_lines:
trim_t = t.strip(' ')[:max_char] #prevent limit max_char
cumulated += len(trim_t)
if cumulated > max_char:
text_barn.append(_text)
_text = '' #text initialize
cumulated = len(trim_t) #new text_part
_text += trim_t
else:
_text += trim_t
text_barn.append(_text)
return text_barn
text_barn_maker ํจ์์ ๋ํด์ ์ค๋ช
์ ํ์๋ฉด, ์
๋ ฅ ๋ณ์์ธ post_lines ๋ด์ ๊ธ์์๋ฅผ ๊ณ์ฐํด์ max_char์ ์๋ฅผ ๋๊ธฐ์ง ์๋ text_barn์ ์์ฑํฉ๋๋ค.
๊ตฌ์ฒด์ ์ธ ์์๋ฅผ ํด๋ณด์๋ฉด, ์์์ ๋ฆฌ์คํธ ['ab', 'd', 'ef'] ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์๋, ์ต๋ 3๊ธ์ ๋จ์๋ก ์๋ก์ด ๋ฆฌ์คํธ๋ก ๋ง๋ ๋ค๋ฉด, ['abd', 'ef'] ๋ฅผ ์์ฑํ๋ ํจ์๊ฐ ๋๋๊ฒ ์
๋๋ค.
์ด์ , ํ
๋ ๊ทธ๋จ์ผ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ send_news ํจ์๋ฅผ ์์ฑํ๊ฒ ์ต๋๋ค.
def send_news(text_barn):
print("{} text barn(s)".format(len(text_barn)))
for text_line in text_barn:
bot.sendMessage(chat_id = '3*****8', text = text_line))
print("well sent")
์์ ํจ์๋ text_barn๋ก ๋ฐ์ ๋ฆฌ์คํธ๋ฅผ for loop๋ก ์ํํ๋ฉด์ ๊ตฌ์ฑ์์(๋ด์ค text)์ ๋๋์ด์ ๋ณด๋ ๋๋ค.
์ด์ ์์ ์ฝ๋๋ค์ ๋ชจ๋ ํฉ์ณ๋ณด๊ฒ ์ต๋๋ค.
import time
import feedparser
import requests
import telegram
API_KEY = 'aaaaaaaaa:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
bot = telegram.Bot(token = API_KEY) #bot์ ์ ์ธํฉ๋๋ค.
def get_news_article(url):
from lxml import html
import requests
resp = requests.get(url)
lxml_html = html.fromstring(resp.text)
# ์ ๋ชฉ ์ถ์ถํ๊ธฐ
news_title = [lxml_html.find_class("article-top-image-section-inner")[0].text_content().strip() + "\n\n"] ##1
# ๋ณธ๋ฌธ ์ถ์ถํ๊ธฐ
lxml_end_point = lxml_html.cssselect("em")
lxml_end_point = lxml_end_point[0]
end_parent = lxml_end_point.getparent()
body_lxml = []
for elem in end_parent.itersiblings(preceding=True):
body_lxml.append(elem)
news_body = [t.text_content() for t in body_lxml[::-1]]
news_title.extend(news_body)
return news_title
def text_barn_maker(post_lines, max_char = 4000):
cumulated = 0
_text = ''
text_barn = []
for t in post_lines:
trim_t = t.strip(' ')[:max_char] #prevent limit max_char
cumulated += len(trim_t)
if cumulated > max_char:
text_barn.append(_text)
_text = '' #text initialize
cumulated = len(trim_t) #new text_part
_text += trim_t
else:
_text += trim_t
text_barn.append(_text)
return text_barn
def send_news(text_barn):
print("{} text barn(s)".format(len(text_barn)))
for text_line in text_barn:
bot.sendMessage(chat_id = "3*******8", text = text_line) # chat_id๋ ๋ณธ์ธ ๊ฒ์ผ๋ก ๋ณ๊ฒฝํ์
์ผ ํฉ๋๋ค.
print("well sent")
while True:
feed = feedparser.parse("https://www.coindesk.com/feed/")
coindesk_urls = []
for entry in feed['entries']:
coindesk_urls.append(entry['link'])
with open("coindesk_news.txt", "r", encoding="utf8") as f:
old_urls = f.read().split("\n")
new_urls = []
for new in coindesk_urls: #์ URL์ new_urls์ ์ถ๊ฐ
if new not in old_urls:
new_urls.append(new)
else:
pass
for url in new_urls: #ํจ์๋ฅผ ํตํด ์ค์ ๋์ํ๋ ๋ถ๋ถ
news_lines = get_news_article(url)
news_barn = text_barn_maker(news_lines)
send_news(news_barn)
with open("coindesk_news.txt", "a", encoding="utf8") as f:
f.write(url + "\n")
print("well sent")
time.sleep(300)
๋ง์ง๋ง time.sleep(300) ์ 300์ด ๋์ ์ต์ ๊ธ ๊ฒ์์ ์ฐ๋ค๋ ๊ฒ์
๋๋ค. ๋๋ฌด ์ฆ์ ํ์ด์ง ์์ฒญ์ ํ๊ฒ๋๋ฉด ํด๋ผ์ฐ๋ํ์ด์ ๊ฐ์ DDOS ๋ฐฉ์ง๊ฒ์ดํธ๋ก ๋ค์ด๊ฐ ์ ์๊ธฐ ๋๋ฌธ์ ์ฃผ์ํด์ผ ํฉ๋๋ค.
while True ์ดํ ๋ํด์ ์ค๋ช
์ ๋๋ฆฌ๋ฉด, feedparser๋ก ์ต์ ๊ธ ๋ฆฌ์คํธ๋ฅผ ๋ฐ์ coindesk_urls์ ์ ์ฅํ๊ณ old_urls์ ์๋ url๋ค๋ง new_urls์ ์ถ๊ฐ๋ฅผ ํฉ๋๋ค. ๋ง์ง๋ง for -loop ๋ถ๋ถ์ new_urls ์ ํ๋์ฉ ๋์๊ฐ๋ฉด์ get_news_article, text_barn_maker ์ ๊ฑฐ์ณ์ ์ ๋นํ ํฌ๊ธฐ์ text๋ค์ ๋ด๊ณ ์๋ news_barn ๋ฆฌ์คํธ๋ฅผ ์์ฑํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก news_barn ์ ๋ด๊ฒจ ์๋ text๋ค์ send_newsํจ์๋ฅผ ํตํด์ Telegram์ผ๋ก ์ ์กํ๊ฒ ๋ฉ๋๋ค.
๋ค์ ์๊ฐ์๋ AWS ๋ฌด๋ฃ Instance์ ํด๋น ์ฝ๋๋ฅผ ์ฌ๋ ค์ ๋์์์ผ๋ณด๊ฒ ์ต๋๋ค.
๊ณ ์ ํ์ จ์ต๋๋ค!
์ด์ ๊ธ ๋ณด๊ธฐ
[Python] ํ์ด์ฌ ์นํฌ๋กค๋ง๋ด ๋ง๋ค๊ธฐ -1-
[Python] ํ์ด์ฌ ์นํฌ๋กค๋ง๋ด ๋ง๋ค๊ธฐ -2- First Scraper
[Python] ํ์ด์ฌ ์นํฌ๋กค๋ง๋ด ๋ง๋ค๊ธฐ -3- ์ํธํํ๋ด์ค์ฌ์ดํธ ํฌ๋กค๋ง
[Python] ํ์ด์ฌ ์นํฌ๋กค๋ง๋ด ๋ง๋ค๊ธฐ -4- ํ์ฑํด์ ํ์ฉํ ๋ณธ๋ฌธ ์ถ์ถํ๊ธฐ