|


Add Refrences ...
- NewtonSoft.Json (จัดข้อความให้อยู่ให้อยู่ในรูปแบบ JSON)
- WinSCPnet.dll (FTP - File Transfer Protocol ในการอัพโหลดและดาวน์โหลดไฟล์ภาพ ระหว่างคอมพิวเตอร์ และ Hosting)
*** ทั้ง 2 ไฟล์นี้เป็นของฟรีครับ ***
วิธีการส่งภาพผ่าน LINE Messaging API ด้วย VB.NET: คุณจะต้องดำเนินการตามขั้นตอนเหล่านี้แทน
(1) คุณต้องมี Server ที่สามารถเข้าถึงได้จากอินเทอร์เน็ต (เช่น Web Server, Cloud Storage อย่าง AWS S3, Google Cloud Storage, หรือบริการฝากไฟล์อื่นๆ)
เขียนโค้ด VB.NET เพื่ออัปโหลดไฟล์ภาพจาก Local Computer ของคุณไปยัง Server นั้น เมื่ออัปโหลดสำเร็จ คุณจะได้รับ URL ของรูปภาพที่อยู่บน Server
(2) สร้าง Payload สำหรับส่งภาพ:
สร้าง JSON Payload ตามรูปแบบที่ LINE Messaging API กำหนดสำหรับการส่งข้อความประเภทรูปภาพ ใน Payload จะต้องมี type เป็น "image"
และมี Properties ดังนี้:
- originalContentUrl: URL ของรูปภาพต้นฉบับ (ขนาดเต็ม) ที่อยู่บน Server ของคุณ
- previewImageUrl: URL ของรูปภาพขนาดเล็กสำหรับแสดงเป็นภาพตัวอย่าง (สามารถใช้ URL เดียวกับ originalContentUrl ได้หากไม่ต้องการภาพตัวอย่างแยก)
(3) ส่ง HTTP POST Request ไปยัง LINE API:
ใช้ HttpClient ใน VB.NET เพื่อส่ง HTTP POST Request ไปยัง Endpoint ของ LINE Messaging API สำหรับการส่งข้อความ (เช่น https://api.line.me/v2/bot/message/push หรือ https://api.line.me/v2/bot/message/reply) กำหนด Headers ให้ถูกต้อง โดยเฉพาะ Authorization (Bearer token) และ Content-Type (application/json)
(4) ใส่ JSON Payload ที่สร้างไว้ใน Body ของ Request
(04-05-2568) แอดมินใช้บริการ Hosting ของฟรีจาก www.serv00.com แต่ปัจจุบันนี้ผู้ให้บริการได้ปิดการรับสมัคร Account เข้าใช้งานอยู่ จะต้องไปหา Hosting ที่ใหม่ด้วยล่ะครับ
สมัครการใช้งาน Line Official Account ที่
https://manager.line.biz/
https://developers.line.biz/en/
คลิปวิดีโอในการสมัครใช้งาน Line Official Account เพื่อรับค่า Channel Access Token และ UserID
มาดูโค้ดฉบับเต็มกันเถอะ ... (ฟอร์มหลัก)
- '// สมัครการใช้งาน Line Messaging API ที่
- '// https://manager.line.biz/
- '// https://developers.line.biz/en/
- '// จากนั้น สร้าง Channel ใน Line Messaging API
- '// รับ Channel Access Token และ User ID จากหน้า Line Console
- '// ติดตั้ง Library Newtonsoft.Json เพื่อช่วยจัดการ JSON
- '// ใน NuGet Package Manager Console ใช้คำสั่ง:
- '// Install-Package Newtonsoft.Json
- '// .Net Framework 4.5
- Imports System.IO
- Imports WinSCP
- Public Class frmLineApiMsgImg
- '// ------------------------------------------------------------------------------------------------
- '// เก็บตำแหน่งและชื่อไฟล์ภาพต้นฉบับที่ต้องการอัพโหลด
- Dim PictureUploadPath As String = String.Empty
- '// แยกชื่อไฟล์+นามสกุล ออกจากโฟลเดอร์
- Dim UploadFileName As String = ""
- '// Default path.
- Dim PictureDefaultPath As String = MyPath(Application.StartupPath) & "Images"
- '// ตำแหน่งของไฟล์ภาพบน Hosting เพื่อนำมาแสดงผล (โฟลเดอร์ uploadimages อยู่ภายใต้ public_html)
- '// ต้องเปลี่ยน Sub Domain จาก g2gnet ให้เป็นไปตามที่สมัครเอาไว้ด้วยล่ะครับ
- Dim MyURL As String = "https://g2gnet.serv00.net/uploadimages/"
- '// ตำแหน่งในการอัพโหลดไฟล์ภาพ (FTP)
- Dim RemoteDir As String = "domains/g2gnet.serv00.net/public_html/uploadimages/"
- '// For Login to Hosting.
- Dim HostName As String = "HOST_NAME"
- Dim UName As String = "USER_NAME"
- Dim Pwd As String = "PASSWORD"
- Private Sub frmLineApiMsgImg_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- txtMessage.Text = "ทดสอบการทำงานของ Line Messaging API ด้วยการส่งข้อความและรูปภาพ"
- End Sub
- '// ------------------------------------------------------------------------------------------------
- '// คำสั่ง Async ใช้เพื่อระบุว่าฟังก์ชันหรือเมธอดสามารถดำเนินการแบบ Asynchronous
- '// หรือเป็นทำงานแบบไม่รอให้เสร็จสมบูรณ์ก่อนที่จะไปทำคำสั่งถัดไปได้
- '// โดยปกติจะใช้ร่วมกับคำสั่ง Await เพื่อเรียกใช้งานที่ใช้เวลานาน
- '// เช่น การร้องขอข้อมูลจาก API, อ่าน/เขียนไฟล์, หรือรอเครือข่าย โดยไม่บล็อกส่วนที่เหลือของแอพพลิเคชัน
- '// ------------------------------------------------------------------------------------------------
- Private Async Sub btnSendMessage_Click(sender As Object, e As EventArgs) Handles btnSendMessage.Click
- '// หากไม่มีข้อความก็ไม่ต้องส่ง
- 'If (String.IsNullOrEmpty(txtMessage.Text.Trim)) Then Return
- '// ตำแหน่งการแสดงผลไฟล์ภาพ
- Dim imageURL As String = String.Empty
- '// "https://g2gnet.serv00.net/uploadimages/" + "ชื่อไฟล์ภาพ+นามสกุล"
- If Not String.IsNullOrEmpty(UploadFileName) Then imageURL = MyURL + UploadFileName
- '// หากมีรูปภาพต้องอัพโหลดขึ้น Hosting ก่อน
- '// RemoteDir = "domains/g2gnet.serv00.net/public_html/uploadimages/" + UploadFileName
- If Not (String.IsNullOrEmpty(UploadFileName)) Then Call UploadRemoteFile(RemoteDir + UploadFileName)
- '// เริ่มต้นใช้ Line Bot ด้วยการเรียกไปยังคลาส LineMessagingAPI
- Dim LineAPI As New LineMessagingAPI()
- '// Await:
- '// ใช้เพื่อรอการทำงานของงานที่ใช้เวลานาน โดยไม่บล็อกการทำงานของเธรดหลัก
- '// คำสั่งหลัง Await จะรันเมื่อการทำงานนั้นเสร็จสมบูรณ์
- Await LineAPI.SendImageMessageToLineAsync(txtMessage.Text, imageURL)
- '// หากต้องการลบไฟล์ภาพที่อัพโหลดออกไปหลังจากที่ส่งไปใน Line เรียบร้อย
- If Not String.IsNullOrEmpty(imageURL) Then Call DeleteRemoteFile(RemoteDir + UploadFileName)
- '// Clear
- UploadFileName = ""
- PictureUploadPath = String.Empty
- picData.Image = Image.FromFile(PictureDefaultPath & "NoImage.gif")
- End Sub
- '// ------------------------------------------------------------------------------------------------
- '// เบราซ์หาไฟล์ภาพ
- '// ------------------------------------------------------------------------------------------------
- Private Sub btnBrowse_Click(sender As Object, e As EventArgs) Handles btnBrowse.Click
- Dim dlgImage As OpenFileDialog = New OpenFileDialog()
- '// Open File Dialog
- With dlgImage
- .InitialDirectory = PictureDefaultPath
- .Title = "Select Image File"
- .Filter = "Format (*.jpg;*.jpeg;*.png)|*.jpg;*.jpeg;*.png"
- .FilterIndex = 1
- .RestoreDirectory = True
- End With
- '// Select OK after Browse ...
- If dlgImage.ShowDialog() = DialogResult.OK Then
- '// Check file size don't over 1 MB.
- Dim info As New FileInfo(dlgImage.FileName)
- If (info.Length / 1024) > 1024 Then
- MessageBox.Show("The image file you selected is of size " & Format((info.Length / 1024), "#,##0") & " KB. is too big more than 1,024 KB.", "Report Status", MessageBoxButtons.OK, MessageBoxIcon.Warning)
- Exit Sub
- End If
- '// Put the current image file into PictureBox Control.
- picData.Image = Image.FromFile(dlgImage.FileName)
- '// เอาเฉพาะชื่อไฟล์และนามสกุลภาพ (Filename + Extension) เช่น thongkorn.png
- UploadFileName = dlgImage.SafeFileName
- '// เอาไฟล์ภาพมาเต็มพาธ เพื่อระบุต้นทางไฟล์ก่อนทำการอัพโหลด
- PictureUploadPath = dlgImage.FileName
- End If
- End Sub
- '// ------------------------------------------------------------------------------------------------
- '// UPLOAD FILE to HOSTING.
- '// ------------------------------------------------------------------------------------------------
- Private Sub UploadRemoteFile(ByVal imgUrl As String)
- If String.IsNullOrEmpty(UploadFileName) Then Return
- '//
- Me.Cursor = Cursors.WaitCursor
- Try
- '// Setup session options
- Dim sessionOptions As New SessionOptions
- With sessionOptions
- .Protocol = Protocol.Ftp
- .HostName = HostName
- .UserName = UName
- .Password = Pwd
- '// FTP ไม่ต้องใช้
- '.SshHostKeyFingerprint = "ssh-rsa 2048 XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX"
- End With
- Using Session As New Session
- '// Connect
- Session.Open(sessionOptions)
- '// Upload files
- Dim TransferOptions As New TransferOptions
- TransferOptions.TransferMode = TransferMode.Binary
- Dim TransferResult As TransferOperationResult
- '// ตำแหน่งไฟล์ต้นฉบับแบบ Full Path และ Remote Directory ปลายทาง
- '// RemoteDir = "domains/g2gnet.serv00.net/public_html/uploadimages/"
- TransferResult = Session.PutFiles(PictureUploadPath, imgUrl, False, TransferOptions)
- '// Throw on any error
- TransferResult.Check()
- End Using
- Catch ex As Exception
- MessageBox.Show(ex.Message)
- Finally
- Me.Cursor = Cursors.Default
- End Try
- End Sub
- '// ------------------------------------------------------------------------------------------------
- '// การลบไฟล์แบบ Remote ด้วย WinSCP FTP
- '// ------------------------------------------------------------------------------------------------
- Private Sub DeleteRemoteFile(ByVal imgUrl As String)
- Me.Cursor = Cursors.WaitCursor
- Try
- Dim sessionOptions As New SessionOptions With {
- .Protocol = Protocol.Ftp,
- .HostName = HostName,
- .UserName = UName,
- .Password = Pwd
- }
- Using session As New Session
- session.Open(sessionOptions)
- '// ลบไฟล์บน Remote ที่ "domains/g2gnet.serv00.net/public_html/uploadimages/" + "ชื่อไฟล์ภาพ+นามสกุล"
- Dim removalResult As RemovalOperationResult = session.RemoveFiles(imgUrl)
- '// ตรวจสอบว่าเกิดข้อผิดพลาดหรือไม่
- removalResult.Check()
- 'MessageBox.Show("ลบไฟล์สำเร็จ!!!", "Complete", MessageBoxButtons.OK, MessageBoxIcon.Information)
- End Using
- Catch ex As Exception
- MessageBox.Show("เกิดข้อผิดพลาด: " & ex.Message, "Report Status", MessageBoxButtons.OK, MessageBoxIcon.Error)
- Finally
- Me.Cursor = Cursors.Default
- End Try
- End Sub
- '// ------------------------------------------------------------------------------------------------
- Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click
- picData.Image = Image.FromFile(PictureDefaultPath & "NoImage.gif")
- UploadFileName = ""
- PictureUploadPath = String.Empty
- End Sub
- Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
- Me.Close()
- End Sub
- Private Sub frmLineApiMsgImg_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
- Me.Dispose()
- GC.SuppressFinalize(Me)
- Application.Exit()
- End Sub
- #Region "FUNCTION"
- ' / --------------------------------------------------------------------------------
- ' / Get my project path
- ' / AppPath = C:\My Project\bin\debug
- ' / Replace "\bin\debug" with ""
- ' / Return : C:\My Project\
- Function MyPath(ByVal AppPath As String) As String
- '/ MessageBox.Show(AppPath);
- AppPath = AppPath.ToLower()
- '/ Return Value
- MyPath = AppPath.Replace("\bin\debug", "").Replace("\bin\release", "").Replace("\bin\x86\debug", "")
- '// If not found folder then put the \ (BackSlash) at the end.
- If Microsoft.VisualBasic.Right(MyPath, 1) <> Chr(92) Then MyPath = MyPath & Chr(92)
- End Function
- #End Region
- End Class
คัดลอกไปที่คลิปบอร์ด
Class ในการส่งข้อความและรูปภาพไปยัง Chat Bot ... (LineMessagingAPI.vb)
- Imports System.Net.Http
- Imports Newtonsoft.Json
- Imports System.Text
- Imports System.Net.Http.Headers
- Public Class LineMessagingAPI
- '// Channel Access Token จาก Line Developer Console
- Public Shared AccessToken As String = "CHANNEL_ACCESS_TOKEN" '// เปลี่ยนด้วย
- '// ต้องใส่ User ID ของคุณ
- Public Const YourUserId As String = "USER_ID" '// เปลี่ยนด้วย
- '// --------------------------------------------------------------------------------
- '// ฟังค์ชั่นในการทดสอบ Bot ตัวเอง
- '// LINE ไม่รองรับการอัปโหลดไฟล์ภาพ โดยตรงจากเครื่องผู้ใช้ (เช่น C:\image.jpg) ผ่าน API ประเภท push หรือ reply message
- '// LINE ต้องการภาพผ่าน URL เท่านั้นโดย :
- '// - originalContentUrl และ previewImageUrl ต้องเป็นลิงก์ HTTPS
- '// - ต้องสามารถเข้าถึงได้โดยสาธารณะ (Public URL)
- '// - รองรับไฟล์ .jpg, .png, .jpeg และไม่เกิน 1MB
- '// --------------------------------------------------------------------------------
- Public Async Function SendImageMessageToLineAsync(message As String, imageUrl As String) As Task
- Try
- Using client As New HttpClient()
- client.DefaultRequestHeaders.Accept.Add(New System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"))
- client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", AccessToken)
- Dim url As String = "https://api.line.me/v2/bot/message/push"
- '// เตรียมรายการข้อความ สร้าง Payload ตามรูปแบบที่ Line API ต้องการ
- '// Payload คือเนื้อหาข้อมูลที่ส่งไปยัง Line Server ผ่าน API เช่น การส่งข้อความ, การส่งรูปภาพ หรือการสร้าง Flex Message
- Dim MessagePayload As New List(Of Object)
- '// ตรวจสอบว่ามีข้อความ
- If Not String.IsNullOrWhiteSpace(message) Then
- MessagePayload.Add(New With {
- .type = "text",
- .text = message
- })
- End If
- '// ตรวจสอบว่ามี URL รูปภาพ
- If Not String.IsNullOrWhiteSpace(imageUrl) Then
- MessagePayload.Add(New With {
- .type = "image",
- .originalContentUrl = imageUrl,
- .previewImageUrl = imageUrl
- })
- End If
- '// สำหรับวิดีโอ
- 'If Not String.IsNullOrEmpty(videoUrl) AndAlso Not String.IsNullOrEmpty(videoPreviewUrl) Then
- 'MessagePayload.Add(New With {
- 'Key .type = "video",
- 'Key .originalContentUrl = videoUrl,
- 'Key .previewImageUrl = videoPreviewUrl
- '})
- 'End If
- '// ถ้าไม่มีอะไรส่งเลย ให้แจ้งเตือนแล้วเด้งออกไปเลย
- If MessagePayload.Count = 0 Then
- MessageBox.Show("ไม่พบข้อความหรือรูปภาพที่จะส่ง", "No Content", MessageBoxButtons.OK, MessageBoxIcon.Warning)
- Return
- End If
- '// สร้าง Payload ที่จะส่ง
- Dim Payload = New With {
- .to = YourUserId,
- .messages = MessagePayload.ToArray()
- }
- '// แปลงเป็น JSON แล้วส่ง
- Dim JsonPayload As String = JsonConvert.SerializeObject(Payload, Formatting.Indented)
- '// ตัวอย่าง:
- '// {
- '// "to": "USER_ID",
- '// "messages": [
- '// {
- '// "type": "text",
- '// "text": "สวัสดีครับ! นี่คือข้อความจาก Line Messaging API"
- '// },
- '// {
- '// "type": "image",
- '// "originalContentUrl": "https://example.com/image.jpg",
- '// "previewImageUrl": "https://example.com/image_preview.jpg" (หรือใช้ชื่อไฟล์ภาพ Content ตัวเดียวกันได้เลย)
- '// }
- '// ]
- '// }
- Dim content = New StringContent(JsonPayload, Encoding.UTF8, "application/json")
- Dim response = Await client.PostAsync(url, content)
- Dim responseBody = Await response.Content.ReadAsStringAsync()
- '//
- If Not response.IsSuccessStatusCode Then
- MessageBox.Show("เกิดข้อผิดพลาด: " & response.StatusCode & vbCrLf & responseBody, "Report Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
- End If
- '// หากต้องการแสดงข้อความแจ้งเตือน
- 'If response.IsSuccessStatusCode Then
- 'MessageBox.Show("ส่งข้อความและรูปภาพสำเร็จ!", "Complete", MessageBoxButtons.OK, MessageBoxIcon.Information)
- 'Else
- 'MessageBox.Show("เกิดข้อผิดพลาด: " & response.StatusCode & vbCrLf & responseBody, "Report Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
- 'End If
- End Using
- Catch ex As Exception
- MessageBox.Show("LINE Exception: " & ex.Message)
- End Try
- End Function
- End Class
คัดลอกไปที่คลิปบอร์ด
ดาวน์โหลดโค้ดต้นฉบับ VB.NET (.Net Framework 4.5+) ได้ที่นี่ ...
|
ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง
คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน
x
|