Python实现Facebook发帖前检查重复内容
实现Facebook页面当日发帖前置检查方案
核心思路
通过Facebook Graph API读取目标页面的历史帖子,结合你帖子里的唯一日期标识或帖子发布时间,判断当日内容是否已发布,避免重复发帖。
具体实现步骤
1. 准备Graph API权限与令牌
- 在Facebook开发者平台创建应用,关联目标页面。
- 申请必要权限:
pages_read_engagement(读取页面帖子)、pages_manage_posts(发布帖子)。 - 获取长期页面访问令牌(短期令牌仅有效期1小时,服务器部署需长期令牌,可通过API转换生成)。
2. 调用API获取页面历史帖子
使用Python的requests库调用Graph API,获取页面近期帖子(建议取最近7天的,足够覆盖当日范围),指定需要的字段:
message:帖子文本内容(用于匹配日期标识)created_time:帖子发布时间(用于校验发布日期)
3. 实现当日帖子检查逻辑
有两种可靠的检查方式,可任选其一或结合使用:
方式一:通过帖子文本中的唯一日期匹配
因为你的帖子文本包含唯一日期(比如2024-05-20),直接遍历返回的帖子,检查message字段是否包含当日的日期字符串:
import requests from datetime import datetime # 配置信息(建议用环境变量存储,不要硬编码) PAGE_ID = "你的页面ID" ACCESS_TOKEN = "你的长期访问令牌" TODAY_DATE = datetime.today().strftime("%Y-%m-%d") # 生成当日日期字符串 def check_today_post_exists(): url = f"https://graph.facebook.com/v19.0/{PAGE_ID}/posts" params = { "fields": "message,created_time", "access_token": ACCESS_TOKEN, "limit": 20 # 取最近20条帖子,足够覆盖当日 } while True: response = requests.get(url, params=params) data = response.json() if "data" not in data: break for post in data["data"]: # 检查帖子文本是否包含当日日期 if "message" in post and TODAY_DATE in post["message"]: return True # 处理分页,如果有下一页继续请求 if "paging" in data and "next" in data["paging"]: url = data["paging"]["next"] params = {} # 下一页URL已包含所有参数,无需重复传 else: break return False
方式二:通过帖子发布时间校验
解析created_time字段(Facebook返回UTC时间),转换为你所在时区的日期,判断是否为当日:
from datetime import datetime import pytz # 需要安装pytz库:pip install pytz def check_today_post_exists_by_time(): url = f"https://graph.facebook.com/v19.0/{PAGE_ID}/posts" params = { "fields": "created_time", "access_token": ACCESS_TOKEN, "limit": 20 } # 设置目标时区,比如东八区 target_tz = pytz.timezone("Asia/Shanghai") today_start = datetime.now(target_tz).replace(hour=0, minute=0, second=0, microsecond=0) today_end = datetime.now(target_tz).replace(hour=23, minute=59, second=59, microsecond=999999) while True: response = requests.get(url, params=params) data = response.json() if "data" not in data: break for post in data["data"]: # 转换UTC时间到目标时区 post_time_utc = datetime.strptime(post["created_time"], "%Y-%m-%dT%H:%M:%S%z") post_time_local = post_time_utc.astimezone(target_tz) if today_start <= post_time_local <= today_end: return True if "paging" in data and "next" in data["paging"]: url = data["paging"]["next"] params = {} else: break return False
4. 整合到你的发帖流程
在执行下载图片、合并页眉、发帖的代码前,先调用检查函数:
if not check_today_post_exists(): # 执行你的发帖逻辑:下载图片、合并页眉、调用API发帖 print("开始发布当日帖子") else: print("当日帖子已发布,跳过")
额外注意事项
- 令牌安全:不要在代码中硬编码访问令牌,建议用Linux环境变量存储,比如
export FB_ACCESS_TOKEN="你的令牌",代码中用os.getenv("FB_ACCESS_TOKEN")获取。 - API版本:示例用v19.0,可根据Facebook最新API版本调整。
- Linux定时任务:用
crontab -e添加定时任务,比如每日8点执行:0 8 * * * /usr/bin/python3 /path/to/your/script.py - 分页处理:如果页面帖子数量多,一定要处理API的分页返回,避免漏掉早期帖子。
内容的提问来源于stack exchange,提问作者Moebius
相关产品推荐
相关产品推荐

