利用ChatGPT开源api开发一个聊天库

准备工作

第一步:注册OpenAI账号,如果搭建了科学还是提示不对你的国家提供服务的话,尝试清空浏览器缓存或者打开浏览器的无痕窗口。Chrome默认在右上角三个点打开就能找到“打开新的无痕式窗口”。

ChatGPT聊天库代码示例

1.网页获取所需token和Cookie

我们需要三个东西:UserAgent,CfClearance,Session_token

我们需要先打开ChatGPT官方网站:https://chat.openai.com/chat 然后按下F12打开浏览器的开发者模式

UserAgent在网络里(只需要复制UserAgent:后面的值):

CfClearance和Session_token在应用程序->cookie里面

2.创建一个session用来表示一个会话

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public OpenAISession(string session_token,string cfClearance,string userAgent)
{
    Session_token = session_token;
    CfClearance = cfClearance;
    UserAgent = userAgent;
    Headers = new Dictionary<string, string>();
    Cookies = new Dictionary<string, string>();
    Proxies = new Dictionary<string, string>();
}
Session可以刷新自己的AccessToken和Session_token
public async Task RefreshSessionAsync()
{
    if (string.IsNullOrEmpty(Session_token))
    {
        throw new Exception("No tokens provided");
    }
    // Set cookies
    Cookies.Put("__Secure-next-auth.session-token", Session_token);
    Cookies.Put("cf_clearance", CfClearance);
    string cookiesString = GetCookiesString();
    Dictionary<string, string> map = new Dictionary<string, string>();
    Headers.Put("User-Agent", UserAgent);
    Headers.Put("cookie", cookiesString);
    Headers.Put("Cookie", cookiesString);
    var response = await GetAsync("https://chat.openai.com/api/auth/session");
    if (!response.IsSuccessStatusCode)
    {
        Console.WriteLine("err code: " + response.StatusCode);
        Console.WriteLine("cf_clearance: " + CfClearance);
        Console.WriteLine("token: " + Session_token);
        Console.WriteLine("userAgent: " + UserAgent);
        Console.WriteLine("请检查以上参数是否正确,是否过期。");
        throw new Exception("无法获取token!请重试");
    }
    try
    {
        string name = "__Secure-next-auth.session-token=";
        var cookies = response.Headers.GetValues("Set-Cookie");
        var stoken = cookies.FirstOrDefault(x => x.StartsWith(name));
        Session_token = stoken == null ? Session_token : stoken.Substring(name.Length, stoken.IndexOf(";"- name.Length);
        Cookies.Put("__Secure-next-auth.session-token", Session_token);
        var result = await response.Content.ReadAsStringAsync();
        AccessToken = JsonSerializer.Deserialize<Profile>(result, _jsonSerializerOptions)?.AccessToken;
        RefreshHeaders();
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error {nameof(RefreshSessionAsync)}:{ex}");
        throw new Exception($"Error {nameof(RefreshSessionAsync)}", ex);
    }
}

获取到的最新的AccessToken更新到header里,Session_token更新到cookie里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void RefreshHeaders()
{
    Headers.Put("Host""chat.openai.com");
    Headers.Put("Accept""text/event-stream");
    Headers.Put("Authorization", $"Bearer {AccessToken}");
    Headers.Put("User-Agent", UserAgent);
    Headers.Put("X-Openai-Assistant-App-Id", string.Empty);
    Headers.Put("Connection""close");
    Headers.Put("Accept-Language""en-US,en;q=0.9");
    Headers.Put("Referer""https://chat.openai.com/chat");
}
string name = "__Secure-next-auth.session-token=";
var cookies = response.Headers.GetValues("Set-Cookie");
var stoken = cookies.FirstOrDefault(x => x.StartsWith(name));
Session_token = stoken == null ? Session_token : stoken.Substring(name.Length, stoken.IndexOf(";"- name.Length);
Cookies.Put("__Secure-next-auth.session-token", Session_token);

爱搜源码 » 利用ChatGPT开源api开发一个聊天库

发表评论

发表评论