2010/05/22

從Hjnet 下載檔案

最近有一個coding 的人,有一個request:

「以前我會把更新程式放在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^

接下來要打包了:

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 就拿來用了。
所以就記錄一下吧~

1 則留言:

RedJack 提到...

後記:

二點說明:因為是小東西,code 也給人家了
所以我自已覺得沒理由再去寫一堆try...的exception 處理。
一次性工具就就是一次性工具。

另外一點是:其實我並不會用這種做法來進行軟體更新:
一點是這種下載方式,另一點是要user去執行該檔案。
我會用.xml 來建立一個下載清單,因為這樣總是比較完善與全面。
就該軟體運行的環境而言,現有的做法並不太完整。
另一個是更新這件事,最好是全程user不要介入。並且強迫進行更新的動作才對(因為這是公司內部營運的軟體,並不是public release/sale 的東西)

所以,十年的coding 年資是一年的經驗+九次repeat 這句話是真的有道理的。

以後再慢慢來囉,先找到工作還有搞定學校再說吧

ECSA 考試之後

今天通過了ECSA 考試,順利拿到證書。 但是70% 及格的考試,我是70.67 過關。 特定幾個領域的問題全部都不會,沒概念也答不出來。 還有一題,從題目到所有選項、都有看不懂的單字,到最後只能猜。因為從題目到四個選項,我都不知道在講什麼東西。 所以過了又如何,離開...