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
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
Die folgende Funktion gibt die Qiita-API für diese gesammelte Artikel-ID aus und ermittelt die Anzahl der Likes
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
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