테스트 사이트 - 개발 중인 베타 버전입니다

chat-gpt api 적용중 CORS 문제

Player0 2년 전 조회 2,632

그누보드에 chat-gpt를 적용하려는중인데요

CORS 에러가 나서 해결을 못하고 있습니다

고수님들 도움이나 힌트 부탁드립니다

 

먼저 제가 작성한 코드는 다음과 같습니다

★gnuboard5.5.8.2.6\theme\community\head.php

</p>

<p>        <!-- chatGpt추가{ --></p>

<p>        <form id="gpt-form" method="post"></p>

<p>            <div></p>

<p>                <div><label for="prompt">Question to Chat-gpt:</label></div></p>

<p>                <textarea id="prompt" name="prompt" cols="40" rows="3" required></textarea></p>

<p>            </div></p>

<p>            <div></p>

<p>                <div><label for="response">Answer:</label></div></p>

<p>                <textarea id="response" name="response" cols="40" rows="3" readonly></textarea></p>

<p>            </div></p>

<p>            <div></p>

<p>                <input type="submit" value="Submit"></p>

<p>            </div></p>

<p>        </form></p>

<p>        <script></p>

<p>            document.getElementById("gpt-form").addEventListener("submit", function(e) {</p>

<p>                e.preventDefault(); // 비동기통신용</p>

<p> </p>

<p>                var prompt = document.getElementById("prompt").value;</p>

<p> </p>

<p>                fetch('gpt-run.php', {</p>

<p>                        method: 'POST',</p>

<p>                        headers: {</p>

<p>                            'Content-Type': 'application/x-www-form-urlencoded',</p>

<p>                        },</p>

<p>                        body: 'prompt=' + encodeURIComponent(prompt),</p>

<p>                    })</p>

<p>                    .then(response => response.json())</p>

<p>                    .then(data => {</p>

<p>                        document.getElementById("response").value = data.response;</p>

<p>                    });</p>

<p>            });</p>

<p>        </script></p>

<p>        <!-- chatGpt추가} --></p>

<p>

 

★C:\gnuboard5.5.8.2.6\theme\community\gpt-run.php

</p>

<p><?php</p>

<p>if ($_SERVER['REQUEST_METHOD'] === 'POST') {</p>

<p>    $api_key = "***chat-gpt api key***"; // 발급받은 실제 키 사용중입니다</p>

<p> </p>

<p>    $url = "<a href="https://api.openai.com/v1/completions";" target="_blank" rel="noopener noreferrer">https://api.openai.com/v1/completions";</a></p>

<p> </p>

<p>    $prompt = filter_var($_POST["prompt"], FILTER_SANITIZE_FULL_SPECIAL_CHARS);</p>

<p> </p>

<p>    $data = array(</p>

<p>        "model" => "text-davinci-003",</p>

<p>        "prompt" => $prompt,</p>

<p>        "max_tokens" => 3000,</p>

<p>        "temperature" => 0.5,</p>

<p>    );</p>

<p> </p>

<p>    $data_string = json_encode($data);</p>

<p> </p>

<p>    $ch = curl_init();</p>

<p>    curl_setopt($ch, CURLOPT_URL, $url);</p>

<p>    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);</p>

<p>    curl_setopt($ch, CURLOPT_POST, true);</p>

<p>    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);</p>

<p>    curl_setopt($ch, CURLOPT_HTTPHEADER, array(</p>

<p>        "Content-Type: application/json",</p>

<p>        "Authorization: Bearer $api_key",</p>

<p>        "Content-Length: " . strlen($data_string))</p>

<p>    );</p>

<p> </p>

<p>    $output = curl_exec($ch);</p>

<p>    curl_close($ch);</p>

<p> </p>

<p>    $output_json = json_decode($output, true);</p>

<p>    $response = $output_json["choices"][0]["text"];</p>

<p> </p>

<p>    header('Content-Type: application/json');</p>

<p>    echo json_encode(array('response' => trim($response)));</p>

<p> </p>

<p>    exit;</p>

<p>}</p>

<p>?></p>

<p>

 

그리고 제 그누보드 주소입니다

http://player0.dothome.co.kr/

 

알아보니까 헤더 추가하는법이 있어서 해봤는데 에러는 변함이 없네요

header("Access-Control-Allow-Origin: *");

 

그리고 같은 키로 gpt게시판에서 사용중인데 거기서는 동작에 문제가 없습니다

http://player0.dothome.co.kr/bbs/board.php?bo_table=gpt

 

도움 부탁드리겠습니다

댓글을 작성하려면 로그인이 필요합니다.

답변 4개

Player0
2년 전

먼저 답변 감사합니다

제가 초보라서 검색하면서 하는중인데 php.ini파일 위치는 /etc/php.ini인거 같은데 파일질라에서 보면 etc라는 경로가 안보이네요

Configuration File (php.ini) Path /etc
Loaded Configuration File  /etc/php.ini

호스트는 닷홈에서 무료 호스팅 사용중인데 그게 문제일까요?

권한에 따라서 경로가 안보일수도 있다고 합니다

이런 경우 유료 도메인같은걸로 바꾸면 해결될지요?

로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

들레아빠
2년 전
https://sir.kr/g5_skin/55009?page=3
위 링크 게시판으로 테스트 해 보세요.
P
Player0
2년 전
묵공님 자료는 아주 잘 되는데 어디가 문제인지 모르겠네요
사이드메뉴에다 만들면 안되는건지,
긴 시간 답변 너무 감사드리고 코드 좀더 분석해볼게요

댓글을 작성하려면 로그인이 필요합니다.

들레아빠

php.ini에서

extension=curl이 활성화 되어있는지 확인해 보세요.

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

Player0
2년 전

답변 감사드립니다

알려주신 코드를 추가 해 봤는데 서버가 아니라 클라이언트 쪽에서 발생하는 에러라서 브라우저에서는 받아볼수 없는것 같습니다. 아무것도 출력이 안되네요 ㅠㅠ

개발자 도구에는 아래의 에러가 출력되는데

※Access to fetch at 'https://guide-page.dothome.co.kr/404.html' (redirected from 'http://player0.dothome.co.kr/gpt-run.php') from origin 'http://player0.dothome.co.kr' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled. (index):261    

※GET https://guide-page.dothome.co.kr/404.html net::ERR_FAILED 200 (OK) (anonymous) @ (index):261 (index):279

※Error: TypeError: Failed to fetch     at HTMLFormElement. ((index):261:17)

 

화면이동없이 비동기통신으로 작성했다고 생각하는데 

'http://player0.dothome.co.kr/gpt-run.php'로 리다이렉트 하려는 것처럼 보입니다

뭐가 문제일까요

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

들레아빠

</p>

<p><?php

if ($_SERVER['REQUEST_METHOD'] === 'POST') {

    $api_key = "your-api-key"; // 실제 ChatGPT API 키로 대체

 

    $url = "<a href="https://api.openai.com/v1/completions";" target="_blank" rel="noopener noreferrer">https://api.openai.com/v1/completions";</a>

 

    $prompt = filter_var($_POST["prompt"], FILTER_SANITIZE_FULL_SPECIAL_CHARS);

 

    $data = array(

        "model" => "text-davinci-003",

        "prompt" => $prompt,

        "max_tokens" => 3000,

        "temperature" => 0.5,

    );

 

    $data_string = json_encode($data);

 

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    curl_setopt($ch, CURLOPT_POST, true);

    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);

    curl_setopt($ch, CURLOPT_HTTPHEADER, array(

        "Content-Type: application/json",

        "Authorization: Bearer $api_key",

        "Content-Length: " . strlen($data_string))

    );

 

    $output = curl_exec($ch);

 

    if ($output === false) {

        // 에러 처리

        $error = curl_error($ch);

        // 예를 들어, 로깅하거나 적절한 에러 응답을 반환하는 등의 처리를 수행할 수 있습니다.

        echo json_encode(array('response' => 'API request failed: ' . $error));

    } else {

        $output_json = json_decode($output, true);

        $response = $output_json["choices"][0]["text"];

     

        header('Content-Type: application/json');

        echo json_encode(array('response' => trim($response)));

    }



    curl_close($ch);

    exit;

}

?></p>

<p>

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인