從Hjnet 下載檔案
最近有一個coding 的人,有一個request:
「以前我會把更新程式放在Hjnet提供的web上,然後去下載。
但是現在我不能這樣做了,變成我要讓user先點一下檔案存放的URL,然後網頁會跳到另一個有廣告的頁面,user要在那邊網頁上點一個圖片後才能下載。
「以前我會把更新程式放在Hjnet提供的web上,然後去下載。
但是現在我不能這樣做了,變成我要讓user先點一下檔案存放的URL,然後網頁會跳到另一個有廣告的頁面,user要在那邊網頁上點一個圖片後才能下載。
你能不能寫一個程式來自動下載,全程不需要user 介入?」
「因為檔案都是直接FTP上傳的,所以檔案應該不是存放在DB裡面,但不知道要怎麼做」
然後去下載那段話之前用underline, 是因為我想不起來他說怎麼下載的了…
當下聽描述時得到的訊息不太完整,所以一開始猜想的方向是:
「http server會去檢查檔案類型,如果不是web page, 圖片的話,
就會去檢查該筆session是否瀏覽過同網站的某個PAGE?」-- 如果user 正常使用web的話,理應如此。
等到回家後,打了那一串URL(還給錯!! =.="")
看到redirect 之後的網址,才知道是怎麼回事:
當user 輸入網址:http://jack.download.hjnet.net/download/123.exe 之後
http server 會redirect :http://download.service.hjnet.net/download.html?http://jack.server1.hjnet.net/download/123.exe
而"下載檔案"的圖片中,對應的URL就是:http://jack.server1.hjnet.net/download/123.exe
也就是檔案實際存在的位址
所以問題很簡單,在get 到http server 的response 之後,再去裡面尋找檔案真正存放的URL 並使用即可:
之所以不讓程式直接去抓http://jack.server1.hjnet.net/download/123.exe
是因為也許下一次、另一個檔案,就不在server1.hjnet.net 上面了。~ 也許啦
所以每次都去parse 一下比較好
以下是我的code:
import httplib
from string import split
URL1 = "http://jack.download.hjnet.net"
FILE1 = "/download/123.exe"
MagicNumber = 7 ##comes from-> http://
OutputFile = "123_Download.exe"
conn = httplib.HTTPConnection(URL1)
conn.request("GET",FILE1)
r1 = conn.getresponse()
d1 = r1.read()
dd = d1.find("http") + MagicNumber
URL2=""
while(d1[dd]!=">"):
URL2 += d1[dd]
dd+=1
URL2 = URL2[:-1]
realURL = split(URL2,"/")[0]
realFILE = split(URL2,realURL)[1]
conn2 = httplib.HTTPConnection(realURL)
conn2.request("GET",realFILE)
r2 = conn2.getresponse()
data = r2.read()
SavingFIle = open(OutputFile,"w")
SavingFIle.write(data)
SavingFIle.close()
conn.close()
第一次寫http 相關的東西,五分鐘不到吧, python 真的是個好東西~ ^o^
接下來要打包了:
參考這篇文章,將code 打包:http://ez2learn.com/index.php/python-tutorials/advance-tutorials/176-py2exepythonexe
1) 首先下載與安裝py2exe
2) 開始打包:
建立一個.py 檔如下,並且和要打包的東西放在同一個目錄底下:(假設命名為setup.py)
from distutils.core import setup
import py2exe
setup(console = ['TargetFile.py"]) ##斜體字請自行置換!
3) 以cmd 模式,切換到TargetFile.py 所在的目錄底下並執行以下指令:
python setup.py install
4) 再執行這個指令:
python setup.py py2exe
這樣就解決了,其實還蠻快的。
第一次幫人這樣從頭用到尾,以前都寫到.py 就拿來用了。
所以就記錄一下吧~
留言
二點說明:因為是小東西,code 也給人家了
所以我自已覺得沒理由再去寫一堆try...的exception 處理。
一次性工具就就是一次性工具。
另外一點是:其實我並不會用這種做法來進行軟體更新:
一點是這種下載方式,另一點是要user去執行該檔案。
我會用.xml 來建立一個下載清單,因為這樣總是比較完善與全面。
就該軟體運行的環境而言,現有的做法並不太完整。
另一個是更新這件事,最好是全程user不要介入。並且強迫進行更新的動作才對(因為這是公司內部營運的軟體,並不是public release/sale 的東西)
所以,十年的coding 年資是一年的經驗+九次repeat 這句話是真的有道理的。
以後再慢慢來囉,先找到工作還有搞定學校再說吧