🐱 我用代码让家里的黑猫成了小红书博主
📖 故事背景
家里养了一只黑猫,名字叫妮妮。她傲娇、贪吃,尤其喜欢在元宵节盯着汤圆看。突发奇想:能不能让妮妮自己当小红书博主?不用我动手,就能自动生成笔记、配图、发布,偶尔卖个萌吸粉。
于是,有了这个项目——妮妮的元宵节小红书自动发布。
🎯 项目目标
让家里的黑猫“妮妮”成为小红书博主,自动发布一篇元宵节主题笔记。
📋 发布内容预览
标题《本喵的元宵节:汤圆是什么好吃的?》
正文(猫咪第一人称)喵~元宵节到了!铲屎官端来一碗白白圆圆的东西凑近闻了闻,糯糯香香的,芝麻馅儿直往鼻子里钻!可是!为什么不能给本喵吃啊?!铲屎官说什么糯米不好消化,还可能有木糖醇...看在芝麻馅儿这么香的份上,就原谅这个“猫猫禁食”的节日美食了!元宵节快乐呀,两脚兽们!
🛠️ 技术栈
🔄 自动化发布流程
整个发布就像一条流水线,每一步都由代码自动完成:
- 加载Cookie → 从 xhs_cookies.json 读取已登录状态
- 访问小红书主站 → www.xiaohongshu.com 注入Cookie
- 跳转创作者发布页 → creator.xiaohongshu.com/publish/publish
- 上传图片 → 通过JavaScript创建file input并发送图片路径
- 输入标题 → 用JS直接设置input value并触发事件
- 输入正文 → 用JS设置innerText并触发input/change事件
- 验证成功 → URL出现 published=true,页面重置
⚠️ 踩坑与填坑(最精华的部分)
问题1:浏览器驱动选择
结论:用系统自带的Edge,省去安装Chrome的麻烦。
问题2:文件上传不触发对话框
# ❌ 错误示范:直接点击上传按钮upload_button.click() # 没反应,因为input是隐藏的# ✅ 正确姿势:创建隐藏的file input并send_keysdriver.execute_script(""" var input = document.createElement('input'); input.type = 'file'; input.accept = 'image/*'; document.body.appendChild(input);""")file_input.send_keys(image_path)
问题3:中文/Emoji输入乱码
# ❌ 直接send_keys可能乱码或漏字符element.send_keys("喵~🍡")# ✅ 使用JavaScript直接设置,并手动触发事件driver.execute_script(""" arguments[0].innerText = arguments[1]; arguments[0].dispatchEvent(new Event('input', { bubbles: true })); arguments[0].dispatchEvent(new Event('change', { bubbles: true }));""", element, content)
问题4:控制台输出乱码
在脚本开头添加:
os.system('chcp 65001 > nul') # 切换控制台编码为UTF-8
问题5:发布按钮定位不到
小红书页面按钮可能有多种写法,用选择器列表逐个尝试:
selectors = [ "//button[contains(text(), '发布')]", "//button[.//text()='发布']", "button[class*='publish']",]for selector in selectors: try: button = driver.find_element(By.XPATH, selector) break except: continue
📝 核心代码片段(精选)
Cookie加载
with open('xhs_cookies.json', 'r', encoding='utf-8') as f: cookies_data = json.load(f)cookies = cookies_data.get('cookies', [])for cookie in cookies: driver.add_cookie({ 'name': cookie['name'], 'value': cookie['value'], 'domain': '.xiaohongshu.com', 'path': '/', })
图片上传完整逻辑
# 创建/查找文件输入框result = driver.execute_script(""" var inputs = document.querySelectorAll('input[type="file"]'); if (inputs.length === 0) { var input = document.createElement('input'); input.type = 'file'; input.accept = 'image/*'; document.body.appendChild(input); } return inputs.length;""")# 上传文件file_input = driver.find_element(By.CSS_SELECTOR, 'input[type="file"]')file_input.send_keys(image_path)
标题与正文填充
# 标题driver.execute_script(""" arguments[0].value = arguments[1]; arguments[0].dispatchEvent(new Event('input', { bubbles: true })); arguments[0].dispatchEvent(new Event('change', { bubbles: true }));""", title_input, title)# 正文(支持换行和emoji)driver.execute_script(""" arguments[0].innerText = arguments[1]; arguments[0].dispatchEvent(new Event('input', { bubbles: true })); arguments[0].dispatchEvent(new Event('change', { bubbles: true }));""", content_input, content)
✅ 成功标志
脚本运行结束后,检查:
- URL变化:页面跳转到 https://creator.xiaohongshu.com/publish/publish?published=true
- 打开小红书App,个人主页已经出现了妮妮的第一篇笔记!🎉
💡 经验总结 & 最佳实践
🔗 相关资源
- Cookie文件:替换为你的本地Cookie文件路径
🐾 后记
第一次跑通脚本时,看着浏览器自动打开、填写、点击,最后跳出“发布成功”,那种成就感难以形容。虽然第二天笔记就被平台风控了(笑),但这趟技术探索让我收获满满:
- 给自家猫咪建了个“数字分身”,感觉她真的活在了互联网里
⚠️ 不足与反思:第二天就被平台禁了!
就在我沉浸在“发布成功”的喜悦中时,第二天打开小红书,发现妮妮的笔记已经被删除,账号也收到了“操作异常”的警告。这说明基础的自动化脚本触碰了平台的风控红线。
🧐 为什么会这样?
- Selenium的自动化特征太明显:用Selenium启动的浏览器会留下`navigator.webdriver`为`true`的指纹,还有固定的启动参数、窗口尺寸等,很容易被风控系统识别为“机器人”。
- 操作节奏过于规律:脚本里用的是固定的`time.sleep(3)`,每次点击间隔一模一样,真人可不会这么精确。
- 缺少真实用户行为痕迹:浏览器是全新的实例,没有浏览历史、cookies、缓存,就像个刚出厂的手机,太可疑了。
🔧 后续技术改进方向(写给同样想尝试的朋友)
如果你也想做类似的自动化,又希望账号活得久一点,可以考虑以下升级方案:
- 改用更隐蔽的自动化工具放弃Selenium,改用 Playwright 的 CDP模式(Chrome DevTools Protocol)。这种模式可以直接连接你日常使用的浏览器(比如你正在看网页的Edge),让它“亲手”操作小红书,而不是新造一个机器人。这样所有的浏览器指纹、历史记录、登录态都是真实的,风控很难察觉。
- 模拟真人的操作节奏- 在每次点击前加入随机等待,比如`random.uniform(1.5, 3.5)`秒。- 用`page.mouse.move()`模拟鼠标的自然移动轨迹,而不是直接跳到按钮上点击。- 输入文字时模拟逐字敲击的延迟,比如每个字符间隔50~150毫秒。
- 使用真实的用户数据目录启动浏览器时指定一个固定的用户数据目录(`--user-data-dir`),这样每次运行都复用同一个浏览器环境,包含cookies、历史记录、扩展,看起来更像真人。
- 定时更新Cookie,避免长期暴露Cookie会过期,可以写个小脚本每个月重新扫码登录一次。
- 内容策略也要优化不要每天固定时间发,发布频率和时段要随机化。话题标签别堆太多,5~8个精准的就好。
这次我真正理解了“反爬”与“反反爬”的博弈。技术总是在对抗中进步,而每一次踩坑都是宝贵的经验。希望妮妮的下一版脚本能更“人类”,走得更远~
如果你也对AI自动化、宠物博主感兴趣,欢迎留言交流。也许下次,妮妮会发一篇“我是如何被代码控制的”独白呢?