2023年12月29日 星期五

用PYTHON程式,解析XML文件檔案資訊

XML檔,文字編輯器打開,出現一堆HTML標記<>對稱TAG資訊,如何簡單去除TAG資訊方便我們解讀?
可透過下面PYTHON程式(BeautifulSoup模組)進行解析查看

右鍵傳送至XmlParser.py  快速傳遞檔案參數,直接轉換快速作法:
步驟一: 開始| 執行 | Sendto:shell  , (即  C:\Users\YourName\AppData\Roaming\Microsoft\Windows\SendTo  )
步驟二: 將下面程式另字成 XmlParser.py(右鍵傳送到桌面當成捷徑,產生lnk檔) ,並將該lnk檔案複製到上面SendTo資料夾內  
步驟三: 點選您欲轉換之XML檔案,並按右鍵,指定給 XmlParser,即可快速執行XML格式檔案檢視


import sys
from bs4 import BeautifulSoup

def remove_html_tags(html):
    soup = BeautifulSoup(html, 'html.parser')
    text = soup.get_text(separator='\n', strip=True)
    return text

def process_xml_file(file_path):
    with open(file_path, 'r', encoding='utf-8') as file:
        xml_data = file.read()
        # 假設 XML 内容位於 BODY 標記中,則可將其提取出来
        start_index = xml_data.find("<BODY>") + len("<BODY>")
        end_index = xml_data.find("</BODY>")
        xml_body = xml_data[start_index:end_index].strip()

        #  移除 HTML 標記,並整理為可讀性文本
        text_content = remove_html_tags(xml_body)

        # 產出結果至螢幕
        print(text_content)
        
        #將畫面將時暫停,方便複製下來,貼到EXCEL去分析,並按任意鍵後離開
        input("Press any key to continue!")

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: python XmlParser.py <xml_file_path>")
        sys.exit(1)

    xml_file_path = sys.argv[1]
    process_xml_file(xml_file_path)

 

XML格式開放資料集查詢:

 展覽資訊、電影資訊、演唱會資訊


No-Break Space 不換行空格 之處理 ChrW(160)

情境:
因原自網頁來源資料,內含NBSP不換行空格(即 &nbsp; ) ,故藉由 PYTHON程式去除 空白特殊字元,
才不會看起來一樣,但對電腦(如:EXCEL之vlookup比對函數)來說,後面多個空白字元,就是2個不同的字串值。


import os
import sys

def replace_string_in_file(file_path):
    # 讀取欲去處理之原始檔案內容
    with open(file_path, 'r', encoding='utf-8') as file:
        content = file.read()

    # 替換NBSP特殊字元
    replaced_content = content.replace('&nbsp;', '')

    # 取得原檔案的檔名和副檔名
    file_name, file_extension = os.path.splitext(file_path)

    # 產生新檔案名稱( 原檔名_1 )
    new_file_name = file_name + '_1' + file_extension

    # 寫入去除空白字元後的內容,到新檔案
    with open(new_file_name, 'w', encoding='utf-8') as new_file:
        new_file.write(replaced_content)

    print(f"已完成去除空白字元,並產製新檔:{new_file_name}")


if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: python RemoveNSPF.py <Original_file_path>")
        sys.exit(1)

    nspf_file_path = sys.argv[1]
    replace_string_in_file(nspf_file_path)



相關查詢:

No-Break Space 不換行空格 ChrW(160)

如何檢視空白CRLF換行等特殊字元神器? 可透過Notepad++文字編輯器,查看 檢視(V) | 特殊字元 | 顯示所有字元

空白字元導致vlookup查詢函數失敗,因此需將NBSP特殊字元予以去除

IDSP ,Ideographic Space (0x3000)

用PYTHON程式,進行2個EXCEL表,欄位比較

 
比較2個EXCEL表格,檢視上月 及 本月之差異,為加快人工檢視處理,分別各捉取前7筆資料,並對欄位進行比較處理之VBA程式;
同時亦將完整月份(上月/本月)資料載入不同頁籤


Sub CompareExcelFiles()
Application.DisplayAlerts = False
'控制 Excel 應用程式是否顯示警告訊息。
    Dim wb1 As Workbook, wb2 As Workbook, wb3 As Workbook
    Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet
    Dim i As Integer, j As Integer
    Dim fd As FileDialog
    Dim strFilepPre As String
    Dim strFileCur As String
    
    
    ' '開啟檔案GUI對話窗格,選取上月EXCEL檔,將路徑傳給strFilePre,供開啟比對用
    
     Set fd = Application.FileDialog(msoFileDialogFilePicker)
    With fd
        .Title = "Select a XLS (上月)"
        .Filters.Clear
        .Filters.Add "Excel Files", "*.xls*", 1
        .InitialFileName = "C:\Users\Downloads"
        .AllowMultiSelect = False
        If .Show = True Then
            strFilePre = .SelectedItems(1)
        Else
            Exit Sub
        End If
    End With
    
    
    Set wb1 = Workbooks.Open(strFilepre)
    Set ws1 = wb1.Worksheets(1)
    
    
    '開啟檔案GUI對話窗格,選取本月EXCEL檔,,將路徑傳給strFileCur,供開啟比對用
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    With fd
        .Title = "Select a XLS (本月)"
        .Filters.Clear
        .Filters.Add "Excel Files", "*.xls*", 1
        .InitialFileName = "C:\Users\Downloads"
        .AllowMultiSelect = False
        If .Show = True Then
            strFileCur = .SelectedItems(1)
        Else
            Exit Sub
        End If
    End With
    
    
    ' 開啟本月.xls  ,路徑請自行修改
    Set wb2 = Workbooks.Open(strFileCur)
    Set ws2 = wb2.Worksheets(1)
    
    ' 建立檢核結果.xls
    Set wb3 = Workbooks.Add
    Set ws3 = wb3.Worksheets(1)
    
    ' 將上月.xls複製到「檢核結果.xls」的"上月"工作表
    On Error Resume Next
    Set ws1Copy = wb3.Worksheets("上月")
    If ws1Copy Is Nothing Then
        Set ws1Copy = wb3.Worksheets.Add(Before:=wb3.Worksheets(1))
        ws1Copy.Name = "上月"
    End If
    ws1.UsedRange.Copy ws1Copy.Range("A1")
    
    ' 將本月.xls複製到「檢核結果.xls」的"本月"工作表
    On Error Resume Next
    Set ws2Copy = wb3.Worksheets("本月")
    If ws2Copy Is Nothing Then
        Set ws2Copy = wb3.Worksheets.Add(Before:=wb3.Worksheets(1))
        ws2Copy.Name = "本月"
    End If
    ws2.UsedRange.Copy ws2Copy.Range("A1")
    
    ' 比較標題欄並將結果寫入「檢核結果.xls」的第1列
    For i = 1 To ws1.UsedRange.Columns.Count
        If ws1.Cells(1, i).Value = ws2.Cells(1, i).Value Then
            ws3.Cells(1, i).Value = "相同"
        Else
            ws3.Cells(1, i).Value = "不同"
        End If
    Next i
    
    ' 保存檢核結果.xls
    wb3.SaveAs "檢核結果.xls"
    
    ' 開啟檢核結果.xls
    Set wb3 = Workbooks.Open("檢核結果.xls")
    Set ws3 = wb3.Worksheets("工作表1")
    
    Windows("檢核結果.xls").Activate
    ws3.Cells.Select
    Selection.ClearContents
    Windows("活頁簿1.xlsm").Activate
    
    
    ' 將上月.xls前6筆(含標題列)複製到檢核結果.xls
    ws3.Cells(2, ws3.UsedRange.Columns.Count + 2) = "上月檢核ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ"
    ws1.Range("A1").Resize(5, ws1.UsedRange.Columns.Count).Copy ws3.Cells(3, ws3.UsedRange.Columns.Count + 2)
    ' 將本月.xls前6筆(含標題列)複製到檢核結果.
    ws3.Cells(ws3.UsedRange.Columns.Count + 5, 5) = "本月檢核ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ"
    ws2.Range("A1").Resize(7, ws2.UsedRange.Columns.Count).Copy ws3.Cells(ws3.UsedRange.Columns.Count + 6, 5)
    
    ' 關閉工作簿
    wb1.Close SaveChanges:=False
    wb2.Close SaveChanges:=False
 '  wb3.Close SaveChanges:=True
 
    
    ' 釋放物件
    Set ws1 = Nothing
    Set ws2 = Nothing
    Set ws3 = Nothing
    Set wb1 = Nothing
    Set wb2 = Nothing
 '  Set wb3 = Nothing
    

    Windows("檢核結果.xls").Activate
    Sheets("工作表1").Select
    
 
 Application.DisplayAlerts = True
'控制 Excel 應用程式是否顯示警告訊息。
 
 
End Sub



相關查詢:
INQUIREというアドインを使用して、2つのファイルを比較して違いを表示する (經由 Inquire增益集比對2個EXCEL)

スプレッドシート比較の基本的な作業 (Compare two or more worksheets at the same time)

複数のワークシートを同時に比較する


2023年12月26日 星期二

主機中勒索病毒ransomware參考資訊

風險評估: 優先斷網避免擴散、評估組織內的安全風險,包括網絡架構(重新REVIEW網路分段,是否可能因同網段相連有安全性漏洞進而横向擴散攻擊?)、應用程式漏洞、用戶設備(來源外部維護廠商、USB使用管理)和安全政策。
    

進行專業鑑識,掌握記憶體中是否有殘存的執行程式、分析該程式及攻擊行為可能管道,做為事後改進防止再發生策略
    檢視主機內SERVICE服務、
    檢視開機執行機碼位置(如:AUTORUNS)、
    檢視日誌是否有多餘帳號被建立、何時建立何時執行?(久未使用帳戶應予以停用或刪除)
    檢視防火牆日誌是否有可疑連線、
        

更新和補丁管理: 確保所有系統、防毒軟體引擎及防護碼、應用程式和防火牆,都經常接收最新的安全更新和補丁。
    😐利用已知系統安全漏洞進行提權,如果系統未適時更新又沒安裝IDS就可能遭受攻擊
    😐可利用WEB服務安裝性漏洞,如:上傳一句話木馬(簡稱Webshell)到web服務目錄,進而提權獲取系統權限
知己知彼、百戰不殆:適時擇定內、外部系統,進行滲透測試,及早發現可能的潛在問題;執行弱點掃描,掌握可能的弱點,並進行修補;原始碼檢測避免留由OWASP TOP10問題;對內適時辦理社交工程演練,提昇同仁對資安防護意識敏感度(郵件改成預設為純文字方式讀取)。     

入侵檢測系統: 部署入侵檢測系統(IDS)以監控網絡流量和系統活動,以檢測異常行為和潛在的攻擊跡象,同時特徵碼亦需持續更新。
 

威脅情報分享: 參與威脅情報共享社群,以獲取關於最新威脅和攻擊的信息。

用戶教育和培訓: 提供安全意識培訓,讓員工了解有關勒索軟體(家中電腦是否有裝防毒並定期更新、儘量減少瀏覽器外掛軟體,因為當外掛來源遭駭時,有可能惡意程式經過此管道入侵)和釣魚攻擊的風險。
 

定期備份及BCP:定期備份重要數據,並確保備份是可恢復的。(還原時建議不要還原前1天,可能仍有安全疑慮;還原時應預先確認還原主機未受感染);另外持續定期對重要系統還原演練亦很重要(模擬異地備份,多久可還原?平日備份後應確認是否有成功?空間及時間是否足夠),確認系統備份、程式碼、虛擬機,是否可由異地還原回來,並確認資料是否正確等,如同保險一樣隨時可能會派上用場(付贖款、營運中斷、商譽損失,遠遠超過平日營運成本數百倍)。
 

密碼管理:實施具複雜度密碼政策,並定期要求員工更換密碼。(維持使用舊密碼可能不安全且仍需備妥忘記密碼方案、儘量不要將密碼儲存在瀏覽器內,瀏覽器外掛程式不使用就應關閉或移除)
 

假若上面工作沒做好,系統雖很快還原,但未落實根因分析?攻擊者很可能已摸透內部架構及系統,將情資再轉賣他人,公司再受到類似攻擊也不足為奇👀
    
    勒索軟體解鎖參考資訊:
    Nomoreransom,
   

2023年12月24日 星期日

Wav to Txt 聲音檔案轉換成純文字檔 (逐字稿)

 情境:逐字稿 公司提供開完會後之WAV錄音檔,想轉換成純文字檔,節省打字時間


需預先載入:語音辨識相關套件

pip install SpeechRecognition



以下為PYTHON程式:

import os,sys
import subprocess


import speech_recognition as sr

# language='ja-JP' 可改成辨識日文語系; language='en-US' 可改成辨識英文語系
def convert_audio_to_text(audio_file):
    recognizer = sr.Recognizer()
    with sr.AudioFile(audio_file) as source:
        audio = recognizer.record(source)
    try:
        text = recognizer.recognize_google(audio,
language='zh-TW')
        return text
    except sr.UnknownValueError:
        return "無法辨識音訊"
    except sr.RequestError:
        return "無法連接到語音識別服務"


#'開啟GUI 取得來源檔(準備欲轉換聲音來源,開啟檔案對話視窗宣告處理)
import tkinter as tk
from tkinter import filedialog

root = tk.Tk()
root.withdraw()

# 取得轉換聲音,轉成純文字檔來源資訊
file_path = filedialog.askopenfilename(initialdir = "/",title = "Select file for OCR (選擇欲辨識聲音檔轉文字檔)",filetypes = (("Audio files","*.wav"),("All files","*.*")))

text1 = convert_audio_to_text(file_path)
print(text1)

with open('wavfile.txt', mode = 'w') as f:
    f.write(text1)
    f.close()

#將剛產出之文字檔,直接開啟顯示出來

subprocess.Popen('explorer "wavfile.txt"')


其它辦識資源 聲音轉換成純文字:
OpenAI (whisper)
 

其它轉換成文字相關工具:
圖檔轉換成文字檔 (Jpg to txt)

2023年12月23日 星期六

以PYTHON執行,經由langchain代理程式介接,使用CHATOPEN AI服務

langchain代理程式介接功能,雷同 瀏覽器add-on外掛程式 或 EXCEL增益集功能概念

下面為PYTHON程式,經由langchain代理程式介接,使用CHATOPEN AI服務

from langchain.chat_models import ChatOpenAI

#llm = ChatOpenAI(openai_api_key="...  此處需將最前面註解#去除,並將您在CHATOPEN產的API金鑰值,貼在此處以便讓您有權存取使用AI服務")

# 大型語言模型LLM 參數匯入糸統
from langchain.llms import OpenAI

# LLM 參數,查詢參數精準度初始化調整
llm = OpenAI(temperature=0.7)

# 輸入您欲查詢之資訊
text = "請摘要說明Langchain Agent,可提供界接雲端服務有哪些 (如:wolfram、chatopenai、serpapi agent)? 請列舉幾個生活上實用範例"

# 經由LLM 及ChatOpenAI服務,將詢問結果產出
prediction = llm(text)
print(prediction.strip())


程式產出結果:  (等同在瀏覽器下 PROMPT提示資訊手動詢問AI:請摘要說明Langchain Agent,可提供界接雲端服務有哪些 (如:wolfram、chatopenai)? 請列舉幾個生活上實用範例)

Langchain Agent是一種人工智能平台,其主要功能是提供界接雲端服務。它可以幫助用戶快速接入各種雲端服務,提供更加便捷和高效的使用體驗。Langchain Agent可以提供的界接雲端服務包括:

1. Wolfram:Wolfram是一個強大的數據分析和計算平台,它可以幫助用戶解決各種數學和科學問題。Langchain Agent可以幫助用戶接入Wolfram,讓用戶可以直接在Agent的界面上進行數據分析和計算,無需打開瀏覽器或下載軟件。

2.ChatOpenAI:它是一個開放式人工智能平台,可以提供自然語言處理、對話式機器人、語言翻譯等功能,開發人員可以通過Langchain AI程式庫輕鬆與ChatOpenAI進行交互,從而實現智能對話機器人等應用。


後記:

一、使用CHATGPT服務需要存取使用權,故需取得API KEY,並貼在程式中 或 設定openai_api_key 變數值於電腦系統環境變數中。

二、匯入必要之函式庫 ,備妥執行環境,如: 

pip install langchain
三、如此PYTHON程式,就可自動化去運用AI功能,而不用瀏覽器去操作詢問了 

 



2023年12月22日 星期五

用PYTHON程式協助products sampling抽驗順位決策


情境:
商品抽驗順位決策參考,

希望依不同部門別,對其業管的商品進行抽樣檢查,
並優先對較久沒被 抽驗過之商品進行查驗,且如果累計抽查次數較多,則將抽驗順位向後調整,
依部門別,每次提供建議抽查之6樣商品


此種用法不限對抽驗商品名稱,亦可用在業務稽核用途;只要將,部門別 換做為總經理室、人事室、會計室 ,而商品名稱 換做 同仁姓名 ,可增加公平性

(抽驗商品資訊如下,有生鮮部、熟食部、及零食部,各自有抽驗過紀錄)

部門   商品名稱  抽查日     累計抽查次
生鮮部    海鮮    1121201       4
生鮮部    貢丸    1121102     2
生鮮部    甜不辣    1121002     1
生鮮部    凍豆腐    1120903     1
生鮮部    花枝丸    1120801        1
生鮮部    黑輪    1120703     1
生鮮部    海鮮    1120603        4
生鮮部    魚丸    1120503     1
生鮮部    海鮮    1121201     1
生鮮部    貢丸    1121102     1
生鮮部    甜不辣    1121002     1
生鮮部    凍豆腐    1120903     1
熟食部    羊肉串    1121201     1
熟食部    雞肉串    1121102     1
熟食部    肉包    1121002     2
熟食部    菜包    1120903     3
熟食部    炒飯    1120801     2
熟食部    炒麵    1120703     1
熟食部    雞塊    1120603        1
熟食部    肉包    1120603     2
熟食部    菜包    1120503       3
熟食部    烤玉米    1120401     4
零食部    花生    1121101     6
零食部    蜜餞    1121001     5



PROMPT提示訊息下法: (AI協助寫PYTHON程式)
針對D:\samplingLIST.csv,每列資料分別為部門別、 商品名稱、 抽檢日、累計抽驗數,
請以PYTHON程式, 協助分析提供下次優先抽驗商品名稱,
依部門別進行分類後,各自提供建議優先抽驗商品名稱,列出6商品,
請以 抽檢日為主要判斷,找出 商品名稱 最少被抽驗到的商品列為最優先抽驗,
以累計抽驗數為次要判斷,亦即次數較高者,則抽驗順位向後

最後,請將結果放置於 D:\samplingOUTPUT.TXT,分別為 每部門別及  分別列出6件建議優先抽驗商品名稱。

產出結果,如下:   (減少漏網出錯,並提昇工作效率)
熟食部
烤玉米
雞塊
炒麵
炒飯
雞肉串
羊肉串


生鮮部
魚丸
黑輪
花枝丸
凍豆腐
甜不辣
貢丸


零食部
蜜餞
花生 


import csv
#自D:\samplingLIST.csv 載入檔案,略過標題列
with open('D:/samplingLIST.csv', newline='', encoding='UTF-8') as csvfile:
    reader = csv.reader(csvfile)
    header = next(reader)  # 略過標題列
    data = [row for row in reader]

# 按部門、檢查日期和累计檢查次數,對資料進行排序
data.sort(key=lambda x: (x[0], x[2], int(x[3])))

# 對分類資料進行反覆運算,並跟蹤每樣產品的檢測次數
inspections = {}
for row in data:
    department = row[0]
    product = row[1]
    if department not in inspections:
        inspections[department] = {}
    if product not in inspections[department]:
        inspections[department][product] = {'inspection_count': 0, 'inspection_dates': set()}
    inspections[department][product]['inspection_count'] += 1
    inspections[department][product]['inspection_dates'].add(row[2])

# 每個部門,提供至少的六個優先檢查產品清單,產出結果到
samplingOUTPUT.TXT  
with open('D:/samplingOUTPUT.TXT', 'w', encoding='UTF-8') as outfile:
    for department in inspections:
        outfile.write(f"\n\n{department}\n")
        sorted_products = sorted(inspections[department], key=lambda x: (len(inspections[department][x]['inspection_dates']), inspections[department][x]['inspection_count']))
        for product in sorted_products[:6]:
            outfile.write(f"{product}\n")

 

後記:

一、一開始是用VBA程式,但TRY了近10次都出現RUNTIME ERROR,改用PYTHON程式,1次就處理完成也沒有BUG,只要抽驗歷史紀錄持續更新,今後哪個最久沒被抽驗商品,也就無所遁形了😏。

二、PYTHON程式要讀檔類型為UTF-8編碼,可透過NOTEPAD++之主選單  編碼(N) | 轉成UTF-8 | 存檔至 D:\samplingLIST.csv