YoutubeLiveのコメントをリアルタイムで取得したかったのでやってみた。
URL:https://blog.sky-net.pw/article/86

上のURLを参考(ほぼコピペ)にしてyoutubeLiveのコメントを取得した。

credentials.jsonとclient.jsonは上のサイトに基本的なことは書いてあった。

最初上のサイトに載っている方法でコメントを取得したが、pageTokenを使って取得した場合コメント量が多い生放送だとコメントがある一定量に達するまで取得できず一括で取得してしまっていた。

そのため、リアルタイムで大量のコメントを取得することができなかった。


スクリーンショット 2018-06-21 10.56.42
(次のpageTokenが取得できない状態が続いてしまう)

解決案として、pageTokenで次のコメントを取得するのではなく同じURLからコメントを取得してこちらで差分を取ることによってほぼリアルタイムで取得することができた。

あと、よく分からないけどコメントがない場合KeyErrorが発生してしまったので取得方法を.get()にしてデフォルトを返すことによって発生しなくした。
参考:
https://qiita.com/sue71/items/b7f5c9373d0af587e256
https://memo.sugyan.com/entry/20090310/1236612991

import httplib2
import httplib2
from oauth2client import tools
from oauth2client import client
from oauth2client.file import Storage
import json
import time

youtubeURL=' youtubeLiveのURL '

def urlGet():
    print("取得したyoutubeliveID:"+youtubeURL[-11:])
    urlP = youtubeURL[-11:]

    credentials_path = "./credentials.json"
    store = Storage(credentials_path)
    credentials = store.get()

    if credentials is None or credentials.invalid:
        f = "./client.json"
        scope = "https://www.googleapis.com/auth/youtube.readonly"
        flow = client.flow_from_clientsecrets(f, scope)
        flow.user_agent = "APIキー"
        credentials = tools.run_flow(flow, Storage(credentials_path))

    http = credentials.authorize(httplib2.Http())
    url = "https://www.googleapis.com/youtube/v3/videos?part=liveStreamingDetails&id="
    url += urlP

    res, data = http.request(url)
    data = json.loads(data.decode())

    try:
        chat_id = data["items"][0]["liveStreamingDetails"]["activeLiveChatId"]
    except:
        print("生放送読み込みエラー")
        return

    print("チャットID:"+chat_id)
    print("チャットID取得")

    url = "https://www.googleapis.com/youtube/v3/liveChat/messages?part=snippet,authorDetails"
    url += "&liveChatId=" + chat_id

    commentGet(data,url,http)

def commentGet(data,url,http):
    commentDifference = ""
    commentDBlue = False

    print("コメント取得開始")
    while True:
        res, data = http.request(url)
        data = json.loads(data.decode())

        if data.get("items"):   #取得できなかった場合のため
            for datum in data["items"]:
                snippet = datum.get("snippet")
                if snippet.get("textMessageDetails"):
                    textMessageDetails = snippet.get("textMessageDetails")
                    if textMessageDetails.get("messageText"):

                        comment = datum["snippet"]["textMessageDetails"]["messageText"]
                        name = datum["authorDetails"]["displayName"]

                        if commentDBlue == True:
                            print(name + ": " + comment)

                        if commentDifference == name + ":" + comment:
                            commentDBlue = True

                        commentDifference_middle = name + ":" + comment

        commentDifference = commentDifference_middle
        time.sleep(0.5)
        commentDBlue = False

if __name__ =='__main__':
    urlGet()

たまに取得できないコメントがあるがまあ、気にしない。一応取得できたのでよしとする。


comment