[PYTHON] Encouragez votre participation à votre calendrier de l'Avent avec Errbot

Préface

La saison du calendrier de l'Avent approche également en 2016. Cette année également, Nijibox utilisera Qiita pour faire un calendrier de l'Avent. Avec le thème de "ma propre connaissance Errbot"

J'ai préparé un script Bot qui indique uniquement l'état du cadre du calendrier de l'Avent en semaine.

--Utilisez Errbot à votre guise --Errbot, qui a des fonctions indescriptibles, est déjà en cours d'exécution, alors créez simplement un plug-in.

Exposez le code

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
    """
    #Réclamation 1:Vous pouvez utiliser crontab
    CRONTAB = [
        '30 18 * * 1,2,3,4,5 .report_calendar_members',
    ]
    TIMEZONE = 'Asia/Tokyo'

    CHANNEL = '#general' #Pour le blanchiment 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):
        """Parlez des informations de trame quotidiennes
        """
        #Réclamation 2:Perth lors du grattage
        resp = requests.get(self.CALENDAR_URL)
        soup = BeautifulSoup(resp.content, 'html.parser')
        items = soup.select('.adventCalendarItem')
        #Réclamation 3:Séparez le nombre d'emplacements et le nombre de contributeurs
        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{}Par les gens{}Les messages seront publiés.\n Merci pour votre participation continue.'.format(
                self.CALENDAR_URL,
                len(authors),
                len(reserved),
            )
            channel = self.build_identifier(self.CHANNEL)
            self.send(channel, message)

Écrivez un petit aperçu du code

Allégation 1: Faites parler à errcron à l'heure chaque jour comme un crontab

Comme je l'ai écrit plus tôt, Errbot n'a pas de fonctionnalités comme crontab, donc J'essaye de faire une simple opération de type Crontab en utilisant mon propre ʻerr cron`. pour cette raison,

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

La notation crontab est utilisée telle quelle. Cette fois, c'est bruyant de parler jusqu'aux vacances, donc je l'ai réglé à 18h30 en semaine, ce qui est comme une pause dans la nuit.

Revendication 2: grattage rapide avec les demandes et BeautifulSoup4

Cette fois, les informations du calendrier de l'Avent de l'entreprise ne proviennent pas de RSS ou d'API, mais HTML est utilisé tel quel. ~~ (RSS ne contient que des articles publics, l'API n'est pas en premier lieu) ~~

Pour les requests, vous pouvez obtenir une réponse en une seule fois avec requests.get, et comme il y a BeautifulSoup, vous pouvez obtenir le nombre de chaque élément du calendrier par le simple moyen de" compter les éléments de la classe ʻadventCalendarItem` ". Merci à Qiita pour sa belle structure.

Allégation 3: Séparez le nombre de créneaux horaires et le nombre de contributeurs

Ce n'est pas le cas actuellement, mais comme un membre peut écrire plusieurs articles, j'ai décidé de considérer le ** nombre de contributeurs ** séparément du ** nombre de publications **.

À propos du nombre d'articles

Le contenu de la boîte .adventCalendarItem affichera uniquement le cadre du nom de l'affiche de la classe .adventCalendarItem_author si le cadre est déjà rempli. En d'autres termes, si vous retirez le contenu de ʻauthor de ʻItem pour le moment, vous pouvez créer une liste d'articles.

dans les environs


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

Supprimez les doublons pour obtenir le nombre de contributeurs

Puisqu'il est difficile de créer une liste de contributeurs sans duplication directement de la liste de publication ci-dessus

  1. Extrayez le nom de la liste des articles et créez-en une liste
  2. Utilisez list-> set pour supprimer les noms en double

Préparez une liste de contributeurs (pas de duplication) au moyen de.

dans les environs


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

Enfin jeter à Slack

Maintenant que nous avons une liste de publications et une liste de contributeurs, tout ce que nous avons à faire est de publier sur Slack en fonction de cela. Puisqu'il s'agit d'une fonction standard d'Errbot, une explication détaillée est une passe cette fois.

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

J'espère que cela rendra notre calendrier vivant.

Recommended Posts

Encouragez votre participation à votre calendrier de l'Avent avec Errbot
Donnez des rendez-vous à d'autres avec l'API de calendrier LINE WORKS
Comment INNER JOIN avec SQL Alchemy
Connectez-vous au VPN avec votre smartphone et éteignez / rallumez le serveur
[TensorFlow / Keras] La route pour assembler un RNN de votre structure préférée
Exécutez la matrice sur le terminal de votre patron!
Pour importer votre propre module avec jupyter
Obtenez des vacances avec l'API Google Agenda
Alignez la barre de couleurs sur la figure avec matplotlib
La route de la compilation vers Python 3 avec Thrift
La voie de la mise à jour de Splunkbase avec votre propre application Splunk compatible avec Python v2 / v3