idownload/upload: Inject cookies and headers (for X-CSRF-Token) - transferwee - Download/upload file via wetransfer.com Err tccr.it 70 hgit clone https://github.com/iamleot/transferwee URL:https://github.com/iamleot/transferwee tccr.it 70 1Log /r/transferwee/log.gph tccr.it 70 1Files /r/transferwee/files.gph tccr.it 70 1Refs /r/transferwee/refs.gph tccr.it 70 1README /r/transferwee/file/README.md.gph tccr.it 70 i--- Err tccr.it 70 1commit ed22bf688bc013dac5b4903ab43951727c54bccb /r/transferwee/commit/ed22bf688bc013dac5b4903ab43951727c54bccb.gph tccr.it 70 1parent 5d921f6b936a0ce688ee9301c0a567fbea8bc7c8 /r/transferwee/commit/5d921f6b936a0ce688ee9301c0a567fbea8bc7c8.gph tccr.it 70 hAuthor: Leonardo Taccari URL:mailto:iamleot@gmail.com tccr.it 70 iDate: Sun, 22 Sep 2019 11:51:43 +0200 Err tccr.it 70 i Err tccr.it 70 idownload/upload: Inject cookies and headers (for X-CSRF-Token) Err tccr.it 70 i Err tccr.it 70 iX-CSRF-Token is now needed for most wetransfer API calls, retrieve Err tccr.it 70 ithem via _prepare_request_data() and inject it together with cookies. Err tccr.it 70 i Err tccr.it 70 iDiffstat: Err tccr.it 70 i M transferwee.py | 68 +++++++++++++++++++++++-------- Err tccr.it 70 i Err tccr.it 70 i1 file changed, 52 insertions(+), 16 deletions(-) Err tccr.it 70 i--- Err tccr.it 70 1diff --git a/transferwee.py b/transferwee.py /r/transferwee/file/transferwee.py.gph tccr.it 70 i@@ -41,6 +41,7 @@ will be shared via emails or link. Err tccr.it 70 i Err tccr.it 70 i from typing import List Err tccr.it 70 i import os.path Err tccr.it 70 i+import re Err tccr.it 70 i import urllib.parse Err tccr.it 70 i import zlib Err tccr.it 70 i Err tccr.it 70 i@@ -101,8 +102,11 @@ def download_url(url: str) -> str: Err tccr.it 70 i } Err tccr.it 70 i if recipient_id: Err tccr.it 70 i j["recipient_id"] = recipient_id Err tccr.it 70 i+ request_data = _prepare_request_data() Err tccr.it 70 i r = requests.post(WETRANSFER_DOWNLOAD_URL.format(transfer_id=transfer_id), Err tccr.it 70 i- json=j) Err tccr.it 70 i+ json=j, Err tccr.it 70 i+ cookies=request_data['cookies'], Err tccr.it 70 i+ headers=request_data['headers']) Err tccr.it 70 i Err tccr.it 70 i j = r.json() Err tccr.it 70 i return j.get('direct_link') Err tccr.it 70 i@@ -138,8 +142,24 @@ def _file_name_and_size(file: str) -> dict: Err tccr.it 70 i } Err tccr.it 70 i Err tccr.it 70 i Err tccr.it 70 i+def _prepare_request_data() -> dict: Err tccr.it 70 i+ """Prepare a wetransfer.com request Err tccr.it 70 i+ Err tccr.it 70 i+ Return cookies and headers as dict. Err tccr.it 70 i+ """ Err tccr.it 70 i+ Err tccr.it 70 i+ r = requests.get('https://wetransfer.com/') Err tccr.it 70 i+ m = re.search('name="csrf-token" content="([^"]+)"', r.text) Err tccr.it 70 i+ Err tccr.it 70 i+ return { Err tccr.it 70 i+ 'headers': { 'X-CSRF-Token': m.group(1), }, Err tccr.it 70 i+ 'cookies': r.cookies, Err tccr.it 70 i+ } Err tccr.it 70 i+ Err tccr.it 70 i+ Err tccr.it 70 i def _prepare_email_upload(filenames: List[str], message: str, Err tccr.it 70 i- sender: str, recipients: List[str]) -> str: Err tccr.it 70 i+ sender: str, recipients: List[str], Err tccr.it 70 i+ request_data: dict) -> str: Err tccr.it 70 i """Given a list of filenames, message a sender and recipients prepare for Err tccr.it 70 i the email upload. Err tccr.it 70 i Err tccr.it 70 i@@ -153,11 +173,14 @@ def _prepare_email_upload(filenames: List[str], message: str, Err tccr.it 70 i "ui_language": "en", Err tccr.it 70 i } Err tccr.it 70 i Err tccr.it 70 i- r = requests.post(WETRANSFER_UPLOAD_EMAIL_URL, json=j) Err tccr.it 70 i+ r = requests.post(WETRANSFER_UPLOAD_EMAIL_URL, json=j, Err tccr.it 70 i+ cookies=request_data['cookies'], Err tccr.it 70 i+ headers=request_data['headers']) Err tccr.it 70 i return r.json() Err tccr.it 70 i Err tccr.it 70 i Err tccr.it 70 i-def _prepare_link_upload(filenames: List[str], message: str) -> str: Err tccr.it 70 i+def _prepare_link_upload(filenames: List[str], message: str, Err tccr.it 70 i+ request_data: dict) -> str: Err tccr.it 70 i """Given a list of filenames and a message prepare for the link upload. Err tccr.it 70 i Err tccr.it 70 i Return the parsed JSON response. Err tccr.it 70 i@@ -168,22 +191,28 @@ def _prepare_link_upload(filenames: List[str], message: str) -> str: Err tccr.it 70 i "ui_language": "en", Err tccr.it 70 i } Err tccr.it 70 i Err tccr.it 70 i- r = requests.post(WETRANSFER_UPLOAD_LINK_URL, json=j) Err tccr.it 70 i+ r = requests.post(WETRANSFER_UPLOAD_LINK_URL, json=j, Err tccr.it 70 i+ cookies=request_data['cookies'], Err tccr.it 70 i+ headers=request_data['headers']) Err tccr.it 70 i return r.json() Err tccr.it 70 i Err tccr.it 70 i Err tccr.it 70 i-def _prepare_file_upload(transfer_id: str, file: str) -> str: Err tccr.it 70 i+def _prepare_file_upload(transfer_id: str, file: str, Err tccr.it 70 i+ request_data: dict) -> str: Err tccr.it 70 i """Given a transfer_id and file prepare it for the upload. Err tccr.it 70 i Err tccr.it 70 i Return the parsed JSON response. Err tccr.it 70 i """ Err tccr.it 70 i j = _file_name_and_size(file) Err tccr.it 70 i r = requests.post(WETRANSFER_FILES_URL.format(transfer_id=transfer_id), Err tccr.it 70 i- json=j) Err tccr.it 70 i+ json=j, Err tccr.it 70 i+ cookies=request_data['cookies'], Err tccr.it 70 i+ headers=request_data['headers']) Err tccr.it 70 i return r.json() Err tccr.it 70 i Err tccr.it 70 i Err tccr.it 70 i def _upload_chunks(transfer_id: str, file_id: str, file: str, Err tccr.it 70 i+ request_data: dict, Err tccr.it 70 i default_chunk_size: int = WETRANSFER_DEFAULT_CHUNK_SIZE) -> str: Err tccr.it 70 i """Given a transfer_id, file_id and file upload it. Err tccr.it 70 i Err tccr.it 70 i@@ -209,7 +238,9 @@ def _upload_chunks(transfer_id: str, file_id: str, file: str, Err tccr.it 70 i r = requests.post( Err tccr.it 70 i WETRANSFER_PART_PUT_URL.format(transfer_id=transfer_id, Err tccr.it 70 i file_id=file_id), Err tccr.it 70 i- json=j) Err tccr.it 70 i+ json=j, Err tccr.it 70 i+ cookies=request_data['cookies'], Err tccr.it 70 i+ headers=request_data['headers']) Err tccr.it 70 i url = r.json().get('url') Err tccr.it 70 i r = requests.options(url, Err tccr.it 70 i headers={ Err tccr.it 70 i@@ -224,17 +255,21 @@ def _upload_chunks(transfer_id: str, file_id: str, file: str, Err tccr.it 70 i r = requests.put( Err tccr.it 70 i WETRANSFER_FINALIZE_MPP_URL.format(transfer_id=transfer_id, Err tccr.it 70 i file_id=file_id), Err tccr.it 70 i- json=j) Err tccr.it 70 i+ json=j, Err tccr.it 70 i+ cookies=request_data['cookies'], Err tccr.it 70 i+ headers=request_data['headers']) Err tccr.it 70 i Err tccr.it 70 i return r.json() Err tccr.it 70 i Err tccr.it 70 i Err tccr.it 70 i-def _finalize_upload(transfer_id: str) -> str: Err tccr.it 70 i+def _finalize_upload(transfer_id: str, request_data: dict) -> str: Err tccr.it 70 i """Given a transfer_id finalize the upload. Err tccr.it 70 i Err tccr.it 70 i Return the parsed JSON response. Err tccr.it 70 i """ Err tccr.it 70 i- r = requests.put(WETRANSFER_FINALIZE_URL.format(transfer_id=transfer_id)) Err tccr.it 70 i+ r = requests.put(WETRANSFER_FINALIZE_URL.format(transfer_id=transfer_id), Err tccr.it 70 i+ cookies=request_data['cookies'], Err tccr.it 70 i+ headers=request_data['headers']) Err tccr.it 70 i Err tccr.it 70 i return r.json() Err tccr.it 70 i Err tccr.it 70 i@@ -269,19 +304,20 @@ def upload(files: List[str], message: str = '', sender: str = None, Err tccr.it 70 i raise FileExistsError('Duplicate filenames') Err tccr.it 70 i Err tccr.it 70 i transfer_id = None Err tccr.it 70 i+ rd = _prepare_request_data() Err tccr.it 70 i if sender and recipients: Err tccr.it 70 i # email upload Err tccr.it 70 i transfer_id = \ Err tccr.it 70 i- _prepare_email_upload(files, message, sender, recipients)['id'] Err tccr.it 70 i+ _prepare_email_upload(files, message, sender, recipients, rd)['id'] Err tccr.it 70 i else: Err tccr.it 70 i # link upload Err tccr.it 70 i- transfer_id = _prepare_link_upload(files, message)['id'] Err tccr.it 70 i+ transfer_id = _prepare_link_upload(files, message, rd)['id'] Err tccr.it 70 i Err tccr.it 70 i for f in files: Err tccr.it 70 i- file_id = _prepare_file_upload(transfer_id, f)['id'] Err tccr.it 70 i- _upload_chunks(transfer_id, file_id, f) Err tccr.it 70 i+ file_id = _prepare_file_upload(transfer_id, f, rd)['id'] Err tccr.it 70 i+ _upload_chunks(transfer_id, file_id, f, rd) Err tccr.it 70 i Err tccr.it 70 i- return _finalize_upload(transfer_id)['shortened_url'] Err tccr.it 70 i+ return _finalize_upload(transfer_id, rd)['shortened_url'] Err tccr.it 70 i Err tccr.it 70 i Err tccr.it 70 i if __name__ == '__main__': Err tccr.it 70 .