Bumbu Hot Delegrambotの作成


1.BotFatherによる通信室の作成


Teleme:自分のTelegramBotを作成する方法を参照してください.
API Tokenを忘れないでください.

2.簡単なCrawlerの作成

  • まずTelegramロボットを取り付けます.
  • $ pip install python-telegram-bot
  • とスクロールコードを作成します.
  • スクロールコードを作成してBombuの5つ以上の文章を収集し,電報に関連するモジュールを挿入する.
    # 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
    
  • chat id
  • をインポート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を設定することで、画面のオフセット処理を省略します.
  • クライアントと障害モデルを接続します.
  • Chrollerからのデータを格納するモデルを作成します.
    # 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に戻ると、推奨通知が重複していないことがわかります.

    📌 リファレンスソース

  • スクロールを使用してWeb、Telegrambot、REST API、モバイルアプリケーションを作成