[PYTHON] Notifier LINE des informations d'apparence TV de votre artiste préféré

Objectif

J'ai raté mon idole préférée et mon artiste riant apparaissant à la télévision, alors j'ai décidé de les informer sur LINE. 2020-05-15 (9).png

Aperçu

[Guide Yahoo! TV G](https://tv.yahoo.co.jp/search/?q=%E7%9C%89%E6%9D%91%E3%81%A1%E3%81%82% Nous avons obtenu des informations sur les programmes télévisés de E3% 81% 8D & g = & a = 23 & oa = 1 & s = 1% 22) et l'avons notifié à l'aide de LINE Notify. J'ai configuré le Raspberry pi pour exécuter le programme tous les matins à 9h.

Acquisition d'informations sur le programme

Par exemple, dans le cas du programme terrestre de "Chiaki Meimura" (réglage régional de Tokyo), il s'agit de l'URL. https://tv.yahoo.co.jp/search/?q=眉村ちあき&g=0&a=23&oa=1&s=1

Définissez une fonction appelée tv_information (query, romaji, jenre) et recevez le nom de l'animateur que vous souhaitez notifier en entrée, le nom du fichier texte qui enregistre le programme d'apparence et le genre du programme télévisé que vous souhaitez notifier. J'ai obtenu les informations de l'URL que j'ai saisie. Cette fois, nous sommes limités aux programmes terrestres à Tokyo. Je voulais être notifié des informations sur la combinaison du rire et New York, mais comme de nombreux programmes liés à New York dans l'état américain sont notifiés dans le quartier de New York, je permet de préciser le genre du programme et de le notifier. Entrez jenre = 0 pour tous les genres et genre = 5 pour la variété.

LINE LINE Notify J'ai un jeton d'ici. Entrez le jeton obtenu à la place de line_notify_token =" Obtained LINE API ".

Code utilisé

tv_line.py


import requests
from bs4 import BeautifulSoup
import sys
from time import sleep

#Obtenir des informations TV(argument:Nom de l'artiste, caractères romains(Faites-en un nom de fichier), Genre)
def tv_information(query,romaji,jenre):
#0 pour tous les genres, 5 pour la variété
    if jenre==0:
        no=''
    elif jenre==5:
        no='05'
    url = "https://tv.yahoo.co.jp/search/?q="+query+"&g="+no+"&a=23&oa=1&s=1" 
    res = requests.get(url)
    status = res.status_code

    #Si le code d'état des demandes n'est pas 200, notifiez LINE et quittez.
    if status != 200:
        def LineNotify(message):
            line_notify_token = "API LINE acquise"
            line_notify_api = "https://notify-api.line.me/api/notify"
            payload = {"message": message}
            headers = {"Authorization": "Bearer " + line_notify_token}
            requests.post(line_notify_api, data=payload, headers=headers)
        message = "Les demandes ont échoué"
        LineNotify(message)
        sys.exit()
    

    #Si le code d'état est 200, le traitement se poursuit
    else:
        pass
    
    #Obtenez le nombre de recherches par mots clés
    soup = BeautifulSoup(res.text,"html.parser")
    p = soup.find("p",class_="floatl pt5p")

    #Si le nombre de recherches est égal à 0, le processus se termine
    if p == None:
        print('0')
        non={}
        return non  

    #Poursuivre le traitement si le nombre de recherches est égal ou supérieur à 1
    else:
        pass
    
    answer = int(p.em.text) #Nombre de recherches
    page = 1
    list1 = []  #Date et heure de diffusion
    list2 = []  #Diffuseur
    list3 = []  #Titre du programme

    #Obtenez des informations pour chaque page
    while answer > 0:
        url = "https://tv.yahoo.co.jp/search/?q="+query+"&g="+no+"&a=23&oa=1&s="+str(page)
        res = requests.get(url)
        soup = BeautifulSoup(res.text, "html.parser")

        dates = soup.find_all("div",class_="leftarea")
        for date in dates:
            d = date.text
            d = ''.join(d.splitlines())
            list1.append(d)

        for s in soup("span",class_="floatl"):
            s.decompose()
        tvs = soup.find_all("span",class_="pr35")
        for tv in tvs:
            list2.append(tv.text)

        titles = soup.find_all("div",class_="rightarea")
        for title in titles:
            t = title.a.text
            list3.append(t)

        page = page + 10
        answer = answer - 10

        sleep(3)

    #Une liste qui résume la date et l'heure de diffusion + la station de diffusion + le titre du programme de la liste1 à la liste3_Créer un nouveau
    list_new = [x +" "+ y for (x , y) in zip(list1,list2)]
    list_new = [x +" "+ y for (x , y) in zip(list_new,list3)]
    filename=romaji+'.txt'
    #Développez les données précédentes en tant qu'ensemble à partir d'un fichier texte
    f = open(filename,'r') 
    f_old = f.read()
    list_old = f_old.splitlines()   
    set_old = set(list_old)         
    f.close()           
    
    f = open(filename, 'w') 
    for x in list_new:
        f.write(str(x)+"\n")    #Écriture de fichier
    f.close()   

    #Prendre la différence entre les données précédentes et les données actuelles
    set_new = set(list_new)
    set_dif = set_new - set_old
    return set_dif

def LINE_notify(set_dif,query,romaji):

    #S'il n'y a pas de différence définie, le traitement se termine
    if len(set_dif) == 0:
        return  

    #S'il y a une différence, retirez-la sous forme de liste et notifiez LINE
    else:
        list_now = list(set_dif)
        list_now.sort()

        for L in list_now:
            def LineNotify(message):
                line_notify_token = "API LINE acquise"
                line_notify_api = "https://notify-api.line.me/api/notify"
                payload = {"message": message}
                headers = {"Authorization": "Bearer " + line_notify_token}
                requests.post(line_notify_api, data=payload, headers=headers)
            message = query+"Informations sur le programme d'apparence\n\n" + L
            LineNotify(message)
            sleep(2)
        return

#Notifier les programmes d'apparition de Chiaki Meimura de tous genres
set_dif1=tv_information('Chiaki Mayumura','mayumura',0)
LINE_notify(set_dif1,'Chiaki Mayumura','mayumura')

#Notifier les programmes d'apparence des escaliers pneumatiques de tous genres
set_dif2=tv_information('Escaliers pneumatiques','kuuki',0)
LINE_notify(set_dif2,'Escaliers pneumatiques','kuuki')

#Notifier le programme d'apparition de New York de divers genres
set_dif3=tv_information('New York','newy',5)
LINE_notify(set_dif3,'New York','newy')

Courir

J'ai essayé d'exécuter ce programme sur Raspberry pi tous les jours à 9h. J'ai écrit la déclaration suivante dans le fichier avec crontab -e.

00 09 * * * python3 /home/pi/tv_line.py

Écrivez le travail après l'exécution. Écrivez l'heure d'exécution dans l'ordre des minutes, heures, jours, mois et jours.

référence

Obtenir des informations à partir des listes de Yahoo TV (scraping Web pour débutants) Acquisition du programme d'apparition de Minami Hamabe en grattant [Résumé des commandes crontab [collection de commandes Linux]] (https://eng-entrance.com/linux-command-crontab)

Recommended Posts

Notifier LINE des informations d'apparence TV de votre artiste préféré
Notifier LINE des informations sur l'exploitation du train
Notifier LINE des informations de localisation (Google map) avec GPS Multi-Unit SORACOM Edition
Soyons avertis de la météo dans votre région préférée de Yahoo Weather sur LINE!