魅族雲相簿批量下載方案

芊芊爸爸發表於2021-09-03

 

 

 

2015年開始使用魅族手機,16G儲存,當時應該是很普遍的配置,以為平時不玩遊戲也夠用。

2017年因為打王者太卡了,換了另外一臺CPU和記憶體更高的魅族,64G儲存。後面用到2020年,華為被老M欺負(可能還是覺得打王者有點不順暢),轉支援華為。

手機廠商一般都為相簿提供了雲端儲存功能,每次拍完照片都會自動上傳到雲端儲存,非常方便,每隔幾個月清理一下手機空間即可,為此還連續幾年購買了雲空間容量年套餐。

然將近6年拍攝了近百G的照片和視訊(這6年也正是伴隨芊芊和芊弟弟,每個瞬間都有記錄),後面發現沒辦法下載下來了。

魅族雲端儲存通過手機無法直接下載整個目錄(手機空間不夠),登入WEB後臺只能一張一張的選擇下載,就是個雞肋。

等了好幾年都不見優化這個功能,無奈只能寫個指令碼自己搞定。

魅族是使用的阿里雲OSS(物件儲存),本身阿里雲提供了多種語言的SDK,呼叫對應介面即可,沒啥技術難度。

這裡分享一個思路(小白略過,直接按下面步驟做即可):

  • 先呼叫魅族的介面,拿到相簿和所有照片、視訊資訊(主要是拿到下載地址);

  • 然後根據Flyme雲服務的介面拿到請求阿里雲OSS介面所需的tokenkey資訊,例如:https://mzstorage.meizu.com/file/get_sig介面,這裡不作細述,感興趣的可以看指令碼。

  • 最後是直接呼叫阿里雲SDK下載照片和視訊。


本來想寫個通用程式,然後做個Docker映象,方便一些小白使用,但是這玩意價值不大(有人付費就有價值,哈哈),懶得折騰了,還是寫個教程吧(主要物件是小白)。

下面教程是基於我提供的指令碼來編寫(指令碼是github上找的,做了一些修改),理論上跟著步驟往下走是沒啥大問題,如有什麼問題可以直接留言。

 

(一、環境準備)

 

首先下載指令碼包到本地電腦任意目錄解壓,建議直接放到某盤根目錄。

github地址:https://github.com/SeanXiao1207/mzstorage

然後進入mzstorage-master解壓目錄,能看到如下檔案列表


 

 

 

此時可以看到指令碼是使用PHP寫的,so 我們要準備一個PHP環境。

這裡推薦一個傻瓜式的PHP開發環境,直接下載安裝就有一整套PHP+MySQL+Nginx/Apache等環境的操作皮膚,非常方便。

下載地址:https://www.xp.cn/download.html

進入地址後直接選擇“立即下載”即可,然後解壓執行安裝程式完成安裝。

開啟軟體,可以看到這裡有很多操作選項,我們只需要用到MySQL(儲存相簿和照片、視訊資訊),然後就是配置PHP執行環境(執行PHP指令碼)。

啟動MySQL1),然後選擇”資料庫“(2),選擇”修改root密碼“為123456


 

 

 


需要執行SQL指令碼,選擇資料庫工具”開啟“(3),選擇”SQL-Front“,如果提示沒有安裝,只需要按照提示去”軟體管理“中選擇”安裝“即可。


 

 

 


然後再開啟(3),選擇”SQL-Front“,開啟後輸入root/123456登入,然後在"SQL編輯器"中複製執行下面執行下面指令碼。

CREATE DATABASE IF NOT EXISTS task;​
# 建立圖片記錄表
CREATE
TABLE task.`dy_mz_album` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '記錄id', `album_id` int(10) unsigned DEFAULT '0' COMMENT '照片id', `dirId` int(10) unsigned DEFAULT '0' COMMENT '相簿id', `dirName` varchar(64) DEFAULT NULL COMMENT '相簿名稱', `fileName` varchar(255) DEFAULT NULL COMMENT '照片名稱', `groupDirId` varchar(64) DEFAULT NULL, `groupId` varchar(64) DEFAULT NULL, `height` int(10) unsigned DEFAULT '0' COMMENT '照片高度', `width` int(10) unsigned DEFAULT '0' COMMENT '照片寬度', `isVideo` tinyint(3) unsigned DEFAULT NULL COMMENT '是否視訊', `md5` varchar(64) DEFAULT NULL COMMENT '檔案md5', `createTime` bigint(13) unsigned DEFAULT NULL COMMENT '建立時間', `modifyTime` bigint(13) unsigned DEFAULT NULL COMMENT '修改時間', `remainTrashTime` bigint(13) unsigned DEFAULT NULL, `shootTime` bigint(13) unsigned DEFAULT NULL, `size` bigint(20) DEFAULT NULL, `sqlNow` bigint(13) unsigned DEFAULT NULL COMMENT '最後查詢時間', `tags` varchar(255) DEFAULT NULL COMMENT '標籤', `thumb256` varchar(255) DEFAULT NULL COMMENT '縮圖', `thumb1024` varchar(255) DEFAULT NULL COMMENT '縮圖', `uid` varchar(10) DEFAULT NULL COMMENT 'uid', `userId` int(10) unsigned DEFAULT NULL, `url` varchar(255) DEFAULT NULL COMMENT '圖片路徑', `local` varchar(255) DEFAULT '' COMMENT '本地路徑(代表是否已下載)', `status` int(2) unsigned DEFAULT NULL COMMENT '狀態', `create_time` datetime DEFAULT NULL COMMENT '上傳時間', `update_time` datetime DEFAULT NULL COMMENT '採集時間', `is_delted` tinyint(1) unsigned DEFAULT '0' COMMENT '是否被刪除', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3500 DEFAULT CHARSET=utf8mb4;​ # 建立相簿表 CREATE TABLE task.`dy_mz_dir` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', `dir_id` int(10) unsigned DEFAULT '0' COMMENT '相簿id', `dirName` varchar(64) DEFAULT NULL COMMENT '相簿名稱', `fileNum` int(10) unsigned DEFAULT '0' COMMENT '相簿數量', `icon` varchar(255) DEFAULT '' COMMENT '縮圖', `sqlNow` bigint(13) unsigned DEFAULT '0' COMMENT '最後一次查詢時間', `modifyTime` bigint(13) unsigned DEFAULT '0' COMMENT '最後修改時間', `createTime` bigint(13) unsigned DEFAULT '0' COMMENT '相簿建立時間', `userId` int(10) unsigned DEFAULT '0' COMMENT '使用者id', `totalSize` bigint(20) DEFAULT NULL COMMENT '相簿總大小', `status` tinyint(2) unsigned DEFAULT NULL COMMENT '相簿狀態', `create_time` datetime DEFAULT NULL COMMENT '上傳時間', `update_time` datetime DEFAULT NULL COMMENT '採集時間', `is_delted` tinyint(1) unsigned DEFAULT '0' COMMENT '是否被刪除', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COMMENT='魅族相簿表';


如果不想用預設的密碼和埠,可以在解壓目錄config.php配置檔案中修改,預設不要動這裡。

然後就是配置PHP環境,PHP環境只需要配置一個環境變數即可。


 

 


開啟命令提示符(cmd),執行下面命令就可以完成PHP環境變數設定,注意下面%path%;後面部分是PHP所在目錄,注意你的phpstudy是在C盤還是D盤,一般只需要修改碟符即可。

setxpath "%path%;C:\phpstudy_pro\Extensions\php\php7.3.4nts"

 

至此,配置工作已經完成了。


(二、執行指令碼)


cmd進入指令碼所在目錄,執行拉取相簿命令,因為照片和視訊資訊是需要通過相簿ID來獲取。

K:\Users\15814\Downloads\mzstorage-master>php dir.php
[MSG] 使用者資訊驗證失敗
[ERROR] TOKEN失效,請更新token!> 重新整理flyme雲服務的相簿頁面,複製獲取token的js方法到Console視窗下獲取token,並更新到token檔案中。
[INPUT] 請輸入新的Token:

如上,執行php dir.php後會提示需要更新token,登入flyme雲相簿。

登入flyme雲相簿:https://photos.flyme.cn/photo/index

然後在瀏覽器中按F12,選擇Console,執行下面指令碼獲取token

function getCookie(name){var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");if(arr=document.cookie.match(reg)){return unescape(arr[2])}else{return null}}getCookie("_utoken");

 

直接將這一串紅色字串粘到上面提示輸入新token的命令列中,會看到相簿列表出來了。

K:\Users\15814\Downloads\mzstorage-master>php dir.php
[NOTICE]Token 已更新。
-------------------id  相簿名稱------------------- 
圖片收藏       2張

-------------------請輸入: 'php album.php 277' 進行採集相簿更新成功!

然後根據相簿ID拉取每個相簿的照片和視訊資訊,拉取相簿列表:php album.php

K:\Users\15814\Downloads\mzstorage-master>php album.php
請選擇相簿:
-------------------id相簿名稱------------------- 
277 圖片收藏
-------------------請輸入: 'php album.php 277' 進行採集

 

拉取對應相簿:php album.php 277

K:\Users\15814\Downloads\mzstorage-master>php album.php 
277相簿拉取:2/2 張更新完成!

最後就是下載照片和視訊:php down.php 

K:\Users\15814\Downloads\mzstorage-master>php down.php
更新OSS簽名!當前目錄中,
檔案K:\Users\15814\Downloads\mzstorage-master\down\圖片收藏\4d852e2268ac5bfb2bed974ee645c7a6.jpg存在1
[SUCCESS] '05/41/84/65/054184657650dea606b6ddfea2ca98ae.jpg'當前目錄中,檔案K:\Users\15814\Downloads\mzstorage-master\down\圖片收藏\6d653be354c137f9ed14917001b110e9.jpg存在1
[SUCCESS] '1c/10/57/56/1c105756c68afd67abbee6ba00d9bc66.jpg'所有照片已下載完畢!


(三、問題)


  1. 如果重複執行出現OSS.php signUrl的問題,需要清空.alioss_sigin檔案內容,然後再次執行命令;

  2. 如果出現大量關閉流的問題,可以中斷執行,然後再次重複執行即可(這裡一般是下載的時候token過期了,導致下載不到檔案);

  3. 這裡有幾個超時場景需要注意一下,方便處理問題:

    1. 阿里雲端儲存token超時(預設有1小時),將導致上面第2個問題;

    2. 資料庫超時,這裡主要是MySQL端會超時關閉連結,這裡要麼改成短連結(每次建立連線)、要麼修改my.ini配置interactive_timeoutwait_timeout都設定足夠大;

  4. 下載完後注意核對檔案數,如果不一致可能是上面問題2導致的,只需要把資料重置一下即可,資料庫執行下面指令碼。

    update task.`dy_mz_album`setlocal = ''


- end -

 



相關文章