[PYTHON] Ich habe meine Qiita-Post-Daten automatisch mit Raspberry Pi gesammelt und regelmäßig mit Slack benachrichtigt

Einführung

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.

Umgebung

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"

Bauen

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.

Neuinstallation von Raspberry Pi OS

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

DB-Setup

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.

Erstellung von Datenerfassungsskripten

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 "" beschriebene Teil ist das Kennwort, wenn der Benutzer pi in MySQL erstellt wird.

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.

Periodische Ausführung mit Cron

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.

Abonnement für Slack

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

Ergebnis

Hier ist ein Screenshot, der auf meinem Smartphone an Slack gesendet wurde.

7F3D2229-9000-4AEC-A4E7-AF27B797E7D5.png

Die Grafiken werden jetzt jeden Morgen um 8:10 Uhr gesendet. In Ordung.

schließlich

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 ...

Recommended Posts

Ich habe meine Qiita-Post-Daten automatisch mit Raspberry Pi gesammelt und regelmäßig mit Slack benachrichtigt
[Für Anfänger] Ich habe mit Raspberry Pi einen menschlichen Sensor erstellt und LINE benachrichtigt!
Ich habe versucht, Raspeye und conect + mit der Web-API zu verbinden
Messen und vergleichen Sie Temperaturen mit Raspberry Pi und generieren Sie automatisch Diagramme
Ich habe zum ersten Mal eine Überwachungskamera mit Raspberry PI gemacht.
Home Hack zum automatischen Kauf, wenn es mit Amazon Dash Button und Raspberry Pi billiger wird
Machen Sie ein Thermometer mit Raspberry Pi und machen Sie es im Browser Teil 4 sichtbar
Lesen Sie die Daten des NFC-Lesegeräts, das mit Python an Raspberry Pi 3 angeschlossen ist, und senden Sie sie mit OSC an openFrameworks
Erfassen Sie den Sensorwert von Grove Pi + mit Raspberry Pi und speichern Sie ihn in Kintone
Haustierüberwachung mit Rekognition und Raspberry pi
Ich habe mit Raspberry Pi ein System erstellt, das regelmäßig den Unbehaglichkeitsindex des Raums misst und eine LINE-Benachrichtigung sendet, wenn es sich um einen gefährlichen Wert handelt
Machen Sie ein Thermometer mit Raspberry Pi und machen Sie es im Browser Teil 3 sichtbar
Ich habe versucht, mit Raspeye + Tact Switch eine Schaltfläche für Slack zu erstellen
Generieren und veröffentlichen Sie Dummy-Bilddaten mit Django
MQTT Radicon Car mit Arduino und Himbeere
CSV-Ausgabe von Impulsdaten mit Raspberry Pi (CSV-Ausgabe)
Holen Sie sich Temperatur und Luftfeuchtigkeit mit DHT11 und Raspberry Pi
Ich habe ein Docker-Image erstellt, das RSS liest und automatisch regelmäßig twittert, und es veröffentlicht.
Es wird kalt, also habe ich versucht, das automatische Ein- und Ausschalten der Klimaanlage mit Raspberry Pi zu ermöglichen!