如何实现Facebook聊天机器人自动收集信息并生成推送文档?
嘿,咱们一步步来拆解你的问题,给你实用的可落地方案:
一、如何通过Facebook聊天机器人生成doc/pdf格式的文档?
Facebook Messenger机器人本身并不具备直接生成文档的能力,得靠后端服务配合完成。核心流程是:机器人收集用户数据 → 后端用文档生成库创建文件 → 上传文件到Facebook附件系统 → 通过Messenger API发送给用户,具体步骤如下:
1. 搭建后端服务,对接Messenger Platform
首先需要一个后端服务(比如Python的Flask/Django,或Node.js的Express)来接收Messenger的Webhook事件,获取用户消息和数据。这一步要在Facebook开发者平台配置Webhook,验证后端地址,并拿到Page Access Token用于调用Send API。
2. 选择合适的文档生成库
根据目标文档类型选对应的工具:
- PDF生成:Python推荐
ReportLab(适合自定义排版)或pdfkit(HTML转PDF,适配网页模板场景);Node.js可选用pdf-lib或html-pdf。 - DOCX生成:Python用
python-docx(支持模板替换、样式设置);Node.js用docx库。
3. 生成文档(Python示例)
生成Word文档
from docx import Document from docx.shared import Pt # 创建新文档或加载预设模板 doc = Document() # 用用户信息填充内容 doc.add_heading('用户信息登记表', level=1) doc.add_paragraph(f'姓名: 张三') doc.add_paragraph(f'邮箱: zhangsan@example.com') doc.add_paragraph(f'电话: 138xxxx1234') # 设置字体样式 for paragraph in doc.paragraphs: for run in paragraph.runs: run.font.size = Pt(12) run.font.name = '微软雅黑' # 保存文档 doc.save('user_info.docx')
生成PDF文档(需提前安装wkhtmltopdf工具)
import pdfkit # 用HTML模板生成PDF html_content = """ <h1>用户信息登记表</h1> <p>姓名: 张三</p> <p>邮箱: zhangsan@example.com</p> """ pdfkit.from_string(html_content, 'user_info.pdf')
4. 上传文件并发送给用户
生成文档后,需先上传到Facebook的附件API拿到attachment_id,再通过Send API发送给用户:
import requests PAGE_ACCESS_TOKEN = '你的Page Access Token' RECIPIENT_ID = '用户的PSID(Facebook用户唯一标识)' # 上传PDF文件 upload_url = f'https://graph.facebook.com/v18.0/me/message_attachments?access_token={PAGE_ACCESS_TOKEN}' files = {'file': open('user_info.pdf', 'rb')} data = {'message': '{"attachment":{"type":"file","payload":{}}}'} response = requests.post(upload_url, files=files, data=data) attachment_id = response.json()['attachment_id'] # 发送文件给用户 send_url = f'https://graph.facebook.com/v18.0/me/messages?access_token={PAGE_ACCESS_TOKEN}' send_data = { 'recipient': {'id': RECIPIENT_ID}, 'message': { 'attachment': { 'type': 'file', 'payload': {'attachment_id': attachment_id} } } } requests.post(send_url, json=send_data)
二、实现自动收集信息、填充表单、生成文档回传的完整流程
你目前已经能收集信息并发送邮箱,但需要手动填表单,要实现自动化核心是把「收集信息→填充模板→生成文档→回传用户」串联起来,具体步骤:
1. 设计对话流,自动收集用户信息
用Messenger的**快速回复(Quick Replies)或持久菜单(Persistent Menu)**引导用户分步提供信息(姓名、邮箱、电话等),后端用数据库(比如SQLite、PostgreSQL)存储用户数据,以用户PSID作为唯一标识。
示例对话流处理(Flask后端):
from flask import Flask, request, jsonify import sqlite3 import requests from docx import Document app = Flask(__name__) PAGE_ACCESS_TOKEN = '你的Page Access Token' # 初始化用户数据数据库 def init_db(): conn = sqlite3.connect('user_data.db') c = conn.cursor() c.execute('''CREATE TABLE IF NOT EXISTS users (psid TEXT PRIMARY KEY, name TEXT, email TEXT, phone TEXT)''') conn.commit() conn.close() init_db() @app.route('/webhook', methods=['POST']) def webhook(): data = request.get_json() psid = data['entry'][0]['messaging'][0]['sender']['id'] message = data['entry'][0]['messaging'][0]['message']['text'] conn = sqlite3.connect('user_data.db') c = conn.cursor() user = c.execute('SELECT * FROM users WHERE psid = ?', (psid,)).fetchone() if not user: # 首次对话,请求姓名 send_message(psid, "你好!请告诉我你的姓名~") c.execute('INSERT INTO users (psid) VALUES (?)', (psid,)) elif not user[1]: # 保存姓名,请求邮箱 c.execute('UPDATE users SET name = ? WHERE psid = ?', (message, psid)) send_message(psid, "感谢!请告诉我你的邮箱地址~") elif not user[2]: # 保存邮箱,请求电话 c.execute('UPDATE users SET email = ? WHERE psid = ?', (message, psid)) send_message(psid, "好的!最后请告诉我你的联系电话~") else: # 信息收集完成,生成并发送文档 c.execute('UPDATE users SET phone = ? WHERE psid = ?', (message, psid)) user_data = c.execute('SELECT * FROM users WHERE psid = ?', (psid,)).fetchone() generate_and_send_document(psid, user_data) send_message(psid, "已为你生成用户信息文档,点击下方下载即可~") conn.commit() conn.close() return jsonify({'status': 'ok'}) def send_message(psid, text): # 发送文本消息的工具函数 url = f'https://graph.facebook.com/v18.0/me/messages?access_token={PAGE_ACCESS_TOKEN}' data = {'recipient': {'id': psid}, 'message': {'text': text}} requests.post(url, json=data) def generate_and_send_document(psid, user_data): # 生成文档并发送 doc = Document() doc.add_heading('用户信息登记表', level=1) doc.add_paragraph(f'姓名: {user_data[1]}') doc.add_paragraph(f'邮箱: {user_data[2]}') doc.add_paragraph(f'电话: {user_data[3]}') doc_path = f'{psid}_user_info.docx' doc.save(doc_path) # 上传文档到Facebook并发送 upload_url = f'https://graph.facebook.com/v18.0/me/message_attachments?access_token={PAGE_ACCESS_TOKEN}' files = {'file': open(doc_path, 'rb')} data = {'message': '{"attachment":{"type":"file","payload":{}}}'} response = requests.post(upload_url, files=files, data=data) attachment_id = response.json()['attachment_id'] send_url = f'https://graph.facebook.com/v18.0/me/messages?access_token={PAGE_ACCESS_TOKEN}' send_data = { 'recipient': {'id': psid}, 'message': {'attachment': {'type': 'file', 'payload': {'attachment_id': attachment_id}}} } requests.post(send_url, json=send_data)
2. 用模板填充表单(高效优化方案)
如果表单有固定格式,建议预先制作DOCX/PDF模板,用占位符(比如{{name}}、{{email}})代替需填充的内容,后端直接替换占位符生成文档,比动态创建内容更高效:
from docxtpl import DocxTemplate # 加载预设模板 doc = DocxTemplate('user_template.docx') # 准备填充数据 context = { 'name': user_data[1], 'email': user_data[2], 'phone': user_data[3] } # 替换占位符并保存 doc.render(context) doc.save(f'{psid}_user_info.docx')
3. 错误处理与优化
- 信息校验:对邮箱、电话等格式做校验,不符合时引导用户重新输入;
- 超时提醒:用户中途停止对话时,一段时间后发送提醒消息;
- 文件清理:文档发送完成后删除服务器上的临时文件,避免占用存储空间。
内容的提问来源于stack exchange,提问作者Rohalt




