LoginSignup
0
0

More than 1 year has passed since last update.

YouTube Live チャットのコメントで特定の文字を取得してラズパイでLチカする

Posted at

この記事を参考にすると、YouTube Live チャットのコメントで特定の文字を取得してラズパイでLチカできる。
https://qiita.com/iroiro_bot/items/ad0f3901a2336fe48e8f

↓こんな感じ。

ylc.py
# Live動画のコメント取得

import time
import requests
import json
import RPi.GPIO as GPIO
import time

#事前に取得したYouTube API key
YT_API_KEY = ''


def get_chat_id(yt_url):
    '''
    https://developers.google.com/youtube/v3/docs/videos/list?hl=ja
    '''
    video_id = yt_url.replace('https://www.youtube.com/watch?v=', '')
    print('video_id : ', video_id)

    url    = 'https://www.googleapis.com/youtube/v3/videos'
    params = {'key': YT_API_KEY, 'id': video_id, 'part': 'liveStreamingDetails'}
    data   = requests.get(url, params=params).json()

    liveStreamingDetails = data['items'][0]['liveStreamingDetails']
    if 'activeLiveChatId' in liveStreamingDetails.keys():
        chat_id = liveStreamingDetails['activeLiveChatId']
        print('get_chat_id done!')
    else:
        chat_id = None
        print('NOT live')

    return chat_id




def get_chat(chat_id, pageToken, log_file):
    '''
    https://developers.google.com/youtube/v3/live/docs/liveChatMessages/list
    '''
    url    = 'https://www.googleapis.com/youtube/v3/liveChat/messages'
    params = {'key': YT_API_KEY, 'liveChatId': chat_id, 'part': 'id,snippet,authorDetails'}
    if type(pageToken) == str:
        params['pageToken'] = pageToken

    data   = requests.get(url, params=params).json()

    try:
        for item in data['items']:
            channelId = item['snippet']['authorChannelId']
            msg       = item['snippet']['displayMessage']
            usr       = item['authorDetails']['displayName']
            #supChat   = item['snippet']['superChatDetails']
            #supStic   = item['snippet']['superStickerDetails']

            # コメントが、Hogeの場合
            if msg == "Hoge":
                print('\n')
                print("Hogeをありがとうございます")
                print('\n')

                #LEDをチカチカ
                PNO = 4 # 抵抗に繋いだ側の、GPIOポート番号
                GPIO.setmode(GPIO.BCM)
                GPIO.setup(PNO, GPIO.OUT)
                for i in range(5):
                    GPIO.output(PNO, GPIO.HIGH) # 点灯
                    time.sleep(0.3)
                    GPIO.output(PNO, GPIO.LOW) # 消灯
                    time.sleep(0.3)
                GPIO.cleanup()


            log_text  = '[by {}  https://www.youtube.com/channel/{}]\n  {}'.format(usr, channelId, msg)
            with open(log_file, 'a') as f:
                print(log_text, file=f)
                print(log_text)
        print('start : ', data['items'][0]['snippet']['publishedAt'])
        print('end   : ', data['items'][-1]['snippet']['publishedAt'])

    except:
        pass

    return data['nextPageToken']




def main(yt_url):
    slp_time        = 10 #sec 終了予定
    iter_times      = 60 #回
    take_time       = slp_time / 60 * iter_times
    print('{}分後 終了予定'.format(take_time))
    print('work on {}'.format(yt_url))

    log_file = yt_url.replace('https://www.youtube.com/watch?v=', '') + '.txt'
    with open(log_file, 'a') as f:
        print('{} のチャット欄を記録します。'.format(yt_url), file=f)
    chat_id  = get_chat_id(yt_url)

    nextPageToken = None
    for ii in range(iter_times):
        #for jj in [0]:
        try:
            print('\n')
            nextPageToken = get_chat(chat_id, nextPageToken, log_file)
            time.sleep(slp_time)
        except:
            break




if __name__ == '__main__':
    yt_url = input('Input YouTube URL > ')
    main(yt_url)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0