電電高専生日記

高専生活・電子工作・プログラミングの活動記録。とっくに高専生ではない
2021-10-17 (Sun)

PythonでRapidgatorにファイルをアップロードする方法

1.目的

 RapidgatorのAPIを用いて、Pythonでファイルをアップロードする。
API - Rapidgator.com

2.方法

環境は、以下の通り。

  • Rapidgatorアカウント
  • Python実行環境(3.7x)

3.コード

 結構前に作ったものなんで… ネストが深くて読み解くの面倒なんで、解説はナーシ

import requests
import hashlib
import os
import json
import time

USER_NAME = "*****@yahoo.co.jp"  # サーバーのユーザー名
PASSWORD_LOGIN = "*****"  # ログインパスワード
XLSX_MIMETYPE = 'application/zip'   # ファイルタイプ ZIP形式指定のままでも他のファイル大丈夫っぽい

# アップするファイルのMD5ハッシュ計算
def calcMD5hash(upload_src_path):
    with open(upload_src_path, 'rb') as file:
        fileData = file.read()
        hashMD5 = hashlib.md5(fileData).hexdigest()
    return hashMD5

# ラピゲにログインする
def loginToRapidgator():
    url = 'https://rapidgator.net/api/v2/user/login'
    req = requests.get(url, params={'login': USER_NAME, 'password':PASSWORD_LOGIN})
    req.encoding = "UTF-8"
    return json.loads(req.text)

# ラピゲにアップする
# login_result... ログインAPIの返り値(loginToRapidgatorの出力)
# upload_src_path... アップするファイルのパス
# hashMD5... アップするファイルのMD5ハッシュ
# size... アップするファイルのサイズ
def uploadToRapidgator(login_result, upload_src_path, hashMD5, size):
    isSuccess = False
    downloadURL = ""
    #アップロードリンクのリクエスト
    url = 'https://rapidgator.net/api/v2/file/upload'
    req = requests.get(url, params={
        'token': login_result["response"]["token"], 
        'name':upload_src_path,
        'hash':hashMD5,
        'size': size
    })
    req.encoding = "UTF-8"
    UL_req_result = json.loads(req.text)

    if UL_req_result["status"] == 200:
        #アップロードリンクへアップロード
        fileDataBinary = open(upload_src_path, 'rb').read()
        files = {'file': (upload_src_path, fileDataBinary, XLSX_MIMETYPE)}

        if UL_req_result["response"]["upload"]["file"]: 
            #既にアップロードされてる場合
                isSuccess = True
                downloadURL = UL_req_result["response"]["upload"]["file"]["url"]
        else:
            url = UL_req_result["response"]["upload"]["url"]
            print("Start")
            req = requests.post(url, files=files)
            req.encoding = "UTF-8"
            upload_result = json.loads(req.text)

            if upload_result["status"]==200:
                #アップロード状態取得
                isUploading = True
                while isUploading:
                    url = 'https://rapidgator.net/api/v2/file/upload_info'
                    req = requests.get(url, params={
                        'token': login_result["response"]["token"], 
                        'upload_id': UL_req_result["response"]["upload"]["upload_id"]
                    })
                    req.encoding = "UTF-8"
                    upload_info_result = json.loads(req.text)
                    state = upload_info_result["response"]["upload"]["state"]
                    if state==0 or state==1:
                        print("Uploading...")
                        time.sleep(1)
                    elif state==2:
                        print("Completed")
                        isUploading = False
                        isSuccess = True
                        downloadURL = upload_info_result["response"]["upload"]["file"]["url"]
                    else: #Fail
                        isUploading = False
    if isSuccess:
        return_value = {
            "isSuccess": True,
            "url": downloadURL
        }
    else:
        return_value = {
            "isSuccess": False,
        }
    return return_value

#ファイルをラピゲにアップする
# upload_src_path... アップするファイルのパス
def Upload(upload_src_path):
    login_result = loginToRapidgator()
    hashMD5 = calcMD5hash(upload_src_path)
    size = os.path.getsize(upload_src_path)
    
    if login_result["status"]==200:
        upload_result = uploadToRapidgator(login_result, upload_src_path, hashMD5, size)

    if upload_result["isSuccess"]:
        return_value = {
            "isSuccess":True,
            "downloadURL": upload_result["url"]
        }
    else:
        return_value = {
            "isSuccess":False
        }
    return return_value

#実行
#print(Upload("test.txt"))

4.実行結果

以下に実行結果としてPythonコンソールとRapidgator上のファイルマネージャを示します。

5.課題・考察・感想

 以前作ったものを載せただけ。でもせっかくAPIの内容が充実してるから、アップロードだけじゃなくて色々包括的な操作できるクラスを作っても良かったかと思う。削除は手動とか面倒だし。

Last Modified : 2021-10-17

Comment






非公開コメント