1stPK Posted October 28 Share Posted October 28 I have this code, and I am trying to get the results using HTML from a specific website. However, I am encountering a build error. Can anyone help me? https://www.minhngoc.net.vn/ket-qua-xo-so/mien-bac/27-10-2024.html expandcollapse popup#include <GUIConstantsEx.au3> #include <Date.au3> ; Biến lưu trữ kết quả 10 ngày gần nhất Global $aResults[10][8] ; Tạo GUI Global $hGUI = GUICreate("Kết quả xổ số miền Bắc - 10 ngày gần nhất", 600, 400) Global $lblDate, $lblDB, $lbl1st, $lbl2nd, $lbl3rd, $lbl4th, $lbl5th, $lbl6th, $lbl7th Global $btnPrev = GUICtrlCreateButton("Trang Trước", 150, 350, 100, 30) Global $btnNext = GUICtrlCreateButton("Trang Sau", 350, 350, 100, 30) ; Tạo các nhãn để hiển thị kết quả $lblDate = GUICtrlCreateLabel("", 10, 10, 580, 20) $lblDB = GUICtrlCreateLabel("", 20, 40, 580, 20) $lbl1st = GUICtrlCreateLabel("", 20, 70, 580, 20) $lbl2nd = GUICtrlCreateLabel("", 20, 100, 580, 20) $lbl3rd = GUICtrlCreateLabel("", 20, 130, 580, 20) $lbl4th = GUICtrlCreateLabel("", 20, 160, 580, 20) $lbl5th = GUICtrlCreateLabel("", 20, 190, 580, 20) $lbl6th = GUICtrlCreateLabel("", 20, 220, 580, 20) $lbl7th = GUICtrlCreateLabel("", 20, 250, 580, 20) Local $iCurrentPage = 0 ; Trang hiện tại ; Lấy kết quả từ trang web cho 10 ngày gần nhất For $i = 0 To 9 Local $sDate = _DateAdd('D', -$i, _NowCalcDate()) Local $sFormattedDate = StringReplace($sDate, "-", "/") $aResults[$i][0] = $sFormattedDate Local $sData = FetchData($sFormattedDate) If Not @error Then ParseData($sData, $i) Else MsgBox(16, "Lỗi", "Không thể lấy dữ liệu từ trang web cho ngày: " & $sFormattedDate) EndIf Next ; Hàm lấy dữ liệu từ URL Func FetchData($sDate) Local $sURL = "https://www.minhngoc.net.vn/ket-qua-xo-so/mien-bac/" & $sDate & ".html" Local $sData = InetRead($sURL) If @error Then Return SetError(1, 0, "") EndIf ; Ghi nội dung HTML ra file để kiểm tra FileWrite("output_" & $sDate & ".html", $sData) Return BinaryToString($sData) EndFunc ; Hàm phân tích dữ liệu HTML từ trang web Func ParseData($sData, $iDayIndex) Local $aMatch ; Đặc biệt $aMatch = StringRegExp($sData, '(?s)Đặc biệt.*?class="numbers">(.*?)<', 1) $aResults[$iDayIndex][1] = IsArray($aMatch) And UBound($aMatch) > 0 ? $aMatch[0] : "Không có dữ liệu" ; Giải nhất $aMatch = StringRegExp($sData, '(?s)Giải nhất.*?class="numbers">(.*?)<', 1) $aResults[$iDayIndex][2] = IsArray($aMatch) And UBound($aMatch) > 0 ? $aMatch[0] : "Không có dữ liệu" ; Giải nhì $aMatch = StringRegExp($sData, '(?s)Giải nhì.*?class="numbers">(.*?)<', 1) $aResults[$iDayIndex][3] = IsArray($aMatch) And UBound($aMatch) > 0 ? $aMatch[0] : "Không có dữ liệu" ; Giải ba $aMatch = StringRegExp($sData, '(?s)Giải ba.*?class="numbers">(.*?)<', 1) $aResults[$iDayIndex][4] = IsArray($aMatch) And UBound($aMatch) > 0 ? $aMatch[0] : "Không có dữ liệu" ; Giải tư $aMatch = StringRegExp($sData, '(?s)Giải tư.*?class="numbers">(.*?)<', 1) $aResults[$iDayIndex][5] = IsArray($aMatch) And UBound($aMatch) > 0 ? $aMatch[0] : "Không có dữ liệu" ; Giải năm $aMatch = StringRegExp($sData, '(?s)Giải năm.*?class="numbers">(.*?)<', 1) $aResults[$iDayIndex][6] = IsArray($aMatch) And UBound($aMatch) > 0 ? $aMatch[0] : "Không có dữ liệu" ; Giải sáu $aMatch = StringRegExp($sData, '(?s)Giải sáu.*?class="numbers">(.*?)<', 1) $aResults[$iDayIndex][7] = IsArray($aMatch) And UBound($aMatch) > 0 ? $aMatch[0] : "Không có dữ liệu" ; Giải bảy $aMatch = StringRegExp($sData, '(?s)Giải bảy.*?>(.*?)<', 1) If Not IsArray($aMatch) Or UBound($aMatch) = 0 Then $aResults[$iDayIndex][8] = "Không tìm thấy dữ liệu" Else $aResults[$iDayIndex][8] = $aMatch[0] EndIf EndFunc ; Hàm để cập nhật trang hiển thị kết quả Func UpdatePage($iPage) GUICtrlSetData($lblDate, "Ngày: " & $aResults[$iPage][0]) GUICtrlSetData($lblDB, "Đặc biệt: " & $aResults[$iPage][1]) GUICtrlSetData($lbl1st, "Giải nhất: " & $aResults[$iPage][2]) GUICtrlSetData($lbl2nd, "Giải nhì: " & $aResults[$iPage][3]) GUICtrlSetData($lbl3rd, "Giải ba: " & $aResults[$iPage][4]) GUICtrlSetData($lbl4th, "Giải tư: " & $aResults[$iPage][5]) GUICtrlSetData($lbl5th, "Giải năm: " & $aResults[$iPage][6]) GUICtrlSetData($lbl6th, "Giải sáu: " & $aResults[$iPage][7]) GUICtrlSetData($lbl7th, "Giải bảy: " & $aResults[$iPage][8]) EndFunc ; Hiển thị trang đầu tiên UpdatePage($iCurrentPage) GUISetState(@SW_SHOW) ; Vòng lặp GUI While 1 Local $iMsg = GUIGetMsg() Select Case $iMsg = $btnPrev If $iCurrentPage > 0 Then $iCurrentPage -= 1 UpdatePage($iCurrentPage) EndIf Case $iMsg = $btnNext If $iCurrentPage < 9 Then $iCurrentPage += 1 UpdatePage($iCurrentPage) EndIf Case $iMsg = $GUI_EVENT_CLOSE ExitLoop EndSelect WEnd GUIDelete($hGUI) Link to comment Share on other sites More sharing options...
SOLVE-SMART Posted October 28 Share Posted October 28 (edited) Hi @1stPK 👋 , no build errors with this code: Spoiler expandcollapse popup#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7 #AutoIt3Wrapper_AU3Check_Stop_OnWarning=y #include-once #include <Array.au3> #include <GUIConstantsEx.au3> #include <Date.au3> ; Biến lưu trữ kết quả 10 ngày gần nhất Global $aResults[10][8] ; Tạo GUI Global $hGUI = GUICreate("Kết quả xổ số miền Bắc - 10 ngày gần nhất", 600, 400) Global $lblDate, $lblDB, $lbl1st, $lbl2nd, $lbl3rd, $lbl4th, $lbl5th, $lbl6th, $lbl7th Global $btnPrev = GUICtrlCreateButton("Trang Trước", 150, 350, 100, 30) Global $btnNext = GUICtrlCreateButton("Trang Sau", 350, 350, 100, 30) ; Tạo các nhãn để hiển thị kết quả $lblDate = GUICtrlCreateLabel("", 10, 10, 580, 20) $lblDB = GUICtrlCreateLabel("", 20, 40, 580, 20) $lbl1st = GUICtrlCreateLabel("", 20, 70, 580, 20) $lbl2nd = GUICtrlCreateLabel("", 20, 100, 580, 20) $lbl3rd = GUICtrlCreateLabel("", 20, 130, 580, 20) $lbl4th = GUICtrlCreateLabel("", 20, 160, 580, 20) $lbl5th = GUICtrlCreateLabel("", 20, 190, 580, 20) $lbl6th = GUICtrlCreateLabel("", 20, 220, 580, 20) $lbl7th = GUICtrlCreateLabel("", 20, 250, 580, 20) Global $iCurrentPage = 0 ; Trang hiện tại ; Lấy kết quả từ trang web cho 10 ngày gần nhất For $i = 0 To 9 Global $sDate = _DateAdd('D', -$i, _NowCalcDate()) Global $sFormattedDate = StringReplace($sDate, "-", "/") $aResults[$i][0] = $sFormattedDate Global $sData = FetchData($sFormattedDate) If Not @error Then ParseData($sData, $i) Else MsgBox(16, "Lỗi", "Không thể lấy dữ liệu từ trang web cho ngày: " & $sFormattedDate) EndIf Next ; Hàm lấy dữ liệu từ URL Func FetchData($sDate) Local $sURL = "https://www.minhngoc.net.vn/ket-qua-xo-so/mien-bac/" & $sDate & ".html" Local $sData = InetRead($sURL) If @error Then Return SetError(1, 0, "") EndIf ; Ghi nội dung HTML ra file để kiểm tra FileWrite("output_" & $sDate & ".html", $sData) Return BinaryToString($sData) EndFunc ;==>FetchData ; Hàm phân tích dữ liệu HTML từ trang web Func ParseData($sData, $iDayIndex) Local $aMatch ; Đặc biệt $aMatch = StringRegExp($sData, '(?s)Đặc biệt.*?class="numbers">(.*?)<', 1) $aResults[$iDayIndex][1] = IsArray($aMatch) And UBound($aMatch) > 0 ? $aMatch[0] : "Không có dữ liệu" ; Giải nhất $aMatch = StringRegExp($sData, '(?s)Giải nhất.*?class="numbers">(.*?)<', 1) $aResults[$iDayIndex][2] = IsArray($aMatch) And UBound($aMatch) > 0 ? $aMatch[0] : "Không có dữ liệu" ; Giải nhì $aMatch = StringRegExp($sData, '(?s)Giải nhì.*?class="numbers">(.*?)<', 1) $aResults[$iDayIndex][3] = IsArray($aMatch) And UBound($aMatch) > 0 ? $aMatch[0] : "Không có dữ liệu" ; Giải ba $aMatch = StringRegExp($sData, '(?s)Giải ba.*?class="numbers">(.*?)<', 1) $aResults[$iDayIndex][4] = IsArray($aMatch) And UBound($aMatch) > 0 ? $aMatch[0] : "Không có dữ liệu" ; Giải tư $aMatch = StringRegExp($sData, '(?s)Giải tư.*?class="numbers">(.*?)<', 1) $aResults[$iDayIndex][5] = IsArray($aMatch) And UBound($aMatch) > 0 ? $aMatch[0] : "Không có dữ liệu" ; Giải năm $aMatch = StringRegExp($sData, '(?s)Giải năm.*?class="numbers">(.*?)<', 1) $aResults[$iDayIndex][6] = IsArray($aMatch) And UBound($aMatch) > 0 ? $aMatch[0] : "Không có dữ liệu" ; Giải sáu $aMatch = StringRegExp($sData, '(?s)Giải sáu.*?class="numbers">(.*?)<', 1) $aResults[$iDayIndex][7] = IsArray($aMatch) And UBound($aMatch) > 0 ? $aMatch[0] : "Không có dữ liệu" ; Giải bảy $aMatch = StringRegExp($sData, '(?s)Giải bảy.*?>(.*?)<', 1) _ArrayDisplay($aResults, 1) _ArrayDisplay($aMatch, 2) If Not IsArray($aMatch) Or UBound($aMatch) = 0 Then $aResults[$iDayIndex][8] = "Không tìm thấy dữ liệu" Else $aResults[$iDayIndex][8] = $aMatch[0] EndIf EndFunc ;==>ParseData ; Hàm để cập nhật trang hiển thị kết quả Func UpdatePage($iPage) GUICtrlSetData($lblDate, "Ngày: " & $aResults[$iPage][0]) GUICtrlSetData($lblDB, "Đặc biệt: " & $aResults[$iPage][1]) GUICtrlSetData($lbl1st, "Giải nhất: " & $aResults[$iPage][2]) GUICtrlSetData($lbl2nd, "Giải nhì: " & $aResults[$iPage][3]) GUICtrlSetData($lbl3rd, "Giải ba: " & $aResults[$iPage][4]) GUICtrlSetData($lbl4th, "Giải tư: " & $aResults[$iPage][5]) GUICtrlSetData($lbl5th, "Giải năm: " & $aResults[$iPage][6]) GUICtrlSetData($lbl6th, "Giải sáu: " & $aResults[$iPage][7]) GUICtrlSetData($lbl7th, "Giải bảy: " & $aResults[$iPage][8]) EndFunc ;==>UpdatePage ; Hiển thị trang đầu tiên UpdatePage($iCurrentPage) GUISetState(@SW_SHOW) ; Vòng lặp GUI While 1 Global $iMsg = GUIGetMsg() Select Case $iMsg = $btnPrev If $iCurrentPage > 0 Then $iCurrentPage -= 1 UpdatePage($iCurrentPage) EndIf Case $iMsg = $btnNext If $iCurrentPage < 9 Then $iCurrentPage += 1 UpdatePage($iCurrentPage) EndIf Case $iMsg = $GUI_EVENT_CLOSE ExitLoop EndSelect WEnd GUIDelete($hGUI) But your InetRead request does not provide any data (empty string is returned). So please check line 11 (and the error handling), also the lines 9, 51 and 52 to display the result array. Without a deeper look, I guess you have to get the source page by another method. Search the forum (maybe by google) for "getting page source" or similar and you will find several answer or suggestions besides InetRead. Hope this will help you 🤝 . Best regards Sven Edited October 28 by SOLVE-SMART 1stPK 1 Stay innovative! Spoiler 🌍 Au3Forums 🎲 AutoIt (en) Cheat Sheet 📊 AutoIt limits/defaults 💎 Code Katas: [...] (comming soon) 🎭 Collection of GitHub users with AutoIt projects 🐞 False-Positives 🔮 Me on GitHub 💬 Opinion about new forum sub category 📑 UDF wiki list ✂ VSCode-AutoItSnippets 📑 WebDriver FAQs 👨🏫 WebDriver Tutorial (coming soon) Link to comment Share on other sites More sharing options...
1stPK Posted October 29 Author Share Posted October 29 On 10/28/2024 at 4:37 PM, SOLVE-SMART said: Hi @1stPK 👋 , no build errors with this code: Hide contents expandcollapse popup#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7 #AutoIt3Wrapper_AU3Check_Stop_OnWarning=y #include-once #include <Array.au3> #include <GUIConstantsEx.au3> #include <Date.au3> ; Biến lưu trữ kết quả 10 ngày gần nhất Global $aResults[10][8] ; Tạo GUI Global $hGUI = GUICreate("Kết quả xổ số miền Bắc - 10 ngày gần nhất", 600, 400) Global $lblDate, $lblDB, $lbl1st, $lbl2nd, $lbl3rd, $lbl4th, $lbl5th, $lbl6th, $lbl7th Global $btnPrev = GUICtrlCreateButton("Trang Trước", 150, 350, 100, 30) Global $btnNext = GUICtrlCreateButton("Trang Sau", 350, 350, 100, 30) ; Tạo các nhãn để hiển thị kết quả $lblDate = GUICtrlCreateLabel("", 10, 10, 580, 20) $lblDB = GUICtrlCreateLabel("", 20, 40, 580, 20) $lbl1st = GUICtrlCreateLabel("", 20, 70, 580, 20) $lbl2nd = GUICtrlCreateLabel("", 20, 100, 580, 20) $lbl3rd = GUICtrlCreateLabel("", 20, 130, 580, 20) $lbl4th = GUICtrlCreateLabel("", 20, 160, 580, 20) $lbl5th = GUICtrlCreateLabel("", 20, 190, 580, 20) $lbl6th = GUICtrlCreateLabel("", 20, 220, 580, 20) $lbl7th = GUICtrlCreateLabel("", 20, 250, 580, 20) Global $iCurrentPage = 0 ; Trang hiện tại ; Lấy kết quả từ trang web cho 10 ngày gần nhất For $i = 0 To 9 Global $sDate = _DateAdd('D', -$i, _NowCalcDate()) Global $sFormattedDate = StringReplace($sDate, "-", "/") $aResults[$i][0] = $sFormattedDate Global $sData = FetchData($sFormattedDate) If Not @error Then ParseData($sData, $i) Else MsgBox(16, "Lỗi", "Không thể lấy dữ liệu từ trang web cho ngày: " & $sFormattedDate) EndIf Next ; Hàm lấy dữ liệu từ URL Func FetchData($sDate) Local $sURL = "https://www.minhngoc.net.vn/ket-qua-xo-so/mien-bac/" & $sDate & ".html" Local $sData = InetRead($sURL) If @error Then Return SetError(1, 0, "") EndIf ; Ghi nội dung HTML ra file để kiểm tra FileWrite("output_" & $sDate & ".html", $sData) Return BinaryToString($sData) EndFunc ;==>FetchData ; Hàm phân tích dữ liệu HTML từ trang web Func ParseData($sData, $iDayIndex) Local $aMatch ; Đặc biệt $aMatch = StringRegExp($sData, '(?s)Đặc biệt.*?class="numbers">(.*?)<', 1) $aResults[$iDayIndex][1] = IsArray($aMatch) And UBound($aMatch) > 0 ? $aMatch[0] : "Không có dữ liệu" ; Giải nhất $aMatch = StringRegExp($sData, '(?s)Giải nhất.*?class="numbers">(.*?)<', 1) $aResults[$iDayIndex][2] = IsArray($aMatch) And UBound($aMatch) > 0 ? $aMatch[0] : "Không có dữ liệu" ; Giải nhì $aMatch = StringRegExp($sData, '(?s)Giải nhì.*?class="numbers">(.*?)<', 1) $aResults[$iDayIndex][3] = IsArray($aMatch) And UBound($aMatch) > 0 ? $aMatch[0] : "Không có dữ liệu" ; Giải ba $aMatch = StringRegExp($sData, '(?s)Giải ba.*?class="numbers">(.*?)<', 1) $aResults[$iDayIndex][4] = IsArray($aMatch) And UBound($aMatch) > 0 ? $aMatch[0] : "Không có dữ liệu" ; Giải tư $aMatch = StringRegExp($sData, '(?s)Giải tư.*?class="numbers">(.*?)<', 1) $aResults[$iDayIndex][5] = IsArray($aMatch) And UBound($aMatch) > 0 ? $aMatch[0] : "Không có dữ liệu" ; Giải năm $aMatch = StringRegExp($sData, '(?s)Giải năm.*?class="numbers">(.*?)<', 1) $aResults[$iDayIndex][6] = IsArray($aMatch) And UBound($aMatch) > 0 ? $aMatch[0] : "Không có dữ liệu" ; Giải sáu $aMatch = StringRegExp($sData, '(?s)Giải sáu.*?class="numbers">(.*?)<', 1) $aResults[$iDayIndex][7] = IsArray($aMatch) And UBound($aMatch) > 0 ? $aMatch[0] : "Không có dữ liệu" ; Giải bảy $aMatch = StringRegExp($sData, '(?s)Giải bảy.*?>(.*?)<', 1) _ArrayDisplay($aResults, 1) _ArrayDisplay($aMatch, 2) If Not IsArray($aMatch) Or UBound($aMatch) = 0 Then $aResults[$iDayIndex][8] = "Không tìm thấy dữ liệu" Else $aResults[$iDayIndex][8] = $aMatch[0] EndIf EndFunc ;==>ParseData ; Hàm để cập nhật trang hiển thị kết quả Func UpdatePage($iPage) GUICtrlSetData($lblDate, "Ngày: " & $aResults[$iPage][0]) GUICtrlSetData($lblDB, "Đặc biệt: " & $aResults[$iPage][1]) GUICtrlSetData($lbl1st, "Giải nhất: " & $aResults[$iPage][2]) GUICtrlSetData($lbl2nd, "Giải nhì: " & $aResults[$iPage][3]) GUICtrlSetData($lbl3rd, "Giải ba: " & $aResults[$iPage][4]) GUICtrlSetData($lbl4th, "Giải tư: " & $aResults[$iPage][5]) GUICtrlSetData($lbl5th, "Giải năm: " & $aResults[$iPage][6]) GUICtrlSetData($lbl6th, "Giải sáu: " & $aResults[$iPage][7]) GUICtrlSetData($lbl7th, "Giải bảy: " & $aResults[$iPage][8]) EndFunc ;==>UpdatePage ; Hiển thị trang đầu tiên UpdatePage($iCurrentPage) GUISetState(@SW_SHOW) ; Vòng lặp GUI While 1 Global $iMsg = GUIGetMsg() Select Case $iMsg = $btnPrev If $iCurrentPage > 0 Then $iCurrentPage -= 1 UpdatePage($iCurrentPage) EndIf Case $iMsg = $btnNext If $iCurrentPage < 9 Then $iCurrentPage += 1 UpdatePage($iCurrentPage) EndIf Case $iMsg = $GUI_EVENT_CLOSE ExitLoop EndSelect WEnd GUIDelete($hGUI) But your InetRead request does not provide any data (empty string is returned). So please check line 11 (and the error handling), also the lines 9, 51 and 52 to display the result array. Without a deeper look, I guess you have to get the source page by another method. Search the forum (maybe by google) for "getting page source" or similar and you will find several answer or suggestions besides InetRead. Hope this will help you 🤝 . Best regards Sven expandcollapse popup#include <GUIConstantsEx.au3> #include <IE.au3> Global $day_labels[7] = ["Hôm nay", "Hôm qua", "2 ngày trước", "3 ngày trước", "4 ngày trước", "5 ngày trước", "6 ngày trước"] Global $winData[7][10] ; Mảng lưu dữ liệu các giải mỗi ngày Global $resultLabels[7] ; Mảng lưu các đối tượng nhãn để in dữ liệu ; Khởi tạo GUI Global $hGUI = GUICreate("Kết quả xổ số miền Bắc", 800, 600) Global $tabCtrl = GUICtrlCreateTab(10, 10, 780, 550) For $i = 0 To 6 GUICtrlCreateTabItem($day_labels[$i]) GUICtrlCreateLabel("Dữ liệu ngày: " & $day_labels[$i], 20, 40) $resultLabels[$i] = GUICtrlCreateLabel("", 20, 70, 750, 400) ; Khởi tạo nhãn cho từng ngày GUICtrlCreateTabItem("") Next GUICtrlCreateTabItem("") GUISetState(@SW_SHOW, $hGUI) ; Hàm cập nhật dữ liệu từ trang web Func UpdateResults() Local $oIE = _IECreate("https://www.minhngoc.net.vn/ket-qua-xo-so/mien-bac.html", 0, 1) Local $html = _IEDocReadHTML($oIE) _IEQuit($oIE) ; In nội dung HTML để kiểm tra ConsoleWrite($html & @CRLF) ; Phân tích cú pháp HTML và cập nhật mảng dữ liệu For $day = 0 To 6 ; Tìm bảng kết quả xổ số của từng ngày trong HTML bằng cách dùng vị trí hoặc ID của bảng Local $htmlData = StringRegExp($html, '(?s)<table class="bkqtinhmienbac">.*?</table>', 3) ; Kiểm tra xem đã lấy được dữ liệu bảng hay chưa If UBound($htmlData) > 0 And $day < UBound($htmlData) Then ; Lấy dữ liệu từng giải (giả sử có 10 giải cho mỗi ngày) $winData[$day][0] = "Giải đặc biệt: " & ExtractResult($htmlData[$day], "giaidb") $winData[$day][1] = "Giải nhất: " & ExtractResult($htmlData[$day], "giai1") $winData[$day][2] = "Giải nhì: " & ExtractResult($htmlData[$day], "giai2") $winData[$day][3] = "Giải ba: " & ExtractResult($htmlData[$day], "giai3") $winData[$day][4] = "Giải tư: " & ExtractResult($htmlData[$day], "giai4") $winData[$day][5] = "Giải năm: " & ExtractResult($htmlData[$day], "giai5") $winData[$day][6] = "Giải sáu: " & ExtractResult($htmlData[$day], "giai6") $winData[$day][7] = "Giải bảy: " & ExtractResult($htmlData[$day], "giai7") Else ; Nếu không có dữ liệu, đặt thông báo lỗi $winData[$day][0] = "Không có dữ liệu" EndIf Next EndFunc ; Hàm trích xuất từng giải từ HTML Func ExtractResult($htmlText, $giaiClass) ; Sử dụng StringRegExp để trích xuất số liệu theo lớp (class) từng giải Local $result = StringRegExp($htmlText, '<td class="' & $giaiClass & '">([0-9]+)</td>', 1) If IsArray($result) And UBound($result) > 0 Then Return $result[0] Else Return "Không tìm thấy" EndIf EndFunc ; Cập nhật GUI Func RefreshGUI() For $day = 0 To 6 Local $text = "" For $prize = 0 To 9 $text &= $winData[$day][$prize] & @CRLF Next ; Đảm bảo cập nhật đúng từng nhãn cho mỗi ngày GUICtrlSetData($resultLabels[$day], $text) Next EndFunc ; Cập nhật lần đầu và đặt hẹn giờ cho lần cập nhật tiếp theo UpdateResults() RefreshGUI() AdlibRegister("UpdateResults", 3600000) ; Cập nhật mỗi 1 giờ ; Vòng lặp sự kiện GUI While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd I tried another way but it still didn't work.... HTML.txt Link to comment Share on other sites More sharing options...
genius257 Posted October 30 Share Posted October 30 Hi @1stPK I made it work with this: expandcollapse popup#include <GUIConstantsEx.au3> #include <InetConstants.au3> #include <StringConstants.au3> #include "./Include/HTMLParser.au3" Opt("GUIOnEventMode", 1) #cs # taken from https://techblog.willshouse.com/2012/01/03/most-common-user-agents/ # Helps to avoid bot detection #ce HttpSetUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36') $sDate = "27-10-2024" $sHTML = FetchData($sDate) If @error <> 0 Then ConsoleWriteError(StringFormat("Failed to fetch data for ""%s""\n", $sDate)) Exit 1 EndIf ; Fix issue with missing space between multiple html element attributes $sHTML = StringRegExpReplace($sHTML, '(="[^"]+")([^ \/>;,])', "$1 $2") ; Fix issue with multiple lt $sHTML = StringRegExpReplace($sHTML, '<{2,}', "<") $tHTML = ParseData($sHTML) If @error <> 0 Then ConsoleWriteError(StringFormat("Failed to parse data for ""%s""\n", $sDate)) Exit 1 EndIf $pNode = _HTMLParser_GetFirstStartTag($tHTML.head) If @error <> 0 Then ConsoleWriteError(StringFormat("Failed to find first tag in data for ""%s""\n", $sDate)) Exit 1 EndIf $hWnd = GUICreate("kết quả xổ số", 700, 320) GUISetOnEvent($GUI_EVENT_CLOSE, "GuiClose", $hWnd) $label1 = GUICtrlCreateLabel("Giải đặc biệt: đang tải...", 10, 10, 680, 20) $label2 = GUICtrlCreateLabel("Giải nhất: đang tải...", 10, 30, 680, 20) $label3 = GUICtrlCreateLabel("Giải nhì: đang tải...", 10, 50, 680, 20) $label4 = GUICtrlCreateLabel("Giải ba: đang tải...", 10, 70, 680, 20) $label5 = GUICtrlCreateLabel("Giải tư: đang tải...", 10, 90, 680, 20) $label6 = GUICtrlCreateLabel("Giải năm: đang tải...", 10, 110, 680, 20) $label7 = GUICtrlCreateLabel("Giải sáu: đang tải...", 10, 130, 680, 20) $label8 = GUICtrlCreateLabel("Giải bảy: đang tải...", 10, 150, 680, 20) GUISetState(@SW_SHOW, $hWnd) $sText = ExtractText($pNode, "giaidb") GUICtrlSetData($label1, "Giải đặc biệt: " & (@error <> 0 ? "Lỗi" : $sText)) $sText = ExtractText($pNode, "giai1") GUICtrlSetData($label2, "Giải nhất: " & (@error <> 0 ? "Lỗi" : $sText)) $sText = ExtractText($pNode, "giai2") GUICtrlSetData($label3, "Giải nhì: " & (@error <> 0 ? "Lỗi" : $sText)) $sText = ExtractText($pNode, "giai3") GUICtrlSetData($label4, "Giải ba: " & (@error <> 0 ? "Lỗi" : $sText)) $sText = ExtractText($pNode, "giai4") GUICtrlSetData($label5, "Giải tư: " & (@error <> 0 ? "Lỗi" : $sText)) $sText = ExtractText($pNode, "giai5") GUICtrlSetData($label6, "Giải năm: " & (@error <> 0 ? "Lỗi" : $sText)) $sText = ExtractText($pNode, "giai6") GUICtrlSetData($label7, "Giải sáu: " & (@error <> 0 ? "Lỗi" : $sText)) $sText = ExtractText($pNode, "giai7") GUICtrlSetData($label8, "Giải bảy: " & (@error <> 0 ? "Lỗi" : $sText)) While 1 Sleep(10) Wend Func FetchData($sDate) Local $sURL = StringFormat("https://www.minhngoc.net.vn/ket-qua-xo-so/mien-bac/%s.html", $sDate) Local $dData = InetRead($sURL, BitAND($INET_BINARYTRANSFER, $INET_FORCEBYPASS)) If @error <> 0 Then ConsoleWriteError(StringFormat("Failed to fetch data for ""%s""\n", $sURL)) Return SetError(1) EndIf Return BinaryToString($dData) EndFunc Func ParseData($sHTML) Local $tTokenList = _HTMLParser($sHTML) If @error <> 0 Then Return SetError(1) ; Check if all HTML was parsed If @extended < StringLen($sHTML) Then Return SetError(2) Return $tTokenList EndFunc Func ExtractText($pNode, $sClassName) Local $aNodes = _HTMLParser_GetElementsByClassName($sClassName, $pNode) If @error <> 0 Then Return SetError(1) $pNode = $aNodes[0] Local $aText = _HTMLParser_Element_GetText($pNode) Local $sText = "" For $pText In $aText $tNode = __doublyLinkedList_Node($pText) $sText &= " " & StringRegExpReplace(__HTMLParser_GetString($tNode.data), "^\s+|\s+$", "") Next Return $sText EndFunc Func GuiClose() Exit EndFunc I used my html parser for this, but a better parser solution could also work, or go back to regex I used google translate for the Vietnamese strings i added, so they might be wrong I'll also attach my solution with includes to this post. Hope it helps! 212413.zip Musashi and SOLVE-SMART 2 My highlighted topics: AutoIt Package Manager, AutoItObject Pure AutoIt, AutoIt extension for Visual Studio Code Github: AutoIt HTTP Server, AutoIt HTML Parser Link to comment Share on other sites More sharing options...
1stPK Posted October 30 Author Share Posted October 30 2 hours ago, genius257 said: Hi @1stPK I made it work with this: expandcollapse popup#include <GUIConstantsEx.au3> #include <InetConstants.au3> #include <StringConstants.au3> #include "./Include/HTMLParser.au3" Opt("GUIOnEventMode", 1) #cs # taken from https://techblog.willshouse.com/2012/01/03/most-common-user-agents/ # Helps to avoid bot detection #ce HttpSetUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36') $sDate = "27-10-2024" $sHTML = FetchData($sDate) If @error <> 0 Then ConsoleWriteError(StringFormat("Failed to fetch data for ""%s""\n", $sDate)) Exit 1 EndIf ; Fix issue with missing space between multiple html element attributes $sHTML = StringRegExpReplace($sHTML, '(="[^"]+")([^ \/>;,])', "$1 $2") ; Fix issue with multiple lt $sHTML = StringRegExpReplace($sHTML, '<{2,}', "<") $tHTML = ParseData($sHTML) If @error <> 0 Then ConsoleWriteError(StringFormat("Failed to parse data for ""%s""\n", $sDate)) Exit 1 EndIf $pNode = _HTMLParser_GetFirstStartTag($tHTML.head) If @error <> 0 Then ConsoleWriteError(StringFormat("Failed to find first tag in data for ""%s""\n", $sDate)) Exit 1 EndIf $hWnd = GUICreate("kết quả xổ số", 700, 320) GUISetOnEvent($GUI_EVENT_CLOSE, "GuiClose", $hWnd) $label1 = GUICtrlCreateLabel("Giải đặc biệt: đang tải...", 10, 10, 680, 20) $label2 = GUICtrlCreateLabel("Giải nhất: đang tải...", 10, 30, 680, 20) $label3 = GUICtrlCreateLabel("Giải nhì: đang tải...", 10, 50, 680, 20) $label4 = GUICtrlCreateLabel("Giải ba: đang tải...", 10, 70, 680, 20) $label5 = GUICtrlCreateLabel("Giải tư: đang tải...", 10, 90, 680, 20) $label6 = GUICtrlCreateLabel("Giải năm: đang tải...", 10, 110, 680, 20) $label7 = GUICtrlCreateLabel("Giải sáu: đang tải...", 10, 130, 680, 20) $label8 = GUICtrlCreateLabel("Giải bảy: đang tải...", 10, 150, 680, 20) GUISetState(@SW_SHOW, $hWnd) $sText = ExtractText($pNode, "giaidb") GUICtrlSetData($label1, "Giải đặc biệt: " & (@error <> 0 ? "Lỗi" : $sText)) $sText = ExtractText($pNode, "giai1") GUICtrlSetData($label2, "Giải nhất: " & (@error <> 0 ? "Lỗi" : $sText)) $sText = ExtractText($pNode, "giai2") GUICtrlSetData($label3, "Giải nhì: " & (@error <> 0 ? "Lỗi" : $sText)) $sText = ExtractText($pNode, "giai3") GUICtrlSetData($label4, "Giải ba: " & (@error <> 0 ? "Lỗi" : $sText)) $sText = ExtractText($pNode, "giai4") GUICtrlSetData($label5, "Giải tư: " & (@error <> 0 ? "Lỗi" : $sText)) $sText = ExtractText($pNode, "giai5") GUICtrlSetData($label6, "Giải năm: " & (@error <> 0 ? "Lỗi" : $sText)) $sText = ExtractText($pNode, "giai6") GUICtrlSetData($label7, "Giải sáu: " & (@error <> 0 ? "Lỗi" : $sText)) $sText = ExtractText($pNode, "giai7") GUICtrlSetData($label8, "Giải bảy: " & (@error <> 0 ? "Lỗi" : $sText)) While 1 Sleep(10) Wend Func FetchData($sDate) Local $sURL = StringFormat("https://www.minhngoc.net.vn/ket-qua-xo-so/mien-bac/%s.html", $sDate) Local $dData = InetRead($sURL, BitAND($INET_BINARYTRANSFER, $INET_FORCEBYPASS)) If @error <> 0 Then ConsoleWriteError(StringFormat("Failed to fetch data for ""%s""\n", $sURL)) Return SetError(1) EndIf Return BinaryToString($dData) EndFunc Func ParseData($sHTML) Local $tTokenList = _HTMLParser($sHTML) If @error <> 0 Then Return SetError(1) ; Check if all HTML was parsed If @extended < StringLen($sHTML) Then Return SetError(2) Return $tTokenList EndFunc Func ExtractText($pNode, $sClassName) Local $aNodes = _HTMLParser_GetElementsByClassName($sClassName, $pNode) If @error <> 0 Then Return SetError(1) $pNode = $aNodes[0] Local $aText = _HTMLParser_Element_GetText($pNode) Local $sText = "" For $pText In $aText $tNode = __doublyLinkedList_Node($pText) $sText &= " " & StringRegExpReplace(__HTMLParser_GetString($tNode.data), "^\s+|\s+$", "") Next Return $sText EndFunc Func GuiClose() Exit EndFunc I used my html parser for this, but a better parser solution could also work, or go back to regex I used google translate for the Vietnamese strings i added, so they might be wrong I'll also attach my solution with includes to this post. Hope it helps! 212413.zip 7.14 kB · 0 downloads On this website (https://www.minhngoc.net.vn/ket-qua-xo-so/mien-bac.html), there are 7 results, and I want them to be updated on the GUI. If there is not enough space on the GUI, we can create pages to view everything. I also want it to update daily for each access session; the program. Link to comment Share on other sites More sharing options...
SOLVE-SMART Posted October 30 Share Posted October 30 Hi @genius257 👋 , the fix was to add these two flags (constants) to InetRead, right? Local $dData = InetRead($sURL, BitAND($INET_BINARYTRANSFER, $INET_FORCEBYPASS)) Good work, as usually 😀 . Best regards Sven Musashi 1 Stay innovative! Spoiler 🌍 Au3Forums 🎲 AutoIt (en) Cheat Sheet 📊 AutoIt limits/defaults 💎 Code Katas: [...] (comming soon) 🎭 Collection of GitHub users with AutoIt projects 🐞 False-Positives 🔮 Me on GitHub 💬 Opinion about new forum sub category 📑 UDF wiki list ✂ VSCode-AutoItSnippets 📑 WebDriver FAQs 👨🏫 WebDriver Tutorial (coming soon) Link to comment Share on other sites More sharing options...
genius257 Posted October 30 Share Posted October 30 12 hours ago, 1stPK said: On this website (https://www.minhngoc.net.vn/ket-qua-xo-so/mien-bac.html), there are 7 results, and I want them to be updated on the GUI. You can do a for loop on $aNodes in the ExtractText function, to get each of the 7 elements that match the classname. 13 hours ago, 1stPK said: If there is not enough space on the GUI, we can create pages to view everything. That is some math you will need to do. You also just add a could add a scroll-bar (https://www.autoitscript.com/autoit3/docs/libfunctions/_GUIScrollBars_Init.htm) or GUI tabs (https://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateTab.htm) 13 hours ago, 1stPK said: I also want it to update daily for each access session For that you could register your with Windows scheduled tasks. There are many threads with examples, if you search for it Hi @SOLVE-SMART The INET_BINARYTRANSFER flag is the default behavior, when no explicit option is given, and INET_FORCEBYPASS simply speeds up InetRead, bypassing the normal force connection online step. I am not sure what the problem was initially, as i read the original code and made mine from scratch, but using the same url and function naming. It could be something as simple as setting the user agent string, because many sites do not like scrapers and bots, so "AutoIt" as the default user agent string might trigger responses. But thanks for the nice words and the like My highlighted topics: AutoIt Package Manager, AutoItObject Pure AutoIt, AutoIt extension for Visual Studio Code Github: AutoIt HTTP Server, AutoIt HTML Parser Link to comment Share on other sites More sharing options...
1stPK Posted November 1 Author Share Posted November 1 as per the code below, and on the main GUI i have set the default date to real time. i have added a way to see more results of another day, by pressing the button to select the day we need to see on a new window. now i want to see other days right on the main GUI, by creating more Conversion Tabs. this i have done a lot but not working, hope you will help again, Thanks. expandcollapse popup#include <GUIConstantsEx.au3> #include <InetConstants.au3> #include <StringConstants.au3> #include "./Include/HTMLParser.au3" Opt("GUIOnEventMode", 1) HttpSetUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36') ; Cập nhật ngày hiện tại Global $sDate = @MDAY & "-" & @MON & "-" & @YEAR Global $hWnd = GUICreate("Kết quả xổ số", 700, 320) GUISetOnEvent($GUI_EVENT_CLOSE, "GuiClose", $hWnd) ; Các nhãn cho kết quả giải thưởng Global $label1 = GUICtrlCreateLabel("Giải đặc biệt: đang tải...", 10, 10, 680, 20) Global $label2 = GUICtrlCreateLabel("Giải nhất: đang tải...", 10, 30, 680, 20) Global $label3 = GUICtrlCreateLabel("Giải nhì: đang tải...", 10, 50, 680, 20) Global $label4 = GUICtrlCreateLabel("Giải ba: đang tải...", 10, 70, 680, 20) Global $label5 = GUICtrlCreateLabel("Giải tư: đang tải...", 10, 90, 680, 20) Global $label6 = GUICtrlCreateLabel("Giải năm: đang tải...", 10, 110, 680, 20) Global $label7 = GUICtrlCreateLabel("Giải sáu: đang tải...", 10, 130, 680, 20) Global $label8 = GUICtrlCreateLabel("Giải bảy: đang tải...", 10, 150, 680, 20) ; Nút để mở cửa sổ mới Global $btnNewWindow = GUICtrlCreateButton("Xem ngày khác", 10, 180, 120, 30) GUICtrlSetOnEvent($btnNewWindow, "ShowNewWindow") GUISetState(@SW_SHOW, $hWnd) ; Hiển thị kết quả ban đầu ShowResults($sDate, $label1, $label2, $label3, $label4, $label5, $label6, $label7, $label8) While 1 Sleep(10) WEnd Func ShowResults($sDate, $lbl1, $lbl2, $lbl3, $lbl4, $lbl5, $lbl6, $lbl7, $lbl8) Local $sHTML = FetchData($sDate) If @error <> 0 Then ConsoleWriteError(StringFormat("Failed to fetch data for ""%s""\n", $sDate)) Return EndIf $sHTML = StringRegExpReplace($sHTML, '(="[^"]+")([^ \/>;,])', "$1 $2") $sHTML = StringRegExpReplace($sHTML, '<{2,}', "<") Local $tHTML = ParseData($sHTML) If @error <> 0 Then ConsoleWriteError(StringFormat("Failed to parse data for ""%s""\n", $sDate)) Return EndIf Local $pNode = _HTMLParser_GetFirstStartTag($tHTML.head) If @error <> 0 Then ConsoleWriteError(StringFormat("Failed to find first tag in data for ""%s""\n", $sDate)) Return EndIf ; Cập nhật các nhãn với kết quả GUICtrlSetData($lbl1, "Giải đặc biệt: " & ExtractText($pNode, "giaidb")) GUICtrlSetData($lbl2, "Giải nhất: " & ExtractText($pNode, "giai1")) GUICtrlSetData($lbl3, "Giải nhì: " & ExtractText($pNode, "giai2")) GUICtrlSetData($lbl4, "Giải ba: " & ExtractText($pNode, "giai3")) GUICtrlSetData($lbl5, "Giải tư: " & ExtractText($pNode, "giai4")) GUICtrlSetData($lbl6, "Giải năm: " & ExtractText($pNode, "giai5")) GUICtrlSetData($lbl7, "Giải sáu: " & ExtractText($pNode, "giai6")) GUICtrlSetData($lbl8, "Giải bảy: " & ExtractText($pNode, "giai7")) EndFunc Func ShowNewWindow() Local $sNewDate = InputBox("Ngày Kết Quả", "Nhập ngày (dd-mm-yyyy):", "31-10-2024") If @error Then Return ; Kiểm tra định dạng ngày tháng If Not StringRegExp($sNewDate, '^\d{2}-\d{2}-\d{4}$') Then MsgBox(0, "Lỗi", "Định dạng ngày không hợp lệ. Vui lòng nhập theo định dạng dd-mm-yyyy.") Return EndIf ; Tách ngày, tháng, năm Local $aDate = StringSplit($sNewDate, "-") Local $iDay = $aDate[1] Local $iMonth = $aDate[2] Local $iYear = $aDate[3] ; Kiểm tra xem ngày có phải là ngày trong tương lai không If Not IsDateValid($iDay, $iMonth, $iYear) Then MsgBox(0, "Lỗi", "Ngày không hợp lệ hoặc là ngày trong tương lai.") Return EndIf Local $hNewWnd = GUICreate("Kết quả xổ số ngày " & $sNewDate, 700, 320) Local $lbl1 = GUICtrlCreateLabel("Giải đặc biệt: đang tải...", 10, 10, 680, 20) Local $lbl2 = GUICtrlCreateLabel("Giải nhất: đang tải...", 10, 30, 680, 20) Local $lbl3 = GUICtrlCreateLabel("Giải nhì: đang tải...", 10, 50, 680, 20) Local $lbl4 = GUICtrlCreateLabel("Giải ba: đang tải...", 10, 70, 680, 20) Local $lbl5 = GUICtrlCreateLabel("Giải tư: đang tải...", 10, 90, 680, 20) Local $lbl6 = GUICtrlCreateLabel("Giải năm: đang tải...", 10, 110, 680, 20) Local $lbl7 = GUICtrlCreateLabel("Giải sáu: đang tải...", 10, 130, 680, 20) Local $lbl8 = GUICtrlCreateLabel("Giải bảy: đang tải...", 10, 150, 680, 20) GUISetState(@SW_SHOW, $hNewWnd) ShowResults($sNewDate, $lbl1, $lbl2, $lbl3, $lbl4, $lbl5, $lbl6, $lbl7, $lbl8) EndFunc Func FetchData($sDate) Local $sURL = StringFormat("https://www.minhngoc.net.vn/ket-qua-xo-so/mien-bac/%s.html", $sDate) Local $dData = InetRead($sURL, BitAND($INET_BINARYTRANSFER, $INET_FORCEBYPASS)) If @error <> 0 Then ConsoleWriteError(StringFormat("Failed to fetch data for ""%s""\n", $sURL)) Return SetError(1) EndIf Return BinaryToString($dData) EndFunc Func ParseData($sHTML) Local $tTokenList = _HTMLParser($sHTML) If @error <> 0 Then Return SetError(1) If @extended < StringLen($sHTML) Then Return SetError(2) Return $tTokenList EndFunc Func ExtractText($pNode, $sClassName) Local $aNodes = _HTMLParser_GetElementsByClassName($sClassName, $pNode) If @error <> 0 Then Return SetError(1) $pNode = $aNodes[0] Local $aText = _HTMLParser_Element_GetText($pNode) Local $sText = "" For $pText In $aText $tNode = __doublyLinkedList_Node($pText) $sText &= " " & StringRegExpReplace(__HTMLParser_GetString($tNode.data), "^\s+|\s+$", "") Next Return $sText EndFunc Func IsDateValid($iDay, $iMonth, $iYear) ; Kiểm tra xem năm có hợp lệ không If $iYear < 1900 Or $iYear > @YEAR Then Return False ; Kiểm tra xem tháng có hợp lệ không If $iMonth < 1 Or $iMonth > 12 Then Return False ; Kiểm tra xem ngày có hợp lệ không Switch $iMonth Case 1, 3, 5, 7, 8, 10, 12 If $iDay < 1 Or $iDay > 31 Then Return False Case 4, 6, 9, 11 If $iDay < 1 Or $iDay > 30 Then Return False Case 2 If $iYear Mod 4 = 0 And ($iYear Mod 100 <> 0 Or $iYear Mod 400 = 0) Then ; Năm nhuận If $iDay < 1 Or $iDay > 29 Then Return False Else ; Năm không nhuận If $iDay < 1 Or $iDay > 28 Then Return False EndIf Case Else Return False EndSwitch ; Kiểm tra xem ngày có phải là ngày trong tương lai không If $iYear > @YEAR Or ($iYear = @YEAR And ($iMonth > @MON Or ($iMonth = @MON And $iDay > @MDAY))) Then Return False EndIf Return True EndFunc Func GuiClose() Exit EndFunc Test Appxstd.rar Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now