2026, 새로운 도약을 시작합니다.

Youtube 채널의 영상을 파이썬으로 그누보드에 퍼오기 (50개 제한 우회)

안녕하세요? 좋은 주말이네요! ^-^

저번에 올려드린 그누보드 자동 글쓰기 함수를 활용하여

( https://sir.kr/g5_tip/15678 )

Youtube API의 비디오 50개 제한을 우회하면서 특정 채널의 영상을 퍼오는 Python 스크립트를 작성했어요~

[code]

import requests, pymysql, json

from tqdm import tqdm

from datetime import datetime


 

def board_write(board, subject, content, mb_id, nickname):

    # MySQL connection 및 cursor 생성

    conn = pymysql.connect(host = 'URL을입력하세요', 

                           user = 'DB유저명을입력하세요', 

                           password = 'DB비번을입력하세요',

                           db = 'DB명을입력하세요', 

                           charset = 'utf8')

    curs = conn.cursor()

    # 작성글 INSERT

    sql = f"select wr_num from g5_write_{board}" 

    curs.execute(sql)

    wr_num = str(int(curs.fetchone()[0]) - 1)

    now = datetime.today().strftime('%Y-%m-%d %H:%M:%S') # 그누보드의 날짜 형식 준수 (ex: 2021-04-05 23:45:15)

    sql = f"insert into g5_write_{board} set wr_num = {wr_num}, \

          wr_reply = '', wr_comment = 0, ca_name = '', wr_option = 'html1', wr_subject = '{subject}', \

          wr_content = '{content}', wr_link1 = '', wr_link2 = '', \

          wr_link1_hit = 0, wr_link2_hit = 0, wr_hit = 1, wr_good = 0, wr_nogood = 0, \

          mb_id = '{mb_id}', wr_password = '', wr_name = '{nickname}', wr_email = '', wr_homepage = '', \

          wr_datetime = '{now}', wr_last = '{now}', wr_ip = '111.111.111.111', \

          wr_1 = '', wr_2 = '', wr_3 = '', wr_4 = '', wr_5 = '', \

          wr_6 = '', wr_7 = '', wr_8 = '', wr_9 = '', wr_10 = '', \

          wr_comment_reply = '', wr_facebook_user = '', wr_twitter_user = '', \

          as_re_name = '', as_tag = '', as_map = '', as_icon = '', as_thumb = '', as_video = ''"

    curs.execute(sql)

    # 부모 아이디에 UPDATE

    sql = f"select wr_id from g5_write_{board}"

    curs.execute(sql)

    wr_id = str(curs.fetchall()[-1][0])

    sql = f"update g5_write_{board} set wr_parent = {wr_id} where wr_id = {wr_id}"

    curs.execute(sql)

    # 새글 INSERT

    sql = f"insert into g5_board_new ( bo_table, wr_id, wr_parent, bn_datetime, mb_id ) values \

          ( '{board}', '{wr_id}', '{wr_id}', '{now}', '{mb_id}' )"

    curs.execute(sql)

    # 게시글 1 증가

    sql = f"select bo_count_write from g5_board where bo_table = '{board}'"

    curs.execute(sql)

    bo_count_write = str(int(curs.fetchone()[0]))

    sql = f"update g5_board set bo_count_write = {bo_count_write} + 1 where bo_table = '{board}'"

    curs.execute(sql)

    # MySQL connection 닫기

    conn.close()

    return


 

def get_all_video(c_id):

    api_key = '유튜브API키를입력하세요'

    base_search_url = 'https://www.googleapis.com/youtube/v3/search?'

    start_url = base_search_url+'key={}&channelId={}&part=snippet,id&order=date&maxResults=25'.format(api_key, c_id)

    video_data = dict()

    url = start_url

    while True:

        resp = requests.get(url).text

        data = json.loads(resp)

        for i in data['items']:

            if i['id']['kind'] == "youtube#video":

                title = i['snippet']['title']

                v_id = i['id']['videoId']

                video_data[title] = v_id # key에 제목, value에 videoId를 넣습니다.

        try:

            next_page_token = data['nextPageToken']

            url = start_url + '&pageToken={}'.format(next_page_token)

        except:

            break

    return dict(reversed(list(video_data.items()))) # 역순이기 때문에 이를 뒤집어서 업로드 시간 순으로 정렬합니다.


 

channel_id = '채널ID를입력하세요'

result = get_all_video(channel_id)

board = '게시판명을입력하세요'

mb_id = 'ID를입력하세요'

nickname = '닉네임을입력하세요'

for key, value in tqdm(result.items()):

    subject = key

    content = f'<iframe width="560" height="315" src="https://www.youtube.com/embed/{value}" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>'

    board_write(board, subject, content, mb_id, nickname)

[/code]

위 스크립트는 파이썬 3.7에서 테스트되었으며,

3.5 이하에서는 dictionary의 순서가 보존되지 않기 때문에 collections.OrderedDict를 사용하셔야 되어요~

참고로 파이썬 3.8에서는 보다 간단한 방법으로 reversed를 처리할 수 있습니다 :)

실행 결과는 다음과 같이 Progress bar로 표현했어요 ^^

3666978703_1621741490.516.png

Lancôme Korea 유튜브 채널에 들어가보면 현재 총 51개의 영상이 업로드되어 있는데,

그누보드(아미나)에 51개의 영상이 정상적으로 업로드된 결과를 캡쳐했어요 :)

3666978703_1621741541.2182.png

3666978703_1621741554.327.png

3666978703_1621741579.5201.png

3666978703_1621741595.8815.png

게시글에 들어가보면 다음과 같이 업로드가 잘 되어있는 것을 확인할 수 있어요~ ^^

3666978703_1621741849.8715.png

일반적으로 Youtube API는 최대 50개까지의 비디오에 대하여 데이터를 반환하지만,

위 스크립트에서는 nextPageToken을 이용하여 그 이상의 데이터도 받을 수 있도록 작성하였습니다!

다만 이 방식을 사용하더라도 구글 측에서 대략 500개 내외에서 제한을 거는 것 같네요 ㅠㅠ

그리고 위 스크립트에서 최종적으로 업로드한 videoId를 로그 파일에 저장하도록 하여 crontab에 넣으면

아미나의 'Basic Feed'와 유사한 용도로 활용할 수 있지만,

위 스크립트는 50개 이상의 데이터를 받아오도록 작성되었기 때문에

crontab으로 너무 자주 돌리면 Youtube API의 1일 최대 limit에 걸릴 수 있습니다 ㅠㅠ

다음에는 복수의 유튜브 채널에서 영상을 수집하여 crontab에 넣고 돌릴 수 있는 스크립트를 올려볼게요!

그럼 다들 즐겁고 뜻깊은 주말 오후 되시고, 일교차가 큰데 감기 조심하세요~ ^^

냑 회원님들께 항상 감사드립니다! 

|

댓글 16개

@트리플 트리플 님 안녕하세요? ^-^
허접한 스크립트에 번번이 추천과 댓글 남겨주셔서 진심으로 감사드립니다!
트리플 님께서도 항상 건강하시고 사업도 번창하시기를 기원합니다 :)
멋지네요
테스트 한번 해봐야겠어요
@균이 안녕하세요? ^-^
허접한 소스인데 추천과 댓글 남겨주셔서 감사드립니다 :)
그럼 남은 5월도 잘 마무리하시고, 코로나19로 어려운 시국이지만 가정에 건강이 늘 함께 하시기를 기원합니다!
추천 10개 박고 싶지만 1개밖에 안되네요. 공개해주셔서 감사합니다^^
@G몽 옙 말씀만으로도 정말 감사드립니다 ^-^
아무쪼록 조금이나마 도움이 되셨으면 좋겠네요~
그럼 편안한 저녁 되세요! :)
@더SUN 저야말로 감사드립니다! ^-^
그럼 편안한 저녁 되시고, 항상 건강하세요~ :)
@크리스휘 옙 감사합니다 ^^
좋은 저녁 되시고, 남은 5월 잘 마무리하세요~ :)
트위터에 특정 키워드
구글에 특정 키워드 걸어서 긁어오게도 할 수 있을까요?
@더SUN 예 그렇게 크롤링하도록 구현하면 가능합니다 ^^
즐거운 주말 되세요 :)
정말 감사합니다
@그들보드 옙 감사합니다! ^^ 좋은 저녁 되세요 :)
좋은 자료입니다.
좋은자료입니다.
어떻게 사용해야 하는지 설명 좀 부탁드려도 될까요 ^^;;

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

그누보드5 팁자료실

번호 제목 글쓴이 날짜 조회
공지 3년 전 조회 4,593
2741 어제 조회 77
2740 3일 전 조회 83
2739 1주 전 조회 195
2738 1주 전 조회 201
2737 1주 전 조회 169
2736 1주 전 조회 269
2735 2주 전 조회 274
2734 3주 전 조회 255
2733 1개월 전 조회 258
2732 1개월 전 조회 293
2731 1개월 전 조회 261
2730 1개월 전 조회 218
2729 1개월 전 조회 344
2728 1개월 전 조회 238
2727 1개월 전 조회 413
2726 1개월 전 조회 248
2725 1개월 전 조회 323
2724 1개월 전 조회 352
2723 1개월 전 조회 260
2722 1개월 전 조회 293
2721 1개월 전 조회 206
2720 2개월 전 조회 299
2719 2개월 전 조회 302
2718 2개월 전 조회 196
2717 2개월 전 조회 329
2716 2개월 전 조회 198
2715 2개월 전 조회 306
2714 2개월 전 조회 266
2713 2개월 전 조회 369
2712 2개월 전 조회 284
🐛 버그신고