Bumbu Hot Delegrambotの作成
1.BotFatherによる通信室の作成
Teleme:自分のTelegramBotを作成する方法を参照してください.
API Tokenを忘れないでください.
2.簡単なCrawlerの作成
$ pip install python-telegram-bot
# telegram-bot/crawler.py
from bs4 import BeautifulSoup
import requests
import telegram # 텔레그램 모듈을 가져온다.
response = requests.get(
"https://www.ppomppu.co.kr/zboard/zboard.php?id=ppomppu"
)
soup = BeautifulSoup(response.text, 'html.parser')
BOT_TOKEN = 'YOUR API TOKEN' # 토큰을 변수에 저장.
bot = telegram.Bot(token = BOT_TOKEN) # bot 선언.
for item in soup.find_all('tr', {'class': ['list1', 'list0']}):
try:
image = item.find('img', class_='thumb_border').get('src')[2:]
title = item.find('font', class_='list_title').text
title = title.strip()
link = item.find('font', class_='list_title').parent.get('href')
link = 'https://www.ppomppu.co.kr/zboard/' + link
reply_count = item.find('span', class_='list_comment2').text
reply_count = int(reply_count)
up_count = item.find_all('td')[-2].text
up_count = up_count.split("-")[0]
up_count = int(up_count)
if up_count >= 5:
bot.send_message(-1001760796628, '{} {}'.format(title, link))
except Exception as e:
continue
bot.send_meesage(chat_id, 'message')
を介して通信するにはchat idが必要です.ただし、チャンネルルームからchat idをインポートすることはできません.ブラウザアドレス入力ウィンドウに
https://api.telegram.org/bot{YOUR API TOKEN}/getUpdates
を代替として入力すると、チャンネルルームでどのようなリクエストが受信されるかが表示されます.アドレスの入力が正しい場合は、最初に次のメッセージが出力されます.
{"ok":true,"result":[]}
チャットルームに入ると、メッセージを送信してアドレスをリフレッシュするとchat idが得られます.{"ok":true,"result":[{"update_id":78739183,
"my_chat_member":{"chat":{"id":-1001760796628,"title":"\ud56b\ub51c\uc54c\ub78c\ubd07","type":"channel"},"from":{"id":5294452231,"is_bot":false,"first_name":"JIMIN","last_name":"LEE"},"date":1642702748,"old_chat_member":{"user":{"id":5006961994,"is_bot":true,"first_name":"\ud56b\ub51c\uc54c\ub9bc\ubd07","username":"hotdeal_alarm_bot"},"status":"left"},"new_chat_member":{"user":{"id":5006961994,"is_bot":true,"first_name":"\ud56b\ub51c\uc54c\ub9bc\ubd07","username":"hotdeal_alarm_bot"},"status":"administrator","can_be_edited":false,"can_manage_chat":true,"can_change_info":true,"can_post_messages":true,"can_edit_messages":true,"can_delete_messages":true,"can_invite_users":true,"can_restrict_members":true,"can_promote_members":false,"can_manage_voice_chats":true,"is_anonymous":false}}},{"update_id":78739184,
"channel_post":{"message_id":2,"sender_chat":{"id":-1001760796628,"title":"\ud56b\ub51c\uc54c\ub78c\ubd07","type":"channel"},"chat":{"id":-1001760796628,"title":"\ud56b\ub51c\uc54c\ub78c\ubd07","type":"channel"},"date":1642702751,"text":"hello"}}]}
crawler.py
を実行して、メッセージが正しく伝達されることを確認します.ただし、ファイルを実行するたびに、同じ投稿の推奨通知が表示されます.
これはdjango-rest-frameworkがapiを作成することによって解決されます.
3.django-rest-frameworkの使用
プロジェクトを作成し、RestAPIのViewsetを設定することで、画面のオフセット処理を省略します.
# telegram-bot/hotdeal/models.py
from django.db import models
# Create your models here.
class Deal(models.Model):
image_url = models.CharField(max_length=200)
title = models.CharField(max_length=200)
link = models.CharField(max_length=200, primary_key=True)
reply_count = models.IntegerField()
up_count = models.IntegerField()
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
ordering =['-created_at']
データベースに保存された投稿はcrawler.py
コードを変更しますが、使用は推奨されません.# telegram-bot/hotdeal/scripts/crawler.py
from bs4 import BeautifulSoup
import requests
import telegram
from hotdeal.models import Deal
response = requests.get(
"https://www.ppomppu.co.kr/zboard/zboard.php?id=ppomppu"
)
soup = BeautifulSoup(response.text, 'html.parser')
BOT_TOKEN = 'YOUR API TOKEN'
bot = telegram.Bot(token=BOT_TOKEN)
def run():
# 현재 시간에서 3일을 뺀 시간보다 작은 created_at 필드를 가진 게시물은 삭제한다.
# 즉, 3일이 지난 게시물은 삭제된다.
Deal.objects.filter(created_at__lte=datetime.now() - timedelta(days=3)).delete()
print(row, "deals deleted")
for item in soup.find_all('tr', {'class': ['list1', 'list0']}):
try:
image = item.find('img', class_='thumb_border').get('src')[2:]
image = 'http://' + image
title = item.find('font', class_='list_title').text
title = title.strip()
link = item.find('font', class_='list_title').parent.get('href')
link = 'https://www.ppomppu.co.kr/zboard/' + link
reply_count = item.find('span', class_='list_comment2').text
reply_count = int(reply_count)
up_count = item.find_all('td')[-2].text
up_count = up_count.split("-")[0]
up_count = int(up_count)
if up_count >= 5:
# iexact : 대소문자를 구분하지않고 정확히 일치하는 데이터를 찾는다.
# DB내의 링크와 크롤링한 링크가 같은 것이 없으면
# 크롤링 데이터를 DB에 집어넣는다. (즉, 등록되어 있지 않은 글만 집어넣음.)
if (Deal.objects.filter(link__iexact=link).count() == 0):
Deal(image_url=image, title=title, link=link, reply_count=reply_count, up_count=up_count).save()
bot.send_message(-1001760796628, '{} {}'.format(title, link))
except Exception as e:
continue
$ python manage.py runscript crawler
上のShellコマンドでcrawlerに戻ると、推奨通知が重複していないことがわかります.📌 リファレンスソース
Reference
この問題について(Bumbu Hot Delegrambotの作成), 我々は、より多くの情報をここで見つけました https://velog.io/@duo22088/뽐뿌-핫딜-텔레그램봇-만들기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol