채널의 모든 동영상을 가져 오는 YouTube API
YouTube 채널 이름 (API 사용) 별 비디오 목록이 필요합니다.
아래 API를 사용하여 채널 목록 (채널 이름 만)을 얻을 수 있습니다.
https://gdata.youtube.com/feeds/api/channels?v=2&q=tendulkar
아래는 채널의 직접 링크입니다
https://www.youtube.com/channel/UCqAEtEr0A0Eo2IVcuWBfB9g
또는
WWW.YouTube.com/channel/HC-8jgBP-4rlI
이제 >> UCqAEtEr0A0Eo2IVcuWBfB9g 또는 HC-8jgBP-4rlI 비디오가 필요합니다.
우리는 시도했다
https://gdata.youtube.com/feeds/api/videos?v=2&uploader=partner&User=UC7Xayrf2k0NZiz3S04WuDNQ https://gdata.youtube.com/feeds/api/videos?v=2&uploader=partner&q=UC7Xayrf2k0NZiz3S04WuDNQ
그러나 도움이되지 않습니다.
채널에 게시 된 모든 비디오가 필요합니다. 채널에 업로드 된 동영상은 여러 사용자가 올 수 있으므로 사용자 매개 변수를 제공해도 도움이되지 않을 것이라고 생각합니다.
YouTube Data API 를 봐야 합니다 . API에 액세스하는 방법에 대한 설명서가 있습니다. 클라이언트 라이브러리 도 찾을 수 있습니다 .
직접 요청할 수도 있습니다. 다음은 채널에서 최신 동영상을 검색하는 URL 예입니다.
https://www.googleapis.com/youtube/v3/search?key={your_key_here}&channelId={channel_id_here}&part=snippet,id&order=date&maxResults=20
그 후 JSON
비디오 ID와 세부 정보가 포함 된를 받게 되고 다음과 같이 비디오 URL을 구성 할 수 있습니다.
http://www.youtube.com/watch?v={video_id_here}
먼저 사용자 / 채널의 업로드를 나타내는 재생 목록의 ID를 가져와야합니다.
https://developers.google.com/youtube/v3/docs/channels/list#try-it
forUsername={username}
매개 변수를 사용하여 사용자 이름을 지정 mine=true
하거나 자신을 얻도록 지정할 수 있습니다 (먼저 인증해야 함). part=contentDetails
재생 목록을 보려면 포함 하십시오.
GET https://www.googleapis.com/youtube/v3/channels?part=contentDetails&forUsername=jambrose42&key={YOUR_API_KEY}
결과에 "relatedPlaylists"
포함됩니다 "likes"
및 "uploads"
재생 목록. 그 잡아 "upload"
재생 목록 ID. 또한 "id"
나중에 참조 할 수 있도록 channelID입니다.
다음으로 해당 재생 목록에있는 동영상 목록을 가져옵니다.
https://developers.google.com/youtube/v3/docs/playlistItems/list#try-it
재생 목록을 삭제하십시오.
GET https://www.googleapis.com/youtube/v3/playlistItems?part=snippet%2CcontentDetails&maxResults=50&playlistId=UUpRmvjdu3ixew5ahydZ67uA&key={YOUR_API_KEY}
다음은v3
YouTube API 에서 채널의 모든 동영상을 나열하는 방법을 보여주는 Google 개발자의 동영상입니다 .
두 단계가 있습니다 :
'업로드'ID를 얻기 위해 채널을 쿼리합니다. 예 :
https://www.googleapis.com/youtube/v3/channels?id={channel Id}&key={API key}&part=contentDetails
이 "업로드"ID를 사용하여 비디오 목록을 가져 오려면 PlaylistItems를 쿼리하십시오. 예 :
https://www.googleapis.com/youtube/v3/playlistItems?playlistId={"uploads" Id}&key={API key}&part=snippet&maxResults=50
채널 목록을 얻으려면 :
forUserName으로 채널 목록 가져 오기 :
채널 ID 별로 채널 목록을 가져 옵니다 .
채널 가져 오기 섹션 :
재생 목록을 얻으려면 :
채널 ID로 재생 목록 가져 오기 :
가져 오기 재생 목록 으로 pageToken을 가진 채널 ID를 :
https://www.googleapis.com/youtube/v3/playlists?part=snippet,contentDetails&channelId=UCq-Fj5jknLsUf-MWSy4_brA&maxResults=50&key= & pageToken = CDIQAA
PlaylistItems를 가져 오려면 :
PlayListId로 PlaylistItems 목록 가져 오기 :
비디오를 얻으려면 :
동영상 ID로 동영상 목록 가져 오기 :
여러 개의 동영상으로 동영상 목록 가져 오기 id :
의견 목록 받기
비디오 ID로 댓글 목록 가져 오기 :
https://www.googleapis.com/youtube/v3/commentThreads?part=snippet,replies&videoId=el **** kQak & key = A ********** k
채널 ID 별로 댓글 목록 가져 오기 :
https://www.googleapis.com/youtube/v3/commentThreads?part=snippet,replies&channelId=U ***** Q & key = AI ******** k
allThreadsRelatedToChannelId로 댓글 목록 가져 오기 :
https://www.googleapis.com/youtube/v3/commentThreads?part=snippet,replies&allThreadsRelatedToChannelId=UC ***** ntcQ & key = AI ***** k
여기에 모든 API는 Get 접근 방식입니다.
채널 ID를 기준으로 모든 동영상을 직접 가져 오지는 않습니다. 여기서 중요한 점입니다.
통합 https://developers.google.com/youtube/v3/quickstart/ios?ver=swift
아래는 특별한 패키지가 필요하지 않은 파이썬 대안입니다. 채널 ID를 제공하면 해당 채널의 비디오 링크 목록이 반환됩니다. 작동 하려면 API 키 가 필요합니다 .
import urllib
import json
def get_all_video_in_channel(channel_id):
api_key = YOUR API KEY
base_video_url = 'https://www.youtube.com/watch?v='
base_search_url = 'https://www.googleapis.com/youtube/v3/search?'
first_url = base_search_url+'key={}&channelId={}&part=snippet,id&order=date&maxResults=25'.format(api_key, channel_id)
video_links = []
url = first_url
while True:
inp = urllib.urlopen(url)
resp = json.load(inp)
for i in resp['items']:
if i['id']['kind'] == "youtube#video":
video_links.append(base_video_url + i['id']['videoId'])
try:
next_page_token = resp['nextPageToken']
url = first_url + '&pageToken={}'.format(next_page_token)
except:
break
return video_links
다음과 같이 시도하십시오. 도움이 될 수 있습니다.
https://gdata.youtube.com/feeds/api/videos?author=cnn&v=2&orderby=updated&alt=jsonc&q=news
채널 이름과 "q"를 지정하여 검색어를 지정할 수 있습니다.
세 단계 만 거치면됩니다.
구독 : 목록-> https://www.googleapis.com/youtube/v3/subscriptions?part=snippet&maxResults=50&mine=true&access_token= {oauth_token}
채널 : 목록-> https://www.googleapis.com/youtube/v3/channels?part=contentDetails&id= {channel_id} & key = {YOUR_API_KEY}
PlaylistItems : 목록-> https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId= {playlist_id} & key = {YOUR_API_KEY}
채널 아래의 모든 동영상 ID를 반환하는 코드는 다음과 같습니다.
<?php
$baseUrl = 'https://www.googleapis.com/youtube/v3/';
// https://developers.google.com/youtube/v3/getting-started
$apiKey = 'API_KEY';
// If you don't know the channel ID see below
$channelId = 'CHANNEL_ID';
$params = [
'id'=> $channelId,
'part'=> 'contentDetails',
'key'=> $apiKey
];
$url = $baseUrl . 'channels?' . http_build_query($params);
$json = json_decode(file_get_contents($url), true);
$playlist = $json['items'][0]['contentDetails']['relatedPlaylists']['uploads'];
$params = [
'part'=> 'snippet',
'playlistId' => $playlist,
'maxResults'=> '50',
'key'=> $apiKey
];
$url = $baseUrl . 'playlistItems?' . http_build_query($params);
$json = json_decode(file_get_contents($url), true);
$videos = [];
foreach($json['items'] as $video)
$videos[] = $video['snippet']['resourceId']['videoId'];
while(isset($json['nextPageToken'])){
$nextUrl = $url . '&pageToken=' . $json['nextPageToken'];
$json = json_decode(file_get_contents($nextUrl), true);
foreach($json['items'] as $video)
$videos[] = $video['snippet']['resourceId']['videoId'];
}
print_r($videos);
참고 : 로그인 후 https://www.youtube.com/account_advanced 에서 채널 ID를 얻을 수 있습니다 .
여기와 다른 곳에서 공유 된 참조 덕분에 채널의 모든 비디오를 얻는 데 사용할 수있는 온라인 스크립트 / 도구를 만들었습니다.
그것은에 API 호출을 결합 youtube.channels.list
, playlistItems
, videos
. 재귀 함수를 사용하여 유효한 응답을 얻을 때 비동기 콜백이 다음 반복을 실행하도록합니다.
또한 한 번에 실제 요청 수를 제한하여 YouTube API 규칙을 위반하지 않도록합니다. 단축 된 스 니펫을 공유 한 다음 전체 코드에 대한 링크를 공유합니다. 다음 50 개의 결과를 가져 오는 응답에 오는 nextPageToken 값을 사용하여 통화 당 최대 50 개의 결과를 얻었습니다.
function getVideos(nextPageToken, vidsDone, params) {
$.getJSON("https://www.googleapis.com/youtube/v3/playlistItems", {
key: params.accessKey,
part: "snippet",
maxResults: 50,
playlistId: params.playlistId,
fields: "items(snippet(publishedAt, resourceId/videoId, title)), nextPageToken",
pageToken: ( nextPageToken || '')
},
function(data) {
// commands to process JSON variable, extract the 50 videos info
if ( vidsDone < params.vidslimit) {
// Recursive: the function is calling itself if
// all videos haven't been loaded yet
getVideos( data.nextPageToken, vidsDone, params);
}
else {
// Closing actions to do once we have listed the videos needed.
}
});
}
여기에는 id, title, 게시 날짜 등을 포함한 비디오의 기본 목록이 있습니다. 그러나 조회수 및 좋아요와 같은 각 동영상의 세부 정보를 얻으려면에 API 호출을해야 videos
합니다.
// Looping through an array of video id's
function fetchViddetails(i) {
$.getJSON("https://www.googleapis.com/youtube/v3/videos", {
key: document.getElementById("accesskey").value,
part: "snippet,statistics",
id: vidsList[i]
}, function(data) {
// Commands to process JSON variable, extract the video
// information and push it to a global array
if (i < vidsList.length - 1) {
fetchViddetails(i+1) // Recursive: calls itself if the
// list isn't over.
}
});
참고 항목 여기에 전체 코드 , 그리고 여기에 라이브 버전 . (편집 : 고정 github 링크)
편집 : 종속성 : JQuery, Papa.parse
이 질문에 대답하는 모든 사람은 500 비디오 제한 으로 인해 문제가 있으므로 Python 3 에서 youtube_dl 을 사용하는 대체 솔루션이 있습니다. 또한 API 키가 필요하지 않습니다 .
- youtube_dl을 설치하십시오.
sudo pip3 install youtube-dl
- 타겟 채널의 채널 ID를 찾으십시오 . ID는 UC로 시작합니다. 채널의 C를 업로드 용 U (예 : UU ...)로 바꾸면 업로드 재생 목록 입니다.
- youtube-dl 의 재생 목록 다운로더 기능 을 사용하십시오 . 재생 목록에있는 모든 동영상을 기본값 인 메타 데이터 만 다운로드하지 않는 것이 이상적입니다.
예 (경고-수십 분이 소요됨) :
import youtube_dl, pickle
# UCVTyTA7-g9nopHeHbeuvpRA is the channel id (1517+ videos)
PLAYLIST_ID = 'UUVTyTA7-g9nopHeHbeuvpRA' # Late Night with Seth Meyers
with youtube_dl.YoutubeDL({'ignoreerrors': True}) as ydl:
playd = ydl.extract_info(PLAYLIST_ID, download=False)
with open('playlist.pickle', 'wb') as f:
pickle.dump(playd, f, pickle.HIGHEST_PROTOCOL)
vids = [vid for vid in playd['entries'] if 'A Closer Look' in vid['title']]
print(sum('Trump' in vid['title'] for vid in vids), '/', len(vids))
더 이상 사용되지 않는 API 버전 2를 사용하면 (UCqAEtEr0A0Eo2IVcuWBfB9g 채널의) 업로드 URL은 다음과 같습니다.
https://gdata.youtube.com/feeds/users/UCqAEtEr0A0Eo2IVcuWBfB9g/uploads
API 버전 3이 있습니다.
최근에 채널에서 모든 동영상을 검색해야했습니다. YouTube 개발자 문서에 따르면 https://developers.google.com/youtube/v3/docs/playlistItems/list
function playlistItemsListByPlaylistId($service, $part, $params) {
$params = array_filter($params);
$response = $service->playlistItems->listPlaylistItems(
$part,
$params
);
print_r($response);
}
playlistItemsListByPlaylistId($service,
'snippet,contentDetails',
array('maxResults' => 25, 'playlistId' => 'id of "uploads" playlist'));
$service
당신의 Google_Service_YouTube
목적 은 어디에 있습니까 ?
채널에서 실제로 업로드 한 모든 동영상이있는 '업로드'재생 목록을 검색하려면 채널에서 정보를 가져와야합니다. https://developers.google.com/youtube/v3/docs/channels/list
이 API를 처음 사용하는 경우 코드 샘플을 기본 스 니펫에서 전체 샘플로 바꾸는 것이 좋습니다.
따라서 채널에서 모든 동영상을 검색하는 기본 코드는 다음과 같습니다.
class YouTube
{
const DEV_KEY = 'YOUR_DEVELOPPER_KEY';
private $client;
private $youtube;
private $lastChannel;
public function __construct()
{
$this->client = new Google_Client();
$this->client->setDeveloperKey(self::DEV_KEY);
$this->youtube = new Google_Service_YouTube($this->client);
$this->lastChannel = false;
}
public function getChannelInfoFromName($channel_name)
{
if ($this->lastChannel && $this->lastChannel['modelData']['items'][0]['snippet']['title'] == $channel_name)
{
return $this->lastChannel;
}
$this->lastChannel = $this->youtube->channels->listChannels('snippet, contentDetails, statistics', array(
'forUsername' => $channel_name,
));
return ($this->lastChannel);
}
public function getVideosFromChannelName($channel_name, $max_result = 5)
{
$this->getChannelInfoFromName($channel_name);
$params = [
'playlistId' => $this->lastChannel['modelData']['items'][0]['contentDetails']['relatedPlaylists']['uploads'],
'maxResults'=> $max_result,
];
return ($this->youtube->playlistItems->listPlaylistItems('snippet,contentDetails', $params));
}
}
$yt = new YouTube();
echo '<pre>' . print_r($yt->getVideosFromChannelName('CHANNEL_NAME'), true) . '</pre>';
Python의 샘플 솔루션 . 이 동영상에서 가져온 도움말 : video 다른 답변과 마찬가지로 업로드 ID는 먼저 채널 ID에서 검색해야합니다.
urllib.request 가져 오기 수입 json 키 = "YOUR_YOUTUBE_API_v3_BROWSER_KEY" # 채널 목록 : 채널 ID 또는 사용자 이름 ( "id"또는 "forUsername")을 붙여 넣을 경우 언급 ytids = [["bbcnews","forUsername"],["UCjq4pjKj9X4W9i7UnYShpVg","id"]] newstitles = [] for ytid,ytparam in ytids: urld = "https://www.googleapis.com/youtube/v3/channels?part=contentDetails&"+ytparam+"="+ytid+"&key="+key with urllib.request.urlopen(urld) as url: datad = json.loads(url.read()) uploadsdet = datad['items'] #get upload id from channel id uploadid = uploadsdet[0]['contentDetails']['relatedPlaylists']['uploads'] #retrieve list urld = "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet%2CcontentDetails&maxResults=50&playlistId="+uploadid+"&key="+key with urllib.request.urlopen(urld) as url: datad = json.loads(url.read()) for data in datad['items']: ntitle = data['snippet']['title'] nlink = 데이터 [ 'contentDetails'] [ 'videoId'] newstitles.append ([nlink, ntitle]) 뉴스 제목의 링크, 제목 : 인쇄 (링크, 제목)
YouTube 채널에서 다운로드 한 링크는 보존 자 디렉토리 구조가 아닙니다. 그래서 나는 그것을 실현시키기위한 코드를 작성했습니다. 위에서 허용 된 방식으로 비디오를 다운로드 한 후에 사용하십시오. `
def play_vid(channel):
yset = dict()
temp = []
link = channel + '/playlists'
first = urlopen(link)
bs = BeautifulSoup(first.read(), 'html.parser')
for i in bs.find_all('a', {'class':'yt-uix-sessionlink yt-uix-tile-link spf-link yt-ui-ellipsis yt-ui-ellipsis-2'}):
print('Creating list for the playlist: ', i.get_text())
link = 'https://www.youtube.com'+i.get('href')
# print(link)
first = urlopen(link)
bsp = BeautifulSoup(first.read(), 'html.parser')
res=bsp.find_all('a',{'class':'pl-video-title-link'})
for l in res:
temp.append(l.get_text().replace(" ", "").strip())
yset[i.get_text()]=temp
temp=[]
print("Done!!")
return yset
checking = play_vid('https://www.youtube.com/user/NinjaTraderLLC')
'''for me /media/shivam/BIG/ninja is the folder where i've previously downloaded all the videos from channel'''
downloaded = [file for file in os.listdir('/media/shivam/BIG/ninja/') if os.path.isfile('/media/shivam/BIG/ninja/'+file)]
hash_table = dict()
for i in downloaded:
hash_table[i.replace(" ", "")] = i
for i in scraped.keys():
if os.path.isdir('/media/shivam/BIG/ninja/'+ i):
pass
else:
os.mkdir('/media/shivam/BIG/ninja/'+ i)
minn = 1000
mov = ""
for j in scraped[i]:
for k in hash_table.keys():
if nltk.edit_distance(j, k) < minn:
minn = nltk.edit_distance(j, k)
mov = k
minn = 1000
print("Moving ",mov, "for channel: ",j)
shutil.copy('/media/shivam/BIG/ninja/'+ hash_table[mov], '/media/shivam/BIG/ninja/'+ i +'/'+hash_table[mov])
`
설명서에 설명 된대로 ( link ) 채널 리소스 유형 및 작업 목록을 사용하여 채널의 모든 비디오를 가져올 수 있습니다. 이 작업은 'channel id'인수를 사용하여 수행해야합니다.
참고 URL : https://stackoverflow.com/questions/18953499/youtube-api-to-fetch-all-videos-on-a-channel
'Programing' 카테고리의 다른 글
파이썬에서 선행 공백을 어떻게 제거합니까? (0) | 2020.06.03 |
---|---|
Express에서 등록 된 모든 경로를 얻는 방법은 무엇입니까? (0) | 2020.06.03 |
div를 부모의 상단에 맞추고 인라인 블록 동작을 유지하는 방법은 무엇입니까? (0) | 2020.06.03 |
IntelliJ IDEA에서 명령 줄 인수를 어떻게 입력합니까? (0) | 2020.06.02 |
D는 Java 및 C ++의 확실한 대안입니까? (0) | 2020.06.02 |