基于WorkBuddy与AI的自动化热搜日报系统:从数据抓取到智能推送

发布时间:2026/8/4 16:21:19
基于WorkBuddy与AI的自动化热搜日报系统:从数据抓取到智能推送 1. 项目缘起从“信息焦虑”到“主动投喂”的自动化构想每天打开手机信息流像瀑布一样冲刷下来想了解今天发生了什么却总在热搜榜、新闻App和社交媒体之间疲于切换。作为一个对信息敏感但又讨厌重复劳动的人我一直在想能不能让机器自动帮我完成“信息抓取-整理-推送”这个流程直到我遇到了腾讯版的WorkBuddy这个想法才真正落地。WorkBuddy你可以把它理解为一个运行在你电脑上的“数字助理”它不仅能帮你操作软件、处理文件更重要的是它支持通过Python脚本扩展能力实现复杂的自动化流程。而“AI生成热搜日报”这个需求恰好是它的绝佳应用场景。核心思路很简单写一个脚本定时去抓取主流平台的热搜榜单然后调用一个大语言模型比如GPT、文心一言等的API让它对原始的热搜列表进行总结、分类和观点提炼最后通过邮件发送给我。整个过程无需我手动干预实现“躺平”也能掌握每日热点。这不仅仅是省了几分钟刷手机的时间。关键在于经过AI加工后的“日报”信息密度和可读性远超原始榜单。AI可以剔除重复、无意义的娱乐八卦当然如果你需要也可以保留将社会、科技、财经等不同领域的事件归类甚至提炼出事件的简要背景和潜在影响让你在几分钟的阅读内就能对当日舆情有一个结构化的认知。接下来我就把用WorkBuddy实现这套自动化系统的完整过程包括踩过的坑、调优的技巧毫无保留地分享出来。2. 环境搭建与核心工具选型为什么是它们在开始写代码之前选择合适的工具是成功的一半。这个项目涉及几个核心环节自动化调度、网络请求、AI接口调用和邮件发送。每个环节都有多种选择我的选型基于稳定性、易用性和与WorkBuddy的兼容性。2.1 自动化调度核心腾讯版WorkBuddy为什么选择WorkBuddy而不是传统的cronLinux或任务计划程序Windows原因有三点跨平台与状态可视WorkBuddy提供了统一的图形界面来管理你的自动化任务它称之为“技能”或Skill无论你用的是Windows、macOS还是Linux配置方式基本一致。你可以清晰地看到任务何时运行、是否成功、日志输出是什么这对于调试和监控至关重要。集成化与易扩展WorkBuddy本身就是一个自动化框架它内置了对Python的良好支持。你写的脚本可以直接作为它的一个“技能”被加载和管理无需关心复杂的进程守护、环境变量等问题。它就像一个容器让你的脚本运行得更规范。触发方式灵活除了定时触发WorkBuddy还支持文件变化、HTTP请求、快捷键等多种触发方式为未来扩展比如收到特定关键词时触发分析留下了空间。注意网络上提到的“CodeBuddy”通常是更偏向于代码辅助和开发的工具而“WorkBuddy”的定位更偏向于广义的办公和流程自动化。本项目需要的是流程自动化能力因此WorkBuddy是更合适的选择。2.2 编程语言Python这一点几乎没有悬念。Python在数据处理、网络爬虫和AI应用接口调用方面拥有无与伦比的生态优势。requests库用于网络请求smtplib和email库用于发邮件调用OpenAI或国内大模型API也有成熟的SDK如openai,zhipuai等。语法简洁开发效率极高。2.3 热搜数据源选择与稳定性处理数据源是项目的基石。单一源容易失效多源互补能提高稳定性。我主要选择了以下两个源A某社交媒体平台通过抓取其热搜榜API接口获取。优点是实时性高代表性强。缺点是接口可能变更且需要处理反爬机制如请求头校验。源B某新闻聚合平台通过其公开的网页或RSS源获取。优点是结构稳定内容更偏新闻性。可以作为源A的备份和补充。应对反爬策略直接访问API或页面可能会被拒绝。实践中我做了以下处理模拟真实浏览器请求头在requests请求中完整地带上User-Agent,Referer,Cookie如需等信息。headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36, Referer: https://weibo.com/ } response requests.get(https://weibo.com/ajax/side/hotSearch, headersheaders)使用代理IP池可选针对高频抓取如果定时任务很密集考虑使用付费或免费的代理IP服务来轮换IP避免被单个IP封锁。对于个人每日几次的频率通常不需要。异常捕获与重试网络请求必须放在try-except块中并设置重试逻辑。使用tenacity或retrying库可以优雅地实现。from tenacity import retry, stop_after_attempt, wait_exponential retry(stopstop_after_attempt(3), waitwait_exponential(multiplier1, min4, max10)) def fetch_hot_searches(): # ... 请求逻辑 if response.status_code ! 200: raise Exception(f请求失败状态码{response.status_code}) return response.json()2.4 AI模型选择与提示词设计这是项目的“大脑”。我测试了多个模型包括GPT-3.5/4、Claude以及国内的文心、通义千问等。对于文本总结和提炼任务GPT-3.5 Turbo在性价比和效果上取得了很好的平衡。如果追求更高的分析深度可以升级到GPT-4。核心中的核心提示词Prompt设计。一条好的提示词直接决定了日报的质量。经过多次迭代我目前的提示词结构如下你是一个专业的舆情分析助理。请根据以下JSON格式提供的今日热搜列表生成一份简洁的每日热点舆情日报。 原始数据 {hot_search_data_json} 请按照以下要求处理 1. **分类归纳**将热搜事件按照“社会时事”、“科技财经”、“文娱体育”、“其他”等类别进行归类。 2. **信息提炼**对每个事件用一句话不超过50字概括其核心内容避免使用“据悉”、“据报道”等开头。 3. **观点摘要可选**选取其中2-3个最具讨论度或潜在影响的事件简要分析其可能的原因或后续影响每点分析不超过80字。 4. **输出格式**直接以纯文本输出结构为 【今日热点舆情日报】 * 生成时间{current_time} * 数据来源{source} 【分类热点】 - [社会时事] 1. 事件标题概括内容。 ... - [科技财经] ... 【重点事件简析】 1. 事件标题简要分析。 ... 请确保内容客观、简洁不要添加任何额外的解释或标记。这条提示词明确了AI的角色、任务、输入格式和输出格式要求。将原始数据以JSON格式嵌入让AI能结构化地理解信息。指定分类和输出格式确保了最终日报的一致性方便邮件模板直接使用。3. 核心脚本拆解从抓取到发送的完整代码逻辑有了设计图我们来一步步实现代码。整个脚本hot_search_daily.py主要包含四个函数数据抓取、数据处理、AI调用和邮件发送。3.1 数据抓取与清洗函数这个函数负责从多个源获取原始数据并清洗成统一的格式一个Python列表里面包含字典。import requests import json from datetime import datetime import pytz def fetch_and_clean_data(): all_hot_items [] # 源A某社交媒体平台 try: weibo_data fetch_weibo_hot_search() # 封装好的具体抓取函数 for item in weibo_data.get(data, {}).get(realtime, []): cleaned_item { title: item.get(word, ).strip(), rank: item.get(rank, 0), hot_value: item.get(raw_hot, 0), source: 微博, url: fhttps://s.weibo.com/weibo?q{item.get(word)} # 构造搜索链接 } if cleaned_item[title]: # 过滤空标题 all_hot_items.append(cleaned_item) except Exception as e: print(f抓取微博热搜失败{e}) # 可以在这里加入发送错误通知的逻辑 # 源B某新闻平台 try: news_data fetch_news_hot_search() # ... 类似的清洗逻辑整合到 all_hot_items 中 except Exception as e: print(f抓取新闻热搜失败{e}) # 按热度值排序如果来源有的话 all_hot_items.sort(keylambda x: x.get(hot_value, 0), reverseTrue) # 取前50条避免给AI的上下文过长 return all_hot_items[:50]关键点每个源的抓取逻辑最好封装成独立函数便于维护和单独测试。清洗后的数据字段要统一至少包含title标题、source来源和url链接如果有。3.2 AI调用与日报生成函数这是脚本的智能中枢。它接收清洗后的数据构造提示词调用大模型API并返回生成的日报文本。import openai # 或 from zhipuai import ZhipuAI # 假设使用OpenAI格式的API client openai.OpenAI(api_key你的API_KEY, base_url你的API_BASE_URL) # 国内用户可能需要配置base_url def generate_daily_report(hot_items): # 1. 准备输入数据 current_time datetime.now(pytz.timezone(Asia/Shanghai)).strftime(%Y-%m-%d %H:%M) hot_data_json json.dumps(hot_items, ensure_asciiFalse, indent2) # 2. 构造系统提示词和用户消息 system_prompt 你是一个专业的舆情分析助理。请根据用户提供的今日热搜列表生成一份简洁的每日热点舆情日报。 user_prompt f 请根据以下JSON格式提供的今日热搜列表生成一份简洁的每日热点舆情日报。 原始数据 {hot_data_json} 请按照以下要求处理 1. **分类归纳**将热搜事件按照“社会时事”、“科技财经”、“文娱体育”、“其他”等类别进行归类。 2. **信息提炼**对每个事件用一句话不超过50字概括其核心内容。 3. **观点摘要可选**选取其中2-3个最具讨论度的事件简要分析其可能的原因或后续影响每点分析不超过80字。 4. **输出格式**直接以纯文本输出结构为 【今日热点舆情日报】 * 生成时间{current_time} * 数据来源综合 【分类热点】 - [社会时事] 1. 事件标题概括内容。 ... 【重点事件简析】 1. 事件标题简要分析。 ... 请确保内容客观、简洁。 # 3. 调用AI模型 try: response client.chat.completions.create( modelgpt-3.5-turbo, # 或 gpt-4, claude-3-haiku等 messages[ {role: system, content: system_prompt}, {role: user, content: user_prompt} ], temperature0.7, # 控制创造性0.7左右比较平衡 max_tokens1500 # 限制输出长度 ) report_content response.choices[0].message.content.strip() return report_content except Exception as e: print(fAI生成日报失败{e}) # 降级方案返回一个简单的格式化列表 return f【热点列表】\n \n.join([f{i1}. {item[title]} ({item[source]}) for i, item in enumerate(hot_items[:20])])经验之谈temperature参数很关键。设为0完全确定性可能导致输出枯燥、模板化设为1高随机性又可能每次格式都不一样。0.5-0.8是一个较好的范围能在一致性和可读性间取得平衡。必须设置max_tokens防止API因生成长文本而消耗过多费用或超时。一定要有降级方案。AI服务可能不稳定当API调用失败时返回一个简单的、手工格式化的热点列表总比什么都没有强。3.3 邮件发送函数日报生成后需要通过邮件发送。这里使用Python内置的smtplib和email库。import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.header import Header def send_email(report_content, recipient_email): # 邮件服务器配置以QQ邮箱为例 smtp_server smtp.qq.com smtp_port 465 # SSL端口 sender_email your_emailqq.com sender_password 你的授权码 # 注意不是邮箱密码是SMTP授权码 # 构造邮件 msg MIMEMultipart() msg[From] Header(f热点日报机器人 {sender_email}) msg[To] Header(recipient_email) msg[Subject] Header(f每日热点舆情日报 {datetime.now().strftime(%Y-%m-%d)}, utf-8) # 邮件正文 text_part MIMEText(report_content, plain, utf-8) msg.attach(text_part) # 可选添加一个HTML版本阅读体验更好 # html_content fpre{report_content}/pre # 用pre标签保持格式 # html_part MIMEText(html_content, html, utf-8) # msg.attach(html_part) # 发送邮件 try: with smtplib.SMTP_SSL(smtp_server, smtp_port) as server: server.login(sender_email, sender_password) server.sendmail(sender_email, [recipient_email], msg.as_string()) print(邮件发送成功) except Exception as e: print(f邮件发送失败{e})重要提示务必使用SMTP授权码而非邮箱密码。在QQ邮箱、163邮箱的设置中可以找到“开启SMTP服务”并生成授权码。Gmail等可能需要配置“应用专用密码”。3.4 主函数与WorkBuddy集成最后我们将所有功能串联起来并适配WorkBuddy的调用方式。def main(): print(开始获取今日热点...) # 1. 抓取并清洗数据 hot_items fetch_and_clean_data() if not hot_items: print(未获取到热点数据任务终止。) return print(f共获取到{len(hot_items)}条热点。) # 2. 调用AI生成日报 print(正在请AI生成日报...) daily_report generate_daily_report(hot_items) # 3. 发送邮件 recipient your_destinationemail.com # 收件邮箱 print(f正在发送邮件至 {recipient}...) send_email(daily_report, recipient) print(每日热点日报任务执行完毕) if __name__ __main__: main()在WorkBuddy中你只需要将这个Python脚本文件hot_search_daily.py放在指定的技能目录下然后在WorkBuddy的界面中创建一个新的“定时任务”指向这个脚本的main函数并设置每天上午9点执行即可。WorkBuddy会自动管理Python环境或使用你指定的环境来运行它。4. WorkBuddy技能配置与定时任务管理脚本写好了如何让它每天自动运行这就是WorkBuddy大显身手的地方。4.1 将脚本部署为WorkBuddy技能找到技能目录在WorkBuddy的设置或文档中找到存放用户自定义技能的目录。通常路径类似于~/WorkBuddySkills/或C:\Users\[YourName]\Documents\WorkBuddy\Skills\。创建技能文件夹在该目录下为你这个热点日报项目创建一个新文件夹例如HotSearchDaily。放置脚本与配置文件将hot_search_daily.py放入该文件夹。同时创建一个skill.json或config.ini文件来定义技能元数据非必须但更规范。一个简单的skill.json示例{ name: 每日热点舆情日报, version: 1.0.0, author: 你的名字, description: 自动抓取热搜经AI总结后发送邮件。, entry_point: hot_search_daily.py, trigger: scheduled }重启或刷新WorkBuddy放置好后重启WorkBuddy客户端或者在技能管理界面点击“刷新”或“重新加载技能”。你的“每日热点舆情日报”技能应该会出现在技能列表中。4.2 配置定时任务触发器WorkBuddy的核心优势在于其可视化的触发器配置。创建定时任务在WorkBuddy主界面找到“自动化”或“任务”模块创建新任务。选择触发方式选择“定时触发”Scheduled Trigger。你可以设置频率每天、每周、每月。具体时间例如每天上午9:30。考虑到AI生成和网络延迟可以设定在信息相对充沛后的时间点比如工作日上午10点。重复是否在错过一次后补执行。关联动作在定时任务的“动作”部分选择“运行Python脚本”或“执行技能”然后指向你刚才部署的hot_search_daily.py文件或技能名称。设置失败通知高级WorkBuddy可能支持任务失败时发送通知如系统通知、HTTP回调。建议开启这样当脚本因网络问题、API额度耗尽等原因失败时你能及时知道。4.3 日志查看与调试当任务运行时你可以在WorkBuddy的“日志”或“运行历史”面板中查看实时输出。print语句的内容会在这里显示。这是排查问题的第一现场。如果任务没有按预期运行首先检查这里是否有错误信息。5. 进阶优化与个性化定制方案基础版本跑通后你可以根据个人需求进行深度定制让这个工具更贴合你。5.1 日报内容个性化定制你的专属提示词最初的提示词是通用型的。你可以通过修改提示词让AI产出不同风格的日报面向投资人提示词中要求侧重分析热点事件对相关行业、股市的潜在影响并关联具体公司。面向自媒体从业者要求提炼热搜中的争议点、情绪倾向并建议可能的创作角度。增加“冷知识”环节让AI从当日热搜中延伸介绍一个相关的背景知识或历史事件。改变语气让日报的口吻变得幽默、犀利或严肃。例如给投资人的提示词可以增加...前面部分不变... 5. **投资视角摘要**从列表中筛选出可能与资本市场股市、期货、特定行业相关的事件简要分析其可能带来的市场情绪影响或对具体上市公司如有的潜在业务影响。5.2 多平台推送与备份除了邮件你还可以将日报推送到其他平台实现多端接收。企业微信/钉钉机器人生成日报后调用企业微信或钉钉群机器人的Webhook接口将内容发送到工作群。import requests def send_to_wechat_work(webhook_url, content): data { msgtype: markdown, markdown: { content: f**每日热点舆情日报**\n{content} } } requests.post(webhook_url, jsondata)保存为本地文件每次生成的日报可以追加保存到一个Markdown或文本文件中形成历史档案方便日后回溯。with open(hot_search_archive.md, a, encodingutf-8) as f: f.write(f\n## {datetime.now().strftime(%Y-%m-%d)}\n) f.write(report_content) f.write(\n---\n)5.3 性能与成本优化缓存与去重如果你的脚本设定为每小时运行但热搜榜单更新没那么快可以在两次运行间缓存结果如果新抓取的榜单与上次相比变化不大例如相似度超过90%则跳过AI生成和邮件发送仅记录日志节省API调用费用。模型降级与分级处理并非每次都需要最强的模型。可以设定规则如果当日热点数量少或热度普遍不高则使用更便宜、更快的模型如GPT-3.5 Turbo而不是GPT-4来生成摘要。错误预警机制在脚本开头或结尾加入对关键步骤如数据抓取、AI调用成功与否的判断。如果连续失败多次可以触发一个更醒目的报警比如发送一条特别的短信或电话提醒而不是默默地停止工作。5.4 处理敏感词与内容过滤网络热搜内容多样有时可能包含你不感兴趣或不想看到的内容。可以在数据清洗阶段或AI处理前加入过滤规则。关键词屏蔽维护一个屏蔽词列表如果热搜标题中包含这些词直接过滤掉。blacklist [某明星八卦, 无意义综艺] filtered_items [item for item in hot_items if not any(word in item[title] for word in blacklist)]AI指令过滤在提示词中明确要求AI过滤或淡化某些类型的内容。例如“请避免详细展开纯娱乐明星绯闻事件仅简要提及即可。”6. 常见问题排查与实战心得在开发和运行过程中我遇到了不少坑这里总结一下希望能帮你绕过去。6.1 数据抓取失败反爬虫与接口变更这是最常见的问题。症状是fetch_and_clean_data函数返回空列表或直接报错。排查首先在WorkBuddy日志中查看打印的错误信息。然后可以临时修改脚本将抓取到的原始响应response.text打印或保存到文件看看返回的是否是预期的JSON或HTML还是反爬虫的验证页面。解决更新请求头模仿最新版浏览器的User-Agent。添加Cookie有时需要登录态的Cookie。可以手动登录后从浏览器开发者工具中复制Cookie字符串到请求头中。但注意Cookie会过期这不是长期稳定的方案。使用Selenium模拟浏览器对于反爬极其严格的网站可以考虑使用selenium库控制一个真实的浏览器如Chrome去抓取。但这会大幅增加资源消耗和运行时间不适合轻量级定时任务。仅作为最后手段。寻找替代数据源维护一个备选数据源列表当主源失效时自动切换。6.2 AI生成内容格式混乱或不符合要求症状是日报的格式五花八门有时没有分类有时多了很多废话。排查检查发送给AI的提示词是否清晰、格式要求是否明确。将你实际发送的user_prompt和收到的response_content都打印出来对比。解决强化系统提示词在system_prompt里更严格地定义AI的角色和输出纪律。结构化输出要求在user_prompt中使用更明确的标记如“请严格按照以下格式输出”并用三个引号\包裹示例格式。后处理清洗写一个简单的后处理函数用正则表达式提取需要部分或者修正一些常见的格式错误。例如如果AI总是多输出“好的这是为您生成的日报”这句话就在拿到结果后把它去掉。调整temperature尝试降低temperature值比如从0.7调到0.3让输出更稳定、更遵循指令。6.3 邮件发送被拒或进入垃圾箱症状是WorkBuddy日志显示邮件发送成功但你始终收不到。排查检查发件邮箱的SMTP服务是否已开启授权码是否正确。检查收件箱的垃圾邮件文件夹。解决完善邮件头确保From,To,Subject字段格式正确特别是使用Header类处理中文。添加纯文本和HTML双版本如代码示例所示同时提供纯文本和HTML版本能提升邮件客户端的兼容性。控制发送频率如果是免费邮箱如QQ、163过于频繁的发送可能被限制。每天1-2次是安全的。考虑专业邮件发送服务对于可靠性要求极高的场景可以使用SendGrid、Mailgun等第三方邮件服务商的API它们有更高的送达率保障。6.4 WorkBuddy任务不执行或执行报错症状是定时任务到了点没反应或者日志里出现Python环境错误。排查检查WorkBuddy是否在运行确保WorkBuddy客户端在后台正常运行并且没有进入休眠或暂停状态。检查任务开关确认定时任务是否被启用Enabled。检查Python环境WorkBuddy可能使用它自带的Python环境也可能使用系统环境。确保你的脚本所需的第三方库requests,openai等已经安装在正确的Python环境中。可以在WorkBuddy的技能目录下尝试运行pip install -r requirements.txt如果你创建了依赖文件。检查文件路径确保脚本中任何读取或写入本地文件的路径都使用的是绝对路径或相对于技能目录的路径因为WorkBuddy运行脚本时的工作目录可能不同。解决在脚本开头添加详细的日志输出帮助定位问题。对于环境问题最稳妥的方式是在WorkBuddy的技能配置中明确指定使用哪个Python解释器路径。这个项目从构想到稳定运行我花了大约一周的业余时间其中大部分是在调试数据抓取和优化提示词。最大的成就感不在于省下了刷手机的时间而在于构建了一个完全属于自己、可以随意定制的信息过滤和加工管道。它现在每天上午准时把一份干净、有条理的日报送到我的邮箱让我在早餐后就能快速把握当日脉搏。如果你也对信息过载感到疲惫不妨动手试试从复制我的代码开始打造你的第一个AI自动化工作流。