๐ API ๊ธฐ๋ฅ URL
- Ticket ๋ฒํธ๋ก json ํ์ผ ๋ถ๋ฌ์ค๊ธฐ
https://support.๋๋ฉ์ธ.com/api/v2/tickets/{ticket_id}.json
ex) https://support. ๋๋ฉ์ธ .com/api/v2/tickets/849.jsonโ
- ํฐ์ผ ์์ฑ
https://support. ๋๋ฉ์ธ .com/api/v2/requests.json
- ์ฒจ๋ถ ํ์ผ
https://๋๋ฉ์ธ.zendesk .com/api/v2/attachments/{attachment_id}.json
- ํฐ์ผ์์ attachment_id ์ป๊ธฐ
/api/v2/tickets/{ticket_id}/comments
์ฌ๋ฌ ์ฒจ๋ถํ์ผ : https://support. ๋๋ฉ์ธ .com/api/v2/tickets/2341/comments
๐ Zendesk
1. ์ฐ๋์ ํ์ํ API ํ ํฐ ์์ฑ
- ๊ด๋ฆฌ์ ํ์ด์ง์์ ์ฌ์ฉ ๊ฐ๋ฅ : https:// ๋๋ฉ์ธ .zendesk.com/admin
2. ํฐ์ผ ์์ฑ
๊ณต์ ๋ฌธ์ : https://developer.zendesk.com/api-reference/ticketing/tickets/ticket-requests/
- ์์ฒญ url : ๋๋ฉ์ธ/api/v2/requests
- json ํ์ผ ํ์ธ : https://support.๋๋ฉ์ธ.com/api/v2/requests.json
- ํฐ์ผ ํ์ธ : https://support. ๋๋ฉ์ธ .com/api/v2/tickets/{ticket_id}.json
// ์ฌ์ฉ ์์
fetch("https://support. ๋๋ฉ์ธ .com/api/v2/requests.json", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Basic " + btoa("๊ณ์ /token:ํ ํฐ๊ฐ")
},
body: JSON.stringify(requestData)
}
3. ํ๋ ์์
๊ด๋ฆฌ์ ํ์ด์ง์์ ์ฌ์ฉ์๊ฐ ์์๋ก ํ๋ ์์ ๊ฐ๋ฅ
: https:// ๋๋ฉ์ธ .zendesk.com/admin/objects-rules/tickets/ticket-fields
4. ๋ค๊ตญ์ด ์ฌ์ฉ
- handlebars : ๊ฐ ํ๊ทธ ๋ณ๋ก ์ธ์ด ์ฒ๋ฆฌ๋ฅผ ์งํํด์ผํจ
handlebars ์ฌ์ฉ ์์
<h2>
{{#is help_center.locale "ko"}}
๋ฌธ์ ๋ฑ๋ก
{{else}}Inquiry Registration
{{/is}}
</h2>
- ๋์ ์ฝํ ์ธ ํ์ฉ
๋์ ์ฝํ ์ธ ํ์ฉ : https://๋๋ฉ์ธ.zendesk.com/admin/workspaces/agent-workspace/dynamic_content
- Zendesk Guide ๊ด๋ฆฌ์ ํ์ด์ง ์ ์
- ์ค์ (Settings) → Locale ์ ํ
- ๋ฒ์ญ ๋ฐ์ดํฐ ์ถ๊ฐ
new_request_page.hbs์์ ๋์ ์ฝํ
์ธ ์ฌ์ฉ ์์
{{dc "์ฝํ
์ธ ๋ช
"}}
ex)
{{dc "Zendesk_Help_Center_isPrivacyConsent"}}
[Chatgpt ์ธ์ฉ]
๐ Zendesk์ new_request_page์์ ์๋ ๋ฒ์ญ ๊ฐ๋ฅํ ๊น?
โ
์ ๋ต: ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ ๋ฒ์ญ์ ์ง์๋์ง ์์ผ๋ฉฐ, ์ธ์ด๋ณ๋ก ํผ์ ๊ตฌ์ถํด์ผ ํจ.
Zendesk์๋ ์๋ ๋ฒ์ญ ์์คํ
(Google Translate, DeepL ๋ฑ)์ด ๊ธฐ๋ณธ ๋ด์ฅ๋์ด ์์ง ์์, ๋ฐ๋ผ์ new_request_page์ form๋ ์๋ ๋ฒ์ญ์ด ๋์ง ์์.
โ
๋์ Zendesk๋ ๋ค์ ๋ฐฉ๋ฒ์ ์ง์ํจ:
- Zendesk์ ๋ฒ์ญ ์์คํ ({{t}} ํฌํผ)๋ฅผ ํ์ฉํด ์ธ์ด๋ณ ํผ์ ์๋ ๋ณํ
Zendesk Guide์์๋ {{t}} ํฌํผ๋ฅผ ์ฌ์ฉํ๋ฉด, Zendesk์์ ์ค์ ํ ๋ฒ์ญ ๋ฐ์ดํฐ์ ๋ฐ๋ผ ์๋ ๋ณํ๋จ.
5. ์ฒจ๋ถํ์ผ
๊ณต์ ๋ฌธ์ : https://developer.zendesk.com/api-reference/ticketing/tickets/ticket-attachments/
- ์์ฒญ : ๋๋ฉ์ธ/api/v2/uploads
- ํฐ์ผ ํ์ธ : https://support. ๋๋ฉ์ธ .com/api/v2/tickets/{ticket_id}.json
- /api/v2/tickets/{ticket_id}/comments
- /api/v2/attachments/{attachment_id}.json
- ํ์ผ์ ํ์์ ์ง์ ํ์ง ์๊ณ file ๊ทธ๋๋ก fetchํ์ฌ ์ ์กํ๋ค
- ํ์ผ ์ ๋ก๋ ์ ๋ง๋ค token์ด ์๋ก ์์ฑ๋๊ธฐ ๋๋ฌธ์ ๋น๋๊ธฐ์(async/await) ์ฌ์ฉ
*) ์๋๋ ์ฒจ๋ถ ํ์ผ ์ ๋ก๋ ์ ๋ฌธ์ ๋์๋ ์ด๋ ฅ์ ์ ๋ฆฌํ ๋ด์ฉ์ด๋ค.
์ค๋ฅ ํด๊ฒฐ ๊ณผ์
[ ์ค๋ฅ ]
file์ fetch๋ก ์ ์ก ์ body์ form-data๋ก ๋ฃ์ผ๋ฉด ์ด๋ฏธ์ง ํ์ผ์ด ๊นจ์ง
file ๊ทธ ์์ฒด๋ก ์ธ์ํด์ผํจ
> ์ค๋ฅ ์์ธ ๋ด์ฉ
ํ์ผ์ ์ ๋ก๋๊ฐ ๋๋๋ฐ ์ด๋ฏธ์ง ํ์ผ์ด ๊นจ์ง
- content-type์ด multipart/form-data๋ก ๋ค์ด๊ฐ ์์
file.type : image/png

- upload ๋ ๋

[ ํด๊ฒฐ ]
API ํ ์คํธ : Postman API ํ ์คํธ ์งํ
์ผ๋ฐ ํ์ผ์ ์ง์ ์ ํํด์ api ์ ์ก ์ ์ฑ๊ณต ํ์ธ

fetch ์ ํ์ผ ๊ทธ๋๋ก๋ก ์ค์
fetch() {
method: "POST",
headers: {"Authorization": "Basic " + btoa("๊ณ์ /token:ํ ํฐ"), },
body: file
}
์ฌ๋ฌ๊ฐ์ ํ์ผ ์ ๋ก๋
ํ์ผ ์ ๋ก๋ ์ ๋ง๋ค token์ด ์๋ก ์์ฑ๋๊ธฐ ๋๋ฌธ์ ๋น๋๊ธฐ์(async/await) ์ฌ์ฉ
// ์ ์ถํ๊ธฐ(ํ๋)
document.getElementById("inquiryForm").addEventListener("submit", async (event) => {
event.preventDefault(); // ๊ธฐ๋ณธ ํผ ์ ์ถ ๋ฐฉ์ง
const files = document.querySelector("#fileInput").files || null; // ํ์ผ ์์ ๊ฒฝ์ฐ null ์ฒ๋ฆฌ
const uploadToken = await uploadFile(file); // ํ์ผ ์
๋ก๋ ์๋ (์์ผ๋ฉด null ๋ฐํ)
createZendeskTicket(uploadToken); // ํ์ผ ์ ๋ฌด ๊ด๊ณ์์ด ํฐ์ผ ์์ฑ
});
// ํ์ผ ์
๋ก๋
async function uploadFile(file) {
if (!file) return null; // ํ์ผ์ด ์์ผ๋ฉด ์
๋ก๋ ์๋ต
try {
const uploadResponse = await fetch(`https://๋๋ฉ์ธ.zendesk.com/api/v2/uploads?filename=${encodeURIComponent(file.name)}`, {
method: "POST",
headers: {
"Authorization": "Basic " + btoa("๊ณ์ /token:ํ ํฐ"),
},
body: file
});