YouTube의 급상승을 직접 만들어보고 싶었다 📺
16896 단어 YouTubeAPIgas
소개
YouTube를 보면서 오래된 동영상이 갑자기 늘어나고 있다고 생각합니다. (TV 출연이라든가, 유명인이 선전한다든가)
YouTube를 게시하는 사람을 알고 있다고 생각하지만 YouTube Studio라는 관리 도구에 채널 애널리틱스가 있으며 다양한 분석을 할 수 있습니다. 투고하고 있는 사람은 이것을 보고 갑작스런 성장을 눈치채면(자) 합니다만, 단지 시청자인 나등은 눈치채지 않습니다. (깨달을 필요는 없지만)
그래서 이번에는 자기 앞에서 만들어 보았습니다. (지정된 채널만)
자신이 좋아하는 채널의 인기 정도 알고 싶으니까요! !
메커니즘
최종적으로는 1주일 정도로 실행해, 「지난주의 인기 동영상」과 같은 형태로의 구현을 생각하고 있으므로, 필요한 것은 동영상의 ID와 조회수(전회 실행시와 지금)가 있으면 할 수 있을 것 같습니다. 데이터베이스만큼은 아니기 때문에 이번에는 스프레드 시트와의 연계가 간단한 gas를 사용하여 구현했습니다.
최종적으로는 1주일 정도로 실행해, 「지난주의 인기 동영상」과 같은 형태로의 구현을 생각하고 있으므로, 필요한 것은 동영상의 ID와 조회수(전회 실행시와 지금)가 있으면 할 수 있을 것 같습니다. 데이터베이스만큼은 아니기 때문에 이번에는 스프레드 시트와의 연계가 간단한 gas를 사용하여 구현했습니다.
간단히 쓰면 이런 느낌입니다.
새롭게 공개되거나, 비공개가 되어 버리거나, 삭제되거나, 반대로 비공개로부터 공개가 된다고 고려하는 것이 좋은 것은 있습니다만, ↑의 실장이면 ①과 ②의 양쪽 모두 에 동영상이 없을 때는 차이를 취하지 않기 때문에 잘 고려할 수 있었다고 생각합니다. (신착 동영상은 초동으로 성장하기 쉽기 때문에 생략 OK)
소스 코드
const main = () => {
// 調べるチャンネルのID
const channelId = 'UCZx7esGXyW6JXn98byfKEIA';
// 前回実行から一番再生された動画
let hotVideo = ['', 0];
const latestVideos = getVideoList(channelId);
const oldVideos = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
for (const latestVideo of latestVideos) {
for (const oldVideo of oldVideos) {
if (latestVideo[0] === oldVideo[0]) {
hotVideo = hotVideo[1] < latestVideo[1] - oldVideo[1] ? [latestVideo[0], latestVideo[1] - oldVideo[1]] : hotVideo;
break;
}
}
}
// シートを更新
SpreadsheetApp.getActiveSheet().getRange(1, 1, latestVideos.length, 2).setValues(latestVideos);
// Slackへ投稿
postSlack(hotVideo);
};
/**
* 指定のチャンネルの動画を取得する
*
* @param {string} channelId - 取得したいチャンネルIDを指定
* @returns {Array} - [動画ID, 再生回数] を一要素にした二次元配列
*/
const getVideoList = channelId => {
const videos = [];
let nextToken = '';
while (nextToken !== undefined) {
const results = YouTube.Search.list('snippet', {
channelId: channelId,
maxResults: 50,
pageToken: nextToken,
});
for (const result of results.items) {
if (result.id.kind === 'youtube#video') {
const statistics = YouTube.Videos.list('statistics', {
id: result.id.videoId
});
videos.push([result.id.videoId, statistics.items[0].statistics.viewCount]);
}
}
nextToken = results.nextPageToken;
}
return videos;
};
/**
* Slackへ投稿する
*
* @param {Array} hotVideo - 投稿する動画のIDと期間で再生された回数
*/
const postSlack = hotVideo => {
const url = 'https://www.youtube.com/watch?v=' + hotVideo[0];
const webHookUrl = SLACK_WEBHOOK_URL;
const name = '急上昇';
const icon = ':arrow_heading_up:';
const message = '一番再生された動画' + '(前回から ' + hotVideo[1] + ' 回再生されました。) ' + url;
const json = {
'username': name,
'icon_emoji': icon,
'text': message
};
const payload = JSON.stringify(json);
const param = {
'method': 'post',
'contextType': 'application/json',
'payload': payload
};
UrlFetchApp.fetch(webHookUrl, param);
};
조금 설명(?)
// 調べるチャンネルのID
const channelId = 'UCZx7esGXyW6JXn98byfKEIA';
이전에도 기사로 한 푸라소니카 이라는 그룹
// 前回実行から一番再生された動画
let hotVideo = ['', 0];
const latestVideos = getVideoList(channelId);
const oldVideos = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
for (const latestVideo of latestVideos) {
for (const oldVideo of oldVideos) {
if (latestVideo[0] === oldVideo[0]) {
hotVideo = hotVideo[1] < latestVideo[1] - oldVideo[1] ? [latestVideo[0], latestVideo[1] - oldVideo[1]] : hotVideo;
}
}
}
인기 동영상을 찾는 곳, ,, 깨끗하게 해 주었으면 ,,,.
const webHookUrl = SLACK_WEBHOOK_URL;
프로젝트의 속성에 토큰을 설정하면 안전합니다. 환경 변수?
결과
장식은 전에 Python이지만 썼기 때문에 이번에는 그만 뒀습니다 (멘도쿠 s)
↓로 좋은 느낌으로 장식하고 있으므로,
htps : // 코 m / 바쿠 로린 / ms / d5 푸 d6f2d64085145 A07
스케줄 실행
월요일 아침에 움직이게 했습니다.
가끔 두 번 이상 움직이거나 버립니다만, 문제 없다고 생각합니다. (이상한 투고가 가능하지만)
끝
이것으로 인기가 된 동영상을 놓치지 않을 것 같습니다, 좋았다.
간단한 메커니즘이지만 만들고 싶었기 때문에 만족
Reference
이 문제에 관하여(YouTube의 급상승을 직접 만들어보고 싶었다 📺), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/bakuwarorin/items/ac4efc8af09b3a552d35
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
const main = () => {
// 調べるチャンネルのID
const channelId = 'UCZx7esGXyW6JXn98byfKEIA';
// 前回実行から一番再生された動画
let hotVideo = ['', 0];
const latestVideos = getVideoList(channelId);
const oldVideos = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
for (const latestVideo of latestVideos) {
for (const oldVideo of oldVideos) {
if (latestVideo[0] === oldVideo[0]) {
hotVideo = hotVideo[1] < latestVideo[1] - oldVideo[1] ? [latestVideo[0], latestVideo[1] - oldVideo[1]] : hotVideo;
break;
}
}
}
// シートを更新
SpreadsheetApp.getActiveSheet().getRange(1, 1, latestVideos.length, 2).setValues(latestVideos);
// Slackへ投稿
postSlack(hotVideo);
};
/**
* 指定のチャンネルの動画を取得する
*
* @param {string} channelId - 取得したいチャンネルIDを指定
* @returns {Array} - [動画ID, 再生回数] を一要素にした二次元配列
*/
const getVideoList = channelId => {
const videos = [];
let nextToken = '';
while (nextToken !== undefined) {
const results = YouTube.Search.list('snippet', {
channelId: channelId,
maxResults: 50,
pageToken: nextToken,
});
for (const result of results.items) {
if (result.id.kind === 'youtube#video') {
const statistics = YouTube.Videos.list('statistics', {
id: result.id.videoId
});
videos.push([result.id.videoId, statistics.items[0].statistics.viewCount]);
}
}
nextToken = results.nextPageToken;
}
return videos;
};
/**
* Slackへ投稿する
*
* @param {Array} hotVideo - 投稿する動画のIDと期間で再生された回数
*/
const postSlack = hotVideo => {
const url = 'https://www.youtube.com/watch?v=' + hotVideo[0];
const webHookUrl = SLACK_WEBHOOK_URL;
const name = '急上昇';
const icon = ':arrow_heading_up:';
const message = '一番再生された動画' + '(前回から ' + hotVideo[1] + ' 回再生されました。) ' + url;
const json = {
'username': name,
'icon_emoji': icon,
'text': message
};
const payload = JSON.stringify(json);
const param = {
'method': 'post',
'contextType': 'application/json',
'payload': payload
};
UrlFetchApp.fetch(webHookUrl, param);
};
// 調べるチャンネルのID
const channelId = 'UCZx7esGXyW6JXn98byfKEIA';
// 前回実行から一番再生された動画
let hotVideo = ['', 0];
const latestVideos = getVideoList(channelId);
const oldVideos = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
for (const latestVideo of latestVideos) {
for (const oldVideo of oldVideos) {
if (latestVideo[0] === oldVideo[0]) {
hotVideo = hotVideo[1] < latestVideo[1] - oldVideo[1] ? [latestVideo[0], latestVideo[1] - oldVideo[1]] : hotVideo;
}
}
}
const webHookUrl = SLACK_WEBHOOK_URL;
이것으로 인기가 된 동영상을 놓치지 않을 것 같습니다, 좋았다.
간단한 메커니즘이지만 만들고 싶었기 때문에 만족
Reference
이 문제에 관하여(YouTube의 급상승을 직접 만들어보고 싶었다 📺), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/bakuwarorin/items/ac4efc8af09b3a552d35텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)