# Attention! Before running this code, install an API-library as bellow

# pip install google-api-python-client 

 

# YoutubeのAPIを使って、Youtube内の特定の動画の情報を取得

# ●毎日定時、所定時刻までくりかえし実行
from apiclient.discovery import build #GoogleAnalyticsAPI  

import json

import time

import csv

import schedule

from time import sleep

from datetime import datetime,date

 

#自分のAPI KEY

YOUTUBE_API_KEY = "取得したキーをここへ入れる!"

 

# YoutubeAPIを使うための準備

API_SERVICE_NAME = "youtube"

API_VERSION = "v3"

youtube = build(API_SERVICE_NAME, API_VERSION, developerKey=YOUTUBE_API_KEY)

 

# 情報取得したい動画のID

YOUTUBE_MOVIE_IDs = []

YOUTUBE_MOVIE_IDs = ['Dokn5iGzjwU','1n83PbBLjls','HjEFHk_6nWA','0KfVYm2Rpxs','fGCmRBn6-7o','T5kZFuSTbMY']

 

# CSVファイルから情報取得したい動画のIDを読込み

# csvfile = "./YOUTUBE_MOVIE_IDs.csv"

# with open(csvfile, 'r') as csv_readfile:

# YOUTUBE_MOVIE_IDs = csv.reader(csv_readfile)

 

#01 定期実行する関数を準備

def task():

 

    for YOUTUBE_MOVIE_ID in YOUTUBE_MOVIE_IDs:

        import datetime

 

        # mv基本情報の取得

        part_get_snippet = 'snippet'

        part_get_statistics = 'statistics'

        part_get = part_get_snippet+","+part_get_statistics

        youtube_query = youtube.videos().list(part = part_get,id = YOUTUBE_MOVIE_ID)

        youtube_responce = youtube_query.execute()

        info_mv = youtube_responce['items'][0][part_get_snippet]

 

        # 取得したmv基本情報の抽出

        # PageInfoにある情報

        # "totalResults"        ●検索などの結果の件数

        # itemsにある情報

        # "id"                ●動画ID

        # snippetにある情報

        # "channelid"        ●チャンネルID

        # "publishedAt"        ●動画公開日

        # "title"                ●動画タイトル

        # "description"    ●動画説明

        # "duration"        ●再生時間

 

        title_mv = info_mv['title']

        publishedAt_mv = info_mv['publishedAt'] 

 

        # mv再生統計の取得

 

        # part_get = 'statistics'

        # youtube_query = youtube.videos().list(part = part_get,id = YOUTUBE_MOVIE_ID)

        # youtube_responce = youtube_query.execute()

        

        mv_info = youtube_responce['items'][0][part_get_statistics]

 

        # 取得したmv再生統計の抽出(ここでは再生数のみ)

        # statisticsにある情報

        # "viewCount"        ●再生数

        # "likeCount"        ●高評価数

        # "dislikeCount"    ●低評価数

        # "favoriteCount"    ●お気に入り数

        # "commentCount"    ●コメント数

 

        viewCount_mv = mv_info['viewCount']

        likeCount_mv = mv_info['likeCount']

        commentCount_mv = mv_info['commentCount']

 

        datetime_now = datetime.datetime.now()

 

        # 取得情報のCSV追記、画面表示

        name_csvrec = "YTMVinfo_tubakiNEWSingle.csv"

        row_output =[[title_mv,viewCount_mv,likeCount_mv,commentCount_mv,datetime_now,publishedAt_mv]]

        outf = open(name_csvrec, 'a', newline='')

        writer = csv.writer(outf)

        writer.writerows(row_output)

        outf.close()

        print(title_mv,",",viewCount_mv,",",likeCount_mv,",",commentCount_mv,",",datetime_now,publishedAt_mv)

 

#02 スケジュール登録

# 設定例

# schedule.every(2).seconds.do(task)            ●2秒毎

# schedule.every().hour.at(“:35”).do(task)        ●毎時35分

# schedule.every().monday.at(“15:40”).do(task)    ●毎月曜日15時40分

# schedule.every().day.at(“12:20”).do(task)        ●毎日12時20分

# schedule.every().day.at(“12:20”).do(task).tag("daytime")        ●毎日12時20分、タグ付き

# schedule.every().day.at(“23:20”).do(task).tag("nighttime")        ●毎日23時20分、タグ付き

# schedule.clear()                                ●全スケジュール一斉キャンセル

# schedule.clear("nighttime")                    ●タグ付きスケジュールキャンセル

 

 

# 全スケジュールクリア

schedule.clear()

 

# 15秒ごと情報取得・記録

schedule.every().day.at("00:00").do(task)

 

# 毎日23時59分に情報取得・記録

# schedule.every().day.at(“23:59”).do(task)

 

#02 何時まで実行するか定義

year   = 2022

month  = 7

day    = 1

hour   = 0

minute = 2

second = 0

set_until_time = datetime(year,month,day,hour,minute,second)

 

print(" process start : ",datetime.now())

print(" running until : ",set_until_time)

 

#03-0 単純無限ループ

# while True:

    # schedule.run_pending()

    # sleep(1)

 

#03-1 イベント実行 (特定の時間が来るまで定期実行)

while datetime.now() < set_until_time:

    schedule.run_pending()

    sleep(1)

print("process end by time")