🚀 抖音、TikTok 数据采集与无水印视频下载 API,自托管,支持 MCP 调用与 Docker 一键部署。| Self-hosted TikTok & Douyin scraper and no-watermark video downloader — async REST API, MCP server, CLI and web console for posts, profiles, comments and playlists. Self-healing identity pool, PostgreSQL archive, one docker compose up.
This report summarizes scanner evidence for Evil0ctal/Douyin_TikTok_Download_API, a Python project with 20,588 GitHub stars. SynthScan examined 178,686 lines of code across 544 source files, recording 3873 pattern matches distributed across 15 syntactic categories. The legacy adjusted pattern signal is 32.2 (High pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 2303 finding(s).
Are imports declared and package/API names verified? 601 finding(s).
Are wrappers, guards, and repeated structures necessary? 3146 finding(s).
Which changes need focused human review? 3873 finding(s).
Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 3873 distinct pattern matches across 15 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. 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 configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docker/compose.yml | 93 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docker/compose.yml | 96 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docker/compose.yml | 206 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docker/compose.yml | 210 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docker/compose.yml | 223 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docker/compose.yml | 225 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docker/compose.yml | 323 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docker/compose.yml | 332 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docker/compose.yml | 459 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docker/compose.yml | 472 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | install/install.sh | 14 | # ------------------------------------- | COMMENT |
| MEDIUM | install/install.zh.sh | 14 | # ---------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_ops_masking.py | 17 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_ops_masking.py | 25 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_tools_sign_stages.py | 119 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_tools_sign_stages.py | 121 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_tools_sign_stages.py | 169 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_tools_sign_stages.py | 171 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_tools_sign_stages.py | 219 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_tools_sign_stages.py | 221 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_tools_sign_stages.py | 269 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_tools_sign_stages.py | 271 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/test_tools_sign_stages.py | 95 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/test_tools_sign_stages.py | 97 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_absence_matrix.py | 45 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_absence_matrix.py | 47 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_absence_matrix.py | 131 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_absence_matrix.py | 133 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_absence_matrix.py | 192 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_absence_matrix.py | 194 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_signing.py | 272 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_signing.py | 281 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_signing.py | 794 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_signing.py | 796 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_signing.py | 977 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_signing.py | 979 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_signing.py | 1037 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_signing.py | 1039 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_signing.py | 1248 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_signing.py | 1250 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_signing.py | 1531 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_signing.py | 1533 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_signing.py | 1898 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_signing.py | 1906 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_signing.py | 2112 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_signing.py | 2114 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_signing.py | 2411 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_signing.py | 2413 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_signing.py | 2566 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_signing.py | 2568 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/test_signing.py | 120 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/test_signing.py | 122 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/test_signing.py | 161 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/test_signing.py | 163 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/test_signing.py | 191 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/test_signing.py | 193 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_worker_ops_identity_test.py | 155 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_worker_ops_identity_test.py | 157 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_worker_ops_identity_test.py | 270 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_worker_ops_identity_test.py | 272 | # -------------------------------------------------------------------------- | COMMENT |
| 612 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker/browser_rpc/tests/test_validation.py | 43 | def test_allows_platform_hosts(self, url: str) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_validation.py | 58 | def test_rejects_everything_else(self, url: str) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_validation.py | 62 | def test_rejects_cross_platform_url(self) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_validation.py | 68 | def test_normalizes_host_and_drops_fragment(self) -> None: | CODE |
| LOW | docker/browser_rpc/tests/test_validation.py | 96 | def test_rejects_other_schemes(self, url: str) -> None: | CODE |
| LOW | docker/browser_rpc/tests/test_validation.py | 100 | def test_allows_private_addresses(self) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_service.py | 124 | async def test_returns_cookies_and_fingerprint(self, service: BrowserRpcService) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_service.py | 130 | async def test_aligns_timezone_with_the_exit(self, service: BrowserRpcService) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_service.py | 137 | async def test_measured_exit_drives_alignment( | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_service.py | 198 | async def test_refuses_when_the_backend_never_started( | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_service.py | 207 | async def test_returns_signature_fields(self, service: BrowserRpcService) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_service.py | 212 | async def test_warm_context_is_reused(self, settings: Settings) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_service.py | 279 | async def test_warm_pages_go_direct_without_one(self, settings: Settings) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_service.py | 289 | async def test_rejects_a_url_outside_the_allowlist(self, service: BrowserRpcService) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_service.py | 295 | async def test_reports_warm_contexts_and_versions(self, settings: Settings) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_service.py | 496 | async def test_an_anonymous_caller_still_gets_a_signature( | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_service.py | 506 | def test_the_same_session_is_the_same_binding(self) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_service.py | 510 | def test_a_different_jar_is_a_different_binding(self) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_service.py | 513 | def test_a_different_exit_is_a_different_binding(self) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_service.py | 517 | def test_nothing_at_all_is_the_anonymous_binding(self) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_service.py | 521 | def test_the_binding_does_not_carry_the_cookies_around(self) -> None: | CODE |
| LOW | docker/browser_rpc/tests/test_service.py | 153 | async def test_profiles_are_single_use_and_removed( | CODE |
| LOW | docker/browser_rpc/tests/test_service.py | 165 | async def test_profile_is_removed_after_a_failure(self, settings: Settings) -> None: | CODE |
| LOW | docker/browser_rpc/tests/test_service.py | 177 | async def test_timeout_is_reported_not_hung(self, settings: Settings) -> None: | CODE |
| LOW | docker/browser_rpc/tests/test_service.py | 186 | async def test_concurrent_mints_are_capped(self, settings: Settings) -> None: | CODE |
| LOW | docker/browser_rpc/tests/test_service.py | 225 | async def test_stale_context_is_rebuilt(self, settings: Settings, clock: Any) -> None: | CODE |
| LOW | docker/browser_rpc/tests/test_service.py | 241 | async def test_broken_page_is_replaced_and_the_call_succeeds(self, settings: Settings) -> None: | CODE |
| LOW | docker/browser_rpc/tests/test_service.py | 252 | async def test_gives_up_after_the_retry(self, settings: Settings) -> None: | CODE |
| LOW | docker/browser_rpc/tests/test_service.py | 261 | async def test_warm_pages_use_the_configured_exit(self, settings: Settings) -> None: | CODE |
| LOW | docker/browser_rpc/tests/test_service.py | 308 | async def test_unstarted_service_answers_anyway( | CODE |
| LOW | docker/browser_rpc/tests/test_service.py | 317 | async def test_startup_failure_is_recorded_not_raised(self, settings: Settings) -> None: | CODE |
| LOW | docker/browser_rpc/tests/test_service.py | 346 | async def test_the_signature_names_the_callers_own_visitor(self, settings: Settings) -> None: | CODE |
| LOW | docker/browser_rpc/tests/test_service.py | 365 | async def test_two_identities_never_share_a_page(self, settings: Settings) -> None: | CODE |
| LOW | docker/browser_rpc/tests/test_service.py | 394 | async def test_one_identity_keeps_its_page(self, settings: Settings) -> None: | CODE |
| LOW | docker/browser_rpc/tests/test_service.py | 413 | async def test_the_page_follows_the_identitys_own_exit(self, settings: Settings) -> None: | CODE |
| LOW | docker/browser_rpc/tests/test_service.py | 443 | async def test_rebinding_never_exceeds_the_configured_browser_count( | CODE |
| LOW | docker/browser_rpc/tests/test_service.py | 472 | async def test_concurrent_signatures_do_not_overrun_the_budget( | CODE |
| LOW | docker/browser_rpc/tests/test_service.py | 538 | async def test_a_crash_while_warming_up_is_retried(self, settings: Settings) -> None: | CODE |
| LOW | docker/browser_rpc/tests/test_service.py | 571 | async def test_a_pool_that_never_opens_still_reports_the_reason( | CODE |
| LOW | docker/browser_rpc/tests/test_service.py | 594 | async def test_a_failed_open_does_not_leak_the_slot(self, settings: Settings) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_geo.py | 55 | def test_hint_wins_over_measured_exit(self) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_geo.py | 59 | def test_measured_exit_used_without_hint(self) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_geo.py | 64 | def test_individual_fields_override(self) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_geo.py | 70 | def test_falls_back_to_default_country(self) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_geo.py | 74 | def test_unknown_everything_is_still_usable(self) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_geo.py | 81 | async def test_reads_ip_and_country(self) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_geo.py | 91 | async def test_goes_through_the_proxy(self) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_geo.py | 98 | async def test_no_proxy_means_no_proxy_argument(self) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_geo.py | 103 | async def test_disabled_probe_is_silent(self) -> None: | CODE |
| LOW | docker/browser_rpc/tests/test_geo.py | 116 | async def test_alternate_field_names(self) -> None: | CODE |
| LOW | docker/browser_rpc/tests/test_rpc_api.py | 36 | async def test_returns_the_documented_shape(self, client: httpx.AsyncClient) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_rpc_api.py | 52 | async def test_rejects_an_unknown_platform(self, client: httpx.AsyncClient) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_rpc_api.py | 57 | async def test_rejects_a_proxy_that_is_not_a_proxy(self, client: httpx.AsyncClient) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_rpc_api.py | 66 | async def test_signs_with_the_callers_query(self, client: httpx.AsyncClient) -> None: | CODE |
| LOW | docker/browser_rpc/tests/test_rpc_api.py | 82 | async def test_builds_a_query_when_the_caller_sends_only_params( | CODE |
| LOW | docker/browser_rpc/tests/test_rpc_api.py | 103 | async def test_the_callers_cookies_reach_the_signing_page( | CODE |
| LOW | docker/browser_rpc/tests/test_rpc_api.py | 127 | async def test_a_caller_that_sends_no_cookies_still_gets_a_signature( | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_rpc_api.py | 138 | async def test_rejects_a_url_off_the_allowlist(self, client: httpx.AsyncClient) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_rpc_api.py | 145 | async def test_rejects_a_url_from_the_other_platform(self, client: httpx.AsyncClient) -> None: | CODE |
| LOW⚡ | docker/browser_rpc/tests/test_rpc_api.py | 154 | async def test_reports_backend_and_versions(self, client: httpx.AsyncClient) -> None: | CODE |
| 2097 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker/browser_rpc/geo.py | 19 | CODE | |
| LOW | docker/browser_rpc/service.py | 22 | CODE | |
| LOW | docker/browser_rpc/models.py | 13 | CODE | |
| LOW | docker/browser_rpc/__init__.py | 21 | CODE | |
| LOW | docker/browser_rpc/settings.py | 8 | CODE | |
| LOW | docker/browser_rpc/errors.py | 11 | CODE | |
| LOW | docker/browser_rpc/main.py | 13 | CODE | |
| LOW | docker/browser_rpc/__main__.py | 8 | CODE | |
| LOW | docker/browser_rpc/validation.py | 14 | CODE | |
| LOW | docker/browser_rpc/backends/fake.py | 14 | CODE | |
| LOW | docker/browser_rpc/backends/cloak.py | 36 | CODE | |
| LOW | docker/browser_rpc/backends/__init__.py | 10 | CODE | |
| LOW | docker/browser_rpc/backends/__init__.py | 15 | CODE | |
| LOW | docker/browser_rpc/backends/__init__.py | 15 | CODE | |
| LOW | docker/browser_rpc/backends/__init__.py | 15 | CODE | |
| LOW | docker/browser_rpc/backends/__init__.py | 15 | CODE | |
| LOW | docker/browser_rpc/backends/__init__.py | 15 | CODE | |
| LOW | docker/browser_rpc/backends/base.py | 14 | CODE | |
| LOW | docker/browser_rpc/tests/conftest.py | 10 | CODE | |
| LOW | docker/browser_rpc/tests/test_validation.py | 3 | CODE | |
| LOW | docker/browser_rpc/tests/test_service.py | 7 | CODE | |
| LOW | docker/browser_rpc/tests/test_geo.py | 3 | CODE | |
| LOW | docker/browser_rpc/tests/test_rpc_api.py | 10 | CODE | |
| LOW | docker/browser_rpc/tests/test_backends.py | 10 | CODE | |
| LOW | docker/browser_rpc/tests/test_settings.py | 8 | CODE | |
| LOW | tests/conftest.py | 9 | CODE | |
| LOW | tests/unit/test_signature_decoding.py | 10 | CODE | |
| LOW | tests/unit/test_client_profile.py | 14 | CODE | |
| LOW | tests/unit/test_db_models.py | 11 | CODE | |
| LOW | tests/unit/test_ops_masking.py | 10 | CODE | |
| LOW | tests/unit/test_tools_sign_stages.py | 15 | CODE | |
| LOW | tests/unit/test_absence_matrix.py | 19 | CODE | |
| LOW | tests/unit/test_signing.py | 27 | CODE | |
| LOW | tests/unit/test_signing.py | 33 | CODE | |
| LOW | tests/unit/test_worker_ops_identity_test.py | 17 | CODE | |
| LOW | tests/unit/test_policy_coverage.py | 10 | CODE | |
| LOW | tests/unit/test_watchlist.py | 8 | CODE | |
| LOW | tests/unit/test_ops_backup.py | 9 | CODE | |
| LOW | tests/unit/test_ops_notify.py | 15 | CODE | |
| LOW | tests/unit/test_media_client.py | 9 | CODE | |
| LOW | tests/unit/test_capacity.py | 8 | CODE | |
| LOW | tests/unit/test_openapi_completeness.py | 14 | CODE | |
| LOW | tests/unit/test_identity_marks.py | 3 | CODE | |
| LOW | tests/unit/test_tools_decode_route.py | 13 | CODE | |
| LOW | tests/unit/test_worker_ops_notify_test.py | 18 | CODE | |
| LOW | tests/unit/test_media_plan.py | 7 | CODE | |
| LOW | tests/unit/test_content_ids.py | 8 | CODE | |
| LOW | tests/unit/test_ops_health.py | 10 | CODE | |
| LOW | tests/unit/test_ops_retention.py | 8 | CODE | |
| LOW | tests/unit/test_paging.py | 10 | CODE | |
| LOW | tests/unit/test_api_middleware.py | 10 | CODE | |
| LOW | tests/unit/test_webhooks.py | 9 | CODE | |
| LOW | tests/unit/test_i18n.py | 8 | CODE | |
| LOW | tests/unit/test_transport.py | 9 | CODE | |
| LOW | tests/unit/test_openapi_contract.py | 12 | CODE | |
| LOW | tests/unit/test_worker.py | 8 | CODE | |
| LOW | tests/unit/test_console_shell.py | 15 | CODE | |
| LOW | tests/unit/test_identity_importing.py | 7 | CODE | |
| LOW | tests/unit/test_archive.py | 9 | CODE | |
| LOW | tests/unit/test_fetch_classification.py | 20 | CODE | |
| 517 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker/browser_rpc/geo.py | 28 | logger = logging.getLogger(__name__) | CODE |
| LOW | docker/browser_rpc/geo.py | 188 | __all__ = [ | CODE |
| LOW | docker/browser_rpc/service.py | 55 | logger = logging.getLogger(__name__) | CODE |
| LOW | docker/browser_rpc/service.py | 537 | __all__ = ["ANONYMOUS", "BrowserRpcService", "MintOutcome", "WarmSlot", "binding_key"] | CODE |
| LOW | docker/browser_rpc/models.py | 132 | __all__ = ["HealthResponse", "MintRequest", "MintResponse", "SignRequest", "SignResponse"] | CODE |
| LOW | docker/browser_rpc/__init__.py | 23 | __all__ = ["__version__"] | CODE |
| LOW | docker/browser_rpc/settings.py | 183 | __all__ = ["DEFAULT_GEO_PROBE_URL", "ENV_PREFIX", "Settings"] | CODE |
| LOW | docker/browser_rpc/errors.py | 70 | __all__ = [ | CODE |
| LOW | docker/browser_rpc/main.py | 39 | logger = logging.getLogger(__name__) | CODE |
| LOW | docker/browser_rpc/main.py | 164 | __all__ = ["configure_logging", "create_app"] | CODE |
| LOW | docker/browser_rpc/validation.py | 199 | __all__ = [ | CODE |
| LOW | docker/browser_rpc/backends/fake.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW | docker/browser_rpc/backends/fake.py | 191 | __all__ = ["BACKEND_NAME", "FAKE_CHROMIUM_MAJOR", "FakeBackend", "FakeSigningContext", "build"] | CODE |
| LOW | docker/browser_rpc/backends/cloak.py | 67 | logger = logging.getLogger(__name__) | CODE |
| LOW | docker/browser_rpc/backends/cloak.py | 755 | __all__ = [ | CODE |
| LOW | docker/browser_rpc/backends/__init__.py | 43 | __all__ = [ | CODE |
| LOW | docker/browser_rpc/backends/base.py | 157 | __all__ = [ | CODE |
| LOW | tests/integration/test_api_demo.py | 54 | def _set_demo(app: Any, enabled: bool) -> None: | CODE |
| LOW | tests/integration/test_api_support.py | 216 | __all__ = [ | CODE |
| LOW | tests/support/marks.py | 55 | __all__ = ["MARK_DRAWING", "MARK_GLYPHS", "MARK_SYNTAX", "is_project_mark"] | CODE |
| LOW | tests/replay/support.py | 130 | __all__ = [ | CODE |
| LOW | src/dtk/platforms/registry.py | 71 | __all__ = ["available_platforms", "get_adapter"] | CODE |
| LOW | src/dtk/platforms/__init__.py | 17 | __all__ = [ | CODE |
| LOW | src/dtk/platforms/common.py | 308 | __all__ = [ | CODE |
| LOW | src/dtk/platforms/base.py | 457 | __all__ = [ | CODE |
| LOW | src/dtk/platforms/paging.py | 56 | __all__ = ["MAX_PAGE_SIZE", "max_page_size"] | CODE |
| LOW | src/dtk/platforms/douyin/params.py | 359 | __all__ = [ | CODE |
| LOW | src/dtk/platforms/douyin/adapter.py | 124 | __all__ = ["ADAPTER", "DouyinAdapter"] | CODE |
| LOW | src/dtk/platforms/douyin/__init__.py | 5 | __all__ = ["ADAPTER", "DouyinAdapter"] | CODE |
| LOW | src/dtk/platforms/douyin/parser.py | 579 | __all__ = [ | CODE |
| LOW | src/dtk/platforms/douyin/endpoints.py | 315 | __all__ = [ | CODE |
| LOW | src/dtk/platforms/tiktok/params.py | 580 | __all__ = [ | CODE |
| LOW | src/dtk/platforms/tiktok/adapter.py | 94 | __all__ = ["ADAPTER", "TikTokAdapter"] | CODE |
| LOW | src/dtk/platforms/tiktok/__init__.py | 5 | __all__ = ["ADAPTER", "TikTokAdapter"] | CODE |
| LOW | src/dtk/platforms/tiktok/parser.py | 628 | __all__ = [ | CODE |
| LOW | src/dtk/platforms/tiktok/endpoints.py | 317 | __all__ = [ | CODE |
| LOW | src/dtk/signing/registry.py | 856 | __all__ = [ | CODE |
| LOW | src/dtk/signing/__init__.py | 38 | __all__ = [ | CODE |
| LOW | src/dtk/signing/rpc.py | 317 | __all__ = ["HEALTH_PATH", "SIGN_PATH", "RpcSigner"] | CODE |
| LOW | src/dtk/signing/base.py | 325 | __all__ = [ | CODE |
| LOW | src/dtk/signing/protection.py | 107 | __all__ = ["DOUYIN_SIGNED_PATHS", "requires_browser_signature"] | CODE |
| LOW | src/dtk/signing/native/xbogus.py | 263 | __all__ = [ | CODE |
| LOW | src/dtk/signing/native/tiktok_sign.py | 726 | __all__ = [ | CODE |
| LOW | src/dtk/signing/native/__init__.py | 22 | __all__ = [ | CODE |
| LOW | src/dtk/signing/native/tokens.py | 299 | __all__ = [ | CODE |
| LOW | src/dtk/signing/native/decoding.py | 1015 | __all__ = [ | CODE |
| LOW | src/dtk/signing/native/websign.py | 135 | __all__ = [ | CODE |
| LOW | src/dtk/signing/native/sm3.py | 119 | __all__ = ["IV", "sm3_hash", "sm3_hexdigest", "sm3_to_array"] | CODE |
| LOW | src/dtk/signing/native/signer.py | 375 | __all__ = [ | CODE |
| LOW | src/dtk/signing/native/abogus.py | 823 | __all__ = [ | CODE |
| LOW | src/dtk/transport/classify.py | 742 | __all__ = [ | CODE |
| LOW | src/dtk/transport/wreq_transport.py | 558 | __all__ = [ | CODE |
| LOW | src/dtk/transport/emulation.py | 271 | __all__ = [ | CODE |
| LOW | src/dtk/transport/__init__.py | 49 | __all__ = [ | CODE |
| LOW | src/dtk/transport/headers.py | 142 | __all__ = [ | CODE |
| LOW | src/dtk/transport/base.py | 336 | __all__ = [ | CODE |
| LOW | src/dtk/core/logging.py | 105 | __all__ = ["QUIET_LOGGERS", "SENSITIVE_KEYS", "configure", "get_logger", "redact"] | CODE |
| LOW | src/dtk/core/db.py | 67 | __all__ = ["Base", "dispose_engine", "get_engine", "init_engine", "session_scope"] | CODE |
| LOW | src/dtk/core/config.py | 733 | __all__ = [ | CODE |
| LOW | src/dtk/core/crypto.py | 86 | __all__ = [ | CODE |
| 138 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker/browser_rpc/geo.py | 166 | except Exception as exc: | CODE |
| LOW | docker/browser_rpc/service.py | 166 | except Exception as exc: | CODE |
| LOW | docker/browser_rpc/service.py | 214 | except Exception: | CODE |
| LOW | docker/browser_rpc/service.py | 401 | except Exception as exc: | CODE |
| LOW | docker/browser_rpc/service.py | 519 | except Exception: | CODE |
| LOW | docker/browser_rpc/main.py | 152 | except Exception as exc: | CODE |
| LOW | docker/browser_rpc/backends/cloak.py | 326 | except Exception as exc: | CODE |
| LOW | docker/browser_rpc/backends/cloak.py | 368 | except Exception as exc: | CODE |
| LOW | docker/browser_rpc/backends/cloak.py | 474 | except Exception as exc: | CODE |
| LOW | docker/browser_rpc/backends/cloak.py | 494 | except Exception as exc: | CODE |
| LOW | docker/browser_rpc/backends/cloak.py | 549 | except Exception as exc: | CODE |
| LOW | docker/browser_rpc/backends/cloak.py | 580 | except Exception as exc: | CODE |
| LOW | docker/browser_rpc/backends/cloak.py | 620 | except Exception as exc: | CODE |
| LOW | docker/browser_rpc/backends/cloak.py | 623 | except Exception: | CODE |
| LOW | docker/browser_rpc/backends/cloak.py | 667 | except Exception as exc: # a navigation mid-poll, or a crashed target | CODE |
| LOW | docker/browser_rpc/backends/cloak.py | 716 | except Exception as exc: | CODE |
| LOW | install/install.sh | 918 | except Exception: | CODE |
| LOW | install/install.sh | 944 | except Exception: | CODE |
| LOW | install/install.zh.sh | 894 | except Exception: | CODE |
| LOW | install/install.zh.sh | 920 | except Exception: | CODE |
| LOW | tests/integration/conftest.py | 48 | except Exception as exc: | CODE |
| LOW | tests/integration/conftest.py | 67 | except Exception as exc: | CODE |
| LOW | tests/integration/test_end_to_end.py | 53 | except Exception as exc: | CODE |
| LOW | src/dtk/signing/registry.py | 850 | except Exception as exc: | CODE |
| LOW | src/dtk/transport/wreq_transport.py | 295 | except Exception as exc: | CODE |
| LOW | src/dtk/transport/wreq_transport.py | 396 | except Exception as exc: | CODE |
| LOW | src/dtk/transport/wreq_transport.py | 455 | except Exception as exc: | CODE |
| LOW | src/dtk/transport/wreq_transport.py | 478 | except Exception as exc: | CODE |
| LOW | src/dtk/core/db.py | 54 | except Exception: | CODE |
| LOW | src/dtk/identity/mint_log.py | 67 | except Exception as exc: # pragma: no cover - a breadcrumb, never a failure | CODE |
| LOW | src/dtk/identity/mint_log.py | 102 | except Exception as exc: # pragma: no cover - a breadcrumb, never a failure | CODE |
| LOW | src/dtk/identity/mint_log.py | 126 | except Exception as exc: # pragma: no cover - a breadcrumb, never a failure | CODE |
| LOW | src/dtk/identity/mint_log.py | 134 | except Exception as exc: # pragma: no cover - a breadcrumb, never a failure | CODE |
| LOW | src/dtk/identity/mint_log.py | 153 | except Exception as exc: | CODE |
| LOW | src/dtk/identity/pool.py | 114 | except Exception as exc: | CODE |
| LOW | src/dtk/identity/pool.py | 411 | except Exception as exc: | CODE |
| LOW | src/dtk/mcp/tools.py | 114 | except Exception as exc: # reporting must never mask the failure it explains | CODE |
| LOW | src/dtk/mcp/tools.py | 121 | except Exception as exc: # reporting must never mask the failure it explains | CODE |
| LOW | src/dtk/mcp/tools.py | 144 | except Exception as exc: | CODE |
| MEDIUM | src/dtk/mcp/tools.py | 118 | def _snapshot(self) -> PoolSnapshot | None: | CODE |
| LOW | src/dtk/cli/fetch_cmd.py | 163 | except Exception as exc: | CODE |
| LOW | src/dtk/api/deps.py | 203 | except Exception: | CODE |
| LOW | src/dtk/api/deps.py | 268 | except Exception: | CODE |
| LOW | src/dtk/api/middleware.py | 254 | except Exception: | CODE |
| LOW | src/dtk/api/routes/auth.py | 164 | except Exception as exc: # Redis is down; a login must still be possible. | CODE |
| LOW | src/dtk/api/routes/auth.py | 181 | except Exception as exc: | CODE |
| LOW | src/dtk/api/routes/system.py | 78 | except Exception as exc: | CODE |
| LOW | src/dtk/api/routes/system.py | 248 | except Exception as exc: | CODE |
| LOW | src/dtk/api/routes/system.py | 283 | except Exception: | CODE |
| LOW | src/dtk/api/routes/system.py | 323 | except Exception as exc: | CODE |
| LOW | src/dtk/api/routes/operations.py | 204 | except Exception: | CODE |
| LOW | src/dtk/api/routes/operations.py | 259 | except Exception as exc: | CODE |
| LOW | src/dtk/api/routes/setup.py | 137 | except Exception as exc: # startup must not fail over an advisory | CODE |
| LOW | src/dtk/api/routes/setup.py | 248 | except Exception as exc: | CODE |
| LOW | src/dtk/api/routes/admin/identities.py | 160 | except Exception: | CODE |
| LOW | src/dtk/api/routes/admin/identities.py | 307 | except Exception: | CODE |
| LOW | src/dtk/api/routes/admin/proxies.py | 59 | except Exception: | CODE |
| LOW | src/dtk/api/routes/admin/settings.py | 276 | except Exception as exc: | CODE |
| LOW | src/dtk/ops/_sql.py | 48 | except Exception as exc: | CODE |
| LOW | src/dtk/ops/health.py | 125 | except Exception as exc: # pragma: no cover - depends on the wreq build | CODE |
| 36 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker/entrypoint.sh | 1 | #!/bin/sh | COMMENT |
| LOW | docker/compose.yml | 1 | # Production orchestration for a single host. | COMMENT |
| LOW | docker/compose.yml | 41 | #: Resource ceilings for the two Python app services. | COMMENT |
| LOW | docker/compose.yml | 141 | # here, and Redis dies rather than swaps when it hits a ceiling, so the | COMMENT |
| LOW | docker/compose.yml | 161 | # cache writes one entry per distinct request and keeps it for the TTL in | COMMENT |
| LOW | docker/compose.yml | 241 | volumes: | COMMENT |
| LOW | docker/compose.yml | 321 | # Throughput is bounded by the identity pool, not by this number. | COMMENT |
| LOW | docker/compose.yml | 381 | # | COMMENT |
| LOW | docker/compose.yml | 401 | # rather than a guess. The driver passes --disable-dev-shm-usage itself | COMMENT |
| LOW | docker/compose.yml | 461 | # only wants metadata never needs to store a byte of video. | COMMENT |
| LOW | docker/downloader/store.go | 1 | package main | COMMENT |
| LOW | docker/downloader/queue.go | 1 | package main | COMMENT |
| LOW | docker/downloader/download.go | 1 | package main | COMMENT |
| LOW | docker/downloader/api.go | 1 | package main | COMMENT |
| LOW | docker/downloader/main.go | 1 | // Command downloader stores media this instance has already parsed onto the | COMMENT |
| LOW | docker/downloader/safety.go | 1 | package main | COMMENT |
| LOW | docker/browser_rpc/requirements.txt | 1 | # Runtime dependencies of the browser-rpc image. | COMMENT |
| LOW | docker/browser_rpc/settings.py | 61 | #: navigable well before its security bundle has loaded, and signing in that | COMMENT |
| LOW | docker/browser_rpc/backends/cloak.py | 81 | LAUNCH_ENTRY_POINT: str = "launch_persistent_context_async" | COMMENT |
| LOW | docker/browser_rpc/backends/cloak.py | 121 | #: Both platforms sign by patching ``window.fetch`` and ``XMLHttpRequest`` | COMMENT |
| LOW | docker/browser_rpc/backends/cloak.py | 181 | #: after its context opened and produced nothing, twice, and then returned a | COMMENT |
| LOW | docker/browser_rpc/backends/cloak.py | 201 | COMMENT | |
| LOW | docker/browser_rpc/backends/cloak.py | 341 | COMMENT | |
| LOW | install/install.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | install/install.zh.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | web/eslint.config.js | 1 | import js from '@eslint/js' | COMMENT |
| LOW | web/src/pages/Identities.tsx | 1081 | // cell is where that id gets copied from; a column preference persisted | COMMENT |
| LOW | web/src/pages/Logs.tsx | 221 | id: 'identity', | COMMENT |
| LOW | web/src/pages/Downloads.tsx | 321 | //: asking which one you have is asking you to classify your own clipboard. | COMMENT |
| LOW | tests/unit/test_signature_decoding.py | 41 | #: recovered from the bundle, where `b` is a byte array and `if (b[i+1])` is | COMMENT |
| LOW | tests/unit/test_signing.py | 281 | # -------------------------------------------------------------------------- | COMMENT |
| LOW | tests/unit/test_signing.py | 2721 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " | COMMENT |
| LOW | tests/unit/test_tools_decode_route.py | 61 | COMMENT | |
| LOW | tests/unit/test_i18n.py | 701 | COMMENT | |
| LOW | tests/unit/test_repo_hygiene.py | 501 | assert '"negotiated"' in console_py | COMMENT |
| LOW | tests/integration/conftest.py | 21 | "postgresql+asyncpg://dtk:dtk_test_password@127.0.0.1:55432/dtk_test", | COMMENT |
| LOW | tests/integration/test_worker.py | 821 | "maintenance", | COMMENT |
| LOW | tests/support/marks.py | 21 | from __future__ import annotations | COMMENT |
| LOW | .github/FUNDING.yml | 1 | # Only GitHub Sponsors. The other channels this project once listed were removed | COMMENT |
| LOW | .github/dependabot.yml | 1 | # Dependency updates. | COMMENT |
| LOW | .github/workflows/docker-publish.yml | 1 | # Build the images and push them to Docker Hub. | COMMENT |
| LOW | .github/workflows/docker-publish.yml | 21 | # (see the two Dockerfiles). | COMMENT |
| LOW | .github/workflows/docker-publish.yml | 221 | # | COMMENT |
| LOW | .github/workflows/codeql.yml | 1 | # Static analysis for the three languages this repository actually ships. | COMMENT |
| LOW | src/dtk/__init__.py | 1 | """dtk - self-hosted Douyin / TikTok data API.""" | COMMENT |
| LOW | src/dtk/platforms/base.py | 281 | name: str | COMMENT |
| LOW | src/dtk/platforms/douyin/parser.py | 401 | #: The ``status`` on a ``collects_list`` entry that means "anyone can open it". | COMMENT |
| LOW | src/dtk/platforms/tiktok/params.py | 101 | APP_NAME: Final = "tiktok_web" | COMMENT |
| LOW | src/dtk/platforms/tiktok/params.py | 121 | #: request took /api/item/detail/ from 0 bytes to a full itemStruct, while | COMMENT |
| LOW | src/dtk/platforms/tiktok/endpoints.py | 221 | # No empty_body_is_normal: TikTok answers a hidden list with a real | COMMENT |
| LOW | src/dtk/platforms/tiktok/endpoints.py | 261 | # The third and last of the Saved tab's endpoints, and the one that | COMMENT |
| LOW | src/dtk/signing/registry.py | 261 | COMMENT | |
| LOW | src/dtk/signing/registry.py | 301 | #: ``msToken`` and URL, and ``msToken`` is a session token minted per identity; | COMMENT |
| LOW | src/dtk/signing/native/xbogus.py | 21 | """ | COMMENT |
| LOW | src/dtk/signing/native/tiktok_sign.py | 141 | #: Environment fingerprint the payload reports, taken from a real browser. | COMMENT |
| LOW | src/dtk/signing/native/tiktok_sign.py | 161 | #: present/absent), so it is a property of the SDK build rather than of the | COMMENT |
| LOW | src/dtk/signing/native/tiktok_sign.py | 181 | DEVICE_HASH: Final = "0" | COMMENT |
| LOW | src/dtk/signing/native/tokens.py | 41 | COMMENT | |
| LOW | src/dtk/signing/native/abogus.py | 61 | # __ | COMMENT |
| LOW | src/dtk/signing/native/abogus.py | 101 | #: ``"1.0.1.19-fix.01"`` as the SDK parses it: ``split(".")`` then a JS ``~~``, | COMMENT |
| 36 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docker/browser_rpc/backends/cloak.py | 152 | const state = { capture: false, url: null }; | CODE |
| HIGH | docker/browser_rpc/backends/cloak.py | 156 | const url = typeof input === 'string' ? input : (input && input.url); | CODE |
| HIGH | docker/browser_rpc/backends/cloak.py | 232 | state.url = null; | CODE |
| HIGH⚡ | tests/unit/test_fetch_classification.py | 707 | b'{"status_code":0,"aweme_detail":null,' | CODE |
| HIGH | tests/unit/test_repo_hygiene.py | 323 | assert "open={pending !== null}" in source | CODE |
| HIGH | tests/integration/test_api_downloads.py | 761 | """null, not missing: a card that has to branch on undefined reads the same | STRING |
| HIGH | src/dtk/signing/protection.py | 9 | if ("webSign" === f.strategyKey && b === a.REWRITE) { | STRING |
| HIGH | src/dtk/signing/native/websign.py | 94 | """Serialize like the JavaScript ``URLSearchParams.toString()`` the SDK uses. | STRING |
| HIGH | src/dtk/transport/classify.py | 183 | #: "aweme_detail": null, | COMMENT |
| HIGH | src/dtk/transport/classify.py | 202 | #: 200, 211 bytes, {"status_code": 0, "aweme_detail": null, | COMMENT |
| HIGH | src/dtk/mcp/tools.py | 425 | platform did not report are null, never zero - a null is missing data, | STRING |
| HIGH | src/dtk/worker/ops/identity_mint.py | 9 | "proxy_id": "..." | null} | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/unit/test_signing.py | 2737 | #: What the Node harness reported for the two codes the payload carries, which is | COMMENT |
| MEDIUM | tests/unit/test_signing.py | 2739 | #: below was generated by that harness, so reproducing them byte for byte requires | COMMENT |
| MEDIUM | tests/integration/test_api_logs.py | 364 | # pool and a transport to assert one column would test the harness | COMMENT |
| MEDIUM⚡ | tests/integration/test_api_auth.py | 48 | # Plain HTTP in the test harness, so Secure is dropped rather than making | COMMENT |
| MEDIUM | src/dtk/signing/native/tiktok_sign.py | 150 | #: The earlier values (129 and 14) came from a Node harness driving the genuine | COMMENT |
| MEDIUM | src/dtk/signing/native/tiktok_sign.py | 154 | #: left as they were. The harness, not the port, was what disagreed with the | COMMENT |
| MEDIUM⚡ | src/dtk/signing/native/tiktok_sign.py | 170 | #: 2d context reports. Giving the harness a working ``getContext('2d')`` made the | COMMENT |
| MEDIUM⚡ | src/dtk/signing/native/tiktok_sign.py | 176 | #: Three more environment fields the Node harness could not produce, so the port | COMMENT |
| MEDIUM⚡ | src/dtk/signing/native/tiktok_sign.py | 184 | #: running in. Confirmed by pointing the harness at a video URL, which made this | COMMENT |
| MEDIUM⚡ | src/dtk/ops/notify.py | 584 | """The one method a caller needs in order to raise an alert. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit/test_transport.py | 123 | CODE | |
| LOW | src/dtk/signing/native/tiktok_sign.py | 649 | CODE | |
| LOW | src/dtk/db/timeseries.py | 32 | CODE | |
| LOW | src/dtk/db/timeseries.py | 180 | CODE | |
| LOW | src/dtk/api/routes/content.py | 424 | CODE | |
| LOW | src/dtk/api/routes/content.py | 485 | CODE | |
| LOW | src/dtk/api/routes/content.py | 557 | CODE | |
| LOW | src/dtk/api/routes/content.py | 633 | CODE | |
| LOW | src/dtk/api/routes/content.py | 693 | CODE | |
| LOW | src/dtk/api/routes/content.py | 766 | CODE | |
| LOW | src/dtk/api/routes/content.py | 843 | CODE | |
| LOW | src/dtk/api/routes/content.py | 918 | CODE | |
| LOW | src/dtk/api/routes/content.py | 1002 | CODE | |
| LOW | src/dtk/api/routes/content.py | 1077 | CODE | |
| LOW | src/dtk/api/routes/content.py | 1139 | CODE | |
| LOW | src/dtk/api/routes/content.py | 1212 | CODE | |
| LOW | src/dtk/api/routes/content.py | 1279 | CODE | |
| LOW | src/dtk/api/routes/content.py | 1353 | CODE | |
| LOW | src/dtk/api/routes/archive.py | 174 | CODE | |
| LOW | src/dtk/api/routes/archive.py | 292 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | web/eslint.config.js | 80 | 'placeholder', | CODE |
| LOW | web/src/locales/zh/setup.json | 39 | "placeholder": "每行一个代理", | CODE |
| LOW⚡ | web/src/locales/zh/console.json | 1734 | "placeholder": "https://www.douyin.com/video/7408915107113127220", | CODE |
| LOW⚡ | web/src/locales/zh/console.json | 1742 | "placeholder": "", | CODE |
| LOW⚡ | web/src/locales/zh/console.json | 1750 | "placeholder": "https://www.douyin.com/video/7408915107113127220", | CODE |
| LOW⚡ | web/src/locales/zh/console.json | 1758 | "placeholder": "https://www.douyin.com/user/MS4wLjABAAAA… 或 MS4wLjABAAAA…", | CODE |
| LOW | web/src/locales/en/setup.json | 39 | "placeholder": "One proxy per line", | CODE |
| LOW⚡ | web/src/locales/en/console.json | 1734 | "placeholder": "https://www.douyin.com/video/7408915107113127220", | CODE |
| LOW⚡ | web/src/locales/en/console.json | 1742 | "placeholder": "", | CODE |
| LOW⚡ | web/src/locales/en/console.json | 1750 | "placeholder": "https://www.douyin.com/video/7408915107113127220", | CODE |
| LOW⚡ | web/src/locales/en/console.json | 1758 | "placeholder": "https://www.douyin.com/user/MS4wLjABAAAA…", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL⚡ | tests/unit/test_db_models.py | 233 | assert model.__table__.c.id.type.compile(PG) == "UUID" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/dtk/transport/base.py | 193 | except (ValueError, UnicodeDecodeError): | CODE |
| HIGH | src/dtk/api/request_proxy.py | 233 | except ValueError: | CODE |
| HIGH | src/dtk/services/settings_store.py | 167 | except TimeoutError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker/browser_rpc/service.py | 419 | CODE | |
| LOW | tests/unit/test_identity_importing.py | 253 | CODE | |
| LOW | tests/unit/test_identity_importing.py | 279 | CODE | |
| LOW | tests/unit/test_repo_hygiene.py | 106 | CODE | |
| LOW | tests/unit/test_repo_hygiene.py | 109 | CODE | |
| LOW | src/dtk/identity/pool.py | 422 | CODE | |
| LOW | src/dtk/cli/identities.py | 105 | CODE | |
| LOW | src/dtk/cli/identities.py | 119 | CODE | |
| LOW | src/dtk/api/routes/openapi.py | 369 | CODE | |
| LOW | src/dtk/api/routes/tools.py | 760 | CODE | |
| LOW | src/dtk/ops/webhooks.py | 172 | CODE | |
| LOW | src/dtk/worker/registry.py | 383 | CODE | |
| LOW | src/dtk/worker/main.py | 763 | CODE | |
| LOW | src/dtk/services/archive.py | 111 | CODE | |
| LOW | src/dtk/services/archive.py | 261 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docker/README.md | 1 | # Container images and orchestration | COMMENT |
| MEDIUM | docker/compose.test.yml | 1 | # Test-only orchestration. Always run through: | COMMENT |
| MEDIUM | docker/compose.yml | 1 | # Production orchestration for a single host. | COMMENT |
| MEDIUM | tests/integration/test_scheduler_fairness.py | 85 | # The wait budget is scaffolding, not the thing under test: what is | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/dtk/urls/expand.py | 59 | Follow ``url`` to its final destination and return the canonical form. Every hop is re-validated against the host a | STRING |