ChatGPT联网实现【完整代码+调用方式】

接口代码

<?php
header("Content-Type:application/json;charset=utf-8");
date_default_timezone_set('Asia/Shanghai');
header("Access-Control-Allow-Origin: *");
ob_start(); // 开启输出缓冲



function send_post_lw($post_data) {
    
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,"https://lite.duckduckgo.com/lite/");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate');
    $headers = array();
    $headers[] = "Host: lite.duckduckgo.com";
    $headers[] = "Content-Type: application/x-www-form-urlencoded";
    $headers[] = "Origin: https://lite.duckduckgo.com";
    $headers[] = "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0";
    $headers[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8";
    $headers[] = "Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2";
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    $result = curl_exec($ch);
    if (curl_errno($ch)) {
    
    
        $content=array(
            'code' => "500",
            'msg' => "访问出错");
        print_r(json_encode($content,JSON_NUMERIC_CHECK|JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES));
        exit();
    }
    curl_close($ch);
    return $result;
}
function calculate_cost($num_tokens){
    
    
    $cost_per_token = 0.000048;
    $total_cost = $num_tokens * $cost_per_token;
    return $total_cost;
}
function send_post_json($jsonStr,$key)
{
    
    
    $timeout = 120;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_URL, "https://api.openai.com/v1/chat/completions");
    curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonStr);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT, $timeout);
    $headers = array();
    $headers[] = "Host: api.openai.com";
    $headers[] = "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0";
    $headers[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8";
    $headers[] = "Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2";
    $headers[] = "Content-Type: application/json;charset=utf-8";
    $headers[] = "Authorization: Bearer ".$key;
    curl_setopt($ch, CURLOPT_HTTPHEADER,$headers);
    $result = curl_exec($ch);
    if (curl_errno($ch)) {
    
    
        $content=array(
            'code' => "500",
            'msg' => "访问出错");
        print_r(json_encode($content,JSON_NUMERIC_CHECK|JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES));
        exit();
    }
    curl_close($ch);
    return $result;
}



@$message=$_REQUEST['message'];

if(empty($message)){
    
    
    $content = array(
        'code' => "203",
        'msg' => "请输入待回答的问题"
    );
    print_r(json_encode($content, JSON_NUMERIC_CHECK|JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES));
    exit();
} else {
    
    

    ob_flush();
    flush();
    
    $message_bm = urlencode($message);
    $post_data = "q=$message_bm&df=&kl=cn-zh";
    $data = send_post_lw($post_data);

  
    ob_flush();
    flush();

    preg_match_all("/<a rel=\"nofollow\" href=\"(.*?)\" class=\'result-link\'>.*<\/a>/", $data, $urlss);
    preg_match_all("/<td class=\'result-snippet\'>\s*(.*?)\s*<\/td>/", $data, $contentss);
    $urls = $urlss[1];
    $contents = $contentss[1];
    $array = array();
    $date = date('Y/m/d');
    for($i=0; $i<3; $i++){
    
    
        $js = $i + 1;
        $content = $contents[$i];
        $url = $urls[$i];
        $content_bq = strip_tags($content);
        $string = "[$js]:\"$content_bq\"\nURL:$url";
        array_push($array, $string);
    }
    $allcontents = implode("\n\n", $array);
    $resultwb = "Web search results:\n\n" . $allcontents . "\n\nCurrent date:$date\n\nInstructions: Using the provided web search results, write a comprehensive reply to the given query. If the provided search results refer to multiple subjects with the same name, write separate answers for each subject.\n\nQuery: $message\n\nReply in 中文";

    ob_flush();
    flush();

    if (array_key_exists('key', $_GET)) {
    
    
        $keys = $_GET['key'];
    } else {
    
    
        $keys = "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";
    }

    $postdata = array(
        'model' => "gpt-3.5-turbo-16k",
        'messages' => array(
            array(
                'role' => "user",
                'content' => "$resultwb"
            )
        ),
        'temperature' => 0.7
    );

    $jsonStr = json_encode($postdata);
    $data = send_post_json($jsonStr, $keys);


    ob_flush();
    flush();

    $jsondata = json_decode($data,true);
    $choices = $jsondata['choices'][0]['message']['content'];
    if(empty($choices)){
    
    
        $content = array(
            'code' => "201",
            'msg' => "获取失败,请联系站长(key失效)"
        );
        print_r(json_encode($content,JSON_NUMERIC_CHECK|JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES));
    } else {
    
    
        $tokens = $jsondata['usage']['total_tokens'];
        $money = calculate_cost($tokens);
        $content = array(
            'code' => "200",
            'msg' => "获取成功",
            'total_money' => "$money",
            'message' => "$message",
            'answer' => "$choices"
        );
        print_r(json_encode($content,JSON_NUMERIC_CHECK|JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES));
    }
}
ob_end_flush(); // 结束输出缓冲
?>

调用方式

# coding=utf-8
import requests
import json

def ask_question(question):
    base_url = "你部署的接口地址"
    response = requests.get(base_url, params={
    
    "message": question}, stream=True)

    # 检查响应状态
    if response.status_code != 200:
        return {
    
    "error": f"API responded with status code {response.status_code}"}

    # 处理流式输出
    content = []
    for chunk in response.iter_content(chunk_size=None):  # 使用None来读取整个内容块
        decoded_chunk = chunk.decode('utf-8')  # 将内容块从字节转换为字符串
        content.append(decoded_chunk)


    # 合并所有内容块并解析JSON
    full_content = ''.join(content)
    return json.loads(full_content)


if __name__ == "__main__":
    question = input("请输入您的问题:")
    response = ask_question(question)
    answer=response["answer"]
    print(answer)

测试效果

请输入您的问题:如何看到日本今年把核废水投入海洋?
根据提供的搜索结果,日本政府计划在2023年夏季将福岛核事故产生的核废水排放到福岛附近的海域中。这些核废水将包含放射性同位素"氚"(Tritium),这一决定引发了国内外的广泛关注和争议。

排放核废水到海洋中可能对全球的人体健康和海洋生态造成风险。许多国家和地区,特别是中国和韩国,强烈批评和反对这一决定。一些国际环保组织和邻国也表达了对核废水排放计划的担忧。

然而,美国对日本政府的决定表示支持。此外,欧洲国家在这个问题上并未发表明确立场。

总之,核废水排放到海洋的决定引发了广泛争议。不同国家和地区对此持不同观点,而全球的环保组织和人士也对此表示担忧。

请注意,以上回答仅基于提供的搜索结果,可能无法涵盖所有相关信息。建议进一步查找可靠的新闻来源或政府声明以获取更全面和准确的信息。

猜你喜欢

转载自blog.csdn.net/weixin_46211269/article/details/133358441