wo52616111 / capslock-plus

An efficiency tool that provides various functions by enhancing the Caps Lock key into a modifier key.
https://capslox.com/capslock-plus/
GNU General Public License v2.0
1.14k stars 198 forks source link

想仿造有道翻译写一个OpenAI的请求,已经能返回结果了但是发现发出的请求,中文一定是乱码。 #163

Closed zhjnerv closed 1 month ago

zhjnerv commented 1 month ago

具体的代码如下,我是外行人,完全是靠GPT,内容比较乱见谅。

#Include ../lib/lib_json.ahk ;引入json解析文件

keyFunc_OpenAI(){
    ;指定文件编码
    #Persistent
    FileEncoding, UTF-8
    ;确认function调用成功
    msgbox, "OpenAI 启动成功"
    ; 设置OpenAI API密钥
    ;OpenAI_key := "YOUR_OpenAI_key"

    ; 定义基础URL地址变量
    ;base_url := "https://api.openai.com/"

    ; 定义模型变量
    ;model := "gpt-4o-mini"

    ; 定义temperature和top_p参数
    ;temperature := 0.7
    ;top_p := 0.9

    global OpenAI_key, base_url, model, temperature, top_p

    OpenAI_key:=CLSets.TTranslate.OpenAI_key
    base_url:=CLSets.TTranslate.base_url
    model:=CLSets.TTranslate.model
    temperature:=CLSets.TTranslate.temperature
    top_p:=CLSets.TTranslate.top_p

    ;确认变量
    MsgBox, [ %OpenAI_key%, %base_url%, %model%, %temperature%, %top_p% ]

    ; 快捷键:Ctrl+Shift+O
    ;^+o::
        ; 获取光标左侧的文本
        clipboard:="" ;将剪贴板清空
        MsgBox, %clipboard% ;确认剪贴板内容清空
        SendInput, ^+{Up}
        Sendinput, ^{c}
        ClipWait, 1

        prompt := clipboard 

        if (A_IsUnicode) {
            ; 如果 AutoHotkey 运行在 Unicode 模式下,直接使用剪贴板内容
            utf8Prompt := clipboard
        } else {
            ; 如果运行在 ANSI 模式下,将剪贴板内容转换为 UTF-8 编码
            utf8Prompt := ConvertToUTF8(clipboard)
        }

        MsgBox, %utf8Prompt%

        msgbox, %prompt%

       utf8Prompt := %utf8Prompt%

        ;创建一个空对象
        data := {}

        ; 设置请求数据
        data["model"] := model
        data["messages"] := [{"role": "user","content": utf8Prompt}]
        ;data["temperature"] := temperature
        ;data["top_p"] := top_p

        ; 将data数据转换为JSON格式
        json_data := JSON.Dump(data)

        msgbox, %json_data% ;确认data数据是否正确
        ; 构建请求头
        http := ComObjCreate("WinHttp.WinHttpRequest.5.1")
        post_url := base_url . "v1/chat/completions"
        http.Open("POST", post_url)
        http.SetRequestHeader("Content-Type", "application/json")
        http.SetRequestHeader("Authorization", "Bearer " . OpenAI_key)
        http.Send(json_data)
        ; 获取响应
        response := http.ResponseText

        ; 使用 JSON.Load 解析响应 (移除 .Text)
        responseObject := JSON.Load(response)

        ; 获取助手消息内容
        result := responseObject.choices[1].message.content

        ; 显示结果
        MsgBox, %result%

        clipboard := result ;将result数据复制到剪贴板

        return result

}

ConvertToUTF8(str) {
    VarSetCapacity(utf8Str, StrPut(str, "CP0") * 2)
    StrPut(str, &utf8Str, "CP0")
    return StrGet(&utf8Str, "UTF-8")
}

以上代码,data["messages"] := [{"role": "user","content": utf8Prompt}],这一行以及

        json_data := JSON.Dump(data)

        msgbox, %json_data% ;确认data数据是否正确

上面两行,只要复制的是中文,就不行,传出去的token都是乱码的。 实在是搞不好,只能来这里求助了。

zhjnerv commented 1 month ago

在其它论坛上有好人帮我解决了, 把response := http.ResponseText改为如下内容:

arr := http.responseBody
pData := NumGet(ComObjValue(arr) + 8 + A_PtrSize)
length := arr.MaxIndex() + 1
response := StrGet(pData, length, "utf-8")