この記事を参考にすると、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)