안녕하세요
트위치 라이브 탐지 + 방송 기록 저장하기 본문
twitch api의 search/channels 를 이용하여 원하는 채널을 검색합니다.
/**
* 채널이름을 query로 검색하여 live중인 채널을 반환
* @param {string} query
* @returns
*/
exports.getTwitchLiveChannelsData = async (query) => {
const twitch_channels_base_url = "https://api.twitch.tv/helix/search/channels";
const headers = {
Authorization: `Bearer ${process.env.REACT_APP_TWITCH_ACCESS_TOKEN}`,
"Client-Id": `${process.env.REACT_APP_TWITCH_CLIENT_ID}`,
};
const params = {
query,
// live_only: true,
};
try {
const request = await axios.get(`${twitch_channels_base_url}`, { headers, params });
if (!request.data) {
return [];
}
const liveChannel = request.data.data.filter((data) => validId.includes(data.id));
if (liveChannel.length) {
console.log("getSearchChannelsData");
return liveChannel[0];
}
return [];
} catch (error) {
console.error("getSearchChannelsData", error);
return [];
}
};
live_history 배열에 방송 기록을 저장할 것입니다.
const update = {
$set: {
id,
display_name,
is_live,
thumbnail_url,
title,
live_history: [],
},
};
방송 기록을 저장하기 위한 전체 코드입니다.
/**
* 트위치 라이브 정보 업데이트
*/
exports.updateTwitchLive = async (db) => {
try {
const twitchLivesCollection = await db.collection("twitch_lives");
for (const searchQuery of searchQueries) {
const liveData = await getTwitchLiveChannelsData(searchQuery);
const currentTime = new Date().getTime();
const { id, display_name, is_live, started_at, thumbnail_url, title } = liveData;
const filter = { id };
// started_at이 존재하면 duration 업데이트
const existingHistoryItem = await twitchLivesCollection.findOneAndUpdate(
{ id, "live_history.started_at": started_at },
{ $set: { "live_history.$.duration": currentTime - new Date(started_at).getTime() } }
);
// 업데이트한 정보가 null이 아니라면 set으로 채널 정보만 갱신,
//업데이트한 값이 없고, started_at이 "" 이 아니라면 라이브 정보 추가
let update;
if (existingHistoryItem.value !== null) {
update = { $set: { id, display_name, is_live, thumbnail_url, title } };
} else {
update = { $set: { id, display_name, is_live, thumbnail_url, title } };
if (started_at !== "") {
update.$addToSet = {
live_history: {
title,
duration: currentTime - new Date(started_at).getTime(),
started_at,
},
};
}
}
await twitchLivesCollection.updateOne(filter, update);
}
} catch (error) {
console.error(error);
}
};
1. db에 연동합니다.
exports.updateTwitchLive = async (db) => {
console.log("updateTwitchLive");
try {
const twitchLivesCollection = await db.collection("twitch_lives");
2. liveData를 api로 불러오고, filter는 id로 지정합니다.
for (const searchQuery of searchQueries) {
const liveData = await getTwitchLiveChannelsData(searchQuery);
const currentTime = new Date().getTime();
const { id, display_name, is_live, started_at, thumbnail_url, title } = liveData;
const filter = { id };
3. 채널의 live_history 배열에서 일치하는 started_at 을 찾아 duration을 업데이트 합니다.
// started_at이 존재하면 duration 업데이트
const existingHistoryItem = await twitchLivesCollection.findOneAndUpdate(
{ id, "live_history.started_at": started_at },
{ $set: { "live_history.$.duration": currentTime - new Date(started_at).getTime() } }
);
=> duration은 현재 시간 - 방속 시작 시간으로 몇 분간 방송을 진행했는지에 대한 정보가 됩니다.
4. 삼항연산자로 started_at과 일치하는 값을 찾아 업데이트한 정보가 있는지 확인합니다.
// 업데이트한 정보가 null이 아니라면 set으로 채널 정보만 갱신,
// 업데이트한 값이 없고, started_at이 "" 이 아니라면 라이브 정보 추가
let update;
if (existingHistoryItem.value !== null) {
update = { $set: { id, display_name, is_live, thumbnail_url, title } };
} else {
update = { $set: { id, display_name, is_live, thumbnail_url, title } };
if (started_at !== "") {
update.$addToSet = {
live_history: {
title,
duration: currentTime - new Date(started_at).getTime(),
started_at,
},
};
}
}
await twitchLivesCollection.updateOne(filter, update);
=> 만일 업데이트 한 값이 있다면(null) ? 채널 데이터를 갱신하기만 합니다.
=> 업데이트한 값이 없고, started_at이 "" 이 아니라면 : 라이브 정보 추가
'유튜브컨텐츠탐색-StelLife > Twitch API' 카테고리의 다른 글
[MongoDB] twitch 방송 시간, 플레이한 게임, 최고 시청자 수 기록하기 (0) | 2023.03.27 |
---|---|
twitch api 라이브 정보 받아오기 with JavaScript (0) | 2023.03.22 |