Give your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
190 matches across 9 categories. Click a row to expand file-level details.
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | tests/test_xiaoyuzhou_install.py | 13 | def test_install_xiaoyuzhou_deps_does_not_raise_when_no_groq_key(capsys): |
| LOW | tests/test_xhs_format.py | 58 | def test_single_note_keeps_useful_fields(self): |
| LOW | tests/test_xhs_format.py | 73 | def test_single_note_drops_useless_fields(self): |
| LOW | tests/test_xhs_format.py | 84 | def test_search_results_wrapper(self): |
| LOW | tests/test_xhs_format.py | 127 | def test_non_dict_passthrough(self): |
| LOW | tests/test_skill_command.py | 16 | def test_skill_resources_include_both_locales(self): |
| LOW | tests/test_skill_command.py | 26 | def test_install_skill_creates_skill_md(self): |
| LOW | tests/test_skill_command.py | 55 | def test_uninstall_skill_removes_dir(self): |
| LOW | tests/test_skill_command.py | 77 | def test_install_creates_dir_if_parent_exists(self): |
| LOW | tests/test_skill_command.py | 99 | def test_install_uses_english_skill_for_english_locale(self): |
| LOW | tests/test_doctor.py | 29 | def test_check_all_collects_channel_results(self, tmp_config, monkeypatch): |
| LOW | tests/test_channels.py | 322 | def test_search_returns_unavailable_notice(self): |
| LOW | tests/test_channels.py | 330 | def test_can_handle_xueqiu_urls(self): |
| LOW | tests/test_channels.py | 338 | def test_check_ok_when_api_reachable(self, monkeypatch): |
| LOW | tests/test_channels.py | 21 | def test_get_unknown_channel_returns_none(self): |
| LOW | tests/test_channels.py | 24 | def test_all_channels_registered(self): |
| LOW | tests/test_channels.py | 41 | def test_check_ok_when_api_reachable(self, monkeypatch): |
| LOW | tests/test_channels.py | 65 | def test_check_warn_when_api_unreachable(self, monkeypatch): |
| LOW | tests/test_channels.py | 80 | def test_get_hot_topics_returns_list(self, monkeypatch): |
| LOW | tests/test_channels.py | 126 | def test_get_hot_topics_respects_limit(self, monkeypatch): |
| LOW | tests/test_channels.py | 144 | def test_get_hot_topics_truncates_content(self, monkeypatch): |
| LOW | tests/test_channels.py | 198 | def test_get_topic_returns_detail_and_replies(self, monkeypatch): |
| LOW | tests/test_channels.py | 251 | def test_get_topic_handles_empty_replies(self, monkeypatch): |
| LOW | tests/test_channels.py | 286 | def test_get_user_returns_profile(self, monkeypatch): |
| LOW | tests/test_channels.py | 366 | def test_check_warn_when_api_unreachable(self, monkeypatch): |
| LOW | tests/test_channels.py | 469 | def test_get_hot_posts_returns_list(self, monkeypatch): |
| LOW | tests/test_channels.py | 513 | def test_get_hot_posts_respects_limit(self, monkeypatch): |
| LOW | tests/test_channels.py | 590 | def test_ensure_cookies_loads_from_config(self, monkeypatch, tmp_path): |
| LOW | tests/test_channels.py | 624 | def test_get_json_sends_referer_and_browser_ua(self, monkeypatch): |
| LOW | tests/test_channels.py | 650 | def test_reports_off_when_not_installed(self, monkeypatch): |
| LOW | tests/test_channels.py | 658 | def test_reports_ok_when_authenticated(self, monkeypatch): |
| LOW | tests/test_channels.py | 675 | def test_reports_warn_when_not_authenticated(self, monkeypatch): |
| LOW | tests/test_channels.py | 695 | def test_reports_warn_when_status_check_fails(self, monkeypatch): |
| LOW | tests/test_channels.py | 706 | def test_can_handle_reddit_urls(self): |
| LOW | tests/test_channels.py | 716 | def test_reports_ok_when_cli_authenticated(self, monkeypatch): |
| LOW | tests/test_channels.py | 728 | def test_reports_warn_when_not_authenticated(self, monkeypatch): |
| LOW | tests/test_channels.py | 740 | def test_reports_off_when_not_installed(self, monkeypatch): |
| LOW | tests/test_twitter_channel.py | 18 | def test_check_twitter_cli_found_and_auth_ok(): |
| LOW | tests/test_twitter_channel.py | 31 | def test_check_twitter_cli_found_auth_missing(): |
| LOW | tests/test_twitter_channel.py | 48 | def test_check_bird_fallback_auth_ok(): |
| LOW | tests/test_twitter_channel.py | 64 | def test_check_bird_fallback_auth_missing(): |
| LOW | tests/test_twitter_channel.py | 82 | def test_check_nothing_installed(): |
| LOW | tests/test_twitter_channel.py | 93 | def test_twitter_cli_preferred_over_bird(): |
| LOW | tests/test_config.py | 39 | def test_config_file_priority_over_env(self, tmp_config, monkeypatch): |
| LOW | tests/test_config.py | 64 | def test_get_configured_features(self, tmp_config): |
| LOW | tests/test_config.py | 70 | def test_to_dict_masks_sensitive(self, tmp_config): |
| LOW | tests/test_config.py | 77 | def test_save_creates_file_with_restricted_permissions(self, tmp_path): |
| LOW | tests/test_cli.py | 20 | def test_no_command_shows_help(self, capsys): |
| LOW | tests/test_cli.py | 33 | def test_parse_twitter_cookie_input_separate_values(self): |
| LOW | tests/test_cli.py | 38 | def test_parse_twitter_cookie_input_cookie_header(self): |
| LOW | tests/test_cli.py | 47 | def test_retry_timeout_classification(self): |
| LOW | tests/test_cli.py | 66 | def test_retry_dns_classification(self): |
| LOW | tests/test_cli.py | 78 | def test_retry_rate_limit_then_success(self): |
| LOW | tests/test_cli.py | 119 | def test_check_update_reports_classified_error(self, capsys): |
| LOW | tests/test_channel_contracts.py | 8 | def test_channel_registry_contract(): |
| LOW | tests/test_channel_contracts.py | 21 | def test_channel_check_contract_with_minimal_runtime(monkeypatch, tmp_path): |
| LOW | tests/test_channel_contracts.py | 32 | def test_youtube_warns_when_node_only_and_no_config(monkeypatch, tmp_path): |
| LOW | tests/test_channel_contracts.py | 53 | def test_youtube_warns_with_windows_specific_fix_command(monkeypatch, tmp_path): |
| LOW | tests/test_channel_contracts.py | 75 | def test_youtube_ok_when_deno_installed(monkeypatch): |
| LOW | tests/test_channel_contracts.py | 93 | def test_douyin_check_does_not_call_with_invalid_url(monkeypatch, tmp_path): |
| 7 more matches not shown… | |||
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | docs/update.md | 100 | except Exception: |
| MEDIUM | agent_reach/cli.py | 472 | print("Error: no input on stdin", file=sys.stderr) |
| MEDIUM | agent_reach/cli.py | 477 | print(f"Error: invalid JSON: {e}", file=sys.stderr) |
| LOW | agent_reach/cli.py | 34 | except Exception: |
| LOW | agent_reach/cli.py | 274 | except Exception: |
| LOW | agent_reach/cli.py | 363 | except Exception: |
| LOW | agent_reach/cli.py | 385 | except Exception as e: |
| LOW | agent_reach/cli.py | 447 | except Exception as e: |
| LOW | agent_reach/cli.py | 524 | except Exception: |
| LOW | agent_reach/cli.py | 534 | except Exception: |
| LOW | agent_reach/cli.py | 560 | except Exception: |
| LOW | agent_reach/cli.py | 570 | except Exception: |
| LOW | agent_reach/cli.py | 584 | except Exception: |
| LOW | agent_reach/cli.py | 603 | except Exception: |
| LOW | agent_reach/cli.py | 634 | except Exception as e: |
| LOW | agent_reach/cli.py | 672 | except Exception: |
| LOW | agent_reach/cli.py | 695 | except Exception: |
| LOW | agent_reach/cli.py | 718 | except Exception: |
| LOW | agent_reach/cli.py | 741 | except Exception: |
| LOW | agent_reach/cli.py | 764 | except Exception: |
| LOW | agent_reach/cli.py | 775 | except Exception as e: |
| LOW | agent_reach/cli.py | 787 | except Exception: |
| LOW | agent_reach/cli.py | 839 | except Exception: |
| LOW | agent_reach/cli.py | 859 | except Exception: |
| LOW | agent_reach/cli.py | 937 | except Exception as e: |
| LOW | agent_reach/cli.py | 954 | except Exception: |
| LOW | agent_reach/cli.py | 1002 | except Exception: |
| LOW | agent_reach/cli.py | 1011 | except Exception: |
| LOW | agent_reach/cli.py | 1099 | except Exception as e: |
| LOW | agent_reach/cli.py | 1250 | except Exception as e: |
| LOW | agent_reach/cli.py | 1263 | except Exception: |
| LOW | agent_reach/cli.py | 1293 | except Exception as e: |
| LOW | agent_reach/cli.py | 1296 | except Exception as e: |
| LOW | agent_reach/cli.py | 1315 | except Exception as e: |
| LOW | agent_reach/cli.py | 1351 | except Exception as e: |
| LOW | agent_reach/cli.py | 1375 | except Exception as e: |
| LOW | agent_reach/cli.py | 1395 | except Exception: |
| LOW | agent_reach/cli.py | 1475 | except Exception: |
| LOW | agent_reach/cli.py | 1575 | except Exception: |
| LOW | agent_reach/cli.py | 1604 | except Exception: |
| LOW | agent_reach/cookie_extract.py | 95 | except Exception as e: |
| LOW | agent_reach/cookie_extract.py | 110 | except Exception as e: |
| LOW | agent_reach/cookie_extract.py | 172 | except Exception: |
| LOW | agent_reach/cookie_extract.py | 193 | except Exception: |
| LOW | agent_reach/cookie_extract.py | 212 | except Exception as e: |
| LOW | agent_reach/integrations/mcp_server.py | 54 | except Exception as e: |
| LOW | agent_reach/channels/xiaoyuzhou.py | 45 | except Exception: |
| LOW | agent_reach/channels/douyin.py | 43 | except Exception: |
| LOW | agent_reach/channels/douyin.py | 55 | except Exception: |
| LOW | agent_reach/channels/exa_search.py | 37 | except Exception: |
| LOW | agent_reach/channels/wechat.py | 23 | except Exception: |
| LOW | agent_reach/channels/weibo.py | 41 | except Exception: |
| LOW | agent_reach/channels/weibo.py | 51 | except Exception: |
| LOW | agent_reach/channels/xueqiu.py | 70 | except Exception: |
| LOW | agent_reach/channels/xueqiu.py | 98 | except Exception: |
| LOW | agent_reach/channels/xueqiu.py | 173 | except Exception as e: |
| MEDIUM | agent_reach/channels/xueqiu.py | 164 | def check(self, config=None): |
| LOW | agent_reach/channels/twitter.py | 60 | except Exception: |
| LOW | agent_reach/channels/twitter.py | 81 | except Exception: |
| LOW | agent_reach/channels/bilibili.py | 23 | except Exception: |
| 6 more matches not shown… | |||
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | agent_reach/cli.py | 1443 | # Step 1: Exa (via mcporter, no API key required) |
| LOW | agent_reach/cli.py | 1480 | # Step 2: GitHub token |
| LOW | agent_reach/cli.py | 1496 | # Step 3: Reddit — rdt-cli |
| LOW | agent_reach/cli.py | 1501 | # Step 4: Groq (Whisper) |
| LOW | agent_reach/scripts/transcribe_xiaoyuzhou.sh | 35 | # Step 1: 提取音频 URL 和标题 |
| LOW | agent_reach/scripts/transcribe_xiaoyuzhou.sh | 49 | # Step 2: 下载音频 |
| LOW | agent_reach/scripts/transcribe_xiaoyuzhou.sh | 56 | # Step 3: 获取时长 |
| LOW | agent_reach/scripts/transcribe_xiaoyuzhou.sh | 62 | # Step 4: 转为低码率单声道 MP3 |
| LOW | agent_reach/scripts/transcribe_xiaoyuzhou.sh | 68 | # Step 5: 按大小切片 |
| LOW | agent_reach/scripts/transcribe_xiaoyuzhou.sh | 90 | # Step 6: 调用 Groq Whisper API 转录 |
| LOW | agent_reach/scripts/transcribe_xiaoyuzhou.sh | 143 | # Step 7: 合并输出 |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | tests/test_config.py | 4 | |
| LOW | tests/test_config.py | 5 | |
| LOW | tests/test_config.py | 6 | |
| LOW | tests/test_config.py | 9 | |
| LOW | agent_reach/__init__.py | 7 | |
| LOW | agent_reach/cli.py | 803 | |
| LOW | agent_reach/cli.py | 808 | |
| LOW | agent_reach/doctor.py | 91 | |
| LOW | agent_reach/cookie_extract.py | 11 | |
| LOW | agent_reach/cookie_extract.py | 12 | |
| LOW | agent_reach/utils/paths.py | 3 | |
| LOW | agent_reach/utils/text.py | 3 | |
| LOW | agent_reach/channels/rss.py | 18 | |
| LOW | agent_reach/channels/wechat.py | 42 | |
| LOW | agent_reach/channels/bilibili.py | 7 | |
| LOW | agent_reach/channels/base.py | 13 |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | tests/test_skill_command.py | 26 | |
| LOW | agent_reach/cli.py | 47 | |
| LOW | agent_reach/cli.py | 155 | |
| LOW | agent_reach/cli.py | 323 | |
| LOW | agent_reach/cli.py | 484 | |
| LOW | agent_reach/cli.py | 654 | |
| LOW | agent_reach/cli.py | 677 | |
| LOW | agent_reach/cli.py | 700 | |
| LOW | agent_reach/cli.py | 723 | |
| LOW | agent_reach/cli.py | 793 | |
| LOW | agent_reach/cli.py | 975 | |
| LOW | agent_reach/cli.py | 1017 | |
| LOW | agent_reach/cli.py | 1124 | |
| LOW | agent_reach/cli.py | 1145 | |
| LOW | agent_reach/cli.py | 1321 | |
| LOW | agent_reach/cli.py | 1434 | |
| LOW | agent_reach/cli.py | 1582 | |
| LOW | agent_reach/cli.py | 1614 | |
| LOW | agent_reach/cli.py | 351 | |
| LOW | agent_reach/doctor.py | 27 | |
| LOW | agent_reach/cookie_extract.py | 44 | |
| LOW | agent_reach/cookie_extract.py | 151 | |
| LOW | agent_reach/channels/xiaohongshu.py | 31 |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | agent_reach/cli.py | 753 | # Check if already installed and working |
| LOW | agent_reach/cli.py | 799 | # Check if already installed |
| LOW | agent_reach/cli.py | 1238 | # Check if xiaohongshu-mcp container is running |
| LOW | agent_reach/cookie_extract.py | 123 | # Check if cookie belongs to this platform |
| Severity | File | Line | Snippet |
|---|---|---|---|
| HIGH | agent_reach/channels/reddit.py | 71 | '"modhash": null, "saved_at": 0, "last_verified_at": null}\n\n' |
| Severity | File | Line | Snippet |
|---|---|---|---|
| MEDIUM | tests/test_skill_command.py | 58 | # Create a fake skill installation |
| Severity | File | Line | Snippet |
|---|---|---|---|
| MEDIUM | agent_reach/cli.py | 152 | # ── Command handlers ──────────────────────────────── |