[PYTHON] [Concept] bot qui publie une notification du début de la diffusion en direct de Nico Nico en direct sur Discord sur discord.py

1/30 post-scriptum C'était terminé [Terminé] bot qui publie la notification de démarrage de la diffusion en direct de Nico Nico sur Discord sur discord.py

en premier

C'est le premier message de Qiita Je m'appelle Ryo, également connu sous le nom de fctokyo1016. Twitter → @ fctokyo1016 Je développe généralement avec PHP. C'est un code fait par un amateur qui est ingénieur depuis plusieurs années, alors j'espère que vous pourrez l'ignorer.

Contexte d'essayer de faire

--Niko Niko Live Broadcast équipe de planification à laquelle appartiennent environ 10 personnes, chacun pouvant diffuser librement en direct dans la même communauté

Des difficultés

――Comme mentionné ci-dessus, en raison du changement des spécifications d'alerte de Nico Live, ni RSS ni API ne prennent en charge la diffusion en direct des utilisateurs.

idée

――Pouvez-vous utiliser le grattage que vous avez un peu touché dans le passé? ――Je voulais juste étudier Python

Articles référencés

Résultat d'exécution

La diffusion de nos membres a effectivement été notifiée Discord_2020-01-15_01-02-13.png

code

discordbot.py


import requests
import os.path
import re
import discord
import asyncio
from bs4 import BeautifulSoup

#Spécifiez le chemin du fichier pour la gestion des notifications
listFilePath = 'list.txt'

#Remplacez par le jeton d'accès de votre bot
TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

#Tout identifiant de chaîne(int)
CHANNEL_ID = 0000000000000000

#Définissez la communauté que vous souhaitez vérifier
targetCommunitys = ['co1520016']

#Renvoie True s'il y a une recherche dans la liste et False s'il n'y en a pas
def searchList(liveURL):
    #Vérification de l'existence du fichier
    if not os.path.exists(listFilePath):
        return False

    liveLV = liveIdExtraction(liveURL)

    #Vérification en dossier
    with open(listFilePath) as f:
        for i, line in enumerate(f):
            if line == liveLV + '\n':
                return True
    print(line)
    return False

#Ajouter l'identifiant de diffusion à la liste
def addList(liveURL):
    liveLV = liveIdExtraction(liveURL)
    with open(listFilePath, 'a') as f:
        print(liveLV, file=f)

#Identifiant de diffusion de l'URL de diffusion(lvXXXXXXX)Extraction
def liveIdExtraction(liveURL):
    repatter = re.compile('lv[0-9]+')
    return repatter.search(liveURL).group()

#Obtenir le titre de diffusion à partir de l'URL de diffusion
def getLiveTitle(liveURL):
    r = requests.get(liveURL)
    soup = BeautifulSoup(r.content, "html.parser")
    for meta_tag in soup.find_all('meta', attrs={'property': 'og:title'}):
        return meta_tag.get('content')

#Obtenez le nom du diffuseur à partir de l'URL de diffusion
def getLiveName(liveURL):
    r = requests.get(liveURL)
    soup = BeautifulSoup(r.content, "html.parser")
    return soup.find("span",{"class":"name"}).text



#Générer les objets nécessaires à la connexion
client = discord.Client()

#Traitement qui fonctionne au démarrage
@client.event
async def on_ready():
    while(True):
        #Répétez pour le nombre de communautés cibles
        for targetCommunity in targetCommunitys:
            #Définir l'URL
            r = requests.get("https://com.nicovideo.jp/community/" + targetCommunity)

            #Consultez la page TOP de la communauté
            soup = BeautifulSoup(r.content, "html.parser")
            result = soup.find("section", "now_live")

            #Si la diffusion a commencé
            if result is not None:
                #Obtenir l'URL de diffusion
                liveURL = result.find("a", "now_live_inner").get("href")

                #Rechercher dans la liste et ne pas traiter si l'ID de diffusion a déjà été traité
                if searchList(liveURL) is False:
                    #Obtenir le titre de la diffusion
                    liveTitle = getLiveTitle(liveURL)
                    #Obtenez le nom du diffuseur
                    liveName = getLiveName(liveURL)

                    #Envoyer à Discord
                    channel = client.get_channel(CHANNEL_ID)
                    await channel.send('@everyone ' + liveName + 'A commencé la livraison\n\n' + liveTitle + '\n' + liveURL)

                    #ID de diffusion postscript
                    addList(liveURL)

        #Attendez 1 minute
        await asyncio.sleep(60)

#Connectez-vous à Discord
client.run(TOKEN)

Que fais tu

Spécifiez le nom de fichier du fichier texte qui quitte la diffusion une fois traitée. comme vous voulez

discordbot.py


#Spécifiez le chemin du fichier pour la gestion des notifications
listFilePath = 'list.txt'

Système de réglage de la discorde

discordbot.py


#Remplacez par le jeton d'accès de votre bot
TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

#Tout identifiant de chaîne(int)
CHANNEL_ID = 0000000000000000

Spécifiez la communauté à traiter comme un tableau. Prend en charge plusieurs communautés

discordbot.py


#Définissez la communauté que vous souhaitez vérifier
targetCommunitys = ['co1520016']

Déterminez si vous avez déjà été notifié à partir de l'URL de diffusion Il sert à vérifier pour éviter de notifier plusieurs fois la même émission.

discordbot.py


#Renvoie True s'il y a une recherche dans la liste et False s'il n'y en a pas
def searchList(liveURL):
    #Vérification de l'existence du fichier
    if not os.path.exists(listFilePath):
        return False

    liveLV = liveIdExtraction(liveURL)

    #Vérification en dossier
    with open(listFilePath) as f:
        for i, line in enumerate(f):
            if line == liveLV + '\n':
                return True
    print(line)
    return False

Ajouter la diffusion notifiée à la liste

discordbot.py


#Ajouter l'identifiant de diffusion à la liste
def addList(liveURL):
    liveLV = liveIdExtraction(liveURL)
    with open(listFilePath, 'a') as f:
        print(liveLV, file=f)

Diverses données sont acquises en grattant à partir de l'URL de diffusion

discordbot.py


#Identifiant de diffusion de l'URL de diffusion(lvXXXXXXX)Extraction
def liveIdExtraction(liveURL):
    repatter = re.compile('lv[0-9]+')
    return repatter.search(liveURL).group()

#Obtenir le titre de diffusion à partir de l'URL de diffusion
def getLiveTitle(liveURL):
    r = requests.get(liveURL)
    soup = BeautifulSoup(r.content, "html.parser")
    for meta_tag in soup.find_all('meta', attrs={'property': 'og:title'}):
        return meta_tag.get('content')

#Obtenez le nom du diffuseur à partir de l'URL de diffusion
def getLiveName(liveURL):
    r = requests.get(liveURL)
    soup = BeautifulSoup(r.content, "html.parser")
    return soup.find("span",{"class":"name"}).text

Tâche

Recommended Posts

[Concept] bot qui publie une notification du début de la diffusion en direct de Nico Nico en direct sur Discord sur discord.py
Créez un BOT qui raccourcit l'URL Discord
Créez un bot qui ne renvoie que le résultat de l'analyse morphologique avec MeCab avec Discord
Exécutons la commande à temps avec le bot discord
Obtenir des commentaires sur Nico Nico Live Broadcast
Créez un bot qui publie sur Slack le nombre de personnes positives pour le nouveau virus corona à Tokyo
J'ai essayé de créer un BOT de traduction qui fonctionne avec Discord en utilisant googletrans
Retour sur l'histoire des expressions qui renvoient somme de carré à Pythonic