April 28, 2025
สำหรับใครที่ยังไม่ได้อ่าน Part 1 นะครับ สามารถไปอ่านได้ที่ N8N Part 1
โดยวันนี้ผมจะพามาลองเล่น workflow ในแบบ basic ๆ กันก่อนนะครับ เผื่อให้สามารถเข้าใจการทำงานในเบื้องต้นได้
โดยโจทย์ในครั้งนี้คือ "ค้นหา URLs ต่าง ๆ ของ domain ที่ต้องการโดยใช้ Wayback machine" ถ้านึกภาพไม่ออกคือการทำแบบนี้แหละครับ แต่เราจะทำให้มันเป็น workflow เพื่อนำไปต่อยอดในอนาคตนะครับ
จากนั้นจะพบกับ UI หน้าตาโล่ง ๆ แบบนี้
โดยเมื่อกดปุ่ม "+" กลางจอหรือมุมขวาบนแล้วจะพบกับ Trigger Node ครับ (ภายใน N8N เราจะเรียกเครื่องมือแต่ละตัวว่า Node นะครับ)
Trigger Node คือจุดเริ่มต้นของ workflow ซึ่งสามารถทำได้หลายวิธีด้วยกันขึ้นอยู่กับจุดประสงค์ของ workflow นั้น ๆ ครับ เช่นหากเป็นประเภท Scheduler จะใช้ประเภท "On a scheduler" หากเป็นประเภท Webhook ที่รอรับสัญญาณจากแหล่งอื่นจะใช้เป็น "On webhook call" ครับ ยังมีอีกหลาย ๆ ตัวที่น่าสนใจเช่น
ซึ่งอันนี้เป็นแค่เพียงเบื้องต้นนะครับ จริง ๆ แล้ว N8N ยังสามารถทำอะไรได้มากกว่านั้นอีก (มากกกก) ไปกันต่อเลยครับ
โดยผมจะเริ่มจาก Trigger เบื้องต้นอย่าง "Trigger manually" ละกันครับ สามารถกดเลือกได้เลยครับ เมื่อเลือกแล้วจะมี Node โผล่มากลางจอแบบนี้ครับ
จากนั้นให้กดปุ่ม "+" ที่อยู่ขวามือของ Node เพื่อเพิ่มการทำงานขั้นต่อไปครับ เมื่อกดแล้วจะเพิ่มกับเครื่องมือต่าง ๆ ที่สามารถนำมาใช้ต่อได้นะครับ "ซึ่งมีเยอะมากกกก"
โดยให้เราเลือกเป็น "HTTP Request" ครับ
จากนั้นจะพบกับหน้าต่างที่โผล่ขึ้นมาซึ่งจะแบ่งเป็น 3 ส่วนหลัก ๆ คือ
กลับมาที่ Wayback machine สักแป้บนึงครับ ให้เราค้นหา request ที่จะนำมาใช้งาน ซึ่งในกรณีนี้จะเป็น https://web.archive.org/web/timemap/json
ครับ
กรอกข้อมูลต่าง ๆ ได้เลย โดยที่ส่วนของ URL แนะนำให้ใช้แค่ URL นะครับ แล้วแบ่งเอา Parameter ลงมาใส่ข้างล่างแทน แบบในรูปเลยครับ (แนะนำว่าให้ปรับ Limit เป็นค่าน้อย ๆ จากเดิน 10000 อาจจะลดลงเหลือ 30 ก็ได้ครับ) เสร็จแล้วกดปุ่ม Test Step ได้เลย ถ้าถูกต้องด้านขวามือจะมีข้อมูลขึ้นมาแบบนี้ครับ
โดยที่ Output จะดูข้อมูลได้ 3 รูปแบบได้แก่ Table, JSON, Schema ซึ่งการทำงานจริง ๆ ของ N8N จะทำงานภายใต้ Object Array ครับ
อันนี้ถ้าดูดี ๆ มันจะเป็นการ return มาแบบแปลก ๆ นะครับ ปกติแล้วมันควรจะ return มาเป็น json ในรูปแบบ
[{
"original": "http://example.com:80/",
"mimetype": "text/html",
"..."
}]
แต่กรณีนี้ return มาเป็น
[["original", "mimetype", "..."], ["value"...]]
ซึ่งมันเอาไปใช้ต่อม่ายได้ครับ '-' ดังนั้นให้กด "+" ด้านขวาแล้วเลือก Node "Code" เข้ามาช่วยได้เลยครับ
ให้ลองเอา Code นี้ไปใส่
for (const item of $input.all()) {
console.log(item)
}
return $input.all()
ก่อนกดปุ่มให้กด F12 เพื่อเปิด browser console เพื่อดูผลของ console.log ครับ
โดยอันนี้แหละที่เราจะเอามาใช้ต่อได้ เอา Code อันนี้ไปใส่
// Retrieve all data from the input
const inputItems = $input.all()
// Extract the headers from the first item
const headers = inputItems[0].json || []
// Initialize an array to store the new items
const newItems = []
// Iterate over each old item, starting from the second item since the first is the headers
for (let i = 1; i < inputItems.length; i++) {
const item = inputItems[i].json || []
const obj = {} // Use a plain JavaScript object
// Map each value to its corresponding header
for (let j = 0; j < headers.length; j++) {
obj[headers[j]] = item[j]
}
// Add the new object to the newItems array
newItems.push(obj)
}
// Return the JSON array of objects
return newItems
ใน code จะมี warning ของ interface อยู่นะครับ แต่มองข้ามไปได้ กดรันได้เลยฮะ ถ้าถูกต้องตรงฝั่งขวามือเราจะได้ Output หน้าตาเป็นแบบนี้ครับ ถือว่าถูกต้องและใช้งานต่อได้
ซึ่งต่อไปก็ขึ้นอยู่กับเราว่าจะเอาข้อมูลจาก workflow นี้ไปทำอะไรต่อ เช่นนำไปเก็บใน Database, นำไปใช้วิเคราะห์ต่อ, นำไป filter ข้อมูลที่สนใจอันนี้ขึ้นอยู่กับจุดประสงค์แล้วครับ
บนเส้นเมื่อรันแล้วจะเจอกับเลขอยู่นะครับ ซึ่งหมายถึงจำนวนข้อมูลปกติแล้ว N8N จะทำการ Loop ในข้อมูลแต่ละชุดให้เลยครับ จากด้านซ้ายมีข้อมูล 31 Object (รวม header) เอามาแปลงเป็นข้อมูลด้านขวาซึ่งจะเหลือ 30 Object ครับ
ต่อไปผมจะลองใช้งาน Filter ดูนะครับ โดยที่จะ filter mimetype: text/html
ออกมาอย่างเดียว เลือกเป็น Data transformation และ Filter
เลือกเป็น Schema แล้วดูตรง Node ที่ชื่อว่า "Code" ซึ่งเป็น Node ก่อนหน้า ในที่นี้เราสามารถ drag & drop ข้อมูลที่เราต้องการได้เลยครับ ให้เลือก "mimetype" ลากมาวางตรง "value1"
ส่วน OP: เลือกเป็น "is equal to" และ value ใส่เป็น "text/html" แบบในรูปครับ
เมื่อกด "Test Step" จะพบว่าข้อมูลจะถูกแยกเป็น 2 ส่วนคือ"Kept" (เก็บไว้) และ "Discarded" (เอาทิ้ง) ซึ่งจะเป็นตามเงื่อนไขที่เราตั้งไว้ครับ
ปลายเส้นก็จะเหลือข้อมูล 1 item ตามที่เรา filter ไว้เลยครับ เย่
การใช้งาน N8N ก็จะมีประมาณนี้ครับ ไม่ยากไม่ง่ายจนเกินไปเนอะ ไว้มาต่อกัน EP 3 นะครับ