# [實現自動化ping IP地址](https://hackmd.io/1pPduU9HT9Gm8GX5ADPV7g)
## :question: 目標
:::success
學習如何透過Python 腳本與xlsx結合實現自動Ping IP並接收回傳結果
:::
## :feet: Step
:::success
步驟從檔案建置到python程式碼
:::
1. 創建3個檔案如圖所示

2. 打開**ping_test.xlsx**將A-1 和B-1改為**ip**與**result**

> 注意:A-2(含)以下都可以新增自己想要ping的ip,如上圖**192.168.0.1**與**192.168.137.1**是我想ping的IP
3. 打開**ping_test _result.xlsx**將A-1 和B-1改為**ip**與**result**

4. 打開ping_test.py,輸入以下code
```
import threading
import pandas as pd
import ping3
def single_ping(ip,timeout,ping_results):
'''
ping 指定地址(單獨的)
parm ip:要ping的地址
parm timeout:ping超時的默認時間
parm ping_results: ping的結果,字典格式:key是ip ,value是ping的結果
exmaple:
{
ping_results:{"192.168.0.1": None,
"192.168.137.1": 0.0}
}
'''
ping_time = ping3.ping(ip,timeout = timeout)
ping_results[ip] = ping_time
def batch_ping(file = 'ping_test.xlsx',result_file='ping_test_result.xlsx',timeout=4):
'''
parm file:要從哪個檔案讀取預計要ping的ip(可用絕對或相對位置) example:D:\\test\\ping_test.xlsx
parm result_file:要將ping的結果寫入哪個檔案(可用絕對或相對位置) example:D:\\test\\ping_test_result.xlsx
parm timeout:默認超過幾秒就認為ping失敗
'''
#讀取xlsx ip列表
df = pd.read_excel(file)
ip_items = df.to_dict(orient='records')
ip_list=[]
#將字典列表ip轉成list ip,供後續使用
for i in ip_items:
ip_list.append(i['ip'])
#設定結果空字典以及多線程空列表
ping_results = {}
threads = []
#開始嘗試ping
for ip in ip_list:
#將IP與timeout丟入線程裡,用線程目的是加速ping過程
t = threading.Thread(target=single_ping, args=(ip, timeout,ping_results))
#加入到threads列表是為了後續可以讓系統等待線程完成
threads.append(t)
#啟動宣告好的線程,開始ping IP
t.start()
#強制等待線程完成
for t in threads:
t.join()
#將結果寫入指定檔案
for i in ip_items:
#將想要的ip用字典key讀取ping_results對應結果
item_ping_result = ping_results[i['ip']]
#判斷回傳結果
if item_ping_result is None:
i['result'] = 'full time'
elif item_ping_result is False:
i['result'] ='DNS ERROR'
else:
i['result']='OK'
#寫入表格
new_df = pd.DataFrame(ip_items)
new_df.to_excel(result_file,index=False,columns=['ip','result'])
if __name__ == '__main__':
batch_ping()
```
5. 進行程式測試,若ping_test_result檔案出現如圖所示代表運行成功
