You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何实现Facebook聊天机器人自动收集信息并生成推送文档?

嘿,咱们一步步来拆解你的问题,给你实用的可落地方案:

关于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-libhtml-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

火山引擎 最新活动