ShareGPT
一键分享你最狂野的 ChatGPT 对话。
简介
ShareGPT 是一个开源的 Chrome 扩展程序,让你可以一键分享你最狂野的 ChatGPT 对话。
功能
- 一键分享你的 ChatGPT 对话
- 浏览 sharegpt.com/explore 上的示例
- 保存你喜欢的对话以便日后查看
- 在对话中留下评论
技术栈
ShareGPT 使用以下技术栈构建:
- Next.js – 框架
- Typescript – 语言
- Tailwind – CSS
- Upstash – redis
- Planetscale – 数据库
- NextAuth.js – 身份验证
- Vercel – 托管
REST API
ShareGPT API 是 REST 风格的 API,允许你通过 HTTP 端点对我们的数据库进行读写操作。
对话端点
POST: https://sharegpt.com/api/conversations
你可以使用这个端点将新的对话添加到我们的数据库中。
首先,如果你还没有,请使用以下代码处理 ShareGPT 对话:
function conversationData() {
const threadContainer = document.querySelector(
"#__next main div:nth-of-type(1) div:nth-of-type(1) div:nth-of-type(1) div:nth-of-type(1)"
);
var result = {
avatarUrl: getAvatarImage(),
items: [],
};
for (const node of threadContainer.children) {
const markdownContent = node.querySelector(".markdown");
// tailwind 类表示是人类还是 gpt
if ([...node.classList].includes("dark:bg-gray-800")) {
result.items.push({
from: "human",
value: node.textContent,
});
// 如果是 GPT 响应,可能包含代码块
} else if ([...node.classList].includes("bg-gray-50")) {
result.items.push({
from: "gpt",
value: markdownContent.outerHTML,
});
}
}
return result;
}
function getAvatarImage() {
// 创建一个画布元素
const canvas = document.createElement("canvas");
const image = document.querySelectorAll("img")[1];
// 将画布大小设置为 30x30 像素
canvas.width = 30;
canvas.height = 30;
// 将 img 绘制到画布上
canvas.getContext("2d").drawImage(image, 0, 0);
// 将画布转换为 base64 格式的 JPEG 图片字符串
const base64 = canvas.toDataURL("image/jpeg");
return base64;
}
然后,向以上端点发送如下 payload 和请求头的 POST 请求:
const res = await fetch("https://sharegpt.com/api/conversations", {
body: JSON.stringify(conversationData),
headers: {
"Content-Type": "application/json",
},
method: "POST",
});
这将返回一个带有 id
属性的对象,该属性将是生成帖子唯一的标识符:
const { id } = await res.json();
const url = `https://shareg.pt/${id}`; // ShareGPT 帖子的短链接
GET: https://sharegpt.com/api/conversations
*请注意:*由于流量过大,此端点目前被禁用。
此端点接受 3 个可选查询参数:
type
:- 用于排序结果。
- 接受 2 个字符串值:
"new" | "top"
"new"
按创建时间排序对话"top"
按浏览次数排序对话- 如果
undefined
,则默认为"top"
page
:- 用于分页
- 接受一个整数值作为
PAGINATION_LIMIT
的倍数,该值设置为 50。 - 例如,要获取帖子 100 - 150,请将
page
设置为3
- 如果
undefined
,默认为1
search
- 用于按标题筛选记录。
- 例如,
search = "python"
返回标题中包含 "python" 的所有记录 - 如果
undefined
,搜索结果不筛选
示例:
await fetch(
"https://sharegpt.com/api/conversations?type=new&page=2&search=python"
);
这将返回一个包含以下类型的对话列表:
interface ConversationMeta {
id: string; // 对话的唯一 ID
title: string; // 对话的标题(第一个用户提示)
avatar: string; // 用户头像的 base64 编码 URI
saves: number; // 在 ShareGPT 上保存对话的次数
comments: number; // ShareGPT 上对话的评论次数
views: number; // ShareGPT 上对话的浏览次数
createdAt: Date; // 对话的创建时间戳
}
[];