smart-web-mcp 0.44.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/CHANGELOG.md +352 -1
  2. package/README.md +33 -566
  3. package/dist/assessment.d.ts +10 -3
  4. package/dist/assessment.js +21 -6
  5. package/dist/assessment.js.map +1 -1
  6. package/dist/body-export.d.ts +10 -0
  7. package/dist/body-export.js +28 -0
  8. package/dist/body-export.js.map +1 -0
  9. package/dist/browser-session.d.ts +32 -1
  10. package/dist/browser-session.js +373 -3
  11. package/dist/browser-session.js.map +1 -1
  12. package/dist/cli-fetch-options.d.ts +7 -0
  13. package/dist/cli-fetch-options.js +41 -0
  14. package/dist/cli-fetch-options.js.map +1 -0
  15. package/dist/cli.js +31 -12
  16. package/dist/cli.js.map +1 -1
  17. package/dist/comment-export.d.ts +10 -0
  18. package/dist/comment-export.js +39 -0
  19. package/dist/comment-export.js.map +1 -0
  20. package/dist/composition.d.ts +1 -22
  21. package/dist/composition.js +0 -16
  22. package/dist/composition.js.map +1 -1
  23. package/dist/extraction/budget.d.ts +3 -0
  24. package/dist/extraction/budget.js +88 -7
  25. package/dist/extraction/budget.js.map +1 -1
  26. package/dist/extraction/document.js +134 -9
  27. package/dist/extraction/document.js.map +1 -1
  28. package/dist/korea/coupang-filters.d.ts +5 -0
  29. package/dist/korea/coupang-filters.js +87 -0
  30. package/dist/korea/coupang-filters.js.map +1 -0
  31. package/dist/korea/coupang.d.ts +27 -6
  32. package/dist/korea/coupang.js +202 -82
  33. package/dist/korea/coupang.js.map +1 -1
  34. package/dist/korea/proxy-client.d.ts +1 -0
  35. package/dist/korea/proxy-client.js +6 -2
  36. package/dist/korea/proxy-client.js.map +1 -1
  37. package/dist/korea/smartvertical.d.ts +1 -0
  38. package/dist/korea/smartvertical.js +39 -25
  39. package/dist/korea/smartvertical.js.map +1 -1
  40. package/dist/lib.d.ts +4 -2
  41. package/dist/lib.js +2 -1
  42. package/dist/lib.js.map +1 -1
  43. package/dist/mcp-server.js +39 -15
  44. package/dist/mcp-server.js.map +1 -1
  45. package/dist/operator-browser-fixture.d.ts +7 -0
  46. package/dist/operator-browser-fixture.js +19 -0
  47. package/dist/operator-browser-fixture.js.map +1 -0
  48. package/dist/operator-canary-cli.d.ts +6 -0
  49. package/dist/operator-canary-cli.js +190 -0
  50. package/dist/operator-canary-cli.js.map +1 -0
  51. package/dist/operator-canary.d.ts +74 -0
  52. package/dist/operator-canary.js +135 -0
  53. package/dist/operator-canary.js.map +1 -0
  54. package/dist/operator-cdp.d.ts +15 -0
  55. package/dist/operator-cdp.js +195 -0
  56. package/dist/operator-cdp.js.map +1 -0
  57. package/dist/operator-frame.d.ts +3 -0
  58. package/dist/operator-frame.js +55 -0
  59. package/dist/operator-frame.js.map +1 -0
  60. package/dist/settings.d.ts +3 -0
  61. package/dist/settings.js +1 -0
  62. package/dist/settings.js.map +1 -1
  63. package/dist/shared.d.ts +47 -10
  64. package/dist/shared.js +15 -9
  65. package/dist/shared.js.map +1 -1
  66. package/dist/smartbrowser.d.ts +169 -0
  67. package/dist/smartbrowser.js +288 -0
  68. package/dist/smartbrowser.js.map +1 -0
  69. package/dist/smartcrawl.js +16 -21
  70. package/dist/smartcrawl.js.map +1 -1
  71. package/dist/smartfetch/academic-fallback.js +3 -5
  72. package/dist/smartfetch/academic-fallback.js.map +1 -1
  73. package/dist/smartfetch/archive-fallback.js +2 -5
  74. package/dist/smartfetch/archive-fallback.js.map +1 -1
  75. package/dist/smartfetch/assets.d.ts +1 -1
  76. package/dist/smartfetch/assets.js +28 -1
  77. package/dist/smartfetch/assets.js.map +1 -1
  78. package/dist/smartfetch/jina-reader.d.ts +1 -0
  79. package/dist/smartfetch/jina-reader.js +17 -3
  80. package/dist/smartfetch/jina-reader.js.map +1 -1
  81. package/dist/smartfetch/pipeline.js +15 -25
  82. package/dist/smartfetch/pipeline.js.map +1 -1
  83. package/dist/smartfetch/provider-policy.d.ts +3 -0
  84. package/dist/smartfetch/provider-policy.js +45 -2
  85. package/dist/smartfetch/provider-policy.js.map +1 -1
  86. package/dist/smartfetch/provider-types.d.ts +8 -0
  87. package/dist/smartfetch/providers/article.js +76 -10
  88. package/dist/smartfetch/providers/article.js.map +1 -1
  89. package/dist/smartfetch/providers/blind-post.d.ts +2 -0
  90. package/dist/smartfetch/providers/blind-post.js +167 -0
  91. package/dist/smartfetch/providers/blind-post.js.map +1 -0
  92. package/dist/smartfetch/providers/clien.d.ts +2 -0
  93. package/dist/smartfetch/providers/clien.js +157 -0
  94. package/dist/smartfetch/providers/clien.js.map +1 -0
  95. package/dist/smartfetch/providers/commerce.d.ts +15 -0
  96. package/dist/smartfetch/providers/commerce.js +123 -7
  97. package/dist/smartfetch/providers/commerce.js.map +1 -1
  98. package/dist/smartfetch/providers/dcinside.js +313 -20
  99. package/dist/smartfetch/providers/dcinside.js.map +1 -1
  100. package/dist/smartfetch/providers/hackernews-html.d.ts +21 -0
  101. package/dist/smartfetch/providers/hackernews-html.js +148 -0
  102. package/dist/smartfetch/providers/hackernews-html.js.map +1 -0
  103. package/dist/smartfetch/providers/hackernews.js +76 -14
  104. package/dist/smartfetch/providers/hackernews.js.map +1 -1
  105. package/dist/smartfetch/providers/index.js +7 -1
  106. package/dist/smartfetch/providers/index.js.map +1 -1
  107. package/dist/smartfetch/providers/linkedin.js +2 -1
  108. package/dist/smartfetch/providers/linkedin.js.map +1 -1
  109. package/dist/smartfetch/providers/naver-blog.d.ts +2 -0
  110. package/dist/smartfetch/providers/naver-blog.js +87 -45
  111. package/dist/smartfetch/providers/naver-blog.js.map +1 -1
  112. package/dist/smartfetch/providers/naver-cafe-native.d.ts +7 -0
  113. package/dist/smartfetch/providers/naver-cafe-native.js +188 -0
  114. package/dist/smartfetch/providers/naver-cafe-native.js.map +1 -0
  115. package/dist/smartfetch/providers/naver-cafe.js +165 -4
  116. package/dist/smartfetch/providers/naver-cafe.js.map +1 -1
  117. package/dist/smartfetch/providers/naver-map-search.js +1 -1
  118. package/dist/smartfetch/providers/naver-map-search.js.map +1 -1
  119. package/dist/smartfetch/providers/ppomppu.d.ts +2 -0
  120. package/dist/smartfetch/providers/ppomppu.js +289 -0
  121. package/dist/smartfetch/providers/ppomppu.js.map +1 -0
  122. package/dist/smartfetch/providers/reddit.js +24 -3
  123. package/dist/smartfetch/providers/reddit.js.map +1 -1
  124. package/dist/smartfetch/providers/threads.js +1 -1
  125. package/dist/smartfetch/providers/threads.js.map +1 -1
  126. package/dist/smartfetch/providers/wikipedia.js +138 -0
  127. package/dist/smartfetch/providers/wikipedia.js.map +1 -1
  128. package/dist/smartfetch.d.ts +11 -2
  129. package/dist/smartfetch.js +369 -78
  130. package/dist/smartfetch.js.map +1 -1
  131. package/dist/smartsearch-brave.d.ts +2 -0
  132. package/dist/smartsearch-brave.js +43 -0
  133. package/dist/smartsearch-brave.js.map +1 -0
  134. package/dist/smartsearch-browser.d.ts +5 -0
  135. package/dist/smartsearch-browser.js +116 -0
  136. package/dist/smartsearch-browser.js.map +1 -0
  137. package/dist/smartsearch-ddg.d.ts +2 -0
  138. package/dist/smartsearch-ddg.js +46 -0
  139. package/dist/smartsearch-ddg.js.map +1 -0
  140. package/dist/smartsearch-node.d.ts +6 -0
  141. package/dist/smartsearch-node.js +21 -0
  142. package/dist/smartsearch-node.js.map +1 -0
  143. package/dist/smartsearch-postgresql.d.ts +7 -0
  144. package/dist/smartsearch-postgresql.js +44 -0
  145. package/dist/smartsearch-postgresql.js.map +1 -0
  146. package/dist/smartsearch-python.d.ts +8 -0
  147. package/dist/smartsearch-python.js +87 -0
  148. package/dist/smartsearch-python.js.map +1 -0
  149. package/dist/smartsearch-quality.d.ts +6 -0
  150. package/dist/smartsearch-quality.js +47 -0
  151. package/dist/smartsearch-quality.js.map +1 -0
  152. package/dist/smartsearch-youtube.d.ts +7 -0
  153. package/dist/smartsearch-youtube.js +76 -0
  154. package/dist/smartsearch-youtube.js.map +1 -0
  155. package/dist/smartsearch.d.ts +3 -0
  156. package/dist/smartsearch.js +617 -132
  157. package/dist/smartsearch.js.map +1 -1
  158. package/package.json +8 -5
  159. package/python/requirements-undetected-chromedriver.txt +2 -2
@@ -1,4 +1,6 @@
1
- import { decodeHtml, dedupeUrls, extractMetaDescription, extractMetaProperty, extractTitleFromHtml, extractUrls, stripTags } from "../../shared.js";
1
+ import { parseHTML } from "linkedom";
2
+ import { hasTerminalSafetyBlock } from "../../assessment.js";
3
+ import { dedupeUrls, extractAbsoluteAnchorHrefs, extractMetaDescription, extractMetaProperty, extractTitleFromHtml, extractUrls, stripTags } from "../../shared.js";
2
4
  import { fetchProviderText } from "../provider-policy.js";
3
5
  const USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36";
4
6
  const NAVER_BLOG_ORIGINS = ["https://blog.naver.com:443", "https://m.blog.naver.com:443"];
@@ -12,27 +14,50 @@ function stripNaverBlogContent(html) {
12
14
  return cleanText(stripTags(removeNonContentBlocks(html)));
13
15
  }
14
16
  function isNaverBlogContentUrl(url) {
15
- return url.protocol === "https:" && (url.hostname === "blog.naver.com" || url.hostname === "m.blog.naver.com");
17
+ return url.protocol === "https:" && !url.username && !url.password && !url.port && (url.hostname === "blog.naver.com" || url.hostname === "m.blog.naver.com");
18
+ }
19
+ /** The native mobile document avoids the desktop iframe shell, not access policy. */
20
+ export function naverBlogMobilePostUrl(value) {
21
+ try {
22
+ const url = new URL(value);
23
+ if (!isNaverBlogContentUrl(url))
24
+ return null;
25
+ const path = /^\/([a-zA-Z0-9_-]+)\/([1-9]\d*)\/?$/.exec(url.pathname);
26
+ const blogs = url.searchParams.getAll("blogId");
27
+ const posts = url.searchParams.getAll("logNo");
28
+ if (blogs.length > 1 || posts.length > 1)
29
+ return null;
30
+ const blog = path?.[1] || (url.pathname === "/PostView.naver" ? blogs[0] : "");
31
+ const post = path?.[2] || (url.pathname === "/PostView.naver" ? posts[0] : "");
32
+ if (!blog || !post || !/^[a-zA-Z0-9_-]+$/.test(blog) || !/^[1-9]\d*$/.test(post))
33
+ return null;
34
+ if ((blogs.length && blogs[0] !== blog) || (posts.length && posts[0] !== post))
35
+ return null;
36
+ return `https://m.blog.naver.com/${blog}/${post}`;
37
+ }
38
+ catch {
39
+ return null;
40
+ }
16
41
  }
17
42
  function resolveNaverContentUrl(url, html) {
18
43
  try {
19
44
  const parsed = new URL(url);
20
- const frame = html.match(/<iframe[^>]+id=["']mainFrame["'][^>]+src=["']([^"']+)["']/i)?.[1];
45
+ const frame = parseHTML(html).document.querySelector('iframe#mainFrame')?.getAttribute("src");
21
46
  if (frame) {
22
- const frameUrl = new URL(decodeHtml(frame), `${parsed.protocol}//${parsed.host}`);
23
- if (isNaverBlogContentUrl(frameUrl))
47
+ const frameUrl = new URL(frame, parsed);
48
+ if (naverBlogMobilePostUrl(frameUrl.toString()) === naverBlogMobilePostUrl(url))
24
49
  return { url: frameUrl.toString() };
25
50
  return {
26
51
  url,
27
52
  error: {
28
53
  category: "block",
29
54
  code: "naver_blog_untrusted_frame_url",
30
- message: "Naver Blog frame URL was outside the trusted blog.naver.com/mobile blog origin set",
55
+ message: "Naver Blog frame URL does not match the trusted origin and requested post identity",
31
56
  },
32
57
  };
33
58
  }
34
59
  if (parsed.hostname === "blog.naver.com") {
35
- return { url: `https://m.blog.naver.com${parsed.pathname}${parsed.search}` };
60
+ return { url: naverBlogMobilePostUrl(url) || url };
36
61
  }
37
62
  }
38
63
  catch {
@@ -41,59 +66,70 @@ function resolveNaverContentUrl(url, html) {
41
66
  return { url };
42
67
  }
43
68
  function extractNaverBody(html) {
44
- const patterns = [
45
- /<div[^>]+class=["'][^"']*se-main-container[^"']*["'][^>]*>([\s\S]*?)<\/div>/i,
46
- /<div[^>]+class=["'][^"']*post_ct[^"']*["'][^>]*>([\s\S]*?)<\/div>/i,
47
- /<div[^>]+id=["']postViewArea["'][^>]*>([\s\S]*?)<\/div>/i,
48
- /<div[^>]+class=["'][^"']*post_view[^"']*["'][^>]*>([\s\S]*?)<\/div>/i,
49
- ];
50
- for (const pattern of patterns) {
51
- const match = html.match(pattern);
52
- if (match?.[1]) {
53
- const text = stripNaverBlogContent(match[1]);
54
- if (text)
55
- return text;
69
+ const { document } = parseHTML(html);
70
+ for (const node of document.querySelectorAll('script, style, noscript, svg, template, textarea, input, [hidden], [aria-hidden="true"], [contenteditable]:not([contenteditable="false"])'))
71
+ node.remove();
72
+ for (const node of document.querySelectorAll("[style]")) {
73
+ if (/(?:^|;)\s*(?:display\s*:\s*none|visibility\s*:\s*(?:hidden|collapse))\s*(?:!important\s*)?(?:;|$)/i.test(node.getAttribute("style") || ""))
74
+ node.remove();
75
+ }
76
+ for (const selector of [".se-main-container", ".post_ct", "#postViewArea", ".post_view"]) {
77
+ const candidates = Array.from(document.querySelectorAll(selector)).filter(node => !node.parentElement?.closest(selector));
78
+ if (candidates.length > 1)
79
+ return { text: "", html: "" };
80
+ const body = candidates[0];
81
+ if (body) {
82
+ const text = stripNaverBlogContent(body.innerHTML);
83
+ return { text, html: body.innerHTML };
56
84
  }
57
85
  }
58
- return stripNaverBlogContent(html);
86
+ return { text: "", html: "" };
59
87
  }
60
88
  function isNaverBlogUnavailableShell(html, title, text) {
61
89
  const normalizedTitle = cleanText(title);
62
90
  const normalizedText = cleanText(text);
63
91
  const hasArticleContainer = /(?:class=["'][^"']*(?:se-main-container|post_ct|post_view)[^"']*["']|id=["']postViewArea["'])/i.test(html);
64
92
  const hasErrorContainer = /\b(?:id|class)=["'][^"']*(?:error_content|errorContent|error-container|error_message|error-message|error_wrap|not_found|not-found)[^"']*["']/i.test(html);
65
- const titleLooksLikeShell = /^(?:네이버 블로그|블로그:: 네이버|오류|error|not found|page not found)\b/i.test(normalizedTitle);
66
- const koreanShellText = /게시글을 찾을 수 없습니다|글을 찾을 수 없습니다|존재하지 않는 (?:게시글|글)|삭제되었거나 비공개|비공개 (?:게시글|글)|삭제된 (?:게시글|글)|접근 권한이 없습니다|요청하신 페이지를 찾을 수 없습니다|유효하지 않은 요청입니다|해당 블로그가 없습니다|블로그 아이디를 확인해 주세요/i.test(normalizedText);
93
+ const titleLooksLikeShell = /^(?:네이버 블로그|블로그:: 네이버|오류|error|not found|page not found)(?:$|\s*[:|–-])/i.test(normalizedTitle);
94
+ const koreanShellText = /게시글을 찾을 수 없습니다|글을 찾을 수 없습니다|존재하지 않는 (?:게시글|글)|삭제되었거나 비공개|비공개 (?:게시글|글)|삭제된 (?:게시글|글)|접근 권한이 없습니다|요청하신 페이지를 찾을 수 없습니다|유효하지 않은 요청입니다|해당 블로그가 없습니다|블로그 아이디를 확인해 주세요|로그인(?:이 필요| 후)/i.test(normalizedText);
67
95
  const englishShellText = /(?:post|page) (?:not found|unavailable)|private post|deleted post|access denied/i.test(normalizedText);
68
96
  const shellText = koreanShellText || englishShellText;
69
- return Boolean(!hasArticleContainer
70
- && ((hasErrorContainer && (shellText || titleLooksLikeShell))
71
- || (titleLooksLikeShell && shellText)));
97
+ return Boolean((titleLooksLikeShell && normalizedText.length < 500 && shellText)
98
+ || !hasArticleContainer
99
+ && ((hasErrorContainer && (shellText || titleLooksLikeShell))
100
+ || (titleLooksLikeShell && shellText)));
72
101
  }
73
102
  function naverBlogUnavailableGuidance() {
74
103
  return "Naver Blog post unavailable: 네이버 블로그 글을 공개 본문으로 확인할 수 없습니다. URL을 확인하거나 비공개/삭제 글이면 로그인된 브라우저 세션에서 원문을 열어 확인하세요.";
75
104
  }
76
- function isNaverBlogShellAssetLink(url) {
77
- try {
78
- const parsed = new URL(url);
79
- return /\.(?:woff2?|ttf|otf|eot|css)(?:$|[?#])/i.test(parsed.pathname);
80
- }
81
- catch {
82
- return /\.(?:woff2?|ttf|otf|eot|css)(?:$|[?#])/i.test(url);
83
- }
105
+ function declaredIdentityMatches(html, expected) {
106
+ const { document } = parseHTML(html);
107
+ return Array.from(document.querySelectorAll('head meta[property="og:url"], head link[rel="canonical"]')).every(node => {
108
+ const value = node.getAttribute("content") ?? node.getAttribute("href") ?? "";
109
+ return naverBlogMobilePostUrl(value) === expected;
110
+ });
84
111
  }
85
112
  export const naverBlogProvider = {
86
113
  id: "naver-blog",
87
114
  matches: (_url, target) => target === "naver_blog",
88
115
  async normalize(context) {
89
- const resolvedContent = resolveNaverContentUrl(context.url, context.active.content);
90
- const contentUrl = resolvedContent.url;
116
+ if (hasTerminalSafetyBlock(context.errors) || context.errors.some(error => ["operator_browser_auth_required", "operator_browser_user_required"].includes(error.code))) {
117
+ return { post: null, thread: [], comments: [], outbound_links: [], assetHtml: "", partial: true, method: context.active.method, errors: context.errors };
118
+ }
119
+ const expected = naverBlogMobilePostUrl(context.expectedPostUrl || context.url);
120
+ if (!expected || naverBlogMobilePostUrl(context.resolvedUrl) !== expected || !declaredIdentityMatches(context.active.content, expected)) {
121
+ return { post: null, thread: [], comments: [], outbound_links: [], assetHtml: "", partial: true, method: context.active.method,
122
+ errors: [...context.errors, { category: "parse_error", code: "naver_blog_identity_mismatch", message: "Retrieved document does not identify the requested Naver Blog post" }] };
123
+ }
124
+ const resolvedContent = extractNaverBody(context.active.content).html
125
+ ? { url: context.resolvedUrl }
126
+ : resolveNaverContentUrl(context.resolvedUrl, context.active.content);
127
+ let contentUrl = context.resolvedUrl;
91
128
  let html = context.active.content;
92
129
  let method = context.active.method;
93
130
  let errors = resolvedContent.error ? [...context.errors, resolvedContent.error] : context.errors;
94
- let hydrated = false;
95
- if (contentUrl !== context.url) {
96
- const result = await fetchProviderText(contentUrl, context.timeoutMs, {
131
+ if (resolvedContent.url !== context.resolvedUrl) {
132
+ const result = await fetchProviderText(resolvedContent.url, context.timeoutMs, {
97
133
  headers: {
98
134
  accept: "text/html,text/plain,*/*",
99
135
  "user-agent": USER_AGENT,
@@ -104,10 +140,13 @@ export const naverBlogProvider = {
104
140
  sourceUrl: context.url,
105
141
  allowedOrigins: NAVER_BLOG_ORIGINS,
106
142
  });
107
- if (result.ok) {
143
+ if (result.ok && naverBlogMobilePostUrl(result.final_url) === expected && declaredIdentityMatches(result.text, expected)) {
108
144
  html = result.text;
145
+ contentUrl = result.final_url;
109
146
  method = "naver_blog_frame";
110
- hydrated = true;
147
+ }
148
+ else if (result.ok) {
149
+ errors = [...errors, { category: "parse_error", code: "naver_blog_identity_mismatch", message: "Native frame response does not identify the requested post" }];
111
150
  }
112
151
  else {
113
152
  errors = [...errors, result.error];
@@ -115,22 +154,25 @@ export const naverBlogProvider = {
115
154
  }
116
155
  const title = extractMetaProperty(html, "og:title") || extractTitleFromHtml(html);
117
156
  const description = extractMetaProperty(html, "og:description") || extractMetaDescription(html);
118
- const body = extractNaverBody(html);
119
- const unavailable = isNaverBlogUnavailableShell(html, title, body);
157
+ const extracted = extractNaverBody(html);
158
+ const body = extracted.text;
159
+ const unavailable = isNaverBlogUnavailableShell(html, title, stripNaverBlogContent(html));
120
160
  const text = unavailable ? naverBlogUnavailableGuidance() : body;
121
- const outboundLinks = dedupeUrls([...(hydrated ? [] : context.active.links), ...extractUrls(html)]);
161
+ const outboundLinks = dedupeUrls([...extractAbsoluteAnchorHrefs(extracted.html, contentUrl), ...extractUrls(extracted.html)]);
122
162
  return {
123
163
  post: {
124
164
  url: context.url,
125
165
  canonical_url: contentUrl,
126
166
  title,
127
167
  description,
128
- text: text.slice(0, 40000),
168
+ text,
169
+ body_coverage: { collected_chars: body.length, complete: Boolean(body && !unavailable) },
129
170
  status: body && !unavailable ? "ok" : "blocked_or_unavailable",
130
171
  },
131
172
  thread: [],
132
173
  comments: [],
133
- outbound_links: unavailable ? outboundLinks.filter((link) => !isNaverBlogShellAssetLink(link)) : outboundLinks,
174
+ assetHtml: extracted.html,
175
+ outbound_links: outboundLinks,
134
176
  partial: !body || unavailable,
135
177
  errors: unavailable
136
178
  ? [
@@ -1 +1 @@
1
- {"version":3,"file":"naver-blog.js","sourceRoot":"","sources":["../../../src/smartfetch/providers/naver-blog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"naver-blog.js","sourceRoot":"","sources":["../../../src/smartfetch/providers/naver-blog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { SmartfetchContext, SmartfetchNormalization } from "../provider-types.js";
2
+ export declare const NAVER_CAFE_READY_SELECTOR = ".WebArticle #postContent .ArticleSectionLoggerContent > .content, input[type=\"password\"], body:has-text(\"\uB85C\uADF8\uC778\uC774 \uD544\uC694\"), body:has-text(\"\uB85C\uADF8\uC778 \uD6C4\"), body:has-text(\"\uC811\uADFC \uAD8C\uD55C\"), body:has-text(\"\uC0AC\uC6A9 \uAD8C\uD55C\"), body:has-text(\"\uC0AD\uC81C\uB41C \uAC8C\uC2DC\uAE00\"), body:has-text(\"verify you are human\"), body:has-text(\"captcha\"), body:has-text(\"access denied\"), body:has-text(\"sign in to continue\")";
3
+ /** Public native route only; preserve a caller-supplied share key, never acquire credentials. */
4
+ export declare function naverCafeMobilePostUrl(value: string): string | null;
5
+ export declare function naverCafeIdentity(value: string): string | null;
6
+ /** Only the identity-bound mobile article body and its owned comment list are evidence. */
7
+ export declare function normalizeNaverCafeNative(context: SmartfetchContext): SmartfetchNormalization | null;
@@ -0,0 +1,188 @@
1
+ import { parseHTML } from "linkedom";
2
+ import { dedupeUrls, extractAbsoluteAnchorHrefs, stripTags } from "../../shared.js";
3
+ // Readable article evidence does not depend on a comment counter being present.
4
+ export const NAVER_CAFE_READY_SELECTOR = '.WebArticle #postContent .ArticleSectionLoggerContent > .content, input[type="password"], body:has-text("로그인이 필요"), body:has-text("로그인 후"), body:has-text("접근 권한"), body:has-text("사용 권한"), body:has-text("삭제된 게시글"), body:has-text("verify you are human"), body:has-text("captcha"), body:has-text("access denied"), body:has-text("sign in to continue")';
5
+ /** Public native route only; preserve a caller-supplied share key, never acquire credentials. */
6
+ export function naverCafeMobilePostUrl(value) {
7
+ try {
8
+ const url = new URL(value);
9
+ if (url.protocol !== "https:" || url.username || url.password || url.port || !["cafe.naver.com", "m.cafe.naver.com"].includes(url.hostname))
10
+ return null;
11
+ const path = /^\/([a-zA-Z0-9_-]+)\/([1-9]\d*)\/?$/.exec(url.pathname)
12
+ || /^\/ca-fe\/web\/cafes\/([a-zA-Z0-9_-]+)\/articles\/([1-9]\d*)\/?$/.exec(url.pathname);
13
+ const clubs = url.searchParams.getAll("clubid");
14
+ const articles = url.searchParams.getAll("articleid");
15
+ const keys = url.searchParams.getAll("art");
16
+ if (clubs.length > 1 || articles.length > 1 || keys.length > 1)
17
+ return null;
18
+ const cafe = path?.[1] || (url.pathname === "/ArticleRead.nhn" ? clubs[0] : "");
19
+ const article = path?.[2] || (url.pathname === "/ArticleRead.nhn" ? articles[0] : "");
20
+ if (!cafe || !article || !/^[a-zA-Z0-9_-]+$/.test(cafe) || !/^[1-9]\d*$/.test(article))
21
+ return null;
22
+ if ((clubs.length && clubs[0] !== cafe) || (articles.length && articles[0] !== article))
23
+ return null;
24
+ // The short entry route consumes the public share key before SPA navigation.
25
+ const mobile = new URL(`https://m.cafe.naver.com/${cafe}/${article}`);
26
+ if (keys[0])
27
+ mobile.searchParams.set("art", keys[0]);
28
+ return mobile.href;
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ export function naverCafeIdentity(value) {
35
+ const native = naverCafeMobilePostUrl(value);
36
+ if (!native)
37
+ return null;
38
+ const [cafe, article] = new URL(native).pathname.slice(1).split("/");
39
+ return `https://m.cafe.naver.com/ca-fe/web/cafes/${cafe}/articles/${article}`;
40
+ }
41
+ const identity = naverCafeIdentity;
42
+ function unavailable(context, code, message) {
43
+ return { post: { url: context.url, title: "", text: "", status: "blocked_or_unavailable" }, thread: [], comments: [], outbound_links: [], partial: true,
44
+ errors: [...context.errors, { category: "block", code, message }], method: "naver_cafe_native", assetHtml: "" };
45
+ }
46
+ /** Only the identity-bound mobile article body and its owned comment list are evidence. */
47
+ export function normalizeNaverCafeNative(context) {
48
+ const expected = identity(context.expectedPostUrl || context.url);
49
+ if (!expected)
50
+ return unavailable(context, "naver_cafe_identity_mismatch", "No validated exact Naver Cafe article identity is available");
51
+ const observed = identity(context.resolvedUrl);
52
+ if (observed !== expected) {
53
+ let login = false;
54
+ try {
55
+ const final = new URL(context.resolvedUrl);
56
+ login = final.origin === "https://nid.naver.com" && final.pathname === "/nidlogin.login";
57
+ }
58
+ catch { /* invalid identity */ }
59
+ return unavailable(context, login ? "operator_browser_auth_required" : "naver_cafe_identity_mismatch", login ? "Naver Cafe requires user login in the approved browser" : "Naver Cafe document does not match the requested cafe and article");
60
+ }
61
+ if (context.errors.some(error => ["operator_browser_auth_required", "operator_browser_user_required"].includes(error.code))) {
62
+ return unavailable(context, "operator_browser_user_required", "Naver Cafe requires user participation in the approved browser");
63
+ }
64
+ const { document } = parseHTML(context.active.content || "");
65
+ for (const node of Array.from(document.querySelectorAll("script, style, noscript, template, svg, [hidden], [aria-hidden='true']")))
66
+ node.remove();
67
+ for (const node of Array.from(document.querySelectorAll("[style]"))) {
68
+ if (/(?:display\s*:\s*none|visibility\s*:\s*hidden)/i.test(node.getAttribute("style") || ""))
69
+ node.remove();
70
+ }
71
+ const roots = Array.from(document.querySelectorAll(".WebArticle #ct"));
72
+ const root = roots[0];
73
+ if (!root)
74
+ return new URL(context.resolvedUrl).hostname === "m.cafe.naver.com"
75
+ ? unavailable(context, "naver_cafe_native_body_unavailable", "Naver Cafe native article root is unavailable; page chrome is not article evidence") : null;
76
+ if (roots.length !== 1)
77
+ return unavailable(context, "naver_cafe_ambiguous_article", "Naver Cafe rendered multiple article roots");
78
+ const declarations = Array.from(document.querySelectorAll('meta[property="og:url"], link[rel="canonical"]'));
79
+ if (!declarations.length || declarations.some(node => identity(node.getAttribute("content") || node.getAttribute("href") || "") !== expected)) {
80
+ return unavailable(context, "naver_cafe_identity_mismatch", "Naver Cafe declared source does not match the requested cafe and article");
81
+ }
82
+ const bodies = Array.from(root.querySelectorAll("#postContent > .ArticleSectionLoggerContent > .content"));
83
+ const titles = Array.from(root.querySelectorAll(".post_title .title_area > h2.tit")).filter(node => !node.closest("#postContent, .ArticleComment"));
84
+ const body = bodies[0];
85
+ const titleNode = titles[0];
86
+ if (!body || !titleNode || bodies.length !== 1 || titles.length !== 1)
87
+ return unavailable(context, "naver_cafe_native_body_unavailable", "Naver Cafe has no unambiguous native article body and title");
88
+ const text = stripTags(body.innerHTML).replace(/\s+/g, " ").trim();
89
+ const title = stripTags(titleNode.innerHTML).replace(/\s+/g, " ").trim();
90
+ const postHeader = titleNode.closest(".post_title");
91
+ for (const image of Array.from(root.querySelectorAll("img[src]"))) {
92
+ const src = image.getAttribute("src")?.trim();
93
+ try {
94
+ const url = new URL(src || "", expected);
95
+ if (!src || src.startsWith("#") || !["http:", "https:"].includes(url.protocol) || url.username || url.password || identity(url.href) === expected)
96
+ image.remove();
97
+ else
98
+ image.setAttribute("src", url.href);
99
+ }
100
+ catch {
101
+ image.remove();
102
+ }
103
+ }
104
+ if ((!text && !body.querySelector("img[src]")) || !title || /^(?:로그인이 필요|로그인 후|삭제되었|비공개 글|접근 권한이 없)/.test(text)) {
105
+ return unavailable(context, "naver_cafe_native_body_unavailable", "Naver Cafe native article is empty, unavailable, or requires login");
106
+ }
107
+ const sections = Array.from(root.querySelectorAll(".ArticleComment")).filter(node => !node.closest("#postContent"));
108
+ const section = sections.length === 1 ? sections[0] : null;
109
+ const counts = section ? Array.from(section.querySelectorAll(".CafeCommentSort h3 .num")).filter(node => !node.closest(".comment_list, .comment_item, .comment_content")) : [];
110
+ const countText = counts.length === 1 ? counts[0]?.textContent?.trim().replace(/,/g, "") || "" : "";
111
+ const declared = /^\d+$/.test(countText) && Number.isSafeInteger(Number(countText)) ? Number(countText) : null;
112
+ const lists = section ? Array.from(section.querySelectorAll(".comment_list")).filter(node => !node.closest("li")) : [];
113
+ const list = lists[0];
114
+ const rows = lists.length === 1 && list ? Array.from(list.children).filter(node => node.tagName === "LI") : [];
115
+ const comments = [];
116
+ const ids = new Set();
117
+ let intact = lists.length === 1 || (lists.length === 0 && declared === 0);
118
+ let commentHtml = "";
119
+ for (const row of rows) {
120
+ const items = Array.from(row.querySelectorAll(".comment_item")).filter(node => node.closest("li") === row);
121
+ const item = items[0];
122
+ if (!item || items.length !== 1) {
123
+ intact = false;
124
+ continue;
125
+ }
126
+ const contents = Array.from(item.querySelectorAll(".comment_content"));
127
+ const content = contents[0];
128
+ if (!content || contents.length !== 1) {
129
+ intact = false;
130
+ continue;
131
+ }
132
+ const commentText = stripTags(content.innerHTML).replace(/\s+/g, " ").trim();
133
+ const imageUrls = dedupeUrls(Array.from(content.querySelectorAll("img[src]")).flatMap(node => {
134
+ const src = node.getAttribute("src")?.trim();
135
+ if (!src)
136
+ return [];
137
+ try {
138
+ const image = new URL(src, expected);
139
+ return ["https:", "http:"].includes(image.protocol) && !image.username && !image.password ? [image.href] : [];
140
+ }
141
+ catch {
142
+ return [];
143
+ }
144
+ }));
145
+ if (!commentText && !imageUrls.length) {
146
+ intact = false;
147
+ continue;
148
+ }
149
+ let id = null;
150
+ const controls = Array.from(item.querySelectorAll('.comment_footer [data-nlog-area="comment_list.comment_reply"]'))
151
+ .filter(node => !node.closest(".comment_content") && node.closest(".comment_item") === item);
152
+ try {
153
+ const params = JSON.parse(controls.length === 1 ? controls[0]?.getAttribute("data-nlog-params") || "null" : "null");
154
+ if (params && typeof params === "object" && "comment_id" in params && typeof params.comment_id === "number" && Number.isSafeInteger(params.comment_id) && params.comment_id > 0)
155
+ id = params.comment_id;
156
+ }
157
+ catch { /* retain visible content without inventing an id */ }
158
+ if (id === null)
159
+ intact = false;
160
+ else if (ids.has(id)) {
161
+ intact = false;
162
+ continue;
163
+ }
164
+ else
165
+ ids.add(id);
166
+ const read = (selector) => {
167
+ const nodes = Array.from(item.querySelectorAll(selector)).filter(node => !node.closest(".comment_content") && node.closest(".comment_item") === item);
168
+ return nodes.length === 1 ? nodes[0]?.textContent?.replace(/\s+/g, " ").trim() || "" : "";
169
+ };
170
+ comments.push({ id, author: read(".comment_header .nick_name"), text: commentText, created_at: read(".comment_footer .date"), depth: row.classList.contains("reply") ? 1 : 0, ...(imageUrls.length ? { image_urls: imageUrls } : {}) });
171
+ commentHtml += content.outerHTML;
172
+ }
173
+ const hasMore = Boolean(section?.querySelector(".comment_more a, .comment_more button"));
174
+ const complete = intact && declared !== null && comments.length === declared && !hasMore;
175
+ const assetHtml = body.outerHTML + commentHtml;
176
+ const outbound = extractAbsoluteAnchorHrefs(assetHtml, expected);
177
+ return {
178
+ post: { url: context.url, canonical_url: expected, title, text,
179
+ author: postHeader?.querySelector(".user_wrap .nick")?.textContent?.trim() || "",
180
+ created_at: postHeader?.querySelector(".user_wrap .date")?.textContent?.replace(/작성일|\s+/g, " ").trim() || "",
181
+ body_coverage: { collected_chars: text.length, complete: Boolean(text) },
182
+ comment_count: declared, comment_coverage: { declared_count: declared, collected_count: comments.length, complete } },
183
+ thread: [], comments, outbound_links: outbound, partial: !text || !complete,
184
+ errors: [...context.errors, ...(!complete ? [{ category: "unavailable", code: "naver_cafe_comments_incomplete", message: "Native article body is available, but rendered comment identities/count/pagination do not prove complete comments" }] : [])],
185
+ method: "naver_cafe_native", assetHtml,
186
+ };
187
+ }
188
+ //# sourceMappingURL=naver-cafe-native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naver-cafe-native.js","sourceRoot":"","sources":["../../../src/smartfetch/providers/naver-cafe-native.ts"],"names":[],"mappings":"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"}