Claude2 Api接入方案

news2024/12/24 3:31:37

一,实现目标

接入钉钉机器人支持群聊和私聊

网上看了很多方案,因为Claude的api申请难度非常大,大部分都是说使用Slack,但是Slack只能免费使用一个月。作为一个完美主义怎么可能允许这样的事情发生。何如处理,抓网页。

只能美,英,魔法这些都是入门小菜,这里不再赘述。自行解决。

 二,关键接口

1,获取organizationUuid

String url = "https://claude.ai/api/organizations";

2,新增会话

String url = String.format("https://claude.ai/api/organizations/%s/chat_conversations", organizationUuid);

返回 conversationUuid

3,获取单个会话

String url = String.format("https://claude.ai/api/organizations/%s/chat_conversations/%s", organizationUuid, conversationUuid);

4,获取会话列表

String url = String.format("https://claude.ai/api/organizations/%s/chat_conversations", organizationUuid);

5,删除会话

String url = String.format("https://claude.ai/api/organizations/%s/chat_conversations/%s", organizationUuid, conversationUuid);

7,发送消息

String url = "https://claude.ai/api/append_message";

三,关键代码

一下代码都是他自己生成的,活学活用。

1,请求代理

public class RestTemplateFactory {

    public static RestTemplate getRestTemplate() {
        return new RestTemplate();
    }

    public static RestTemplate getProxyRestTemplate(Integer type) {
        RestTemplateConf restTemplateConf = new RestTemplateConf();
        try {
            if (type == 1) {
                return restTemplateConf.getRestTemplateHongKong();
            } else if (type == 2) {
                return restTemplateConf.getRestTemplateWashington();
            } else if (type == 3) {
                return restTemplateConf.getProxyRestLocal();
            } else if (type == 4) {
                return restTemplateConf.getRestTemplate();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new RestTemplate();
    }

}
public class RestTemplateConf {

    private String hostname;
    private Integer port;
    private String username;
    private String password;

    public RestTemplateConf() {

    }

    private RestTemplateConf(String hostname, Integer port, String username, String password) {
        this.hostname = hostname;
        this.port = port;
        this.username = username;
        this.password = password;
    }

    public RestTemplate getRestTemplateHongKong() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
        RestTemplateConf restTemplateConf = new RestTemplateConf("xxxx", xxxx, "xxxx", "xxxx");
        return restTemplateConf.getRestTemplateProxy();
    }

    public RestTemplate getRestTemplateWashington() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
        RestTemplateConf restTemplateConf = new RestTemplateConf("xxxx", xxxx, "xxxx", "xxxx");
        return restTemplateConf.getRestTemplateProxy();
    }

    public RestTemplate getProxyRestLocal() {
        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
        // 配置代理
        HttpHost proxy = new HttpHost("127.0.0.1", 1087);
        httpClientBuilder.setProxy(proxy);

        // 配置其他HttpClient的相关参数
        RequestConfig requestConfig = RequestConfig.custom()
                // 可根据需求进行配置
                .setConnectTimeout(120000)
                .setSocketTimeout(120000)
                .build();
        httpClientBuilder.setDefaultRequestConfig(requestConfig);

        // 将配置好的HttpClient应用到RestTemplate
        return new RestTemplate(new HttpComponentsClientHttpRequestFactory(httpClientBuilder.build()));
    }

    public RestTemplate getRestTemplate() {
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        factory.setConnectTimeout(120000);
        factory.setReadTimeout(120000);
        return new RestTemplate(factory);
    }

    private RestTemplate getRestTemplateProxy() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
        // 配置其他HttpClient的相关参数
        RequestConfig requestConfig = RequestConfig.custom()
                // 可根据需求进行配置
                .setConnectTimeout(120000)
                .setSocketTimeout(120000)
                .build();
        httpClientBuilder.setDefaultRequestConfig(requestConfig);
        SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
            public boolean isTrusted(X509Certificate[] arg0, String arg1) {
                return true;
            }
        }).build();
        httpClientBuilder.setSSLContext(sslContext);
        //设置代理
        this.setProxy(restTemplate);
        //设置代理密码
        this.setCredentialsProvider(httpClientBuilder);
        HttpClient httpClient = httpClientBuilder.build();
        // httpClient连接配置
        HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
        restTemplate.setRequestFactory(clientHttpRequestFactory);
        return restTemplate;
    }


    private void setProxy(RestTemplate restTemplate) {
        SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(hostname, port));
        requestFactory.setProxy(proxy);
        restTemplate.setRequestFactory(requestFactory);
    }

    private void setCredentialsProvider(HttpClientBuilder httpClientBuilder) {
        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(
                new AuthScope(hostname, port),
                new UsernamePasswordCredentials(username, password)
        );
        HttpHost proxy = new HttpHost(hostname, port);
        httpClientBuilder.setProxy(proxy).setDefaultCredentialsProvider(credentialsProvider).disableCookieManagement();

    }

2,发送消息

/**
     * 获取问题答案
     */
    public static String getAnswer(List<Message> messages, String organizationUuid, String conversationUuid) {
        String organizations = null;
        String conversations = null;
        if (organizationUuid == null || conversationUuid == null) {
            organizations = getOrganizations();
            organizationUuid = JSONUtil.parseArray(organizations).getJSONObject(0).getStr("uuid");
            conversations = addChatConversation(organizationUuid, "问答");
            conversationUuid = JSONUtil.parseObj(conversations).getStr("uuid");
        }
        List<String> attachments = new ArrayList<>();
        if (messages.size() != 1) {
            for (int i = 0; i < messages.size() - 1; i++) {
                Message message = messages.get(i);
                if ("user".equals(message.getRole())) {
                    try {
                        sendMessage(organizationUuid, conversationUuid, messages.get(i).getContent(), attachments);
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        Message message = messages.get(messages.size() - 1);
        List<String> responses = null;
        try {
            responses = sendMessage(organizationUuid, conversationUuid, message.getContent(), attachments);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        //deleteChatConversation(organizationUuid, conversationUuid);
        return String.join("", responses).trim();

四,机器人配置

1,方案一,不能用挺久了,这种支持外部群

2,方案二 

企业内部应用 

开发者后台统一登录 - 钉钉统一身份认证

配置好即可

五,源码

项目地址,欢迎交流

java 版和 python 版都有

https://gitee.com/g7go/chat-ai

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

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

相关文章

基于Redis实现全局唯一Id

微信公众号访问地址&#xff1a;基于Redis实现全局唯一Id 推荐文章&#xff1a; 1、使用原生Redis命令实现分布式锁 ​ 2、为什么引入Redisson分布式锁&#xff1f; 3、SpringBoot整合多数据源&#xff0c;并支持动态新增与切换&#xff08;详细教程&#xff09; 4、Sprin…

【计算机网络】Udp详解

前言 上几文章我们讲解了应用层协议Http和Https&#xff0c;要知道应用层协议有很多&#xff0c;这些都是程序员自己定制的&#xff0c;而真正要传输的时候&#xff0c;是要在操作系统的传输层进行的&#xff0c;今天我们就来学习一下传输层协议Udp的 标识一个通信 要进行跨…

黑马项目一阶段面试 自我介绍篇

面试官你好&#xff0c;我叫xxx&#xff0c;是来自xxxx的本科毕业生。我通过招聘网站/内推/线下招聘了解到的贵司&#xff0c;我具有扎实的Java后端的基础功底&#xff0c;基本掌握JavaSE、JavaEE流行技术的使用&#xff0c;并且我比较好学&#xff0c;心态也很乐观积极&#x…

docker nginx ssl设置

使用docker运行nginx&#xff0c;配置代理&#xff0c;和ssl设置&#xff0c;进行https访问 一 准备 本次在centos环境中 1.已安装docker&#xff0c;docker-compose 2.运行了一个后端服务容器&#xff0c;提供基本的接口访问【可选】 3.一个域名&#xff08;已经解析到服…

Linux命令200例:date用于显示和设置系统的日期和时间

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

MongoDB 更新文档(更新数组对象中的元素)

之前我们介绍了如何更新文档&#xff0c;并简单的介绍了更新文档时可以使用选项进行指定当更新内容不存在时&#xff0c;可以进行新增文档。具体可以参考&#xff1a; MongoDB 更新文档(更新一条文档)https://blog.csdn.net/m1729339749/article/details/129983304 最近遇到了…

Android实现超出固定行数折叠文字“查看全文“、“收起全文“

先上效果图 分析问题 网上有很多关于这个的代码&#xff0c;实现都过于复杂了&#xff0c;github上甚至还看到一篇文章600多行代码&#xff0c;结果一跑起来全是bug。还是自己写吧&#xff01;&#xff01;&#xff01; 如果我们需要换行的"查看全文"、"收起全…

用汇编指令求两个数的最大公约数 求for循环实现1~100

1.用汇编指令求两个数的最大公约数 2.用汇编指令求for循环实现1~100

【校招VIP】测试计划之黑盒测试白盒测试

考点介绍&#xff1a; 黑盒测试&白盒测试是大厂和三四线公司校招的必考点。黑盒是以结果说话&#xff0c;白盒往往需要理解实现逻辑。现在商业项目的接口测试往往以白盒为主&#xff0c;也就是需要测试同学自己观察和修改数据库的值进行用例的测试。 但是无论采用哪种测试方…

尚硅谷大数据项目《在线教育之离线数仓》笔记001

视频地址&#xff1a;尚硅谷大数据项目《在线教育之离线数仓》_哔哩哔哩_bilibili 目录 P003 P004【数仓概念讲的颇为详细】 P018 P019 P020 P021 P022 P023 P024 P003 时间切片&#xff1a;时间回溯&#xff0c;找回以前的数据。 P004【数仓概念讲的颇为详细】 核心架…

华为OD机试 - 数据最节约的备份方法 - 二分查找(Java 2023 B卷 100分)

目录 一、题目描述二、输入描述三、输出描述四、解题思路解题思路如下&#xff1a;解题思路分析&#xff1a; 五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 一、题目描述 有若干个文件&#xff0c;使用刻录光盘…

14k字综述视觉大模型

目录 0.导读1.背景介绍1.1基础架构1.2目标函数1.2.1对比式学习1.2.2生成式学习1.3预训练1.3.1预训练数据集1.3.2微调1.3.3提示工程2.基于文本提示的基础模型2.1基于对比学习的方法2.1.1基于通用模型的对比方法2.1.2基于视觉定位基础模型的方法2.2基于生成式的方法2.3基于对比学…

考公-判断推理-逻辑判断

且和或 只能有一个人是我老婆&#xff0c;要么小红&#xff0c;要么小丽&#xff0c;不可能都是我老婆&#xff0c;虽然有些人心里是这么想的 虽然&#xff0c;但是&#xff0c;且 虽然我很丑&#xff0c;但是我很温柔 或的翻译&#xff0c;否一推一 例题 例题 德摩根 例题…

数据可视化工具的三大类报表制作流程分享

电脑&#xff08;pc&#xff09;、移动、大屏三大类型的BI数据可视化报表制作步骤基本相同&#xff0c;差别就在于尺寸调整和具体的报表布局。这对于采用点击、拖拉拽方式来制作报表的奥威BI数据可视化工具来说就显得特别简单。接下来&#xff0c;我们就一起看看不这三大类型的…

全网最全360无死角编写软件测试用例模板【建议收藏】

总体编写策略&#xff1a; 对于测试用例编写来说&#xff0c;常用的四种方法基本就够用了&#xff0c;等价类、边界值、正交实验法、错误推断法&#xff0c;辅以场景测试法、需求/设计转换法、探索式测试思想&#xff0c;可以应付绝大多数产品的测试。个别的产品还需要在某一点…

nestjs 基础、使用 passport 来进行鉴权

回顾一些定义 NestJS 部分 Module 模块结构 模块是一个图状引用关系。 模块的实例化有三种模式。默认情况是 singletones 模式&#xff0c;也就是模块可能被引用&#xff0c;但不同的引用处拿的是同一个共享实例&#xff0c;也就是说一个进程有一个唯一的实例被共享。 模块&a…

动态设备状态监测:智能化生产的关键利器

动态设备状态监测正引领着工业生产的智能化转型。本文将深入探讨动态设备状态监测的意义、PreMaint在其中的角色&#xff0c;以及如何实现智能化生产&#xff0c;提高生产效率和可靠性。 1. 动态设备状态监测的重要性 随着制造业的发展&#xff0c;设备的状态监测变得至关重要…

小程序制作教程:从零开始搭建企业小程序

在如今的数字化时代&#xff0c;企业介绍小程序成为了企业展示与推广的重要工具。通过企业介绍小程序&#xff0c;企业可以向用户展示自己的品牌形象、产品服务以及企业文化等内容&#xff0c;进而提高用户对企业的认知度和信任度。本文将介绍如何从零开始搭建一个企业介绍小程…

基于深度信念网络的西储大学轴承故障分类识别,基于EMD+DBN的西储大学轴承故障识别,LCD+DBN,LMD+DBN

目录 背影 DBN神经网络的原理 DBN神经网络的定义 受限玻尔兹曼机(RBM) (EMD,LCD,LMD)+DBN的深度信念网络的西储大学轴承故障分类识别 基本结构 主要参数 数据 MATALB代码 结果图 展望 背影 DBN是一种深度学习神经网络,拥有提取特征,非监督学习的能力,是一种非常好的分类…

都说go协程性能好,这次我们来试试java协程

java 协程原理 在Java中&#xff0c;协程&#xff08;Coroutine&#xff09;是一种轻量级的线程解决方案&#xff0c;它可以在代码中实现类似于多线程的并发操作&#xff0c;但不涉及线程的创建和切换开销。 在传统的Java多线程编程模型中&#xff0c;线程的切换开销较大&…