Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Search, analyze, and interact with Xiaohongshu (RedNote/小红书) content via a local MCP server and shell scripts.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
scripts/start-mcp.sh
1#!/bin/bash2# 启动小红书 MCP 服务34XHS_MCP="$HOME/.local/bin/xiaohongshu-mcp"5PID_FILE="$HOME/.xiaohongshu/mcp.pid"6LOG_FILE="$HOME/.xiaohongshu/mcp.log"7XVFB_PID_FILE="$HOME/.xiaohongshu/xvfb.pid"8XVFB_DISPLAY_FILE="$HOME/.xiaohongshu/xvfb.display"910# Cookies 路径(可通过环境变量覆盖)11# XHS_COOKIES_SRC: 源 cookies 文件(用于远程服务器场景)12# 默认检查 ~/cookies.json 和 ~/.xiaohongshu/cookies.json13COOKIES_DST="/tmp/cookies.json"1415mkdir -p "$HOME/.xiaohongshu"1617# 检测是否有显示器(桌面环境)18has_display() {19[ -n "$DISPLAY" ] && xdpyinfo >/dev/null 2>&120}2122# 在无桌面环境下自动启动 Xvfb23ensure_display() {24if has_display; then25return 026fi2728# 已有 Xvfb 在运行29if [ -f "$XVFB_PID_FILE" ]; then30local pid31pid=$(cat "$XVFB_PID_FILE")32if kill -0 "$pid" 2>/dev/null; then33export DISPLAY=$(cat "$XVFB_DISPLAY_FILE" 2>/dev/null || echo ":99")34echo "复用已有 Xvfb (PID: $pid, DISPLAY=$DISPLAY)"35return 036fi37fi3839# 检查 Xvfb 是否安装40if ! command -v Xvfb >/dev/null 2>&1; then41echo "⚠ 未检测到桌面环境,且未安装 Xvfb。"42echo " 请安装:sudo apt-get install -y xvfb"43echo " 安装后重新运行本脚本即可自动配置。"44exit 145fi4647echo "未检测到桌面环境,自动启动 Xvfb 虚拟显示..."4849# 自动选择可用的 display 号(99-109)50local display_num=""51local d52for d in $(seq 99 109); do53if [ ! -e "/tmp/.X${d}-lock" ]; then54display_num=$d55break56fi57# 锁文件存在但进程已死,尝试清理后使用58local lock_pid59lock_pid=$(cat "/tmp/.X${d}-lock" 2>/dev/null | tr -d ' ')60if [ -n "$lock_pid" ] && ! kill -0 "$lock_pid" 2>/dev/null; then61rm -f "/tmp/.X${d}-lock" "/tmp/.X11-unix/X${d}" 2>/dev/null62if [ ! -e "/tmp/.X${d}-lock" ]; then63display_num=$d64break65fi66fi67done6869if [ -z "$display_num" ]; then70echo "✗ 无法找到可用的 display 号(:99-:109 均被占用)"71exit 172fi7374# -ac: 关闭访问控制,允许 chromium 连接虚拟显示(仅用于 headless 自动化)75Xvfb ":${display_num}" -screen 0 1024x768x24 -ac >/dev/null 2>&1 &76echo $! > "$XVFB_PID_FILE"77echo ":${display_num}" > "$XVFB_DISPLAY_FILE"78export DISPLAY=":${display_num}"79sleep 18081if kill -0 "$(cat "$XVFB_PID_FILE")" 2>/dev/null; then82echo "✓ Xvfb 已启动 (DISPLAY=:${display_num})"83else84echo "✗ Xvfb 启动失败"85exit 186fi87}8889# 同步 cookies(支持多个可能的来源)90sync_cookies() {91local src=""9293# 优先使用环境变量指定的路径94if [ -n "$XHS_COOKIES_SRC" ] && [ -f "$XHS_COOKIES_SRC" ]; then95src="$XHS_COOKIES_SRC"96elif [ -f "$HOME/cookies.json" ]; then97src="$HOME/cookies.json"98elif [ -f "$HOME/.xiaohongshu/cookies.json" ]; then99src="$HOME/.xiaohongshu/cookies.json"100fi101102if [ -n "$src" ]; then103if [ ! -f "$COOKIES_DST" ] || [ "$src" -nt "$COOKIES_DST" ]; then104install -m 600 "$src" "$COOKIES_DST"105echo "已同步 cookies: $src -> $COOKIES_DST"106fi107else108# 确保已有的 cookies 文件权限正确109[ -f "$COOKIES_DST" ] && chmod 600 "$COOKIES_DST"110fi111}112113sync_cookies114ensure_display115116# 检查是否已在运行117if [ -f "$PID_FILE" ]; then118PID=$(cat "$PID_FILE")119if kill -0 "$PID" 2>/dev/null; then120echo "MCP 服务已在运行 (PID: $PID)"121echo "如需重启,请先运行 stop-mcp.sh"122exit 0123fi124fi125126# 解析参数127HEADLESS="true"128PORT="${XHS_MCP_PORT:-18060}"129for arg in "$@"; do130case $arg in131--headless=false)132HEADLESS="false"133;;134--port=*)135PORT="${arg#*=}"136;;137esac138done139140# 校验端口号141if [[ ! "$PORT" =~ ^[0-9]+$ ]]; then142echo "错误: 无效端口号: $PORT"143exit 1144fi145146# 启动服务147echo "启动小红书 MCP 服务..."148if [ "$HEADLESS" = "false" ]; then149nohup "$XHS_MCP" -port ":${PORT}" -headless=false > "$LOG_FILE" 2>&1 &150else151nohup "$XHS_MCP" -port ":${PORT}" > "$LOG_FILE" 2>&1 &152fi153154echo $! > "$PID_FILE"155sleep 2156157# 验证启动158if kill -0 $(cat "$PID_FILE") 2>/dev/null; then159echo "✓ MCP 服务已启动 (PID: $(cat $PID_FILE))"160echo " 端点: http://localhost:${PORT}/mcp"161echo " 日志: $LOG_FILE"162else163echo "✗ 启动失败,查看日志: $LOG_FILE"164cat "$LOG_FILE"165exit 1166fi167