 |
|
Windows Service มีปัญหากับ WebBrowser ครับ "Object reference not set to an instance of an object." |
|
 |
|
|
 |
 |
|
พอดีโปรเจ็คที่ทำ คือ ให้ดึง อัตราแลกเปลี่ยน จากธนาคารแห่งประเทศไทย มาเก็บในฐานข้อมูลเพื่อจะนำอัตราซื้อ-ขาย ไปใช้งานต่อไปครับ
เบื้องต้น ลองดูพวก API แล้ว แต่ยัง งงๆ อยู่ (มีตัวอย่าง API จากเว็บ แต่เป็น C# Web App ลองหาวิธีให้เป็น Win App ได้ แต่ก็ดึงค่ามาไม่ได้ครับ)
ดันไปเห็นอีกวิธีคือใช้ WebBrowser โหลด อัตราแลกเปลี่ยน จากธนาคารแห่งประเทศไทย โค้ดโหลด
Code (VB.NET)
Web.ObjectForScripting = True
Web.ScriptErrorsSuppressed = True
Web.Navigate("https://www.bot.or.th/thai/_layouts/application/exchangerate/exchangerate.aspx")
เมื่อโหลดเสร็จ (DocumentCompleted) ก็ใช้โค้ดประมาณนี้ครับ
Code (VB.NET)
Dim str As String = ""
For Each h As HtmlElement In Web.Document.GetElementsByTagName(txtTagName.Text)
If Not Object.ReferenceEquals(h.GetAttribute(txtGetAtt.Text), Nothing) AndAlso h.GetAttribute(txtGetAtt.Text).Equals(txtGetAttEquals.Text) Then
If str.ToString.Split(",").Length = 4 AndAlso IsNumeric(h.InnerText) = False Then
Exit For
Else
str &= If(str = "", "", ",") & h.InnerText.Trim
End If
If str.ToString.Split(",").Length = 5 Then
strText.Text &= If(String.IsNullOrEmpty(strText.Text), "", vbNewLine) & str.ToString
str = ""
End If
ElseIf Not Object.ReferenceEquals(h.GetAttribute(txtGetErrorAtt.Text), Nothing) AndAlso (h.GetAttribute(txtGetErrorAtt.Text).Equals(txtGetErrorAttEquals.Text) And Not String.IsNullOrEmpty(h.InnerText)) Then
strText.Text = h.InnerText.Trim
Exit For
End If
Next
ที่เข้าใจจากโค้ดข้างต้นคือ ไล่วนลูปจาก TagName ของเว็บ แล้วดูว่าค่าไหนตรงกับข้อมูลที่แสดงในเว็บ แล้วดึงค่าจาก Tagname นั้นมาครับ ต่อไปก็นำค่าที่เก็บมา (strText) มาอ่านค่าแล้วบันทึกลงฐานข้อมูลครับ
(แต่ที่ผมทำคือ เปิด Chrome แล้วเข้าเว็บ แล้วคลิกขวาตรงที่ว่าง ๆ แล้วเลือก ดูรหัสต้นฉบับ แล้วหา Tagname ที่มีค่าตรงกับที่ผมต้องการครับ)
เข้าประเด็นนะครับ ตอนแรกรันทดสอบโค้ดที่ New Project Windows Application ปรกติ ไม่มีปัญหาครับ
แต่พอไป New Project เป็น Service เกิดปัญหาคือ เวลาให้ WebBrowser โหลด อัตราแลกเปลี่ยน จากธนาคารแห่งประเทศไทย เกิด Error บรรทัดนี้ครับ
Code (VB.NET)
Web.ObjectForScripting = True
Error ว่า
Quote:"Object reference not set to an instance of an object."
ลองหาวิธีแก้ก็ยัง งง ๆ อยู่ ช่วยชี้แนะด้วยครับ เป็นวิธีแก้ไข หรืออะไรที่ดีกว่านี้ หรือเป็น API ได้ยิ่งดีครับ ขอบคุณครับ
Tag : .NET, Win (Windows App), VS 2010 (.NET 4.x), Windows
|
ประวัติการแก้ไข 2019-08-31 16:13:47
|
 |
 |
 |
 |
Date :
2019-08-31 16:12:49 |
By :
pattaphol |
View :
943 |
Reply :
2 |
|
 |
 |
 |
 |
|
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
Windows Services ไม่น่จะดึง Web Browser ได้ครับ
|
 |
 |
 |
 |
Date :
2019-09-02 17:38:53 |
By :
mr.win |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
วิธีของคุณ ที่ทำ น่าจะเป็นการ web crawler มากกว่านะครับ
ลองดู วิธี ในอ้างอิงด้านนล่างนะครับ (อันแรก) คิดว่าน่าจะดูแล้ว แต่ลองค่อยๆอ่าน และทำความเข้าใจอีกครั้งนะครับ
เห็นใช้ภาษา VB.NET ผมแปะให้ครับ (แปลง จาก C# ที่อ้างอิงนั่นแหละครับ)
Code (VB.NET)
Private Sub SurroundingSub()
Dim startPeriod As String = "2019-01-05"
Dim endPeriod As String = "2019-01-05"
Dim client = New RestClient("https://apigw1.bot.or.th/bot/public/Stat-ExchangeRate/v2/DAILY_AVG_EXG_RATE/?start_period=" & startPeriod & "&end_period=" & endPeriod)
Dim request = New RestRequest(Method.[GET])
request.AddHeader("Accept", "application/json")
request.AddHeader("x-ibm-client-id", "REPLACE_THIS_KEY")
Dim response As IRestResponse = client.Execute(request)
If response.StatusCode.Equals(HttpStatusCode.OK) Then
Console.WriteLine(response.Content)
End If
End Sub
อ้างอิง
https://medium.com/@minatonamikazerak/python-%E0%B8%97%E0%B8%B3-web-scraping-web-crawler-d2d00244ac94
https://medium.com/readmoreth/consume-bank-of-thailand-api-using-c-net-c7595f5efd22
|
 |
 |
 |
 |
Date :
2019-09-06 02:02:32 |
By :
bigsuntat |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|