
摘要:
线上课程关注多了,最容易错过的是「什么时候开课」。本文从开发者视角出发,编写 Python 脚本定时检测 CCtalk 公开课程页面的状态变化,并部署到腾讯云函数(SCF)上以定时任务的方式自动运行,最后接入邮件或即时通讯推送,实现在新课上线或开课倒计时时的主动提醒。全程含完整代码与部署步骤。
【AI辅助创作声明:本文由 AI 辅助整理与撰写,内容已经过人工审校与调整。】
关注了几位老师,加了好几个 CCtalk 群,收藏了不少免费公开课——然后呢?然后因为工作忙、消息多、群通知被淹没,回过神来发现课已经讲了一半,或者干脆错过整期。
CCtalk 客户端本身有课程提醒功能,但它的提醒局限于客户端内的弹窗和群消息,无法和你的日常工作流打通。如果你习惯通过邮件或微信接收重要通知,CCtalk 自带的提醒就很难进入你的视野。
解决办法:写一个轻量的定时监控脚本,让它替你去「蹲守」课程页面,一旦检测到状态变化——比如课程从「报名中」变成了「即将开课」——就主动推送到你真正会看的渠道里。
这条自动化链路分为三块:
2.1 监控端(Python 脚本)
通过 HTTP 请求访问 CCtalk 公开课程页面,解析 HTML 中的关键信息——课程标题、开课时间、当前状态(预告/直播中/已结束),与上一次检测结果做差异对比。
2.2 调度端(腾讯云 SCF 定时触发器)
脚本部署到腾讯云函数上,配置定时触发器(例如每 30 分钟执行一次),无需单独租用云服务器,零闲置成本。
2.3 通知端(邮件或 Webhook 推送)
检测到新课程或状态变更时,通过 SMTP 邮件或第三方 Webhook(如企业微信机器人、Server酱)推送到手机。
[CCtalk 公开课程页] ←─ HTTP GET ─ [腾讯云 SCF (Python 定时函数)]
│
▼ 状态变化?
[邮件 / Webhook 推送]
│
▼
[你的手机 / 邮箱]在本地开发阶段,需要安装两个依赖:
pip install requests beautifulsoup4 -t .如果准备部署到 SCF,可以将依赖一同打包上传,也可以使用 SCF 的在线依赖安装功能。
CCtalk 的公开课程页面 URL 通常格式为 https://www.cctalk.com/m/group/xxxxxxxx 或类似结构。我们用 requests 获取页面内容,用 BeautifulSoup 解析:
import requests
from bs4 import BeautifulSoup
def fetch_course_info(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/120.0.0.0 Safari/537.36'
}
resp = requests.get(url, headers=headers, timeout=15)
resp.encoding = 'utf-8'
soup = BeautifulSoup(resp.text, 'html.parser')
course_title = ''
title_tag = soup.find('h1') or soup.find('title')
if title_tag:
course_title = title_tag.text.strip()
desc = ''
desc_tag = soup.find('meta', attrs={'name': 'description'})
if desc_tag and desc_tag.get('content'):
desc = desc_tag['content']
return {
'url': url,
'title': course_title,
'description': desc,
'page_text': soup.get_text()[:3000]
}课程状态(预告/直播中/已结束)不会以 API 字段的形式直接返回,但会以文本形式出现在页面中。可以通过关键词匹配来推断:
def infer_status(page_text):
if '直播中' in page_text or '正在直播' in page_text:
return 'LIVE'
if '即将开始' in page_text or '开课倒计时' in page_text:
return 'UPCOMING'
if '已结束' in page_text or '直播回放' in page_text:
return 'ENDED'
return 'UNKNOWN'每次运行把检测结果存到一个 JSON 文件中(SCF 环境可用 /tmp/ 目录做临时存储),与上一次结果对比:
import json
import os
STATE_FILE = '/tmp/cctalk_snapshot.json'
def load_previous_snapshot():
if os.path.exists(STATE_FILE):
with open(STATE_FILE, 'r', encoding='utf-8') as f:
return json.load(f)
return {}
def save_snapshot(snapshot):
with open(STATE_FILE, 'w', encoding='utf-8') as f:
json.dump(snapshot, f, ensure_ascii=False, indent=2)
def detect_changes(current, previous):
changes = []
for url, cur_info in current.items():
prev_info = previous.get(url, {})
if cur_info.get('status') != prev_info.get('status'):
changes.append({
'url': url,
'title': cur_info['title'],
'old_status': prev_info.get('status', 'NEW'),
'new_status': cur_info['status'],
'desc': cur_info.get('description', '')[:200]
})
return changes注意:
/tmp/是 SCF 环境中唯一可写的目录,但云函数实例回收后/tmp/内容会丢失,因此本方案适合「课时级」的提醒密度。如果需要长期持久化,可以接入腾讯云 COS 或云数据库 MySQL 来存储快照。
Python 3.9,函数名称自定(如 cctalk-monitor)。将上述所有函数整合到一个 index.py 中,并导出 SCF 所需的 main_handler 入口:
def main_handler(event, context):
urls = [
'https://www.cctalk.com/m/group/xxxxxxxx',
# 添加更多关注的课程页面 URL
]
current = {}
for url in urls:
info = fetch_course_info(url)
info['status'] = infer_status(info['page_text'])
current[url] = info
previous = load_previous_snapshot()
changes = detect_changes(current, previous)
save_snapshot(current)
if changes:
for c in changes:
msg = f"[{c['new_status']}] {c['title']} - {c['url']}"
send_alert(msg)
return {'changed': len(changes), 'detail': changes}
return {'changed': 0}函数创建完成后,在「触发管理」中添加一个「定时触发器」:
0 */30 * * * * *(每 30 分钟执行一次)首次部署建议先用 */5 * * * * * *(每 5 分钟)在测试环境验证,确认逻辑无误后再改为 30 分钟以节省调用次数。
在函数配置中将「执行超时时间」调整为 30 秒(默认 3 秒对于网络请求不够用)。同时可将课程 URL 列表配置为环境变量,避免每次改完 URL 都要重新上传代码包。
检测到变更后,send_alert() 函数负责把消息推到你真正会看的渠道。以下是两种常用方案:
5.1 邮件推送(SMTP)
import smtplib
from email.mime.text import MIMEText
def send_alert(message):
msg = MIMEText(message, 'plain', 'utf-8')
msg['Subject'] = 'CCtalk 课程状态变更提醒'
msg['From'] = 'your_sender@example.com'
msg['To'] = 'your_receiver@example.com'
with smtplib.SMTP_SSL('smtp.example.com', 465) as server:
server.login('your_sender@example.com', '授权码')
server.send_message(msg)5.2 企业微信机器人 Webhook(推荐)
在企业微信群中添加一个机器人,获取 Webhook URL,直接用 requests 发送 Markdown 消息:
def send_alert(message):
url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY'
requests.post(url, json={
'msgtype': 'markdown',
'markdown': {'content': f'## CCtalk 课程提醒\n{message}'}
})无论哪种方式,记得把 Webhook URL 或邮箱密码存为 SCF 环境变量,不要硬编码在代码中。
整个服务搭完不过几十行代码,却能让你的线上学习节奏不再依赖「碰巧看到的通知」。技术服务于效率——这个脚本替你去盯,你只管到点去听。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。