ChatGPT实战-构建文章分析AI聊天机器人

news2024/11/27 10:40:28

视频版本:

ChatGPT实战-构建文章分析AI聊天机器人

简介

本文实现如下功能:

当浏览一篇文章,点击分享,分享到聊天软件的对话框中。它就会生成一个文章的总结和分析结果。例如分析是否有逻辑问题,是否有诱导购买,是否有焦虑制造。

一起来看看怎么实现的吧。

这里以飞书机器人为例,当然你也可以用别的平台,例如微信、钉钉。

整体方案介绍

方案

  1. 首先,用户将文章链接发送给飞书聊天机器人;
  2. 飞书通过事件订阅将内容发给机器人服务端;
  3. 服务端收到链接后访问网址获取内容,并调用chatgpt接口进行总结;
  4. 将总结后的内容回复给用户。

下面我们来一步步实现。

前置准备

在开始之,你需要准备好ChatGPT的API访问key和一台web服务器。

准备web服务器的时候,需要注意安全问题。例如服务器关闭root登录,禁止密码登录。采用ssh key的方式进行登录。

然后防火墙需要在云厂商的控制台开启。不然外部无法访问。

代码

在github中也可以找到:shanchuantian/paper_analyze_bot.git
有三个文件,入口在main.py中。
main.py

import json
import uuid

import requests
from fastapi import FastAPI
from fastapi.params import Body
from fastapi import BackgroundTasks

from openai import chat
from parse_wexin_paper import get_paper_content

app = FastAPI()


@app.get("/")
def root():
    return {"message": "Hello World"}


def get_tenant_access_token():
    url = 'https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal'
    body = {

        "app_id": "cli_xxx",  # todo 可以将其放入环境变量中,不能泄漏!!!!
        "app_secret": "jwxxx"  # todo 可以将其放入环境变量中,不能泄漏!!!!
    }
    res = requests.post(url, json=body)
    return res.json().get('tenant_access_token')


def send_response(message_id, text_content):
    # 回复消息
    url = f'https://open.feishu.cn/open-apis/im/v1/messages/{message_id}/reply'
    res_content = {
        "text": text_content
    }
    response = {
        "content": json.dumps(res_content),
        "msg_type": "text",
        "uuid": str(uuid.uuid4())
    }
    token = get_tenant_access_token()
    headers = {
        'Authorization': f'Bearer {token}',
        'Content-Type': f'application/json; charset=utf-8'
    }
    print(f'response url:{url}, header:{headers}, data:{response}')
    requests.post(url, headers=headers, json=response)


def handle_task(payload):
    # 用户发过来的消息
    content = payload.get('event').get('message').get('content')
    print(f'content:{content}')
    # 获取文章内容
    paper_content = get_paper_content(json.loads(content).get('text'))
    prompt = f"""我会给你一篇由<<begin>>和<<end>>包含的文章,请完成如下任务:
    1.总结一下文章,以列表的形式输出关键要点,保持语句通顺,简单易懂。
    2.分析文章中是否有逻辑问题,如果有请依次列出问题,写在下面的【逻辑问题列表】中,没有则保持空。
    3.分析文章中是否有诱导读者购买课程、商品等行为,如果有请写在下面的【诱导购买列表】中,没有则保持空。
    4.分析文章中是否有焦虑制造倾向,如果有请写在下面的【焦虑制造列表】中,没有则保持空。

    严格按照如下格式输出:
    【总结】
    这里放总结内容。
    【逻辑问题列表】
    在这里列出逻辑问题。
    【诱导购买列表】
    在这里列出诱导购买内容。
    【焦虑制造列表】
    在这里放焦虑制造内容。

    这是文章:
    <<begin>>
    {paper_content}
    <<end>>"""
    print(f'prompt:{prompt}')
    # 调用ChatGPT进行总结
    summary = chat(prompt)
    message_id = payload.get('event').get('message').get('message_id')
    # 回复消息
    send_response(message_id, summary)


@app.post("/")
async def say_hello(background_tasks: BackgroundTasks, payload: dict = Body(...)):
    # 检测到CHALLENGE标记就直接返回,以通过飞书的接入
    challenge = payload.get('CHALLENGE')
    if challenge:
        print(f'CHALLENGE flag is exist, return it.')
        return payload
    # print(f'payload:{json.dumps(payload)}')
    # feishu要求1秒内返回,所以此处起一个后台任务处理
    background_tasks.add_task(handle_task, payload)
    print('###### i will return immediately。。。')
    return ''


if __name__ == '__main__':
    get_tenant_access_token()

openai.py

import requests

url = "https://openai.api2d.net/v1/chat/completions"

headers = {
  'Content-Type': 'application/json',
    # todo 不能泄漏
  'Authorization': 'Bearer fkxxx' # <-- 把 fkxxxxx 替换成你自己的 Forward Key,注意前面的 Bearer 要保留,并且和 Key 中间有一个空格。
}


def chat(content, role='user', model='gpt-3.5-turbo'):
    data = {
      "model": model,
      "messages": [{"role": role, "content": content}]
    }
    print('start chat to chatgpt....')
    response = requests.post(url, headers=headers, json=data)
    print("ChatGPT Status Code", response.status_code)
    print("ChatGPT JSON Response ", response.json())
    return response.json().get('choices')[0].get('message').get('content')

if __name__ == '__main__':
    content = '你好'
    chat(content=content)

parse_wexin_paper.py

import requests
from lxml import etree
import os


def get_paper_content(url):
    html = requests.get(url).text
    # print(f'html:{html}')
    con = etree.HTML(html)

    # 获取标题
    h2 = con.xpath('//h1[@class="rich_media_title "]/text()')
    h2 = ",".join(map(str, h2))
    h2 = os.linesep.join([s for s in h2.splitlines(True) if s.strip()])
    h2 = h2.rstrip()  # 去除右空行
    print(f'h2:{h2}')
    # print(h2)

    # 获取正文
    p_text = ''
    span = con.xpath('//p | //section/span')  # 通过‘|’可以增加筛选的条件
    print(f'span:{span}')
    # print(span)
    for p_tex in span:
        p_tex = p_tex.xpath('string(.)')
        p_text = p_text + p_tex + '\n'
        # print(p_tex)
    # print(p_text)

    # 保存内容
    con_text = '%s%s%s%s' % (h2, '\n', p_text, '\n')
    return con_text


if __name__ == '__main__':
    # url = input("请输入要采集的微信公众号文章地址:")
    url = "https://mp.weixin.qq.com/s/xxx"
    get_paper_content(url)

我们通过fast API这个web框架来实现web服务。在这里我们需要实现两个功能:

一个是接入服务功能,另一个是我们的业务逻辑。

运行服务可以直接通过uvicorn 运行:

uvicorn main:app --host 0.0.0.0 --port 7011

飞书权限申请

主要是在飞书开放平台申请应用,然后添加权限,事件订阅发布版本。(截图太多了,上面视频中有详细介绍)

接下来就可以愉快的进行使用啦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1028848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SSM+Vue的在线购书商城系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

浅谈 React 与 Vue 更新机制的差异

前言 哈喽&#xff0c;大家好&#xff0c;我是 Baker &#xff01;&#x1f389; 对于前端的 Vue 和 React 相信大家并不陌生&#xff0c;这两个库有着截然不同的设计思想和发展目标&#xff0c;对于我们上层使用者来说&#xff0c;研究它们的差异不仅让我们更加深入的去理解…

使用自定义插槽(slot)来将数据传递给插槽内容。el-step

description为描述性文字&#xff0c;需使用slot来自定义文字。 A 是 Vue 3 中的语法糖&#xff0c;用于简洁地定义插槽。用来绑定step组件中description。step可使用插槽 B是绑定date数据实现自定义描述文字。

VoxWeekly|The Sandbox 生态周报|20230918

欢迎来到由 The Sandbox 发布的《VoxWeekly》。我们会在每周发布&#xff0c;对上一周 The Sandbox 生态系统所发生的事情进行总结。 如果你喜欢我们内容&#xff0c;欢迎与朋友和家人分享。请订阅我们的 Medium 、关注我们的 Twitter&#xff0c;并加入 Discord 社区&#xf…

linux安装配置 flume

目录 一 解压安装包 二 配置部署 &#xff08;1&#xff09;修改配置 &#xff08;2&#xff09;下载工具 &#xff08;3&#xff09;创建配置文件 &#xff08;4&#xff09;启动监听测试 &#xff08;5&#xff09;flume监控文件 一 解压安装包 这里提供了网盘资源 链…

狂热过后,RPA到底是什么?

随着科技的不断进步&#xff0c;人工智能正在逐步渗透到各个领域&#xff0c;并不断演变&#xff0c;成为更加便捷的方式步入万家&#xff0c;让科技的变革的春风吹入了千行百业&#xff0c;落入千家万户。而“RPA”&#xff08;Robotic Process Automation&#xff0c;即机器人…

视频去LOGO的方法,AI自动完美地去除视频LOGO

喜欢做影视剧剪辑的朋友&#xff0c;可能会遇到下载的影视剧本身存在字幕、台标的情况&#xff0c;这些和新的剪辑主题不相符的原片元素&#xff0c;都会影响我们最终的成片效果。不过也无需烦恼哦&#xff0c;我们可以利用AI视频处理工具&#xff0c;自动去除视频中的logo或其…

6个超好用的团队任务管理工具,帮你解决团队工作任务“杂乱难”

当团队面临大量任务和复杂工作时&#xff0c;任务管理往往变得杂乱且困难。为了提高团队效率和组织能力&#xff0c;许多团队都在寻找适合他们需求的任务管理工具。在这篇文章中&#xff0c;我们将介绍6个超级好用的团队任务管理工具&#xff0c;它们可以帮助团队更好地组织、分…

【Redis】第1讲 互联网架构的演变历程

第1阶段 数据访问量不大&#xff0c;简单的架构就可以&#xff01; 第2阶段 数据访问量大&#xff0c;使用缓存技术缓存数据库的压力&#xff0c;不同的业务访问不同的数据库。 第3阶段 之前的缓存技术确实能够缓解数据库的压力&#xff0c;但是写和读都集中在一个数据库上&…

PLC串口通讯和通讯接口知识汇总

在使用PLC的时候会接触到很多的通讯协议以及通讯接口&#xff0c;最基本的PLC串口通讯和基本的通讯接口你都了解吗&#xff1f; 一、什么是串口通讯&#xff1f; 串口是一种接口标准&#xff0c;是计算机上一种非常通用设备通信的协议。它规定了接口的电气标准&#xff0c;没…

国家加快培育数据要素市场的重要意义是什么

加快培育数据要素市场 中国大数据发展趋势如何?据工业和信息化部官网9月29日消息&#xff0c;9月28日&#xff0c;2021全国大数据标准化工作会议在山东省济南市召开。工信部信发司副司长王建伟参加会议并致辞。当前&#xff0c;数据已成为重要的生产要素&#xff0c;是加快经…

buuctf-[网鼎杯 2020 朱雀组]phpweb

1.打开网站&#xff0c;吓我一跳 2.查看源代码&#xff0c;主要看到timezone&#xff0c;然后这个页面是五秒就会刷新一次 一开始去搜了这个&#xff0c;但是没什么用 3.使用bp抓包 会发现有两个参数&#xff0c;应该是用func来执行p 4.修改func和p file_get_contents&#…

linux离线安装glibc.i686

一、下载相关rpm包 链接&#xff1a;https://pan.baidu.com/s/1Of1myRZa2ClrlSYw43OR3Q 提取码&#xff1a;hlsq 二、将相关rpm包复制到服务器上 三、执行sh install.sh即可

iOS“超级签名”绕过App Store作弊解决方案

一直以来&#xff0c;iOS端游戏作弊问题都是游戏行业的一大痛点。在当下游戏多端互通的潮流下&#xff0c;游戏作为一个整体&#xff0c;无论哪一端出现安全问题&#xff0c;都会造成更加严重的影响。因此&#xff0c;iOS端游戏安全保护也同样十分重要。 iOS独特的闭源生态&am…

SpringBoot2.7.14整合Swagger3.0的详细步骤及容易踩坑的地方

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Sp…

基于C#的AE二次开发之IQueryFilter接口、ISpatialFilter接口、IQueryDef 接口的查询接口的介绍

一、开发环境 开发环境为ArcGIS Engine 10.2与Visual studio2010。在使用ArcEngine查询进行查询的时候主要使用三种查询接口IQueryFilter&#xff08;属性查询&#xff09; 、ISpatialFilter&#xff08;空间查询&#xff09; 、IQueryDef &#xff08;多表查询&#xff09; 那…

js 事件流、事件冒泡、事件捕获、阻止事件的传播

事件流 js 事件的执行过程分为捕获阶段&#xff08;由外层节点传播到内层节点&#xff09;和冒泡阶段&#xff08;由内层节点传播到外层节点&#xff09;&#xff0c;即先执行捕获阶段的代码&#xff0c;后执行冒泡阶段的代码 事件冒泡 js 事件中的代码默认在冒泡阶段执行&…

滚动渐变导航栏

实现导航栏固定顶部&#xff0c;且滚动渐变的效果 实现效果 准备html vscode可利用快捷输入 header>aul>li*3>atab <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport"…

ULID 在 Java 中的应用: 使用 `getMonotonicUlid` 生成唯一标识符

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

【Java】防沉迷实名认证系统接口测试代码(已全示例通过)

下面的代码以及置顶文件使用并修改了作者:jsppqq.com的开源代码&#xff0c;只作学习使用&#xff0c;侵删 背景&#xff1a; 在接入Taptap的防沉迷实名认证前&#xff0c;需要先通过国家防沉迷实名认证系统的接口测试&#xff0c;要求全部示例通过才能允许使用接口&#xff1…