golang 入門
緣起
之前下載視訊用的you-get,但是b站一直下不了,優酷也經常出問題,所以接觸到luluofollow,noindex" target="_blank">https://github.com/iawia002/Lulu 這個也是基於you-get 直接 pip install lulu,但是作者不維護了,新出了個https://github.com/iawia002/a... 這個不是python 開發的 ,而是 go ,通過 go get github.com/iawia002/annie 來安裝 ,比如之前用lulu下載電影優酷的《大話西遊》,這裡推薦下優酷的2個播主,上傳了幾百個經典香港電影:
OA==?spm=a2h0k.11417342.soresults.dname" rel="nofollow,noindex" target="_blank">經典香港電影 東方不敗影院$ lulu -i https://v.youku.com/v_show/id_XMzY4OTMxMTYyMA==.html? It seems that your ffmpeg is a nightly build. Please switch to the latest stable if merging failed. site:優酷 (Youku) title:大話西遊之大聖娶親【周星馳】【1080p】【國語中字】 streams:# Available quality and codecs [ DEFAULT ] _________________________________ - format:mp4hd3v2 container:mp4 video-profile: 1080P size:1777.4 MiB (1863787718 bytes) m3u8_url:http://pl-ali.youku.com/playlist/m3u8?vid=XMzY4OTMxMTYyMA&type=mp4hd3v3&ups_client_netip=756495b7&utid=31o%2FFP58k0kCAXVklbeqyp8h&ccode=0502&psid=f9aac3a8a0c035a6baa3a745a49c2487&duration=5983&expire=18000&drm_type=1&drm_device=7&ups_ts=1538813154&onOff=0&encr=0&ups_key=5310a4e7d0e7795209d27a8b117c8a04 # download-with: lulu --format=mp4hd3v2 [URL] - format:mp4hd2v2 container:mp4 video-profile: 超清 size:906.9 MiB (950999892 bytes) m3u8_url:http://pl-ali.youku.com/playlist/m3u8?vid=XMzY4OTMxMTYyMA&type=mp4hd2v3&ups_client_netip=756495b7&utid=31o%2FFP58k0kCAXVklbeqyp8h&ccode=0502&psid=f9aac3a8a0c035a6baa3a745a49c2487&duration=5983&expire=18000&drm_type=1&drm_device=7&ups_ts=1538813154&onOff=0&encr=0&ups_key=5310a4e7d0e7795209d27a8b117c8a04 # download-with: lulu --format=mp4hd2v2 [URL] - format:mp4hd container:mp4 video-profile: 高清 size:560.3 MiB (587487098 bytes) m3u8_url:http://pl-ali.youku.com/playlist/m3u8?vid=XMzY4OTMxMTYyMA&type=mp4hdv3&ups_client_netip=756495b7&utid=31o%2FFP58k0kCAXVklbeqyp8h&ccode=0502&psid=f9aac3a8a0c035a6baa3a745a49c2487&duration=5983&expire=18000&drm_type=1&drm_device=7&ups_ts=1538813154&onOff=0&encr=0&ups_key=5310a4e7d0e7795209d27a8b117c8a04 # download-with: lulu --format=mp4hd [URL] - format:3gphd container:mp4 video-profile: 渣清 size:184.1 MiB (193030164 bytes) m3u8_url:http://pl-ali.youku.com/playlist/m3u8?vid=XMzY4OTMxMTYyMA&type=3gphdv3&ups_client_netip=756495b7&utid=31o%2FFP58k0kCAXVklbeqyp8h&ccode=0502&psid=f9aac3a8a0c035a6baa3a745a49c2487&duration=5984&expire=18000&drm_type=1&drm_device=7&ups_ts=1538813154&onOff=0&encr=0&ups_key=e8361d25bb6ea3bb70a8a81a94ed5b50 # download-with: lulu --format=3gphd [URL] - format:mp4sd container:mp4 video-profile: 標清 size:279.0 MiB (292555710 bytes) m3u8_url:http://pl-ali.youku.com/playlist/m3u8?vid=XMzY4OTMxMTYyMA&type=flvhdv3&ups_client_netip=756495b7&utid=31o%2FFP58k0kCAXVklbeqyp8h&ccode=0502&psid=f9aac3a8a0c035a6baa3a745a49c2487&duration=5984&expire=18000&drm_type=1&drm_device=7&ups_ts=1538813154&onOff=0&encr=0&ups_key=e8361d25bb6ea3bb70a8a81a94ed5b50 # download-with: lulu --format=mp4sd [URL]
開始下載mp4hd 格式,大小560M
$ lulu --format=mp4hd https://v.youku.com/v_show/id_XMzY4OTMxMTYyMA==.html? It seems that your ffmpeg is a nightly build. Please switch to the latest stable if merging failed. site:優酷 (Youku) title:大話西遊之大聖娶親【周星馳】【1080p】【國語中字】 stream: - format:mp4hd container:mp4 video-profile: 高清 size:560.3 MiB (587487098 bytes) m3u8_url:http://pl-ali.youku.com/playlist/m3u8?vid=XMzY4OTMxMTYyMA&type=mp4hdv3&ups_client_netip=756495b7&utid=OVs%2FFCNJrjgCAXVklbfwfTTy&ccode=0502&psid=d311f534cb94393bef9139f8653f6a20&duration=5983&expire=18000&drm_type=1&drm_device=7&ups_ts=1538813244&onOff=0&encr=0&ups_key=328b76a03e2f827a1465b0428813b011 # download-with: lulu --format=mp4hd [URL] Downloading 大話西遊之大聖娶親【周星馳】【1080p】【國語中字】.mp4 ... 0.2% (1.4/560.3MB) ├──────────────────────────────────────┤[ 1/16]0B/sl 100% (560.3/560.3MB) ├██████████████████████████████████████┤[16/16]372 kB/s Merging video parts... 其實就是用ffmpeg下載m3u8檔案,但是也經常出問題 $ lulu -i https://v.youku.com/v_show/id_XMzY4OTMxMTYyMA==.html lulu: ▒ͻ▒▒▒▒▒Ȩ▒▒▒▒,201 It seems that your ffmpeg is a nightly build. Please switch to the latest stable if merging failed.
然後用annie 看看 ,注意先把bin 加入環境變數
λannie-ihttps://v.youku.com/v_show/id_XMzY4OTMxMTYyMA==.html Site:優酷 youku.com Title:大話西遊之大聖娶親【周星馳】【1080p】【國語中字】 Type:video Streams:# All available quality [mp4hd3]------------------- Quality:mp4hd3 1920x1080 Size:1777.45 MiB (1863787718 Bytes) # download with: annie -f mp4hd3 ... [mp4hd2]------------------- Quality:mp4hd2 1280x720 Size:906.94 MiB (950999892 Bytes) # download with: annie -f mp4hd2 ... [mp4hd]------------------- Quality:mp4hd 960x540 Size:560.27 MiB (587487098 Bytes) # download with: annie -f mp4hd ... [flvhd]------------------- Quality:flvhd 640x360 Size:279.00 MiB (292555710 Bytes) # download with: annie -f flvhd ... [3gphd]------------------- Quality:3gphd 480x270 Size:184.09 MiB (193030164 Bytes) # download with: annie -f 3gphd ...
go生成的可執行檔案就一個annie.exe,沒有其他依賴,只要把這個檔案下載就能用,太方便了,於是開始學習下 golang
然後熟悉語法,說到這個,簡直奇葩,跟PHP py完全不是一個套路,一個單引號 雙引號混了就失敗,先定義package ,如果不是需要執行的編譯檔案,不能為main ,比如learn/study/test.php package study
run.go import learn/study import匯入的是目錄 ,匯入的包如果不用還不行,定義變數需要指定型別 ,比如var a int =3const b string = "abc" type long float64
var c byte='a'
這裡要說下字元和字串型別 ,字元是單個字元,用單引號,字串是多個字元組成,用雙引號,不能混用, 這的奇葩語法。
main 函式是main包才定義的,而且不能手動呼叫,在init後執行,相當PHP的建構函式 ,但是沒有引數和返回值,一個簡單的demo
package main import fm "fmt" var d =1 const ( // 常量組 a, b = 10, 100 c bool = false ) func main() { power := getPower()//函式內才能不用var宣告變數 name:="test"//下面沒有用到還會失敗!!!,但是全域性變數a不會 fm.Printf(" power is over %d\n",power) } func getPower() int { return 9001 }
go run test.go
程式正常退出的程式碼為 0 即 Program exited with code 0;如果程式因為異常而被終止,則會返回非零值,如:1。這個數值可以用來測試是否成功執行一個程式。
一些常用的命令
go build 編譯並安裝自身包和依賴包,比如window生成EXE檔案
go install 安裝自身包和依賴包,安裝到pkg目錄
gofmt –w program.go 會格式化該原始檔的程式碼然後將格式化後的程式碼覆蓋原始內容, 有了這個不用擔心PHP一樣的帶風格混亂
go doc package 獲取包的文件註釋
當識別符號(包括常量、變數、型別、函式名、結構欄位等等)以一個大寫字母開頭,如:Group1,那麼使用這種形式的識別符號的物件就可以被外部包的程式碼所使用(客戶端程式需要先匯入這個包),這被稱為匯出(像面嚮物件語言中的 public);識別符號如果以小寫字母開頭,則對包外是不可見的,但是他們在整個包的內部是可見並且可用的(像面嚮物件語言中的 private )。
go居然這樣實現面向物件!!!!
break 只是退出當前的迴圈體,而 return 語句提前對函式進行返回,不會執行後續的程式碼。
package表示原始碼所屬的程式碼包* 要生成GO語言可執行程式 ,必須要有main的package包,且必須在該包下有main() 函式
同一路徑下只能存在一個package**,一個package可以拆分成多個原始檔組成
操作符 "&" 取變數地址,"*" 透過指標訪問目標物件,關鍵字 defer 用於註冊延遲呼叫。這些呼叫直到 return 前才被執行,還有陣列,slice 沒來得及學,真的有點難,下次再說了。
實踐
go get github.com/skip2/go-qrcode 下載原始碼
vi qrcode.go package main import "github.com/skip2/go-qrcode" func main() { qrcode.WriteFile("http://www.flysnow.org/",qrcode.Medium,256,"./blog_qrcode.png") }
go run qrcode.go