---
title: "ใช้ ThunderPhone กับ n8n"
description: "ติดตั้งโหนด ThunderPhone สำหรับ n8n เชื่อมต่อคีย์ API ของเซิร์ฟเวอร์ และสร้างเวิร์กโฟลว์ที่ทำงานทุกครั้งเมื่อการโทรสิ้นสุดลง"
---

[n8n](https://n8n.io) คือเครื่องมือสำหรับทำเวิร์กโฟลว์อัตโนมัติ แพ็กเกจ ThunderPhone
สำหรับ n8n เพิ่มโหนดสองรายการ:

- **ThunderPhone Trigger** เริ่มเวิร์กโฟลว์เมื่อการโทรสิ้นสุดลง (**การโทรเสร็จสิ้น**) หรือเมื่อการประเมินการโทรเสร็จสิ้น (**ประเมินการโทรแล้ว**)
- **ThunderPhone** โทรออก เพิ่มผู้ติดต่อไปยังแคมเปญและเริ่มแคมเปญ ดึงข้อมูลการโทรพร้อมทรานสคริปต์และไฟล์บันทึกเสียง และแสดงรายการเอเจนต์และหมายเลขโทรศัพท์ของคุณ

โหนดนี้เป็นโหนดชุมชนที่ผ่านการตรวจสอบแล้ว ซึ่งแสดงอยู่ที่
[ThunderPhone บน n8n](https://n8n.io/integrations/thunderphone/)

## ติดตั้งโหนด

ในตัวแก้ไข n8n คลิก **+** เพื่อเปิดแผงโหนด แล้วค้นหา
**ThunderPhone** เจ้าของอินสแตนซ์อาจต้องตั้งค่าโหนดที่ผ่านการตรวจสอบก่อน
ผู้ใช้อื่นจึงจะเพิ่มโหนดได้

สำหรับ n8n ที่โฮสต์ด้วยตนเอง คุณสามารถติดตั้งด้วยชื่อแพ็กเกจได้เช่นกัน: เปิด
**การตั้งค่า > โหนดชุมชน** แล้วติดตั้ง `n8n-nodes-thunderphone` ตรวจสอบความเสี่ยงของโหนดชุมชนและนโยบายอินสแตนซ์ของคุณ
ก่อนติดตั้ง

## สร้างคีย์ API ของเซิร์ฟเวอร์

<Steps>
  <Step title="เปิดแท็บคีย์">
    ใน ThunderPhone ไปที่ **องค์กร → คีย์** แล้วคลิก **สร้างคีย์**
  </Step>
  <Step title="ตั้งชื่อ">
    ใช้ชื่อที่ระบุตำแหน่งที่จัดเก็บคีย์ เช่น "n8n"
  </Step>
  <Step title="คัดลอกทันที">
    ระบบจะแสดงข้อมูลลับ `sk_live_...` แบบเต็มเพียงครั้งเดียว คัดลอกก่อนปิด
    กล่องโต้ตอบ
  </Step>
</Steps>

เฉพาะผู้ดูแลระบบหรือเจ้าของเท่านั้นที่สร้างคีย์ได้ และ ThunderPhone จะถือว่าคำขอ
ที่ส่งด้วยคีย์นี้มาจากบุคคลนั้น ทริกเกอร์และการดำเนินการกับแคมเปญ
ต้องให้บุคคลนั้นยังคงมีบทบาทผู้ดูแลระบบหรือเจ้าของ
[สร้างคีย์ API ของเซิร์ฟเวอร์](/th/guides/api-keys) ครอบคลุมการหมุนเวียนและการเพิกถอนคีย์

## เพิ่มข้อมูลรับรองใน n8n

1. ใน n8n สร้างข้อมูลรับรองประเภท **ThunderPhone API**
2. วางคีย์ลงใน **คีย์ API**
3. บันทึกแล้วเรียกใช้การทดสอบข้อมูลรับรอง การทดสอบจะอ่านข้อมูลการโทรหนึ่งรายการจาก
   องค์กรของคุณด้วย `GET /v1/calls?limit=1`

## สร้างเวิร์กโฟลว์แรก

เวิร์กโฟลว์นี้จะเพิ่มแถวลงใน Google Sheet ทุกครั้งที่การโทรสิ้นสุดลง

<Steps>
  <Step title="เพิ่มทริกเกอร์">
    เพิ่ม **ทริกเกอร์ ThunderPhone** เลือกข้อมูลรับรอง API ของ ThunderPhone และ
    ตั้งค่า **เหตุการณ์** เป็น **การโทรเสร็จสิ้น**
  </Step>
  <Step title="ดึงข้อมูลการโทร">
    เพิ่มโหนด **ThunderPhone** ตั้งค่า **ทรัพยากร** เป็น **การโทร** **การดำเนินการ**
    เป็น **ดึงข้อมูล** และ **รหัสการโทร** เป็นนิพจน์ `{{ $json.data.call_id }}` 
    เอาต์พุตคือ[ระเบียนการโทร](/api-reference/calls)พร้อม `transcripts`
    และ `recording_url` ซึ่งเป็นลิงก์อายุสั้นที่จะมีค่าเป็น `null` เมื่อการโทร
    ไม่มีไฟล์บันทึกเสียง
  </Step>
  <Step title="เพิ่มแถว">
    เพิ่มโหนด Google Sheets ที่เพิ่มแถว และแมปคอลัมน์ที่ต้องการ
    จากเอาต์พุตการดึงข้อมูลการโทร (ดูตารางด้านล่าง)
  </Step>
  <Step title="เปิดใช้งานเวิร์กโฟลว์">
    บันทึกและเปิดใช้งาน ทริกเกอร์จะลงทะเบียน URL สำหรับใช้งานจริงเป็นปลายทางเว็บฮุก
    ในองค์กร ThunderPhone ของคุณ การปิดใช้งานเวิร์กโฟลว์จะลบปลายทางนั้น
  </Step>
  <Step title="ทดสอบ">
    เปิดเอเจนต์ในตัวสร้าง คลิก **พูดคุย** แล้ววางสาย การโทรทดสอบจากตัวสร้าง
    จะถูกส่งเป็น `web.complete` ซึ่งเป็นหนึ่งในสองเหตุการณ์ของการโทรเสร็จสิ้น
    ดังนั้นเวิร์กโฟลว์จะทำงานและมีแถวปรากฏขึ้น
  </Step>
</Steps>

คอลัมน์ที่มีประโยชน์:

| คอลัมน์ | นิพจน์ |
|---|---|
| รหัสการโทร | `{{ $json.call_id }}` |
| ทิศทาง | `{{ $json.direction }}` |
| จาก | `{{ $json.from_number }}` |
| ถึง | `{{ $json.to_number }}` |
| เวลาเริ่มต้น | `{{ $json.start_time }}` |
| ระยะเวลา (วินาที) | `{{ $json.duration_seconds }}` |
| สถานะ | `{{ $json.status }}` |
| สาเหตุสิ้นสุด | `{{ $json.end_reason }}` |
| ลิงก์การโทร | `https://app.thunderphone.com/dashboard/call-history/{{ $json.call_id }}` |

ลิงก์การโทรจะเปิดการโทรในแดชบอร์ด ThunderPhone สำหรับสมาชิกใน
องค์กรของคุณ พร้อมคำถอดเสียงและไฟล์บันทึกเสียง ดังนั้นชีตจึงไม่จำเป็นต้อง
เก็บข้อมูลทั้งสองอย่าง

หากต้องการเพิ่มคำถอดเสียงด้วย ให้แมป
`{{ $json.transcripts.filter(t => typeof t.content === 'string').map(t => t.role + ': ' + t.content).join('\n') }}`.
URL ของไฟล์บันทึกเสียงจะหมดอายุ ดังนั้นให้จัดเก็บรหัสการโทรและเรียกใช้การดึงข้อมูลการโทรอีกครั้ง
เมื่อต้องการลิงก์ใหม่ คำถอดเสียง สรุป และไฟล์บันทึกเสียงของการโทรอาจมี
ข้อมูลส่วนบุคคลหรือข้อมูลสุขภาพ ส่งข้อมูลเหล่านี้เฉพาะไปยังแอปที่องค์กรของคุณ
ได้รับอนุญาตให้ใช้สำหรับข้อมูลดังกล่าว ภายใต้ BAA หากเกี่ยวข้องกับข้อมูลสุขภาพ
และเก็บเฉพาะฟิลด์ที่จำเป็น

<Note>
  ThunderPhone ส่งเหตุการณ์ด้วย `POST` ไปยัง **URL สำหรับใช้งานจริง
  ของทริกเกอร์** ดังนั้นอินสแตนซ์ n8n ของคุณต้องเข้าถึงได้ผ่าน HTTPS จากอินเทอร์เน็ต
  และเวิร์กโฟลว์ต้องเปิดใช้งานอยู่ ทริกเกอร์จะตรวจสอบ
  HMAC `X-ThunderPhone-Signature` ในทุกคำขอ และตอบกลับ `401` สำหรับ
  ทุกคำขอที่ไม่มีลายเซ็นหรือไม่ถูกต้อง
</Note>

ทริกเกอร์จะแสดงผลเหตุการณ์ฉบับสมบูรณ์: `type`, `event_id` และ `data` ดู
[`telephony.complete` / `web.complete`](/th/webhooks/call-complete) และ
[`call.graded`](/th/webhooks/events) สำหรับฟิลด์ทั้งหมด การส่งข้อมูลเป็นแบบอย่างน้อยหนึ่งครั้ง
และ `event_id` จะคงเดิมในการลองส่งเหตุการณ์เดียวกันอีกครั้ง ดังนั้นให้ตรวจสอบก่อน
ขั้นตอนที่ต้องไม่ทำซ้ำ

## โทรออกอย่างปลอดภัย

**โทรออก** (ทรัพยากร **การโทรออก**, การดำเนินการ **โทรออก**)
รับค่า:

| ฟิลด์ | ความหมาย |
|---|---|
| ชื่อหรือ ID ของเอเจนต์ | เอเจนต์ที่บันทึกไว้ เมนูดรอปดาวน์จะแสดงเอเจนต์ของคุณ |
| ชื่อหรือ ID ของหมายเลขโทรศัพท์ | หมายเลขต้นทาง เมนูดรอปดาวน์จะแสดงเฉพาะหมายเลขที่เปิดใช้สำหรับการโทรออก |
| หมายเลขปลายทาง | ปลายทางในรูปแบบ E.164 เช่น `+14155552671` |
| ตัวแปร | ออบเจ็กต์ JSON ของค่าสำหรับตัวยึดตำแหน่งในพรอมป์ต์ของเอเจนต์ |
| คีย์ไอดีเอ็มโพเทนซี | ID ที่คงที่จากเรกคอร์ดหรือเหตุการณ์ต้นทาง ต้องระบุ |

แมป **คีย์ไอดีเอ็มโพเทนซี** กับ ID จากสิ่งที่ทำให้การรันเริ่มต้น เช่น
ID เรกคอร์ด CRM หรือ `event_id` ของทริกเกอร์ โหนดจะส่ง
`n8n:<node ID>:<your value>` ดังนั้น:

- การลองใหม่อัตโนมัติหรือ **ลองรันอีกครั้ง** จะส่งคีย์เดิม และ
  ThunderPhone จะส่งคืนการโทรเดิมพร้อม `idempotent_replay: true`
  แทนการโทรซ้ำ
- โหนด ThunderPhone สองโหนดที่รับเรกคอร์ดเดียวกันจะส่งคีย์ต่างกัน
- ค่าว่างจะล้มเหลวก่อนส่งคำขอใดๆ

หลีกเลี่ยงการใช้การประทับเวลา ค่าสุ่ม และ ID การรันหรือเวิร์กโฟลว์ของ n8n
ค่าใหม่เมื่อลองใหม่จะโทรจริงเป็นครั้งที่สอง คีย์ทั้งหมดมีความยาวได้สูงสุด 128
อักขระ การใช้คีย์เดิมร่วมกับเอเจนต์ หมายเลข หรือตัวแปรอื่นจะล้มเหลว
พร้อมข้อขัดแย้ง

**แคมเปญ** **เพิ่มรายชื่อติดต่อ** (ทรัพยากร **แคมเปญ**) เพิ่มรายชื่อติดต่อไปยัง
แคมเปญฉบับร่าง โดยรับ ID แคมเปญและอาร์เรย์ JSON ของรายชื่อติดต่อ รายชื่อติดต่อแต่ละรายการต้องมี `phone_number`; คีย์อื่นๆ
จะกลายเป็นตัวแปรการโทร โหนดจะล้มเหลวเมื่อรายชื่อติดต่อทั้งหมดถูกปฏิเสธ และตั้งค่า
`partial_success: true` เมื่อมีเพียงบางรายการเท่านั้นที่ถูกปฏิเสธ **เริ่มต้น** ต้องเลือกช่องทำเครื่องหมาย
เพื่อยืนยันว่าแคมเปญจะโทรจริงและใช้เครดิต ThunderPhone ดู [แคมเปญโทรออก](/th/guides/outbound-campaigns)

ก่อนที่เวิร์กโฟลว์จะเริ่มโทร:

- หาก ThunderPhone ขอให้องค์กรของคุณยืนยันว่าการโทรออก
  เป็นไปตาม TCPA และกฎหมายการโทรอื่นๆ ผู้ดูแลระบบต้องบันทึก
  การยืนยันนั้นในแดชบอร์ดก่อน
- หมายเลขต้นทางต้องเปิดใช้สำหรับการโทรออก หมายเลขที่คุณนำมาจาก
  ผู้ให้บริการของคุณเองจะมีสิทธิ์เมื่อยืนยันแล้ว หมายเลข ThunderPhone จะเริ่มต้น
  เป็นแบบรับสายเข้าเท่านั้น และสามารถได้รับอนุมัติให้ใช้โทรออกได้ โดยผู้ดูแลระบบต้องขอ
  จากหน้า หมายเลขโทรศัพท์ ดู
  [รับหมายเลขโทรศัพท์](/th/guides/get-a-phone-number)
- องค์กรของคุณมีหน้าที่รับผิดชอบในการมีความยินยอมให้โทรไปยังแต่ละหมายเลข
  และปฏิบัติตามกฎหมายการโทรที่เกี่ยวข้อง ดู
  [กฎหมายการโทรออก](/th/guides/outbound-calling-laws)

## ตัวอย่างเวิร์กโฟลว์

- **รายชื่อติดต่อ CRM ไปยังแคมเปญ** เพิ่มรายชื่อติดต่อ CRM ไปยัง ThunderPhone
  แคมเปญฉบับร่าง แล้วเริ่มแคมเปญเมื่อมีผู้อนุมัติรายการ
- **การโทรที่เสร็จสิ้นไปยังเรกคอร์ดลูกค้า** เมื่อการโทรเสร็จสิ้น ให้เรียกใช้ รับข้อมูลการโทร
  และบันทึกบทถอดเสียงกับลิงก์บันทึกเสียงไปยังเรกคอร์ดลูกค้าที่ตรงกัน
- **คะแนนต่ำเพื่อการตรวจสอบ** เมื่อประเมินการโทรแล้ว ให้กรองตาม
  `{{ $json.data.grade.score }}` และส่งการโทรที่มีคะแนนต่ำไปยังคิวตรวจสอบ
  พร้อม ID การโทรและรายละเอียดคะแนน การโทรหนึ่งรายการอาจได้รับการประเมินมากกว่าหนึ่งครั้ง
  และการประเมินที่เสร็จสิ้นแต่ละครั้งจะเรียกใช้ทริกเกอร์ ดังนั้นให้เก็บเฉพาะ
  `graded_at` ล่าสุดสำหรับแต่ละ ID การโทร

บทถอดเสียงการโทร สรุป และบันทึกเสียงอาจมีข้อมูลส่วนบุคคลหรือข้อมูลสุขภาพ
ส่งข้อมูลเหล่านี้เฉพาะไปยังแอปที่องค์กรของคุณได้รับอนุญาตให้ใช้กับข้อมูลดังกล่าว
ภายใต้ BAA เมื่อเกี่ยวข้องกับข้อมูลสุขภาพ และเก็บไว้เฉพาะฟิลด์ที่คุณต้องใช้

<Note>
  ส่งเหตุการณ์การโทรเดียวกันไปยังเซิร์ฟเวอร์ของคุณเองแทนใช่หรือไม่ ดู
  [ปลายทาง Webhook](/th/webhooks/endpoints)
  [โทรออก](/th/guides/place-outbound-calls) อธิบาย API ที่อยู่เบื้องหลัง
  โทรออก
</Note>
