amtoaer

晓风残月

叹息似的渺茫,你仍要保存着那真!
github
x
telegram
steam
nintendo switch
email

一個簡單的命令行圖床上傳工具

昨天使用縮狗圖床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>

上面的代碼還是很清楚的,用選擇器獲取當前選中radiovalue,使用其拼接需要請求的api,接著用ajax將文件數據postapi,成功後返回圖片的地址。

開始編寫#

有了api,接下來就很簡單了,基本思路就是:

  1. 打開文件
  2. 使用requests進行post
  3. 輸出返回的圖片url

使用了requests/click/os三個包。缺少的包可以使用sudo pip install 包名安裝。

首先將允許的圖片文件拓展名和api地址設置為全局變量:

# 這裡列舉了幾種常見的圖片格式,其它格式可以修改後自行測試
allowedExtension = ['.jpeg', '.bmp', '.jpg', '.png', '.webp']
url = ''

接著使用clickmain函數增加命令行參數:

@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

判斷拓展名是否允許,如果允許則將該文件用二進制打開,postapi,輸出文件名和上傳的地址,返回1,否則返回0

最後的內容就不用說了:

if __name__ == '__main__':
    main()

使用截圖#

該截圖同樣使用該工具上傳(使用阿里圖床/--type 1688

image

結語#

啊,沒想到這麼幾行代碼居然能水這麼長一篇文章!(滑稽

目前1688圖床可以正常使用,其它圖床沒有測試,如果有什麼問題的話可以反饋給我。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。