Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save eoureo/c7459151106ec98187b4589e8fdff57d to your computer and use it in GitHub Desktop.
Save eoureo/c7459151106ec98187b4589e8fdff57d to your computer and use it in GitHub Desktop.
Obsidian Templater - Search book from Kyobo Book. (kyobobook.co.kr) 옵시디언 템플레이터(Templater) - 교보문고 도서 정보 검색(제목, 저자)한 다음 정보 가져오기
  1. 메타 데이터(Frontmatter)에 제목과 저자 정보를 입력하고 템플레이터를 실행하여 교보문고 검색을 합니다.
  2. 그 검색 목록을 옵시디언의 목록 선택창을 써서 표시합니다.
  3. 그 목록 가운데 찾고 있는 도서를 선택하면 그 정보가 메타 데이터와 본문에 넣어지도록 합니다.

Search Book

사용 방법

  1. "tr_search_kyobobook.js" 파일을 Templater의 User Script Functions 폴더에 넣습니다.

  2. 아래 링크에서 "tr_get_kyobobook_info.js" 파일을 Templater의 User Script Functions 폴더에 넣습니다. Obsidian Templater User Script Function - Get book information from Kyobo Book. (kyobobook.co.kr) 옵시디언 템플레이터(Templater) 사용자 스크립트 함수 - 교보문고 도서 정보 가져오기
    https://gist.github.com/eoureo/17c8bf42058408e4d1f63ae245e8da9a

    위 파일을 써서 노트의 메타 데이터를 고칩니다.

  3. "(Tr) 교보문고 검색.md.js"파일의 확장자를 ".js"를 빼고 ".md"로 바꿔 Templater의 템플릿 폴더에 넣습니다.

  4. 도서 정보를 넣을 파일 메타 데이터에 "book title: 책 제목"과 "authors: 책 저자" 넣습니다.

  5. Templater를 실행하여 이 템플릿을 선택합니다.

// <%_*
// const title = tp.frontmatter["title"];
// const authors = tp.frontmatter["authors"];
// console.log(title);
// console.log(authors);
async function search_kyobobook(tp, title = "", authors = "") {
// 교보문고
// https://search.kyobobook.co.kr/search?keyword=%EC%82%AC%ED%94%BC%EC%97%94%EC%8A%A4%20%EC%9C%A0%EB%B0%9C%20%ED%95%98%EB%9D%BC%EB%A6%AC&target=total&gbCode=TOT&len=100
// https://search.kyobobook.co.kr/search?keyword=사피엔스%20유발%20하라리&target=total&gbCode=TOT&len=100
let url_search = `https://search.kyobobook.co.kr/search?keyword=${encodeURIComponent([title, authors].join(" "))}&target=total&gbCode=TOT&len=100`;
console.log(url_search);
let response;
try {
response = await request({ url: url_search });
} catch(e) {
console.log("에러 발생 - request");
console.log(e);
alert("에러 발생 - request\n\n" + e +"\n\n옵시디언을 다시 시작해 보세요.");
return;
}
// console.log("response:", response);
const parser = new DOMParser();
const doc = parser.parseFromString(response, "text/html");
let prod_items = doc.querySelectorAll("#shopData_list .prod_list .prod_item");
// console.log(prod_items);
// import { App, Notice, SuggestModal } from "obsidian";
const { App, Notice, SuggestModal } = tp.obsidian;
const ALL_BOOKS = [];
const BOOKS_DETAIL = {};
for(let prod_item of prod_items) {
// 체크박스에 pid와 bid가 없는 경우 무시
if(!prod_item.querySelectorAll("input[data-pid][data-bid]")[0]) {
continue;
}
// 상품 카테고리가 [패키지]이면 무시
if(prod_item.querySelectorAll(".prod_category")[0].innerText.trim() == "[패키지]") {
continue;
}
let book = {};
book.title = prod_item.querySelectorAll(".prod_info")[0].innerText.replace(/\s{2,}/g, " ").trim();
book.authors = prod_item.querySelectorAll(".prod_author_group .auto_overflow_inner")[0].innerText.replace(/\s{2,}/g, " ").trim();
book.publisher = prod_item.querySelectorAll(".prod_publish a")[0].innerText.trim();
book.date = prod_item.querySelectorAll(".prod_publish .date")[0].innerText.trim();
book.pid = prod_item.querySelectorAll("input[data-pid][data-bid]")[0].dataset.pid;
ALL_BOOKS.push(book);
let detail = {};
detail.bid = prod_item.querySelectorAll("input[data-pid][data-bid]")[0].dataset.bid;
detail.url = prod_item.querySelectorAll(".prod_info")[0].href;
BOOKS_DETAIL[book.pid] = detail;
}
// console.log(ALL_BOOKS);
// console.log(BOOKS_DETAIL);
class ListModal extends SuggestModal {
constructor(app, onSubmit) {
super(app);
this.onSubmit = onSubmit;
}
// Returns all available suggestions.
getSuggestions(query) {
return ALL_BOOKS.filter((book) =>
// book.title.toLowerCase().includes(query.toLowerCase())
book.title.toLowerCase().includes(query.toLowerCase()) || book.authors.toLowerCase().includes(query.toLowerCase()) || book.publisher.toLowerCase().includes(query.toLowerCase())
);
}
// Renders each suggestion item.
renderSuggestion(book, el) {
// console.log(book);
let bid = BOOKS_DETAIL[book.pid].bid;
let img = el.createEl("img", { text: book.title });
img.src = `https://contents.kyobobook.co.kr/sih/fit-in/200x0/pdt/${bid}.jpg`;
let div = el.createDiv();
div.createEl("div", { text: book.title });
div.createEl("div", { text: book.authors });
div.createEl("div", { text: book.publisher });
div.createEl("div", { text: book.date });
let url = BOOKS_DETAIL[book.pid].url;
let link = div.createEl("a", { text: url });
link.href = url;
}
// Perform action on the selected suggestion.
onChooseSuggestion(book, evt) {
new Notice(`Selected ${book.title}\n${BOOKS_DETAIL[book.pid].url}`);
console.log(`Selected ${book.title}\n${BOOKS_DETAIL[book.pid].url}`);
this.onSubmit(BOOKS_DETAIL[book.pid].url);
}
onClose() {
console.log("close!!!!");
let { contentEl } = this;
contentEl.empty();
}
}
let book_url = await new Promise((resolve, reject) => {
let listModal = new ListModal(app, function(url) {
if(url) {
resolve(url);
}
else {
reject("");
}
});
listModal.containerEl.createEl("style", { text: `
.suggestion-item {display:flex;}
/*.suggestion-item.is-selected {background-color: orange;}*/
.suggestion-item img { float: left; width: 100px; margin-right: 10px; }
`});
// console.log(listModal);
listModal.open();
});
console.log("book_url:", book_url);
return book_url;
}
module.exports = search_kyobobook;
// _%>
<%_*
let url = tp.frontmatter["url"];
// 메타 데이터에 url이 있으면 검색 없이 바로 책 정보 가져옴.
// 메타 데이터에 url이 없으면 검색.
if(!url) {
// 메타 데이터에서 book title과 authors를 가져 온다.
const title = tp.frontmatter["book title"]? tp.frontmatter["book title"]: "";
const authors = tp.frontmatter["authors"]? tp.frontmatter["authors"]: [];
console.log(title);
console.log(authors);
// 저자 정보를 문자로 바꾸기
let authors_str = "";
if(typeof authors == "string") {
authors_str = authors;
}
else if(authors instanceof Array) {
authors_str = authors.join(" ");
}
else {
for(let key in authors) {
if(typeof authors[key] == "string") {
authors_str += " " + authors[key];
}
else if(authors[key] instanceof Array) {
authors_str += " " + authors[key].join(" ");
}
}
}
// 검색하여 책 정보 주소를 가져온다.
try {
url = await tp.user.tr_search_kyobobook(tp, title, authors_str);
}
catch(e) {
console.log(e);
}
}
console.log("url:", url);
if(url) {
// 책 정보 가져옴.
tR = await tp.user.tr_get_kyobobook_info(tp, url);
if(tR == "") {
return;
}
}
else {
return;
}
_%>
@eoureo
Copy link
Author

eoureo commented Apr 11, 2023

자세한 설명은 제 블로그 글에서 볼 수 있습니다.

옵시디언 템플레이터(Templater) - 교보문고 도서 검색(제목, 저자)한 다음 선택하여 정보 가져오기
https://eoureo.tistory.com/16

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment