[PYTHON] Versuchen Sie, die Überwachung der Anzahl von Qiita mit Lambda + DynamoDB + CloudWatch zu automatisieren

Dieser Artikel ist eine Weitergabe von "2020 Neujahr Adventskalender TechConnect!" von Link Information System Dies ist ein Artikel. TechConnect! Ist ein selbststartender Adventskalender, der von einer selbst erstellten Gruppe namens Engineer.hanzomon weitergeleitet wird. (Klicken Sie hier für das Link-Informationssystem Facebook) (https://ja-jp.facebook.com/lis.co.jp/)

Dieser Artikel ist für den 7. Tag, 1/15 (Mittwoch).


Vergangener Artikel Ich mache das auch, aber ich bin eine Person, die dafür verantwortlich ist, die Anzahl der Likes unserer Anzeigenpflege zu zählen. (Ich habe vorher noch keinen Artikel über die Anzeigenpflege geschrieben, aber ich sammle ihn mit Shell Art) Wenn die Anzahl der zu automatisierenden Likes eine bestimmte Anzahl überschreitet, dachte ich, es wäre schön, wenn ich sie wie einen Qiita-Meilenstein benachrichtigen würde ~~ Es würde Spaß machen ~~, also habe ich beschlossen, sie auf AWS Lambda auszuführen.

Wie bei den vorherigen Artikeln wird auch bei der Implementierung die Adcare-Startseite abgekratzt, um Artikel-URLs zu sammeln, und es scheint, als würde die Anzahl der Likes mit der Qiita-API ermittelt. Zuerst von der Lambda-Funktion, die Artikel-IDs sammelt

code
import os
import requests
import boto3
from selenium import webdriver
from bs4 import BeautifulSoup
from urllib.parse import urljoin

def lambda_handler(event, context):
    api_endpoint = 'https://qiita.com/api/v2/'

    try:
        dynamoDB = boto3.resource("dynamodb")
        advent_calendar = dynamoDB.Table("advent_calendar")

        options = webdriver.ChromeOptions()
        options.binary_location = "/opt/bin/headless-chromium"

        options.add_argument("--headless")
        options.add_argument("--disable-gpu")
        options.add_argument("--window-size=1280x1696")
        options.add_argument("--disable-application-cache")
        options.add_argument("--disable-infobars")
        options.add_argument("--no-sandbox")
        options.add_argument("--hide-scrollbars")
        options.add_argument("--enable-logging")
        options.add_argument("--log-level=0")
        options.add_argument("--single-process")
        options.add_argument("--ignore-certificate-errors")
        options.add_argument("--homedir=/tmp")

        driver = webdriver.Chrome(executable_path="/opt/bin/chromedriver", options=options)
        driver.get(os.environ['TARGET_URL'])
        soup = BeautifulSoup(driver.page_source, 'html.parser')

        item = soup.find('div', id='personal-public-article-body')
        tables = item.find_all('tbody')
        for table in tables:
            rows = table.find_all('tr')
            for row in rows:
                user_id = row.find_all('td')[1].text
                tmp = row.find_all('td')[2].find('a')['href']
                item_id = tmp[tmp.find('items/'):]
                response = advent_calendar.get_item(
                    Key={
                        'user_id': user_id,
                        'item_id': item_id
                    }
                )
                if 'Item' not in response:
                    advent_calendar.put_item(
                        Item = {
                            "user_id": user_id,
                            "item_id": item_id,
                            'likes': 0
                        }
                    )
    except Exception as e:
        print(e)
    finally:
        driver.quit()
    return
Registrieren Sie die erforderlichen Bibliotheken und Chromedriver im Voraus in Lambda Layers. Speichern Sie die erhaltene Artikel-ID in DynamoDB. Hier wird auch die Anzahl der Likes initialisiert. Führen Sie diese Lambda-Funktion stündlich bei einem CloudWatch-Ereignis aus.

Die folgende Funktion gibt die Qiita-API für diese gesammelte Artikel-ID aus und ermittelt die Anzahl der Likes

code
import os
import boto3
import requests
from urllib.parse import urljoin
import smtplib
from email.message import EmailMessage

def lambda_handler(event, context):
    api_endpoint = 'https://qiita.com/api/v2/'
    headers = {'Authorization': 'Bearer ' + os.environ['QIITA_AUTH']}

    dynamoDB = boto3.resource("dynamodb")
    advent_calendar = dynamoDB.Table("advent_calendar")

    try:
        smtp = smtplib.SMTP_SSL(os.environ['SMTP_HOST'], int(os.environ['SMTP_PORT']))
        smtp_user = os.environ['SMTP_USER']
        smtp_pass = os.environ['SMTP_PASS']
        message = EmailMessage()
        message['From'] = os.environ['FROM_ADDRESS']
        message['To'] = os.environ['TO_ADDRESS']
        message['Subject'] = 'Adcare wie Überwachung'
        smtp.login(smtp_user, smtp_pass)

        response = advent_calendar.scan()
        for i in response['Items']:
            user_id = i['user_id']
            item_id = i['item_id']
            old_likes = int(i['likes'])
            item_url = urljoin(api_endpoint, item_id)
            item_detail = requests.get(item_url, headers=headers).json()
            
            title = item_detail['title']
            url = item_detail['url']
            new_likes = int(item_detail['likes_count'])
            comments = int(item_detail['comments_count'])
            stockers_url = urljoin(api_endpoint, item_id + '/stockers?per_page=100')
            stockers = len(requests.get(stockers_url, headers=headers).json())
            
            if old_likes < 100 and new_likes >= 100:
                message.set_content(user_id+"Artikel ""+title+"("+url+")Hat 100 Likes überschritten")
                smtp.send_message(message)
            elif old_likes < 50 and new_likes >= 50:
                message.set_content(user_id+"Artikel ""+title+"("+url+")Hat 50 Likes überschritten")
                smtp.send_message(message)
            elif old_likes < 30 and new_likes >= 30:
                message.set_content(user_id+"Artikel ""+title+"("+url+")Hat 30 Likes überschritten")
                smtp.send_message(message)
            elif old_likes < 10 and new_likes >= 10:
                message.set_content(user_id+"Artikel ""+title+"("+url+")Hat 10 Likes überschritten")
                smtp.send_message(message)
            
            advent_calendar.put_item(
                Item = {
                    "user_id": user_id,
                    "item_id": item_id,
                    "likes" : new_likes,
                    "comments" : comments,
                    "stockers" : stockers
                }
            )
    except Exception as e:
        print(e)
    finally:
        smtp.close()
    return
Scannen Sie DynamoDB, um die Artikel-ID zu erhalten, geben Sie die Qiita-API heraus, vergleichen Sie sie mit der Anzahl der zuletzt erhaltenen Likes, und der Beurteilungsteil ist sehr grob. Wenn er jedoch den Schwellenwert überschreitet, wird er per E-Mail gesendet. Ich werde dich nicht nach ~~ 100 benachrichtigen, aber ich werde es nicht so sehr mögen ~~ Dieser Typ läuft jede Minute beim CloudWatch Event.

Eigentlich wollte ich eine Benachrichtigung an Microsoft Teams senden, die als interner Chat verwendet wird, aber ich konnte sie nicht realisieren, da ich in unserer zweistufigen Authentifizierung mit Office 365-Authentifizierung gefangen war ... Derzeit fliege ich nur zu meiner E-Mail-Adresse. Ich dachte, ich würde versuchen, es automatisch in Outlook zu übertragen, aber ich konnte es wegen unzureichender Berechtigungen nicht übertragen. Ich frage mich was es ist.


Es gibt ein leichtes Gefühl der Einhandigkeit, aber ich konnte die Erfassung der Anzahl der Likes automatisieren. Wenn der Kalender beendet ist und ein Absatz erreicht ist, frage ich mich, ob ich die Daten von DynamoDB abrufen und das Endergebnis erhalten werde. Zuerst dachte ich darüber nach, den HTTP-Agenten von ZABBIX zu verwenden, aber da die kostenlose EC2-Schicht verschwunden ist, habe ich mich für Lambda + DynamoDB entschieden. Free Frame ist das Beste.

Morgen ist @ h-yamasaki.


1/17 Die Anzahl der API-Ausgaben wurde ebenfalls geändert, um die Anzahl der Kommentare und die Anzahl der Bestände zu erfassen. Daher schien die Obergrenze von 1000 Mal pro Stunde erreicht zu werden, sodass das Überwachungsintervall des CloudWatch-Ereignisses von 1 Minute auf 5 Minuten geändert wurde

Recommended Posts

Versuchen Sie, die Überwachung der Anzahl von Qiita mit Lambda + DynamoDB + CloudWatch zu automatisieren
Versuchen Sie, Start / Stop für EC2-Instanzen mit AWS Lambda zu automatisieren
Betreiben Sie Dynamodb von Lambda aus wie SQL
Bearbeiten von DynamoDB-Daten mit Lambda (Node & Python)
Einfache REST-API mit API Gateway / Lambda / DynamoDB
Versuchen Sie, Python: Lambda zuzuweisen oder zu wechseln
[AWS SAM] Erstellen Sie eine API mit DynamoDB + Lambda + API Gateway