天天看點

魅族雲相冊批量下載下傳方案

魅族雲相冊批量下載下傳方案

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

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

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

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

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

等了好幾年都不見優化這個功能,無奈隻能寫個腳本自己搞定。

魅族是使用的阿裡雲OSS(對象存儲),本身阿裡雲提供了多種語言的SDK,調用對應接口即可,沒啥技術難度。

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

  • 先調用魅族的接口,拿到相冊和所有照片、視訊資訊(主要是拿到下載下傳位址);
  • 然後根據Flyme雲服務的接口拿到請求阿裡雲OSS接口所需的token和key資訊,例如: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腳本)。

啟動MySQL(1),然後選擇”資料庫“(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_timeout和wait_timeout都設定足夠大;
  4. 下載下傳完後注意核對檔案數,如果不一緻可能是上面問題2導緻的,隻需要把資料重置一下即可,資料庫執行下面腳本。
    update task.`dy_mz_album`setlocal = ''      

-

end -