昨天使用縮狗圖床api
寫了個命令行圖床上傳工具,支持指定使用的圖床,支持單文件 / 多文件 / 多目錄(非遞歸)上傳。雖然代碼很簡單,但還是準備記錄一下(因為想水篇文章 XD
獲取 api#
既然要使用api
,當然要獲取api
啦,首先看一下網站源碼(此處只摘錄了有用部分):
<!--圖床的選擇-->
<div class="bodyer">
<label><input name="keke" checked="checked" type="radio" value="1688">阿里圖床</label>
<label><input name="keke" type="radio" value="tieba">百度圖床</label>
<label><input name="keke" type="radio" value="360">360圖床</label>
<label><input name="keke" type="radio" value="taobao">淘寶圖床</label>
<label><input name="keke" type="radio" value="smms">SM.MS圖床</label>
<label><input name="keke" type="radio" value="sohu">搜狐圖床</label>
<label><input name="keke" type="radio" value="jd">京東圖床</label>
</div>
<!--圖片的上傳-->
<script>
var imagesUpload = function (files) {
a = $('input:radio:checked').val();
$(files).each(function (key, value) {
setTimeout(function () {
uurrll = 'https://pic.suo.dog/api/tc.php?type=' + a + '&echo=imgurl'
image_form = new FormData();
image_form.append("file", value);
$.ajax({
url: uurrll,
type: 'POST',
data: image_form,
contentType: false,
cache: false,
processData: false,
async: false,
success: function (data) {
if (typeof (data) == 'string') {
imgurl = data
} else {
imgurl = data.imgurl
}
},
error: function (XMLResponse) {
alert("error:" + XMLResponse.responseText);
}
});
}, 100);
})
};
</script>
上面的代碼還是很清楚的,用選擇器獲取當前選中radio
的value
,使用其拼接需要請求的api
,接著用ajax
將文件數據post
到api
,成功後返回圖片的地址。
開始編寫#
有了api
,接下來就很簡單了,基本思路就是:
- 打開文件
- 使用
requests
進行post
- 輸出返回的圖片
url
使用了requests
/click
/os
三個包。缺少的包可以使用sudo pip install 包名
安裝。
首先將允許的圖片文件拓展名和api
地址設置為全局變量:
# 這裡列舉了幾種常見的圖片格式,其它格式可以修改後自行測試
allowedExtension = ['.jpeg', '.bmp', '.jpg', '.png', '.webp']
url = ''
接著使用click
為main
函數增加命令行參數:
@click.command()
@click.option('--type', '-t', default='1688', type=click.Choice(['1688', 'tieba', '360', 'taobao', 'smms', 'sohu', 'jd']), help='image hosting service.')
@click.argument('paths', nargs=-1, type=click.Path(exists=True, readable=True))
--type/-t option
用於指定使用的圖床,限制了圖床的選擇範圍,默認使用阿里圖床,paths argument
接受多個路徑參數,在此處保證了目錄存在並可讀。
然後是main
函數:
def main(type, paths):
global url
url = 'https://pic.suo.dog/api/tc.php?type={}&echo=imgurl'.format(type)
count = 0
print('\033[33m開始上傳...\033[0m')
for path in paths:
if os.path.isdir(path):
if not path.endswith('/'):
path += '/'
items = os.listdir(path)
for item in items:
if os.path.isfile(path + item):
count += uploadFile(path + item)
else:
count += uploadFile(path)
print('\033[33m上傳完成,共上傳{}張圖片!\033[0m'.format(count))
類似於
\033[33m開始上傳...\033[0m
的格式是為了實現彩色輸出,詳情見該文章。
使用獲取到的type
組成url
,使用count
標記上傳圖片的張數,遍歷所有的路徑參數,如果該路徑參數為目錄,則嘗試上傳該目錄的所有文件,如果該路徑參數為文件,則直接嘗試上傳該文件。最後輸出上傳的圖片張數。
之後是核心的上傳函數:
def uploadFile(file):
if os.path.splitext(file)[-1] in allowedExtension:
postContent = {'file': open(file, 'rb')}
with requests.post(url, files=postContent) as response:
print('\033[31m{}\033[0m : \033[4;32m{}\033[0m'.format(
os.path.basename(file), response.text))
return 1
else:
return 0
判斷拓展名是否允許,如果允許則將該文件用二進制打開,post
給api
,輸出文件名和上傳的地址,返回1
,否則返回0
。
最後的內容就不用說了:
if __name__ == '__main__':
main()
使用截圖#
該截圖同樣使用該工具上傳(使用
阿里圖床/--type 1688
)
結語#
啊,沒想到這麼幾行代碼居然能水這麼長一篇文章!(滑稽
目前1688
圖床可以正常使用,其它圖床沒有測試,如果有什麼問題的話可以反饋給我。