<?php
require 'vendor/autoload.php'; // PhpSpreadsheet 로드
use PhpOffice\PhpSpreadsheet\IOFactory;
function auto_create_channels() {
$file_path = '전북RIS_강좌 정보.xlsx';
$login_api_url = "https://usamsung-api.veluga.app/user/sign-in";
$create_channel_api_url = "https://usamsung-api.veluga.app/channel/";
$token_cache = []; // 이메일별 토큰 캐시
// 엑셀 파일 불러오기
$spreadsheet = IOFactory::load($file_path);
$worksheet = $spreadsheet->getSheetByName('과목 채널 생성용');
$rows = $worksheet->toArray();
// 첫 번째 행은 헤더이므로 생략
array_shift($rows);
foreach ($rows as $row) {
try {
$target_email = trim($row[4]);
// 이메일이 캐시에 있는지 확인
if (!isset($token_cache[$target_email])) {
// 로그인 요청
$login_body = json_encode([
"email" => $target_email,
"password" => $target_email,
"isBusiness" => true
]);
$login_response = api_request('POST', $login_api_url, $login_body);
if ($login_response['http_code'] != 200) {
echo "로그인 실패: " . $login_response['response'] . "\n";
continue;
}
$token_cache[$target_email] = json_decode($login_response['response'], true)['data']['token'];
}
$target_token = $token_cache[$target_email];
$headers = [
"Authorization: Bearer $target_token",
"Content-Type: application/json"
];
// 채널 목록 가져오기
$channel_list_response = api_request('GET', $create_channel_api_url, '', $headers);
$channel_list = json_decode($channel_list_response['response'], true)['data']['list'];
$channel_name_list = array_column($channel_list, 'name');
$sheet_channel_name = $row[6];
$channel_description = $row[7];
if (!in_array($sheet_channel_name, $channel_name_list)) {
// 채널 생성
$create_channel_body = json_encode([
"name" => $sheet_channel_name,
"description" => $channel_description,
"welcomeMessage" => "안녕하세요. 과목을 수강하면서 궁금한 사항을 무엇이든 말씀해주시면 친절히 알려드릴게요.\n저는 강의교안과 교수님의 영상 자막을 기반으로 학습되었습니다.",
"temperature" => 'half',
"answerTypeIfCant" => ['noAnswer'],
"answerType" => 'respectful, long and detailed',
"isPublic" => 'false',
"enableQuestionHint" => 'true',
"enableFollowQuestion" => 'false',
"shouldReturnFile" => 'false',
"searchModel" => "hybrid",
"commonGpt" => "gpt-4o"
]);
$response = api_request('POST', $create_channel_api_url, $create_channel_body, $headers);
echo $response['response'] . "\n";
} else {
// 채널 업데이트
$channel_id = array_search($sheet_channel_name, array_column($channel_list, 'name'));
$update_channel_url = $create_channel_api_url . $channel_list[$channel_id]['_id'];
$update_channel_body = json_encode([
"description" => $channel_description,
"welcomeMessage" => "안녕하세요. 과목을 수강하면서 궁금한 사항을 무엇이든 말씀해주시면 친절히 알려드릴게요.\n저는 강의교안과 교수님의 영상 자막을 기반으로 학습되었습니다.",
"commonGpt" => "gpt-4o"
]);
$response = api_request('PATCH', $update_channel_url, $update_channel_body, $headers);
echo $response['response'] . "\n";
}
} catch (Exception $e) {
echo "에러 발생: " . $e->getMessage() . "\n";
}
}
}
function api_request($method, $url, $body = '', $headers = []) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
if (!empty($body)) {
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
}
if (!empty($headers)) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return [
'response' => $response,
'http_code' => $http_code
];
}
// 실행
auto_create_channels();
?>
<?php
function train_post_and_check_status($api_key, $channel_id, $title, $content, $board = null, $from_url = null, $reg_datetime = null, $metadata = null, $doc_filter = null, $attachments = null) {
// API URL 설정
$post_url = "https://usamsung-api.veluga.app/api/v1/document/post";
$check_url_template = "https://usamsung-api.veluga.app/api/v1/document/post/{id}";
// 헤더 설정
$headers = [
"X-VELUGA-API-KEY: $api_key",
"Content-Type: application/json"
];
// 요청 데이터 설정
$data = [
"channelId" => $channel_id,
"title" => $title,
"content" => $content,
"board" => $board,
"fromUrl" => $from_url,
"regDatetime" => $reg_datetime,
"metadata" => $metadata,
"attachments" => $attachments,
"docFilter" => $doc_filter ? json_encode($doc_filter) : null
];
// null 값을 제거한 후 JSON으로 인코딩
$data = array_filter($data, fn($value) => $value !== null);
$json_data = json_encode($data);
// 게시물 학습 요청
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $post_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code == 200) {
$response_data = json_decode($response, true);
$post_id = $response_data['data'];
echo "게시물 학습 요청 성공. 게시물 ID: $post_id\n";
// 학습 상태 체크 (2초 간격)
while (true) {
$check_url = str_replace("{id}", $post_id, $check_url_template);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $check_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$check_response = curl_exec($ch);
$check_http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($check_http_code == 200) {
$check_data = json_decode($check_response, true)['data'];
$post_state = $check_data['state'];
echo "게시물 상태: $post_state\n";
if (in_array($post_state, ['success', 'fail'])) {
echo "학습이 $post_state 상태로 완료되었습니다.\n";
break;
}
} else {
echo "학습 상태 체크 실패. 응답 코드: $check_http_code\n";
break;
}
sleep(2); // 2초 대기
}
} else {
echo "게시물 학습 요청 실패. 응답 코드: $http_code\n";
echo "응답 내용: $response\n";
}
}
// 예시 사용법
$api_key = 'your_api_key_here';
$channel_id = 'your_channel_id_here';
$title = '게시물 제목';
$content = '<p>게시물 내용입니다.</p>';
$board = '공지사항 게시판';
$from_url = 'https://example.com/post';
$reg_datetime = '2024-08-13T12:00:00Z';
$metadata = [
'author' => '관리자'
];
$doc_filter = [
'docType' => '공지사항'
];
$attachments = [
[
'name' => 'attachment.pdf',
'fileUrl' => 'https://example.com/attachment.pdf'
]
];
train_post_and_check_status($api_key, $channel_id, $title, $content, $board, $from_url, $reg_datetime, $metadata, $doc_filter, $attachments);
?>
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://usamsung-api.veluga.app/api/v1/document/post/66c46...[채널아이디]',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => array(
'X-VELUGA-API-KEY: your_api_key_here ',
'Content-Type: application/json'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
<?php
function get_failed_posts($api_key, $channel_id, $board_name = null, $keyword = null) {
// 게시물 리스트 조회 API URL 설정
$list_url = "https://usamsung-api.veluga.app/api/v1/document/post";
// 요청 헤더 설정
$headers = [
"X-VELUGA-API-KEY: $api_key",
"Content-Type: application/json"
];
// 요청 파라미터 설정
$params = [
"channelId" => $channel_id,
"boardName" => $board_name,
"keyword" => $keyword,
"page" => 1,
"limit" => 100, // 최대 100개의 게시물 조회
"sortType" => "createdAt",
"sort" => "desc"
];
// 파라미터를 쿼리 스트링으로 변환
$query = http_build_query($params);
// cURL 초기화
$ch = curl_init();
// cURL 옵션 설정
curl_setopt($ch, CURLOPT_URL, "$list_url?$query");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// 요청 실행 및 응답 받기
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// cURL 종료
curl_close($ch);
// 응답 코드가 200이면 데이터 처리
if ($http_code == 200) {
$response_data = json_decode($response, true);
$failed_posts = array_filter($response_data['data']['list'], function($post) {
return $post['state'] == 'fail';
});
return $failed_posts;
} else {
echo "게시물 리스트 조회 실패. 응답 코드: $http_code\n";
echo "응답 내용: $response\n";
return null;
}
}
function delete_failed_post($api_key, $post_id) {
// 게시물 삭제 API URL 설정
$delete_url = "https://usamsung-api.veluga.app/api/v1/document/$post_id";
// 요청 헤더 설정
$headers = [
"X-VELUGA-API-KEY: $api_key"
];
// cURL 초기화
$ch = curl_init();
// cURL 옵션 설정
curl_setopt($ch, CURLOPT_URL, $delete_url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// 요청 실행 및 응답 받기
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// cURL 종료
curl_close($ch);
// 응답 코드가 200이면 삭제 성공 메시지 출력
if ($http_code == 200) {
echo "게시물 삭제 성공. 게시물 ID: $post_id\n";
} else {
echo "게시물 삭제 실패. 게시물 ID: $post_id, 응답 코드: $http_code\n";
echo "응답 내용: $response\n";
}
}
function delete_all_failed_posts($api_key, $channel_id, $board_name = null, $keyword = null) {
// 학습이 실패한 게시물 리스트 가져오기
$failed_posts = get_failed_posts($api_key, $channel_id, $board_name, $keyword);
if (!empty($failed_posts)) {
echo "총 " . count($failed_posts) . "개의 학습 실패 게시물이 발견되었습니다.\n";
foreach ($failed_posts as $post) {
delete_failed_post($api_key, $post['_id']);
}
} else {
echo "학습 실패한 게시물이 없습니다.\n";
}
}
?>
<?php
function train_file_and_check_status($api_key, $channel_id, $file_path, $doc_filter = null) {
// API URL 설정
$upload_url = "https://usamsung-api.veluga.app/api/v1/document/file";
$check_url_template = "https://usamsung-api.veluga.app/api/v1/document/file/{id}";
// 헤더 설정
$headers = [
"X-VELUGA-API-KEY: $api_key"
];
// 데이터 설정
$post_fields = [
'channelId' => $channel_id,
'forceUpdate' => 'true'
];
if ($doc_filter !== null) {
$post_fields['docFilter'] = json_encode($doc_filter); // doc_filter를 JSON 문자열로 변환
}
// 파일 추가
$post_fields['file'] = curl_file_create($file_path);
// 파일 업로드 요청
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $upload_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code == 200) {
$response_data = json_decode($response, true);
$file_id = $response_data['data'];
$success = $response_data['success'];
if (!$success) {
echo "파일 업로드 실패. 응답 코드: $http_code\n";
echo "응답 내용: $response\n";
return;
}
echo "파일 업로드 성공. 파일 ID: $file_id\n";
// 학습 상태 체크 (2초 간격)
while (true) {
$check_url = str_replace("{id}", $file_id, $check_url_template);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $check_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$check_response = curl_exec($ch);
$check_http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($check_http_code == 200) {
$check_data = json_decode($check_response, true)['data'];
$file_state = $check_data['state'];
echo "파일 상태: $file_state\n";
if ($file_state === 'success' || $file_state === 'fail') {
echo "학습이 $file_state 상태로 완료되었습니다.\n";
break;
}
} else {
echo "학습 상태 체크 실패. 응답 코드: $check_http_code\n";
break;
}
sleep(2); // 2초 대기
}
} else {
echo "파일 업로드 실패. 응답 코드: $http_code\n";
echo "응답 내용: $response\n";
}
}
// 예시 사용법
$api_key = 'your_api_key_here';
$channel_id = 'your_channel_id_here';
$file_path = '/path/to/your/file.pdf'; // 실제 파일 경로로 변경하세요
$doc_filter = [
'docType' => '공지사항'
];
train_file_and_check_status($api_key, $channel_id, $file_path, $doc_filter);
?>
<?php
function delete_files($api_key, $file_id_list) {
// API URL 설정
$delete_url = "https://usamsung-api.veluga.app/api/v1/document/file";
// 요청 헤더 설정
$headers = [
"Authorization: Bearer $api_key",
"Content-Type: application/json"
];
// 요청 데이터 설정
$data = [
"fileIdList" => $file_id_list
];
// JSON 형식으로 데이터 인코딩
$json_data = json_encode($data);
// cURL 초기화
$ch = curl_init();
// cURL 옵션 설정
curl_setopt($ch, CURLOPT_URL, $delete_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PATCH");
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// 요청 실행 및 응답 받기
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// cURL 종료
curl_close($ch);
// 응답 처리
if ($http_code == 200) {
$response_data = json_decode($response, true);
echo "파일 삭제 요청 성공. 응답:\n";
print_r($response_data);
} else {
echo "파일 삭제 요청 실패. 응답 코드: $http_code\n";
echo "응답 내용: $response\n";
}
}
// 예시 사용법
$api_key = 'your_api_key_here'; // 실제 API 키를 입력하세요
$file_id_list = ["60f9b3b3e3b9f3a7b4b3b3b3", "60f9b3b3e3b9f3a7b4b3b3b4"]; // 삭제할 파일 ID 리스트
delete_files($api_key, $file_id_list);
?>
<?php
function train_webUrl_and_check_status($api_key, $channel_id, $web_url, $doc_filter = null) {
// API URL 설정
$upload_url = "https://usamsung-api.veluga.app/api/v1/document/web-url";
$check_url_template = "https://usamsung-api.veluga.app/api/v1/document/web-url/{id}";
// 헤더 설정
$headers = [
"X-VELUGA-API-KEY: $api_key"
];
// 데이터 설정
$post_fields = [
'channelId' => $channel_id,
'webUrl' => $web_url,
'forceUpdate' => 'true'
];
if ($doc_filter !== null) {
$post_fields['docFilter'] = json_encode($doc_filter); // doc_filter를 JSON 문자열로 변환
}
// 웹 URL 업로드 요청
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $upload_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code == 200) {
$response_data = json_decode($response, true);
$web_id = $response_data['data'];
$success = $response_data['success'];
if ($success === false) {
echo "웹 URL 업로드 실패. 응답 코드: $http_code\n";
echo "응답 내용: $response\n";
return;
}
echo "웹 업로드 성공. 파일 ID: $web_id\n";
// 학습 상태 체크 (2초 간격)
while (true) {
$check_url = str_replace("{id}", $web_id, $check_url_template);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $check_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$check_response = curl_exec($ch);
$check_http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($check_http_code == 200) {
$check_data = json_decode($check_response, true)['data'];
$file_state = $check_data['state'];
echo "웹 URL 상태: $file_state\n";
if ($file_state === 'success' || $file_state === 'fail') {
echo "학습이 $file_state 상태로 완료되었습니다.\n";
break;
}
} else {
echo "학습 상태 체크 실패. 응답 코드: $check_http_code\n";
break;
}
sleep(2); // 2초 대기
}
} else {
echo "웹 URL 업로드 실패. 응답 코드: $http_code\n";
echo "응답 내용: $response\n";
}
}
// 예시 사용법
$api_key = 'your_api_key_here';
$channel_id = 'your_channel_id_here';
$web_url = 'https://example.com/your-web-url';
$doc_filter = [
'docType' => '공지사항'
];
train_webUrl_and_check_status($api_key, $channel_id, $web_url, $doc_filter);
?>
<?php
function train_csv_and_check_status($api_key, $channel_id, $file_path) {
// CSV 파일 학습 및 상태 확인 URL 설정
$upload_url = "https://usamsung-api.veluga.app/api/v1/document/file";
$check_url_template = "https://usamsung-api.veluga.app/api/v1/document/file/{id}";
// CSV 파일 여부 확인
if (pathinfo($file_path, PATHINFO_EXTENSION) !== 'csv') {
echo "Error: 이 함수는 CSV 파일만 업로드할 수 있습니다.\n";
return [null, null];
}
// 헤더 설정
$headers = [
"X-VELUGA-API-KEY: $api_key"
];
// 파일 및 데이터 설정
$post_fields = [
"file" => new CURLFile($file_path),
"channelId" => $channel_id
];
// cURL 초기화
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $upload_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// CSV 파일 학습 요청
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code == 200) {
$response_data = json_decode($response, true);
$file_id = $response_data['data'];
echo "CSV 파일 업로드 성공. 파일 ID: $file_id\n";
// 학습 상태 체크 (2초 간격)
while (true) {
$check_url = str_replace("{id}", $file_id, $check_url_template);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $check_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$check_response = curl_exec($ch);
$check_http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($check_http_code == 200) {
$check_data = json_decode($check_response, true)['data'];
$file_state = $check_data['state'];
echo "CSV 파일 상태: $file_state\n";
if (in_array($file_state, ['success', 'fail'])) {
echo "학습이 $file_state 상태로 완료되었습니다.\n";
return [$file_state, $file_id];
}
} else {
echo "학습 상태 체크 실패. 응답 코드: $check_http_code\n";
break;
}
sleep(2); // 2초 대기
}
} else {
echo "CSV 파일 업로드 실패. 응답 코드: $http_code\n";
echo "응답 내용: $response\n";
return [null, null];
}
}
function train_citation_file($api_key, $channel_id, $citation_file_path, $training_file_id) {
// 참조 파일 학습 요청 URL 설정
$citation_url = "https://usamsung-api.veluga.app/api/v1/document/file/citation";
// 헤더 설정
$headers = [
"X-VELUGA-API-KEY: $api_key"
];
// 파일 및 데이터 설정
$post_fields = [
"file" => new CURLFile($citation_file_path),
"channelId" => $channel_id,
"trainingFileId" => $training_file_id
];
// cURL 초기화
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $citation_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// 참조 파일 학습 요청
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// 응답 처리
if ($http_code == 200) {
echo "참조 파일 학습 요청 성공.\n";
} else {
echo "참조 파일 학습 요청 실패. 응답 코드: $http_code\n";
echo "응답 내용: $response\n";
}
}
// 예시 사용법
$api_key = 'your_api_key_here'; // 실제 API 키 입력
$channel_id = 'your_channel_id_here'; // 실제 채널 ID 입력
$csv_file_path = 'testcsv.csv'; // CSV 파일 경로
$citation_file_path = 'testpdf.pdf'; // 참조 파일 경로
// CSV 파일 학습 요청 및 상태 확인
list($state, $file_id) = train_csv_and_check_status($api_key, $channel_id, $csv_file_path);
// 학습 성공 시 참조 파일 학습 요청
if ($state === "success") {
train_citation_file($api_key, $channel_id, $citation_file_path, $file_id);
}
?>