[PYTHON] Verwenden Sie Errbot, um die Teilnahme am Adventskalender Ihres Unternehmens zu fördern

Vorwort

Die Saison für den Adventskalender rückt auch 2016 näher. Auch in diesem Jahr wird Nijibox Qiita verwenden, um einen Adventskalender zu erstellen. Mit dem Thema "Mein eigenes Errbot-Wissen"

Ich habe ein Bot-Skript vorbereitet, das nur an Wochentagen den Frame-Status des Adventskalenders angibt.

Legen Sie den Code offen

adventcarendar.py


from datetime import datetime
from errbot import BotPlugin, botcmd, arg_botcmd, webhook
import pytz
import requests
from bs4 import BeautifulSoup
from errcron.bot import CrontabMixin
from errcron.cronjob import CronJob


class Adventcalendar(BotPlugin, CrontabMixin):
    """
    Qiita AdventCalendar
    """
    #Anspruch 1:Sie können Crontab verwenden
    CRONTAB = [
        '30 18 * * 1,2,3,4,5 .report_calendar_members',
    ]
    TIMEZONE = 'Asia/Tokyo'

    CHANNEL = '#general' #Zum Bleichen von Qiita
    CALENDAR_URL = 'http://qiita.com/advent-calendar/2016/nijibox'

    def activate(self):
        super().activate()
        self.activate_crontab()

    def report_calendar_members(self, polled_time):
        """Sprechen Sie über tägliche Frame-Informationen
        """
        #Anspruch 2:Perth beim Schaben
        resp = requests.get(self.CALENDAR_URL)
        soup = BeautifulSoup(resp.content, 'html.parser')
        items = soup.select('.adventCalendarItem')
        #Anspruch 3:Trennen Sie die Anzahl der Slots und die Anzahl der Mitwirkenden
        reserved = [
            item
            for item in items
            if len(item.select('.adventCalendarItem_author')) > 0
        ]
        authors = set([
            item.select('.adventCalendarItem_author')[0].text.strip()
            for item in reserved
        ])

        if len(reserved) < 25:
            message = '{}\n{}Von Menschen{}Beiträge werden veröffentlicht.\n Vielen Dank für Ihre weitere Teilnahme.'.format(
                self.CALENDAR_URL,
                len(authors),
                len(reserved),
            )
            channel = self.build_identifier(self.CHANNEL)
            self.send(channel, message)

Schreiben Sie einen kleinen Überblick über den Code

Anspruch 1: Lassen Sie Errcron jeden Tag pünktlich sprechen wie einen Crontab

Wie ich bereits geschrieben habe, hat Errbot keine Funktionen wie crontab Ich versuche eine einfache Crontab-ähnliche Operation mit dem von mir erstellten Errcron durchzuführen. aus diesem Grund,

30 18 * * 1,2,3,4,5 .report_calendar_members

Die Crontab-Notation wird unverändert verwendet. Dieses Mal ist es laut, bis in die Ferien zu reden, also habe ich es an Wochentagen auf 18:30 eingestellt, was wie eine Pause in der Nacht ist.

Anspruch 2: Schnelles Schaben mit Anfragen und BeautifulSoup4

Diesmal stammen die Informationen im Adventskalender des Unternehmens nicht aus RSS oder API, sondern HTML wird unverändert verwendet. ~~ (RSS hat nur öffentliche Artikel, API steht nicht an erster Stelle) ~~

Für "Anfragen" können Sie eine Antwort auf einmal mit "Anfragen.get" erhalten, und da es BeautifulSoup gibt, können Sie die Nummer jedes Elements im Kalender durch einfaches "Zählen der Elemente der" AdventCalendarItem "-Klasse" erhalten. Vielen Dank an Qiita für die schöne Struktur.

Anspruch 3: Trennen Sie die Anzahl der Slots und die Anzahl der Mitwirkenden

Dies ist derzeit nicht der Fall, aber da ein Mitglied möglicherweise mehrere Artikel schreibt, habe ich beschlossen, ** Anzahl der Mitwirkenden ** getrennt von ** Anzahl der Beiträge ** zu berücksichtigen.

Über die Anzahl der Beiträge

Der Inhalt des Felds ".adventCalendarItem" zeigt nur dann den Posternamenrahmen der Klasse ".adventCalendarItem_author" an, wenn der Rahmen bereits gefüllt ist. Mit anderen Worten, wenn Sie den Inhalt von "Autor" vorerst aus "Artikel" entfernen, können Sie eine Beitragsliste erstellen.

hier in der Gegend


reserved = [
    item
    for item in items
    if len(item.select('.adventCalendarItem_author')) > 0
]

Entfernen Sie Duplikate, um die Anzahl der Mitwirkenden zu ermitteln

Da es mühsam ist, eine Beitragsliste ohne Duplizierung direkt aus der obigen Beitragsliste zu erstellen

  1. Extrahieren Sie den Namen aus der Beitragsliste und machen Sie daraus eine Liste
  2. Verwenden Sie list-> set, um doppelte Namen zu entfernen

Erstellen Sie eine Liste der Mitwirkenden (keine Vervielfältigung) mit.

hier in der Gegend


authors = set([
    item.select('.adventCalendarItem_author')[0].text.strip()
    for item in reserved
])

Zum Schluss zu Slack werfen

Nachdem wir nun eine Liste der Beiträge und eine Liste der Mitwirkenden haben, müssen wir nur noch auf dieser Grundlage Beiträge an Slack senden. Da es sich um eine Standardfunktion von Errbot handelt, ist diesmal eine ausführliche Erklärung erforderlich.

スクリーンショット 2016-10-31 22.18.37.png

Ich hoffe, dass dies unseren Kalender lebendig macht.

Recommended Posts

Verwenden Sie Errbot, um die Teilnahme am Adventskalender Ihres Unternehmens zu fördern
Mit der LINE WORKS-Kalender-API können Sie Termine an andere Personen weitergeben
So verbinden Sie INNER mit SQL Alchemy
Stellen Sie mit Ihrem Smartphone eine Verbindung zum VPN her und schalten Sie den Server aus / ein
[TensorFlow / Keras] Der Weg zum Zusammenstellen eines RNN Ihrer Lieblingsstruktur
Führen Sie die Matrix zum Terminal Ihres Chefs!
So importieren Sie Ihr eigenes Modul mit jupyter
Holen Sie sich Urlaub mit der Google Kalender-API
Richten Sie die Farbleiste mit matplotlib an der Figur aus
Der Weg zum Kompilieren zu Python 3 mit Thrift
Der Weg zur Aktualisierung von Splunkbase mit Ihrer eigenen Splunk-App, die mit Python v2 / v3 kompatibel ist