Repository Analysis

white0dew/XiaohongshuSkills

支持小红书自动发布、自动评论、自动检索的 Skill。支持 OpenClaw、Codex、CC 等

69.5 Strong AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of white0dew/XiaohongshuSkills, a Python project with 3,299 GitHub stars. SynthScan v2.0 examined 8,458 lines of code across 16 source files, recording 235 pattern matches distributed across 10 syntactic categories. The overall adjusted score of 69.5 places this repository in the Strong AI signal band.

The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).

69.5
Adjusted Score
69.5
Raw Score
100%
Time Factor
2026-08-09
Last Push
3.3K
Stars
Python
Language
8.5K
Lines of Code
16
Files
235
Pattern Hits
2026-08-09
Scan Date
6.69
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.

No multi-scan history yet — run the scanner again to build trend data.

Severity Breakdown

Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.

CRITICAL 0HIGH 107MEDIUM 40LOW 88

Directory Score Breakdown

This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.

Pattern Findings

The scanner identified 235 distinct pattern matches across 10 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.

Cross-Language Confusion107 hits · 489 pts
SeverityFileLineSnippetContext
HIGHscripts/cdp_publish.py1962 if (!obj || typeof obj !== "object") {CODE
HIGHscripts/cdp_publish.py1963 return null;CODE
HIGHscripts/cdp_publish.py1967 if (value !== undefined && value !== null && String(value).trim()) {CODE
HIGHscripts/cdp_publish.py1971 return null;CODE
HIGHscripts/cdp_publish.py1976 let userNode = null;CODE
HIGHscripts/cdp_publish.py1979 while (queue.length && scanCount < 2400) {CODE
HIGHscripts/cdp_publish.py1982 if (!node || typeof node !== "object") {CODE
HIGHscripts/cdp_publish.py2000 if (nameVal && (idVal || avatarVal)) {CODE
HIGHscripts/cdp_publish.py2008 if (item && typeof item === "object") {CODE
HIGHscripts/cdp_publish.py2009 queue.push(item);CODE
HIGHscripts/cdp_publish.py2017 if (value && typeof value === "object") {CODE
HIGHscripts/cdp_publish.py2018 queue.push(value);CODE
HIGHscripts/cdp_publish.py2037 if (!(node instanceof HTMLElement) || node.offsetParent === null) {CODE
HIGHscripts/cdp_publish.py2040 const text = normalize(node.innerText || node.textContent);CODE
HIGHscripts/cdp_publish.py2041 if (text && text.length <= 40) {CODE
HIGHscripts/cdp_publish.py2042 statTexts.push(text);CODE
HIGHscripts/cdp_publish.py2097 return null;CODE
HIGHscripts/cdp_publish.py2103 return null;CODE
HIGHscripts/cdp_publish.py2109 return null;CODE
HIGHscripts/cdp_publish.py2114 url: parsed.toString(),CODE
HIGHscripts/cdp_publish.py2316 containers.push(node);CODE
HIGHscripts/cdp_publish.py2323 let best = null;CODE
HIGHscripts/cdp_publish.py2331 const text = normalize(container.innerText || container.textContent);CODE
HIGHscripts/cdp_publish.py2336 if (targetId && id && id === targetId) {CODE
HIGHscripts/cdp_publish.py2339 if (targetAuthor && author && author.includes(targetAuthor)) {CODE
HIGHscripts/cdp_publish.py2342 if (targetSnippet && text && text.includes(targetSnippet)) {CODE
HIGHscripts/cdp_publish.py2345 if (!best || score > best.score) {CODE
HIGHscripts/cdp_publish.py2451 if (!(el instanceof HTMLButtonElement) || el.offsetParent === null) {CODE
HIGHscripts/cdp_publish.py2458 if (r.width < 8 || r.height < 8) {CODE
HIGHscripts/cdp_publish.py2466 if (!(button instanceof HTMLButtonElement) || button.offsetParent === null) {CODE
HIGHscripts/cdp_publish.py2926 if (!(el instanceof HTMLElement) || el.offsetParent === null) {CODE
HIGHscripts/cdp_publish.py2930 if (r.width < 8 || r.height < 8) {CODE
HIGHscripts/cdp_publish.py2935 return null;CODE
HIGHscripts/cdp_publish.py2961 if (!(el instanceof HTMLButtonElement) || el.offsetParent === null) {CODE
HIGHscripts/cdp_publish.py2968 if (r.width < 8 || r.height < 8) {CODE
HIGHscripts/cdp_publish.py2976 if (!(button instanceof HTMLButtonElement) || button.offsetParent === null) {CODE
HIGHscripts/cdp_publish.py3035 if (node.offsetParent === null) {CODE
HIGHscripts/cdp_publish.py3042 candidates.push(node);CODE
HIGHscripts/cdp_publish.py3047 const text = (node.innerText || node.textContent || "")CODE
HIGHscripts/cdp_publish.py3511 fuzzyKeywords.push('图文', '上传图文');CODE
HIGHscripts/cdp_publish.py3514 fuzzyKeywords.push('视频', '上传视频');CODE
HIGHscripts/cdp_publish.py3523 if (keyword && t.indexOf(keyword) !== -1) {{CODE
HIGHscripts/cdp_publish.py4010 return null;CODE
HIGHscripts/cdp_publish.py919 if (node.offsetParent === null) {{CODE
HIGHscripts/cdp_publish.py928 if (document.body && containsKeyword(document.body.innerText)) {{CODE
HIGHscripts/cdp_publish.py1080 const src = node instanceof HTMLImageElement ? (node.currentSrc || node.src || "") : "";CODE
HIGHscripts/cdp_publish.py1083 node.parentElement ? (node.parentElement.innerText || node.parentElement.textContent) : ""CODE
HIGHscripts/cdp_publish.py1182 if (node.offsetParent === null) {{CODE
HIGHscripts/cdp_publish.py1186 return rect.width >= 8 && rect.height >= 8;CODE
HIGHscripts/cdp_publish.py1197 let inputEl = null;CODE
HIGHscripts/cdp_publish.py1201 if (!(node instanceof HTMLInputElement || node instanceof HTMLTextAreaElement)) {{CODE
HIGHscripts/cdp_publish.py1224 if (descriptor && typeof descriptor.set === "function") {{CODE
HIGHscripts/cdp_publish.py1564 const text = normalize(node.innerText || node.textContent);CODE
HIGHscripts/cdp_publish.py1584 const text = normalize(node.innerText || node.textContent);CODE
HIGHscripts/cdp_publish.py1607 const text = normalize(node.innerText || node.textContent).toUpperCase();CODE
HIGHscripts/cdp_publish.py1625 scroll_top: window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0CODE
HIGHscripts/cdp_publish.py1736 const text = normalize(node.textContent || node.innerText);CODE
HIGHscripts/cdp_publish.py1755 if ({threshold} > 0 && match && Number.parseInt(match[1], 10) > {threshold}) {{CODE
HIGHscripts/cdp_publish.py2153 notes.push({CODE
HIGHscripts/cdp_publish.py2254 if (value && normalize(value)) {CODE
47 more matches not shown…
Excessive Try-Catch Wrapping39 hits · 37 pts
SeverityFileLineSnippetContext
LOWscripts/chrome_launcher.py205 except Exception:CODE
LOWscripts/chrome_launcher.py209 except Exception:CODE
LOWscripts/chrome_launcher.py221 except Exception:CODE
LOWscripts/chrome_launcher.py224 except Exception:CODE
LOWscripts/chrome_launcher.py244 except Exception:CODE
LOWscripts/image_downloader.py163 except Exception as e:CODE
LOWscripts/run_lock.py44 except Exception:CODE
LOWscripts/account_manager.py196 except Exception:CODE
MEDIUMscripts/account_manager.py275 print(f"Error: Account '{args.name}' already exists.", file=sys.stderr)CODE
MEDIUMscripts/account_manager.py282 print(f"Error: Cannot remove account '{args.name}'.", file=sys.stderr)CODE
MEDIUMscripts/account_manager.py294 print(f"Error: Account '{args.name}' not found.", file=sys.stderr)CODE
MEDIUMscripts/account_manager.py301 print(f"Error: Account '{args.name}' not found.", file=sys.stderr)CODE
MEDIUMscripts/cdp_publish.py4469 print(f"Error: Account '{args.name}' already exists.", file=sys.stderr)STRING
MEDIUMscripts/cdp_publish.py4478 print(f"Error: Cannot remove account '{args.name}'.", file=sys.stderr)STRING
MEDIUMscripts/cdp_publish.py4487 print(f"Error: Account '{args.name}' not found.", file=sys.stderr)STRING
LOWscripts/cdp_publish.py73 except Exception:CODE
LOWscripts/cdp_publish.py188 except Exception:CODE
LOWscripts/cdp_publish.py212 except Exception:CODE
LOWscripts/cdp_publish.py388 except Exception:CODE
LOWscripts/cdp_publish.py502 except Exception as e:CODE
LOWscripts/cdp_publish.py624 except Exception as exc:CODE
LOWscripts/cdp_publish.py1400 except Exception:CODE
MEDIUMscripts/cdp_publish.py4540 print("Error: --content or --content-file required.", file=sys.stderr)STRING
MEDIUMscripts/cdp_publish.py4632 print("Error: --content or --content-file required.", file=sys.stderr)STRING
MEDIUMscripts/cdp_publish.py4654 print("Error: --content or --content-file required.", file=sys.stderr)STRING
MEDIUMscripts/cdp_publish.py4820 print(f"Error: {e}", file=sys.stderr)STRING
LOWscripts/feed_explorer.py147 except Exception:CODE
LOWscripts/publish_pipeline.py61 except Exception:CODE
LOWscripts/publish_pipeline.py97 except Exception:CODE
MEDIUMscripts/publish_pipeline.py174 print(f"Error: {media_label} file not found: {file_path}", file=sys.stderr)CODE
MEDIUMscripts/publish_pipeline.py461 print("Error: title is empty.", file=sys.stderr)STRING
MEDIUMscripts/publish_pipeline.py472 print("Error: content is empty.", file=sys.stderr)STRING
MEDIUMscripts/publish_pipeline.py494 print("Error: Failed to start Chrome.", file=sys.stderr)STRING
MEDIUMscripts/publish_pipeline.py533 print(f"Error: {e}", file=sys.stderr)STRING
MEDIUMscripts/publish_pipeline.py550 print("Error: Video download failed.", file=sys.stderr)STRING
MEDIUMscripts/publish_pipeline.py565 print("Error: All image downloads failed.", file=sys.stderr)STRING
MEDIUMscripts/publish_pipeline.py590 print(f"Error during form fill: {e}", file=sys.stderr)STRING
MEDIUMscripts/publish_pipeline.py610 print(f"Error clicking publish: {e}", file=sys.stderr)STRING
MEDIUMscripts/publish_pipeline.py628 print(f"Error: {e}", file=sys.stderr)STRING
Decorative Section Separators18 hits · 26 pts
SeverityFileLineSnippetContext
MEDIUMscripts/account_manager.py219# ---------------------------------------------------------------------------COMMENT
MEDIUMscripts/account_manager.py221# ---------------------------------------------------------------------------COMMENT
MEDIUMscripts/cdp_publish.py1166 # ------------------------------------------------------------------COMMENT
MEDIUMscripts/cdp_publish.py1168 # ------------------------------------------------------------------COMMENT
MEDIUMscripts/cdp_publish.py93# ---------------------------------------------------------------------------COMMENT
MEDIUMscripts/cdp_publish.py95# ---------------------------------------------------------------------------COMMENT
MEDIUMscripts/cdp_publish.py486 # ------------------------------------------------------------------COMMENT
MEDIUMscripts/cdp_publish.py488 # ------------------------------------------------------------------COMMENT
MEDIUMscripts/cdp_publish.py584 # ------------------------------------------------------------------COMMENT
MEDIUMscripts/cdp_publish.py586 # ------------------------------------------------------------------COMMENT
MEDIUMscripts/cdp_publish.py858 # ------------------------------------------------------------------COMMENT
MEDIUMscripts/cdp_publish.py860 # ------------------------------------------------------------------COMMENT
MEDIUMscripts/cdp_publish.py4016 # ------------------------------------------------------------------STRING
MEDIUMscripts/cdp_publish.py4018 # ------------------------------------------------------------------STRING
MEDIUMscripts/cdp_publish.py4126# ---------------------------------------------------------------------------STRING
MEDIUMscripts/cdp_publish.py4128# ---------------------------------------------------------------------------STRING
MEDIUMscripts/cdp_publish.py3298 # ------------------------------------------------------------------STRING
MEDIUMscripts/cdp_publish.py3300 # ------------------------------------------------------------------STRING
Hyper-Verbose Identifiers35 hits · 16 pts
SeverityFileLineSnippetContext
LOWscripts/cdp_publish.py343 def _prepare_upload_file_path(self, file_path: str) -> str:CODE
LOWscripts/cdp_publish.py349 def _looks_like_windows_drive_path(self, file_path: str) -> bool:CODE
LOWscripts/cdp_publish.py357 def _looks_like_windows_backslash_path(self, file_path: str) -> bool:CODE
LOWscripts/cdp_publish.py366 def _should_preserve_upload_path(self, file_path: str) -> bool:CODE
LOWscripts/cdp_publish.py1170 def _prepare_search_input_keyword(self, keyword: str) -> dict[str, Any]:CODE
LOWscripts/cdp_publish.py193def _build_search_filters_from_args(args) -> SearchFilters | None:CODE
LOWscripts/cdp_publish.py215def validate_schedule_post_time(dt_str: str | None) -> bool:CODE
LOWscripts/cdp_publish.py261def _map_note_infos_to_content_rows(note_infos: list[dict[str, Any]]) -> list[dict[str, Any]]:CODE
LOWscripts/cdp_publish.py640 def _build_content_data_result(CODE
LOWscripts/cdp_publish.py679 def _fetch_content_data_via_page_fetch(CODE
LOWscripts/cdp_publish.py896 def _home_login_prompt_visible(self, keyword: str) -> bool:CODE
LOWscripts/cdp_publish.py1334 def _capture_search_recommendations_via_network(CODE
LOWscripts/cdp_publish.py1518 def _extract_feed_comments_state(self) -> dict[str, Any]:CODE
LOWscripts/cdp_publish.py2219 def _activate_reply_target_for_comment(CODE
LOWscripts/cdp_publish.py2753 def _check_feed_page_accessible(self):CODE
LOWscripts/cdp_publish.py3355 def _find_content_editor_selector(self) -> str | None:CODE
LOWscripts/cdp_publish.py754 def _capture_content_data_from_page_request(STRING
LOWscripts/cdp_publish.py1256 def _extract_recommend_keywords_from_payload(STRING
LOWscripts/cdp_publish.py1638 def _scroll_feed_comments_area(STRING
LOWscripts/cdp_publish.py1695 def _click_more_reply_buttons(STRING
LOWscripts/cdp_publish.py1777 def _load_feed_detail_comments(STRING
LOWscripts/cdp_publish.py2080 def _extract_note_cards_from_profile_dom(self, limit: int) -> dict[str, Any]:STRING
LOWscripts/cdp_publish.py2499 def _inspect_note_toggle_state(STRING
LOWscripts/cdp_publish.py3006 def _schedule_click_notification_mentions_tab(self) -> str:STRING
LOWscripts/cdp_publish.py3080 def _fetch_notification_mentions_via_page(self) -> dict[str, Any] | None:STRING
LOWscripts/cdp_publish.py3144 def get_notification_mentions(self, wait_seconds: float = 18.0) -> dict[str, Any]:STRING
LOWscripts/cdp_publish.py3334 def _wait_for_uploaded_images(self, expected_count: int, timeout_seconds: float = 60.0):STRING
LOWscripts/cdp_publish.py3473 def _wait_for_publish_button_ready(self, timeout_seconds: float = VIDEO_PROCESS_TIMEOUT):STRING
LOWscripts/feed_explorer.py196 def _wait_for_home_feeds_state(self):CODE
LOWscripts/feed_explorer.py356 def _apply_filters_in_single_panel(self, option_values: list[str]) -> tuple[bool, str]:CODE
LOWscripts/feed_explorer.py403 def _try_apply_filter_via_hover_mouse(self, filter_value: str) -> tuple[bool, str]:CODE
LOWscripts/feed_explorer.py450 def _apply_single_filter_js_fallback(self, filter_value: str) -> dict[str, Any]:CODE
LOWscripts/feed_explorer.py321 def _open_filter_panel_via_hover_mouse(self) -> tuple[bool, str]:STRING
LOWscripts/publish_pipeline.py130def _extract_topic_tags_from_last_line(content: str) -> tuple[str, list[str]]:CODE
LOWscripts/publish_pipeline.py159def _verify_local_files_exist(CODE
Deep Nesting9 hits · 6 pts
SeverityFileLineSnippetContext
LOWscripts/chrome_launcher.py182CODE
LOWscripts/account_manager.py223CODE
LOWscripts/cdp_publish.py4130CODE
LOWscripts/cdp_publish.py490CODE
LOWscripts/cdp_publish.py1256CODE
LOWscripts/cdp_publish.py1777CODE
LOWscripts/feed_explorer.py356CODE
LOWscripts/feed_explorer.py699CODE
LOWscripts/publish_pipeline.py307CODE
Verbosity Indicators11 hits · 4 pts
SeverityFileLineSnippetContext
LOWscripts/cdp_publish.py4054 # Step 1: Navigate to publish pageSTRING
LOWscripts/cdp_publish.py4058 # Step 2: Click '上传图文' tabSTRING
LOWscripts/cdp_publish.py4061 # Step 3: Upload images (editor appears after upload)STRING
LOWscripts/cdp_publish.py4064 # Step 4: Fill titleSTRING
LOWscripts/cdp_publish.py4067 # Step 5: Fill contentSTRING
LOWscripts/cdp_publish.py4070 # Step 6: Set schedule publish time (if provided)STRING
LOWscripts/cdp_publish.py4103 # Step 1: Navigate to publish pageSTRING
LOWscripts/cdp_publish.py4107 # Step 2: Click '上传视频' tabSTRING
LOWscripts/cdp_publish.py4110 # Step 3: Upload video and wait for processingSTRING
LOWscripts/cdp_publish.py4114 # Step 4: Fill titleSTRING
LOWscripts/cdp_publish.py4117 # Step 5: Fill contentSTRING
Structural Annotation Overuse11 hits · 4 pts
SeverityFileLineSnippetContext
LOWscripts/cdp_publish.py4054 # Step 1: Navigate to publish pageSTRING
LOWscripts/cdp_publish.py4058 # Step 2: Click '上传图文' tabSTRING
LOWscripts/cdp_publish.py4061 # Step 3: Upload images (editor appears after upload)STRING
LOWscripts/cdp_publish.py4064 # Step 4: Fill titleSTRING
LOWscripts/cdp_publish.py4067 # Step 5: Fill contentSTRING
LOWscripts/cdp_publish.py4070 # Step 6: Set schedule publish time (if provided)STRING
LOWscripts/cdp_publish.py4103 # Step 1: Navigate to publish pageSTRING
LOWscripts/cdp_publish.py4107 # Step 2: Click '上传视频' tabSTRING
LOWscripts/cdp_publish.py4110 # Step 3: Upload video and wait for processingSTRING
LOWscripts/cdp_publish.py4114 # Step 4: Fill titleSTRING
LOWscripts/cdp_publish.py4117 # Step 5: Fill contentSTRING
Unused Imports3 hits · 2 pts
SeverityFileLineSnippetContext
LOWscripts/generate_star_history.py4CODE
LOWscripts/run_lock.py3CODE
LOWscripts/feed_explorer.py8CODE
Self-Referential Comments1 hit · 2 pts
SeverityFileLineSnippetContext
MEDIUMscripts/cdp_publish.py548 # Create a new tabCOMMENT
Redundant / Tautological Comments1 hit · 1 pts
SeverityFileLineSnippetContext
LOWscripts/cdp_publish.py879 # Check if we got redirected to a login pageCOMMENT