J'ai créé une application de notification de nouvelles en ligne avec Python

J'ai créé une application qui vous avertira lorsqu'un nouvel article est publié sur le net news cible au centre de notification de Mac.

Chose que tu veux faire

① De nouveaux articles sont publiés ② Le centre de notification vous informera (la notification disparaîtra dans quelques secondes) ③ ー a Cliquez sur l'icône de notification pour ouvrir l'article correspondant ③ ー b Les articles qui ne se sont pas ouverts sont stockés dans la fenêtre de notification même si le Mac ne remarque pas la notification.

Les outils qui répondent aux spécifications ci-dessus sont automatiquement exécutés au démarrage du système d'exploitation. De plus, même si l'outil s'arrête anormalement en raison d'une défaillance temporaire de la communication, etc., il sera redémarré.   名称未設定.png

Matériaux référencés

Procédure de création

Créé en 5 étapes.

  1. Réparez mdfmonitor ・ Lieu de réparation A. Processus de détection de mise à jour d'URL Processus d'extraction des informations d'historique de mise à jour d'URL

A. Les conditions de détection des mises à jour d'URL ont été modifiées comme suit. ・ Existant Lorsque la date d'en-tête et le contenu de la page WEB ont changé depuis la dernière acquisition ·cette fois Lorsque seule la partie article de la page WEB a changé depuis la dernière acquisition

mdfmonitor.py


    def _check_modify(self, url, o_rbody):
        n_rbody = self._get_text(url)
        if n_rbody == o_rbody:
            return False
        else:
            return True

    def _get_text(self, url):
        try:
            l=[]
            title = urladrs = icon = []
            for line in requests.get(url).iter_lines():
                # get title
                if line.find("<h2>") >= 0:
                    title = re.sub(".*html\">", "", line)
                    title = re.sub("</a>.*", "", title)
                # get url
                if line.find("<h2>") >= 0:
                    urladrs = re.sub(".*href=\"", "", line)
                    urladrs = re.sub("\">.*", "", urladrs)
                # get icon
                if re.search("<img src=.* class=\"pict.*\"", line):
                    icon = re.sub("\s.*<a.*img src=\"", "", line)
                    icon = re.sub("\" width.*", "", icon)

                if title and urladrs and icon:
                    l.append([title, urladrs, icon])
                    title = urladrs = icon = []
            return l
        except requests.exceptions.ConnectionError:
            raise ConnectionError("Monitor can't connect the server of url you added.")

Étant donné que la logique de détection de la nouvelle arrivée dépend de la page WEB à détecter, elle est inévitablement non générale. Si le nombre de cibles de détection augmente, il est préférable de créer un fichier externe pour les mots-clés de détection.

B. Le processus d'extraction des informations d'historique de mise à jour d'URL a été modifié comme suit. ・ Existant Processus d'extraction des informations d'historique de mise à jour d'URL ·cette fois Stockez uniquement le nouveau nom d'article, la nouvelle URL d'article et la nouvelle image d'en-tête d'article acquise dans A ci-dessus dans une liste multidimensionnelle.

mdfmoniter.py


    def _diffgen(self):
        l = []
        for new in self.new_rbody:
            if not new in self.old_rbody:
                l.append(new)
        return l
  1. Traitement de sortie de l'instruction de commande d'appel du centre de notification MAC Il s'agit d'un fichier python qui appelle mdfmoniter.py dans 1 ci-dessus.

Exécution du terminal-notifier Je voulais l'exécuter tel quel après la création de l'instruction de commande, mais lorsque je l'exécute par démarrage automatique, le terminal-notifier se termine anormalement pour une raison quelconque. Par conséquent, la commande n'est pas exécutée ici, mais est exécutée par cron.

newsmoniter.py


#!/usr/bin/python
#coding: utf-8

import os
from mdfmonitor import URLModificationMonitor

# create Watcher instnce
monitor = URLModificationMonitor()

# append file to mdfmonitor instance
monitor.add_url("http://blog.esuteru.com")

for mdf in monitor.monitor():
    for title, urladrs, icon in mdf.diff:
        cmd = "/usr/local/bin/terminal-notifier -title new! -message {0} -open {1} -sound Submarine -appIcon {2}".format(title, urladrs, icon)
        f2 = open("/usr/local/bin/news_cmd.sh", "w")
        f2.write(cmd)
        os.chmod("/usr/local/bin/news_cmd.sh", 0777)
        f2.close()

3.newsmoniter.py Outil de surveillance de la vie et de la mort Le newsmoniter.py ci-dessus peut se terminer anormalement en raison d'une erreur de communication temporaire, etc., et le processus peut disparaître. Cet outil est un outil pour détecter la disparition et le redémarrer.

autorun.sh


#!/bin/sh

while true;
do
    ps -ef | grep newsmoniter.py | grep -v grep
    if [ $? = "1" ]; then
        echo "restart newsmoniter.py"
        /usr/local/bin/newsmoniter.py
    fi
    sleep 10
done
  1. Paramètres de démarrage automatique au démarrage du système d'exploitation Utilisez les fonctions standard du système d'exploitation et définissez le fichier autorun.sh ci-dessus pour qu'il démarre au démarrage du système d'exploitation.

/Library/StartupItems/Newsmoniter


StartService()
{
    /usr/local/bin/autorun.sh
}
  1. Exécution de la commande d'appel du centre de notification MAC par cron

cron


* * * * * /usr/local/bin/news_cmd.sh > /dev/null 2>&1; rm -f /usr/local/bin/news_cmd.sh > /dev/null 2>&1

Ce que je veux faire dans le futur

Environnement de vérification de fonctionnement

Recommended Posts

J'ai créé une application de notification de nouvelles en ligne avec Python
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
J'ai fait un compteur de caractères avec Python
J'ai fait une carte hexadécimale avec Python
J'ai fait un jeu rogue-like avec Python
J'ai fait un simple blackjack avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait un simulateur de neurones avec Python
J'ai fait une prévision météo de type bot avec Python.
[Python] J'ai créé un téléchargeur Youtube avec Tkinter.
J'ai fait un jeu de cueillette avec Python
Made Mattermost Bot avec Python (+ Flask)
J'ai fait un blackjack avec du python!
J'ai fait un texte Python
J'ai fait un blackjack avec Python.
J'ai créé wordcloud avec Python.
J'ai fait un Twitter BOT avec GAE (python) (avec une référence)
J'ai fait un jeu d'éclairage de sapin de Noël avec Python
J'ai créé un environnement Python3 sur Ubuntu avec direnv.
J'ai essayé de faire LINE BOT avec Python et Heroku
J'ai fait un jeu de frappe simple avec tkinter de Python
J'ai créé une application de livre simple avec python + Flask ~ Introduction ~
J'ai fait un jeu de puzzle (comme) avec Tkinter of Python
J'ai fait un circuit simple avec Python (AND, OR, NOR, etc.)
J'ai fait un package qui peut comparer des analyseurs morphologiques avec Python
J'ai fait un programme de gestion de la paie en Python!
J'ai dessiné une carte thermique avec Seaborn [Python]
J'ai créé un formulaire de tweet Nyanko avec Python, Flask et Heroku
J'ai créé beaucoup de fichiers pour la connexion RDP avec Python
Démonisez une application Web Python avec Supervisor
Créé un voyage de fléchettes avec python (news)
[Python] J'ai créé une visionneuse d'images avec une fonction de tri simple.
J'ai essayé un langage fonctionnel avec Python
J'ai fait un shuffle qui peut être réinitialisé (inversé) avec Python
J'ai essayé de créer une application de notification de publication à 2 canaux avec Python
Ce que j'ai fait avec les tableaux Python
J'ai fait un jeu de vie avec Numpy
J'ai fait un générateur Hanko avec GAN
J'ai créé un chat-holdem de serveur de jeu de poker en utilisant websocket avec python
Après avoir étudié Python3, j'ai créé un Slackbot
Créez une application de bureau avec Python avec Electron
J'ai fait une application WEB avec Django
Application Othello (application iOS) réalisée avec Python (Kivy)
J'ai créé un outil pour parcourir automatiquement plusieurs sites avec Selenium (Python)
J'ai créé un outil qui facilite un peu la décompression avec CLI (Python3)
J'ai fait un module PyNanaco qui peut charger des crédits nanaco avec python
J'ai fait un robot de remplacement de tampon avec une ligne
J'ai créé un fichier de dictionnaire python pour Neocomplete
Je veux faire un jeu avec Python
Procédure de création d'un LineBot réalisé avec Python
J'ai fait un simple portefeuille de Bitcoin avec pycoin
J'ai créé un Bot LINE avec Serverless Framework!
J'ai fait un graphique de nombres aléatoires avec Numpy
Je veux écrire dans un fichier avec Python
J'ai créé un programme cryptographique César en Python.
Création du wrapper d'API Qiita Python "qiipy"