Ich habe kürzlich mehrere Artikel veröffentlicht, wollte aber Daten wie die Gesamtzahl der Ansichten anzeigen, also habe ich mit Raspeye eine Umgebung erstellt. Dieses Mal besteht das Ziel darin, regelmäßig Daten mit Raspeye zu erfassen, einmal täglich ein Diagramm zu erstellen und es automatisch an Slack zu senden.
Die Umgebung von Mac, die sich hauptsächlich entwickelt, ist wie folgt.
$sw_vers
ProductName: Mac OS X
ProductVersion: 10.13.6
BuildVersion: 17G9016
Die verwendete Raspeltorte ist Raspberry Pi 3 Model B. Das Betriebssystem ist wie folgt.
$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
Ich habe Raspeye eine Weile nicht mehr verwendet, aber als ich versuchte, es erneut zu verwenden, konnte ich mich nicht anmelden. Als ich versuchte, das Kennwort zu ändern, wurde das Betriebssystem nicht mehr gestartet, sodass ich das Betriebssystem neu installierte. Installieren Sie anschließend die erforderlichen Bibliotheken und Tools und erstellen Sie MySQL (MariaDB), in dem Qiita-Daten gespeichert sind. Schließlich erstellen wir einen Prozess, der regelmäßig an Slack gesendet wird.
Klicken Sie hier, um das Betriebssystem neu zu installieren. Sie können das Betriebssystem jetzt starten, indem Sie es wie in [^ 1] beschrieben ausführen. Das Verfahren ist genau wie beschrieben, daher werde ich es weglassen.
Es gab ein Problem, dass "apt update" nicht mit einem Fehler ausgeführt werden konnte. Nach Versuch und Irrtum, wie hier beschrieben [^ 2],
sudo dhclient eth0
Dies löste das Problem. Führen Sie danach den folgenden Befehl aus.
sudo apt-get update
sudo apt-get upgrade
Erstellen Sie als Nächstes eine Datenbank, in der Daten wie die Anzahl der Ansichten von Qiita gespeichert sind. Dieses Mal werde ich MySQL verwenden. Aber als ich versuchte, MySQL zu installieren
$ sudo apt-get install mysql-server
Laden der Paketliste...Erledigt
Erstellen eines Abhängigkeitsbaums
Statusinformationen lesen...Erledigt
Paket MySQL-Server ist nicht verfügbar, wird aber von einem anderen Paket referenziert.
Dies ist ein fehlendes Paket, veraltet oder eine andere Quelle
Es bedeutet, dass es nur von verfügbar ist.
Die folgenden Pakete ersetzen jedoch:
mariadb-server-10.0
E:Paket'mysql-server'Hat keine Installationskandidaten
Der Fehler wurde angezeigt und die Installation konnte nicht durchgeführt werden. In der Fehlermeldung wird jedoch angezeigt, dass MariaDB ersetzt wird. Als ich es versuchte, Ich konnte es mit dem folgenden Befehl installieren.
sudo apt-get install mariadb-client mariadb-server
Dieses Mal denke ich darüber nach, Japanisch in die Daten aufzunehmen, also werde ich die Sprache einstellen.
In Bezug auf dieses [^ 3] habe ich / etc / mysql / conf.d / mysql.cnf
wie folgt geändert.
/etc/mysql/conf.d/mysql.cnf
[mysql]
default-character-set=utf8mb4
Starten Sie MySQL neu und konfigurieren Sie die Benutzer- und Datenbankeinstellungen.
$ sudo service mysql restart
$ sudo mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 60
Server version: 10.3.17-MariaDB-0+deb10u1 Raspbian 10
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> CREATE DATABASE myqiita;
MariaDB [(none)]> CREATE USER 'pi'@'localhost' IDENTIFIED BY '<Passwort>';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON myqiita.* to 'pi'@'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| myqiita |
+--------------------+
2 rows in set (0.002 sec)
MariaDB [(none)]> quit
Bye
Sie können sich jetzt als Benutzer pi anmelden und Ihre Daten in der Datenbank myqiita speichern.
Schreiben Sie den Code für die Verbindung zu der zuvor festgelegten Datenbank.
myconnection.py
import MySQLdb
import pandas.io.sql as psql
class myDB():
def __init__(self):
self.connection = MySQLdb.connect(
host='localhost',
user='pi',
passwd='<Passwort>',
charset='utf8',
db='myqiita')
self.cursor = self.connection.cursor()
def exe(self, sql):
self.cursor.execute(sql)
return self.cursor.fetchall()
def exedf(self, sql):
return psql.read_sql(sql, self.connection)
def commit(self):
self.connection.commit()
def close(self):
self.connection.close()
Der als "
Führen Sie das folgende Programm aus, um eine Tabelle mytable zum Speichern der Daten zu erstellen. Darüber hinaus gibt es einen Textteil zur Typspezifikation jeder Spalte.
create.py
import MySQLdb
from myconnection import myDB
if __name__ == '__main__':
mydb = myDB()
sql = """
create table mytable(
id int(11) AUTO_INCREMENT NOT NULL,
create_datetime datetime not null default current_timestamp,
tot_num_articles int(11) not null,
tot_num_views int(11) not null,
tot_num_likes int(11) not null,
max_num_views int(11) not null,
max_num_views_title varchar(100) not null,
max_num_likes int(11) not null,
max_num_likes_title varchar(100) not null,
PRIMARY KEY (id))
"""
print( sql )
mydb.exe( sql )
Erstellen Sie als Nächstes den Code, um die Daten von Qiita abzurufen und in der Datenbank zu speichern.
insert.py
import requests
import json
import datetime
import MySQLdb
from myconnection import myDB
def collection():
dt_now = datetime.datetime.now()
url = 'https://qiita.com/api/v2/authenticated_user/items'
headers = {"content-type": "application/json",
"Authorization": <Zugangstoken>}
res = requests.get(url, headers=headers)
article_list = res.json()
tot_num_articles = len(article_list)
tot_num_views = 0
tot_num_likes = 0
max_num_views = 0
max_num_likes = 0
max_num_views_title = ''
max_num_likes_title = ''
for item in article_list:
item_id = item['id']
title = item['title']
likes_count = item['likes_count']
url = 'https://qiita.com/api/v2/items/' + item_id
res = requests.get(url, headers=headers)
json = res.json()
page_views_count = json['page_views_count']
tot_num_views += page_views_count
tot_num_likes += likes_count
if max_num_views < page_views_count:
max_num_views = page_views_count
max_num_views_title = title
if max_num_likes < likes_count:
max_num_likes = likes_count
max_num_likes_title = title
data={'dt':dt_now,
'tot_num_articles':tot_num_articles,
'tot_num_views':tot_num_views,
'tot_num_likes':tot_num_likes,
'max_num_views':max_num_views,
'max_num_views_title':max_num_views_title,
'max_num_likes':max_num_likes,
'max_num_likes_title':max_num_likes_title}
return data
if __name__ == '__main__':
mydb = myDB()
data = collection()
sql = """
insert into mytable
(tot_num_articles,tot_num_views,tot_num_likes,max_num_views,max_num_views_title,max_num_likes,max_num_likes_title)
values({},{},{},{},"{}",{},"{}")
""".format(data['tot_num_articles'],
data['tot_num_views'],
data['tot_num_likes'],
data['max_num_views'],
data['max_num_views_title'],
data['max_num_likes'],
data['max_num_likes_title'])
print(sql)
mydb.exe(sql)
mydb.commit()
mydb.close()
Ich erhalte Daten, indem ich auf Qiitas API in "collection ()" klicke. Informationen zum Abrufen von Zugriffstoken und Daten finden Sie hier [^ 4].
Fügen Sie in der Hauptfunktion die von collection ()
erhaltene Datentabelle mytable ein und schreiben Sie sie fest.
Registrieren Sie die zuvor in cron erstellte insert.py, um sie regelmäßig auszuführen.
sudo vim /etc/cron.d/cron_test
Durch Erstellen einer Datei mit dem Namen cron_test und Schreiben der folgenden Datei wird insert.py stündlich um 00:00 Uhr ausgeführt.
00 * * * * pi /usr/bin/python3 /home/pi/work/insert.py
Cron neu starten.
sudo service cron restart
Damit haben wir den Punkt erreicht, an dem regelmäßig Daten erfasst werden.
Stellen Sie abschließend die Daten ein, die grafisch dargestellt und einmal täglich an Slack gesendet werden sollen. Das Programm ist wie folgt.
slack_report.py
from slacker import Slacker
import monitor
def main():
monitor.report()
slack = Slacker("<Zeichen>")
slack.files.upload(file_='out_monitor.png', channels='myqiita')
if __name__ == "__main__":
main()
Das erste ist monitor.report ()
, aber in einem anderen Programm namens monitor.py erhalten wir die Daten der Datenbank, erstellen ein Diagramm und speichern es als out_monitor.png.
Ich sende diese PNG-Datei an meinen Kanal in Slack. Für den Übertragungsteil habe ich hier verwiesen [^ 5].
Der Programminhalt von monitor.py lautet wie folgt.
monitor.py
import MySQLdb
from myconnection import myDB
import pandas as pd
import matplotlib.pyplot as plt
def report():
mydb = myDB()
sql = """
select * from mytable
"""
df = mydb.exedf( sql )
# Preprocess
df['create_datetime'] = pd.to_datetime(df['create_datetime'])
df = df.set_index('create_datetime')
# Plot
fig = plt.figure()
ax1 = fig.add_subplot(311)
df['tot_num_articles'].plot(ax=ax1)
ax1.set_xticklabels('')
ax1.set_xlabel('')
ax1.set_ylabel('tot_num_articles')
ax1.grid()
ax2 = fig.add_subplot(312)
df['tot_num_views'].plot(ax=ax2)
ax2.set_xticklabels('')
ax2.set_xlabel('')
ax2.set_ylabel('tot_num_views')
ax2.grid()
ax3 = fig.add_subplot(313)
df['tot_num_likes'].plot(ax=ax3)
ax3.set_ylabel('tot_num_likes')
ax3.grid()
fig.savefig('out_monitor.png')
if __name__ == '__main__':
report()
Alle in der Tabelle myqiita gespeicherten Daten werden erfasst, in einen DataFrame von Pandas umgewandelt und anschließend grafisch dargestellt. Die Konvertierung in DataFrame finden Sie hier [^ 6]. Die Elemente in der Grafik sind die Anzahl Ihrer Artikel, die Gesamtzahl der Aufrufe und die Gesamtzahl der Likes.
Registrieren Sie das Programm in cron, damit slack_report.py regelmäßig ausgeführt wird. Der Inhalt von cron_test wird unten angezeigt.
/etc/cron.d/cron_test
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
00 * * * * pi /usr/bin/python3 /home/pi/work/insert.py
10 8 * * * pi /usr/bin/python3 /home/pi/work/slack_report.py
Zum Schluss starten Sie cron neu.
sudo service cron restart
Hier ist ein Screenshot, der auf meinem Smartphone an Slack gesendet wurde.
Die Grafiken werden jetzt jeden Morgen um 8:10 Uhr gesendet. In Ordung.
Sie können jetzt regelmäßig Qiita-Browserdaten mit Raspeye an Slack senden. Wenn Sie die Daten sehen können, ist dies interessant, da Sie an einigen Stellen feststellen werden, dass die Anzahl der Aufrufe je nach Tageszeit unterschiedlich hoch ist. Die Anzahl der Aufrufe und Likes ist immer noch gering, aber ...