
简介面向华中大导航网及有微博自动化运营需求的开发人员这份仅5KB的轻量级Python脚本实现了微博自动发布与自动评论回复可用于个人或组织账号的日常内容维护。项目基于HTTP接口模拟请求包含两个核心py文件分别承担定时发布与评论监听功能配合README说明文档与gitignore配置文件可快速接入新浪微博开放平台。使用时需按文档指引获取access_token授权码修改脚本头部变量即可运行同时注意授权有效期约90天若使用苹果客户端需替换APPKEY为安卓版本。资源共4个文件结构精简适合Python初学者学习模拟登录、接口调用与自动化任务调度。目前已有1262人学习下载对于想低成本搭建个人微博机器人的用户可直接参考授权流程、变量配置与异常处理细节并根据自身需求调整抓取和发布时间。 做 weibo-auto 这个项目之前我每天最烦的事不是写代码而是“打卡式运营”——自己打理的一个小账号早上要发一条内容晚上还要去评论区回复问题赶上出差、加班这事儿就断档。后来我干脆写了一个基于 HTTP 的 Python 脚本把“定时发微博 自动回复评论”整套跑起来。项目名字就叫 weibo-auto不依赖浏览器、不依赖手机端纯 HTTP 请求一台轻量服务器或者家里的旧电脑挂着就行。这篇文章会把整套脚本的设计思路、接口调用方式、登录态维护以及真实环境里踩过的坑完整记录下来适合想用 Python 做内容自动化或者刚接触 HTTP 请求编程的读者参考。1. 为什么我把自动化做成“HTTP脚本”而不是“装个SDK完事”1.1 三条实现路径的真实对比在写 weibo-auto 之前我其实试过三条路纯手工复制粘贴当然不现实Selenium 控制浏览器我也坚持了大概两周就放弃了——页面结构调整一次xpath 就崩一遍而且 headless 浏览器在服务器上吃内存想 24 小时挂着根本不现实。最后才把目光锁定在纯 HTTP 请求这条路。方案稳定性维护成本部署成本适用场景网页内部接口直接 HTTP中低高接口地址会变极低个人小范围使用开放平台 APIHTTP高低有官方文档低标准自动化发布/评论Selenium / Playwright中高依赖页面 DOM高需要模拟完整浏览行为我最后选择“HTTP 脚本”的核心原因有三个。第一微博网页端和移动端的所有动作最终都会归结为 HTTP 请求脚本只需要关心“请求—响应”这对关系绕开了浏览器渲染这层不确定性。第二Python 的 requests 库处理这类 JSON 接口非常顺手整个项目完全可以收敛成一个启动文件加一份配置文件部署成本极低。第三纯 HTTP 脚本天然适合配合日志、延时和定时任务跑起来是无头模式安静、稳定、不打扰。1.2 HTTP 自动化背后的本质这里先扯一个基础但关键的认知。浏览器加载网页本质上是浏览器帮我们发出了几十个 HTTP 请求然后把结果渲染成我们看到的样子。用脚本做自动化其实就是把“浏览器自己干的事”拆解成“我们主动发出的那一个关键请求”。判断用户是否已登录靠 Cookie提交内容靠 POST 请求读取结果靠 JSON 反序列化。weibo-auto 的核心就是把这几个关键请求按顺序组织起来再叠加“频率控制”和“异常重试”两套机制。2. 发布微博一个POST请求背后的鉴权与参数细节2.1 鉴权方式Cookie还是OAuth Token微博主流的自动化有两种鉴权路线一种是调用微博开放平台的标准 API走 OAuth 2.0创建应用后完成授权换取 access_token然后带着 token 调 statuses/share 这类写接口另一种是直接在请求头里带上网页版登录后的 Cookie模拟浏览器的身份状态。我个人的建议是优先走开放平台。Cookie 方式虽然“拿到就能用”但接口变动频繁Cookie 本身也可能因为异地登录、改密码而突然失效维护成本很高。开放平台 API 的文档相对稳定返回的错误码体系也完整适合脚本长期跑。需要注意的是写操作权限不是默认就有的创建应用后要在权限申请里开通 statuses_write 这类写权限 Scope否则接口会返回权限不足的错误。2.2 发布核心参数与返回结构发送微博的逻辑本质上是 POST 到开放平台的 statuses/share 接口参数以 application/x-www-form-urlencoded 形式提交。最关键的两个参数status微博正文内容必填visible可见范围0 表示公开6 表示仅自己可见pic_id可选如果带配图需要先调用图片上传接口拿到图片 id发送成功后接口会返回一整个微博对象里面包含 id、idstr、created_at、text 等字段。脚本里不能只看“有没有响应”要做字段校验确认返回里没有 error_code才算发布成功。一个可以跑通的发布函数长这样import requests class WeiboPublisher: def __init__(self, app_key: str, access_token: str): self.app_key app_key self.access_token access_token self.session requests.Session() self.session.headers.update({ User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64), Accept: application/json, text/plain, */*, Content-Type: application/x-www-form-urlencoded }) def publish(self, text: str, visible: int 0, pic_id: str None) - dict: url https://api.weibo.com/2/statuses/share.json data { access_token: self.access_token, source: self.app_key, status: text, visible: visible, } if pic_id: data[pic_id] pic_id resp self.session.post(url, datadata, timeout10) result resp.json() if error_code in result: raise RuntimeError( f发布失败: {result.get(error)} ({result.get(error_code)}) ) return result这里有一个安全习惯必须养成access_token 不要硬编码在代码里用配置文件或者环境变量传入。写进代码里再传到 GitHub几分钟就可能被别人扫描拿走账号就被异地调用了。2.3 配图上传的一个隐藏坑如果想发带图微博share.json 本身不接收本地图片文件需要先调用图片上传接口把图片传到微博图床返回一个图片 ID再把这个 ID 拼到发布请求里。这个环节有个特别容易踩的坑服务端对图片格式和大小有严格限制常规支持 JPEG/PNG单张大小也有上限我实际测试建议控制在 800KB 以内超过就容易报参数错误。更麻烦的是上传失败时返回的错误信息有时候很模糊不会直接告诉你是“图片太大”还是“格式不对”。我的做法是先统一用 Pillow 做一次压缩转成 JPEG控制在 800KB 以内再丢给上传接口。这样处理之后配图上传就很少再出问题。3. 自动评论不难难的是别像机器人3.1 评论接口的调用结构评论接口和发布接口非常相似同样是 POST传入 access_token、要评论的微博 ID 和评论文本。核心参数id待评论的微博 ID不是 page id是微博本身的 idstrcomment评论文本接口调用本身不难难的是“回复得像个人”。我先给一个基础版本的自动回复函数后面再讲怎么让它不像机器人。import random import time def auto_reply(self, weibo_id: str, content_pool: list) - dict: if not content_pool: raise ValueError(内容池为空无法自动回复) content random.choice(content_pool) if len(content) 140: content content[:140] url https://api.weibo.com/2/comments/create.json data { access_token: self.access_token, source: self.app_key, id: weibo_id, comment: content, } resp self.session.post(url, datadata, timeout10) result resp.json() if error_code in result: raise RuntimeError( f评论失败: {result.get(error)} ({result.get(error_code)}) ) return result注意这里我对评论文本做了长度校验超过 140 字就截断。不同端对评论字数的限制其实并不统一网页端和移动端可能不一样稳妥的做法是脚本里统一按更严格的限制来避免被接口直接拒掉。3.2 频率控制随机延时是灵魂很多自动化脚本翻车不是因为接口不会调而是因为太“勤快”。我第一版脚本为了让回复看起来及时每 5 秒扫一次评论区结果跑了不到半天账号就被限流了。后来我把扫描频率降到了 5 分钟一次每次只回复一条并且加入了随机延时。真实的人的行为就是不规律的脚本如果像秒表一样精确反而容易被识别。给一个我后来一直在用的节奏参考操作类型间隔建议发布微博两次发布间隔至少 60 秒以上回复评论每次回复之间随机延时 30-180 秒单账号每小时操作总数建议控制在 15 次以内单条评论长度不超过 140 字# 回复完成后随机睡一段时间再处理下一条 time.sleep(random.uniform(30, 180))这个随机延时不是简单地加一行 time.sleep 就完事关键在“随机区间要够宽”。固定 sleep 60 秒和 sleep 10 秒本质都是精确的周期性行为而人的操作间隔是波动的。3.3 内容池模板化与去重自动回复最怕的有两件事前后矛盾、重复刷屏。如果所有评论都回复同一句话用户一眼就看出来对面是机器人。我建议维护一个内容池而不是写死一段话准备 5-10 条语义相近但表达不同的话术每条可以带随机变量或时间变量同一个微博下不要重复使用同一文本记录最近 N 次使用过的索引随机时优先排除遇到评论里包含特定关键词比如“价格”“链接”“你好”走定向回复分支用提前准备好的对应话术内容池的设计要让脚本的输出像一个“有记忆的人”而不是每次从固定集合里瞎选。我自己的做法是给内容池里的每条话术加一个权重标签有的偏正式有的偏轻松根据实际场景选择避免风格单一。4. Cookie过期、频控拦截脚本挂掉的真实原因与对策4.1 我遇到的两次经典崩溃第一次是 access_token 过期。某个周一早上我看后台日志发现脚本从凌晨 3 点起就一直在报 401 Unauthorized日志刷了几千行。根因是 token 的有效期有限而脚本没有做失效检测遇到鉴权错误还在疯狂重试反而把账号状态搞得更差。教训很明确写操作类的请求失败时不能无脑重试。要先判断错误码如果是 401、21327 这类明确的鉴权错误必须停止运行等人工介入换 token 或者重新授权。第二次是接口限流。发布任务和评论任务共用同一个 access_token而我又同时挂了两个定时任务token 的并发调用数超过了接口限制导致两边都在报高频错误。后来把任务串行化并且错峰执行问题就消失了。4.2 用Session管理登录态并做好持久化requests.Session 有一个很好的特性同一个 Session 实例发出的请求会自动带上之前设置的 Cookie所以登录态只需要维护一份。但脚本重启后 Session 就没了所以还需要把 token 和 cookie 状态持久化到本地文件。import json import requests def save_session_state(path: str, access_token: str, session: requests.Session) - None: state { access_token: access_token, cookies: requests.utils.dict_from_cookiejar(session.cookies) } with open(path, w, encodingutf-8) as f: json.dump(state, f, ensure_asciiFalse, indent2) def load_session_state(path: str) - dict: with open(path, r, encodingutf-8) as f: return json.load(f)每次脚本启动时先加载历史状态优先复用已有的 token 和 cookie每次成功调用接口后把最新状态写回文件。这样即使脚本因为重启断了也不会立刻要求人工重新授权。4.3 异常降级有日志不裸奔我见过很多人的自动化脚本是“裸奔”状态没有日志没有告警挂了就是挂了等发现的时候可能已经过去了好几天。weibo-auto 里我坚持做了三件事每一次请求和响应都追加到本地日志文件写清楚时间戳、调用接口、返回码连续失败 3 次时自动进入“熔断模式”停止所有写操作避免账号状态恶化通过 Server酱、钉钉机器人这类 webhook 推一条告警到手机让我在几分钟内就知道脚本挂了这个“日志 熔断 告警”的模式对任何 HTTP 脚本都适用尤其是跑在无人值守环境里的自动化任务。哪怕写得糙一点也比完全没有强太多。5. 合规与风控自动化的边界在哪里5.1 风控的典型表现与识别方法这里要提醒一件事风控不一定直接封号。最常见的情况是“软隔离”——发布成功后内容实际只有自己能看到别人在时间线里看不到评论发出去了别人也回复不了。接口返回值一切正常但内容被限流了。这种情况比直接报错更隐蔽。一旦发现微博互动数据异常、阅读量断崖式下跌第一时间要做的不是继续调接口而是停掉脚本、减少操作频率、观察 24 小时以上。不要反复试探越试探风控级别只会越高。5.2 我验证有效的规避手段基于我自己的运行经验有三类手段是确实有效的完整模拟浏览器请求头User-Agent、Referer、Accept-Language 这些全部补齐requests 默认的 UA 很容易被识别固定入口不要一会儿用网页版接口一会儿用移动端接口行为特征不一致本身就是风险信号保持稳定的网络出口用一个固定的家庭宽带或云主机直连即可频繁切换出口 IP 比接口调用本身更容易触发风控还有一点容易被忽略脚本运行的时间也最好固定。比如我设定每天早上 8 点发内容晚上 9 点统一处理评论让行为轨迹有一个稳定的节律这其实更接近真实个人账号的使用模式。5.3 合规红线与合理使用边界weibo-auto 这类脚本的价值在于帮个人完成“定时发布”和“统一回复”减少重复劳动。它不适合也不应该被用来做营销轰炸、刷量、恶意、群发广告这些行为违背平台规则也直接干扰其他用户。我给自己定的原则是三条脚本只操作自己账号的内容只回复自己微博下的真实互动设置严格的频控上限宁可少发不可多发。另外关注接口返回里的 user_can_comment、user_can_share 这类字段如果一个账号明显不允许互动脚本就不要强行去评论。自动化工具本身没有好坏之分边界在用它的人手里。一旦越过合规红线被封号是小事对其他人造成骚扰就得不偿失了。5.4 上线前的自查清单最后分享一个我自己上线这类脚本前的检查清单配置文件和代码分离token 不入库、不上传所有写操作都有日志所有失败都有错误码记录鉴权类错误不会无脑重试会触发熔断和告警频率控制参数明确单账号每小时操作数有上限操作对象是本人账号不涉及任何批量、跨账号、推广类行为定时任务错峰执行不并发使用同一 token按这份清单过一遍脚本上线之后的“惊吓”会少很多。说实话把 weibo-auto 从“能用”调到“稳”我花了大概三周。最难的不是把 HTTP 接口调通而是学会让它像一个有耐心的真人一样工作——慢一点、随机一点、有边界一点。现在这套脚本已经在我自己的小服务器上连续跑了一个季度早上 8 点定时发一条晚上 9 点统一处理当天评论我只需要偶尔看一眼日志。如果你也想做类似的事建议从最轻量的“定时发布”开始跑通一条链路之后再考虑加“自动评论”复杂度和风险都更容易控制。后续我还打算把文案生成接进内容池让每天发的东西不完全重复这个就留到下一轮更新再写了。本文还有配套的精品资源点击获取