[PYTHON] [Konzept] Bot, der eine Benachrichtigung über den Beginn der Live-Live-Übertragung von Nico Nico an Discord auf discord.py sendet

1/30 Nachschrift Es wurde abgeschlossen [Abgeschlossen] Bot, der eine Benachrichtigung über den Start der Live-Übertragung von Nico Nico an Discord auf discord.py sendet

zunaechst

Dies ist Qiitas erster Beitrag. Mein Name ist Ryo, auch bekannt als fctokyo1016. Twitter → @ fctokyo1016 Ich entwickle normalerweise mit PHP. Es ist ein Code, der von einem Amateur erstellt wurde, der seit mehreren Jahren Ingenieur ist. Ich hoffe, Sie können ihn übersehen.

Hintergrund des Versuchs zu machen

――Niko Niko Live-Übertragung Planungsteam, zu dem etwa 10 Personen gehören, von denen jeder frei in derselben Community live übertragen kann ――Da die Warnung von Nico Nama aufgrund der Spezifikationsänderung nicht mehr verwendet werden kann, ist es schwierig, die URL zu finden, wenn Sie die Sendung anderer Mitglieder ansehen. ――Ist es nicht einfacher, wenn eine Benachrichtigung an den Discord-Server gesendet wird, der alle Mitglieder enthält?

Schwierigkeiten

――Wie oben erwähnt, unterstützen aufgrund von Änderungen in den Warnspezifikationen von Nico Live weder RSS noch API die Übertragung von Live-Benutzern.

Idee

»Kannst du Schaben verwenden, das du in der Vergangenheit ein wenig berührt hast? ――Ich wollte nur Python lernen

Artikel, auf die verwiesen wird

Ausführungsergebnis

Die Sendung unserer Mitglieder wurde tatsächlich benachrichtigt 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

#Geben Sie den Dateipfad für die Benachrichtigungsverwaltung an
listFilePath = 'list.txt'

#Ersetzen Sie durch den Zugriffstoken Ihres Bots
TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

#Beliebige Kanal-ID(int)
CHANNEL_ID = 0000000000000000

#Legen Sie die Community fest, die Sie überprüfen möchten
targetCommunitys = ['co1520016']

#Gibt True zurück, wenn die Liste eine Suche enthält, und False, wenn keine vorhanden ist
def searchList(liveURL):
    #Überprüfung der Dateiexistenz
    if not os.path.exists(listFilePath):
        return False

    liveLV = liveIdExtraction(liveURL)

    #In-File-Prüfung
    with open(listFilePath) as f:
        for i, line in enumerate(f):
            if line == liveLV + '\n':
                return True
    print(line)
    return False

#Fügen Sie der Liste die Broadcast-ID hinzu
def addList(liveURL):
    liveLV = liveIdExtraction(liveURL)
    with open(listFilePath, 'a') as f:
        print(liveLV, file=f)

#Broadcast-ID von der Broadcast-URL(lvXXXXXXX)Extraktion
def liveIdExtraction(liveURL):
    repatter = re.compile('lv[0-9]+')
    return repatter.search(liveURL).group()

#Ruft den Broadcast-Titel von der Broadcast-URL ab
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')

#Rufen Sie den Namen des Senders von der Broadcast-URL ab
def getLiveName(liveURL):
    r = requests.get(liveURL)
    soup = BeautifulSoup(r.content, "html.parser")
    return soup.find("span",{"class":"name"}).text



#Generieren Sie die für die Verbindung benötigten Objekte
client = discord.Client()

#Verarbeitung, die beim Start ausgeführt wird
@client.event
async def on_ready():
    while(True):
        #Wiederholen Sie diesen Vorgang für die Anzahl der Zielgemeinschaften
        for targetCommunity in targetCommunitys:
            #URL festlegen
            r = requests.get("https://com.nicovideo.jp/community/" + targetCommunity)

            #Überprüfen Sie die Community-TOP-Seite
            soup = BeautifulSoup(r.content, "html.parser")
            result = soup.find("section", "now_live")

            #Wenn die Sendung gestartet wurde
            if result is not None:
                #Broadcast-URL abrufen
                liveURL = result.find("a", "now_live_inner").get("href")

                #Durchsuchen Sie die Liste und verarbeiten Sie sie nicht, wenn die Broadcast-ID bereits verarbeitet wurde
                if searchList(liveURL) is False:
                    #Holen Sie sich den Titel der Sendung
                    liveTitle = getLiveTitle(liveURL)
                    #Holen Sie sich den Namen des Senders
                    liveName = getLiveName(liveURL)

                    #An Zwietracht senden
                    channel = client.get_channel(CHANNEL_ID)
                    await channel.send('@everyone ' + liveName + 'Hat mit der Lieferung begonnen\n\n' + liveTitle + '\n' + liveURL)

                    #Broadcast ID Postscript
                    addList(liveURL)

        #Warte 1 Minute
        await asyncio.sleep(60)

#Stellen Sie eine Verbindung zu Discord her
client.run(TOKEN)

Was machst du

--Scraping der Community-Seite von Nico Nico Live Broadcast, um die Broadcast-URL zu erhalten

Geben Sie den Dateinamen der Textdatei an, die die Übertragung nach der Verarbeitung verlässt. wie es Dir gefällt

discordbot.py


#Geben Sie den Dateipfad für die Benachrichtigungsverwaltung an
listFilePath = 'list.txt'

Discord-Einstellsystem

discordbot.py


#Ersetzen Sie durch den Zugriffstoken Ihres Bots
TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

#Beliebige Kanal-ID(int)
CHANNEL_ID = 0000000000000000

Geben Sie die Community an, die als Array verarbeitet werden soll. Unterstützt mehrere Communities

discordbot.py


#Legen Sie die Community fest, die Sie überprüfen möchten
targetCommunitys = ['co1520016']

Stellen Sie fest, ob Sie bereits über die Broadcast-URL benachrichtigt wurden Es dient zur Überprüfung, um zu verhindern, dass dieselbe Sendung mehrmals benachrichtigt wird.

discordbot.py


#Gibt True zurück, wenn die Liste eine Suche enthält, und False, wenn keine vorhanden ist
def searchList(liveURL):
    #Überprüfung der Dateiexistenz
    if not os.path.exists(listFilePath):
        return False

    liveLV = liveIdExtraction(liveURL)

    #In-File-Prüfung
    with open(listFilePath) as f:
        for i, line in enumerate(f):
            if line == liveLV + '\n':
                return True
    print(line)
    return False

Fügen Sie die benachrichtigte Sendung zur Liste hinzu

discordbot.py


#Fügen Sie der Liste die Broadcast-ID hinzu
def addList(liveURL):
    liveLV = liveIdExtraction(liveURL)
    with open(listFilePath, 'a') as f:
        print(liveLV, file=f)

Verschiedene Daten werden durch Scraping von der Broadcast-URL erfasst

discordbot.py


#Broadcast-ID von der Broadcast-URL(lvXXXXXXX)Extraktion
def liveIdExtraction(liveURL):
    repatter = re.compile('lv[0-9]+')
    return repatter.search(liveURL).group()

#Ruft den Broadcast-Titel von der Broadcast-URL ab
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')

#Rufen Sie den Namen des Senders von der Broadcast-URL ab
def getLiveName(liveURL):
    r = requests.get(liveURL)
    soup = BeautifulSoup(r.content, "html.parser")
    return soup.find("span",{"class":"name"}).text

Aufgabe

Recommended Posts

[Konzept] Bot, der eine Benachrichtigung über den Beginn der Live-Live-Übertragung von Nico Nico an Discord auf discord.py sendet
Erstellen Sie einen BOT, der die Discord-URL verkürzt
Erstellen Sie mit MeCab mit Discord einen Bot, der nur das Ergebnis der morphologischen Analyse zurückgibt
Lassen Sie uns den Befehl pünktlich mit dem Bot der Zwietracht ausführen
Erhalten Sie Kommentare zu Nico Nico Live Broadcast
Erstellen Sie einen Bot, der die Anzahl der Personen, die für das neue Corona-Virus in Tokio positiv sind, an Slack sendet
Ich habe versucht, einen Übersetzungs-BOT zu erstellen, der mit Discord unter Verwendung von Googletrans funktioniert
Rückblick auf die Geschichte der Ausdrücke, die die Summe der Quadrate an Pythonic zurückgeben