Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 22, 2021 10:57:54

VasiliyS
Зарегистрирован: 2021-10-13
Сообщения: 21
Репутация: +  -1  -
Профиль  

Dropbox API TOKEN

Здравствуйте, уважаемые форумчане!
Пытаюсь писать скрипт автоматической загрузки файлов на Dropbox (адаптирую другой скрипт под этот ресурс). Столкнулся с проблемой, которую не могу решить без помощи знающих людей.

Токен доступа для моего скрипта “живет” меньше суток… Как решить эту проблему? Если можно, пожалуйста, объясните поподробнее. Заранее спасибо!

Офлайн

#2 Дек. 22, 2021 11:58:56

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Dropbox API TOKEN

Другой скрипт это сценарий для Селениум. Разумно ли его адаптировать для автоматической загрузки файлов на Dropbox? У Dropbox кажется есть вменяемый API для автоматизации, и загрузку файлов можно автоматизировать без браузера
Про время жизни токена, вот эту страницу видели?



Офлайн

#3 Дек. 22, 2021 13:05:58

VasiliyS
Зарегистрирован: 2021-10-13
Сообщения: 21
Репутация: +  -1  -
Профиль  

Dropbox API TOKEN

FishHook
Другой скрипт это сценарий для Селениум. Разумно ли его адаптировать для автоматической загрузки файлов на Dropbox? У Dropbox кажется есть вменяемый API для автоматизации, и загрузку файлов можно автоматизировать без браузераПро время жизни токена, вот эту страницу видели?
Прошу прощения. Не то. Я писал скрипт для загрузки на Яндекс-диск. Там такой проблемы не было.

Офлайн

#4 Дек. 22, 2021 13:50:56

VasiliyS
Зарегистрирован: 2021-10-13
Сообщения: 21
Репутация: +  -1  -
Профиль  

Dropbox API TOKEN

FishHook
Другой скрипт это сценарий для Селениум. Разумно ли его адаптировать для автоматической загрузки файлов на Dropbox? У Dropbox кажется есть вменяемый API для автоматизации, и загрузку файлов можно автоматизировать без браузераПро время жизни токена, вот эту страницу видели?
Спасибо! Это то что нужно!

Офлайн

#5 Дек. 30, 2021 12:55:16

VasiliyS
Зарегистрирован: 2021-10-13
Сообщения: 21
Репутация: +  -1  -
Профиль  

Dropbox API TOKEN

Как можно получить ссылку для уже созданной общедоступной папки (DxFold)?

  dbx.get_shared_link_metadata() и get_shared_link_file()
Не работают.

 Traceback (most recent call last):
  File "/home/vas/UploadDx/DxRMS.py", line 78, in <module>
    sharedlink = dbx.get_shared_link_metadata(DxFold)
AttributeError: 'Dropbox' object has no attribute 'get_shared_link_metadata'

Можно с примером кода?

Отредактировано VasiliyS (Дек. 30, 2021 12:55:37)

Офлайн

#6 Дек. 31, 2021 19:08:30

VasiliyS
Зарегистрирован: 2021-10-13
Сообщения: 21
Репутация: +  -1  -
Профиль  

Dropbox API TOKEN

Вот мой быдлокод для загрузки файлов:

 #!/usr/bin/python3
import dropbox
from datetime import datetime
import os
import subprocess
import shutil
import glob
import logging
#Get name of temporal folder - year
Year = datetime.strftime(datetime.now(), "%Y")
#Adjustment script
#=================================================
#Get token:
TOKEN = "000000000"
#User
USER = str(subprocess.check_output(['whoami']))[2:-3]
#Path of temporal folder
csvFold="/home/" + USER + "/RMS_data/UFOOrbit_files_" + Year
#Create csvFold (True or False)?
flag=False
#Folder for log-files:
Logfiles="/home/" + USER + "/RMS_data/Dropbox_logs"
#Folder with files for upload
targetPattern = "/home/" + USER + "/RMS_data/ArchivedFiles/*/*_" + Year + "*.csv"
#Format of uploaded files
form = '.csv'
#Get name of Dropbox folder
DxFold = '/' + Year
#=================================================
#Path for temporal Folder
temp_fold = csvFold + '/temp'
#Logging: https://python-scripts.com/logging-python
#Create log's folder
if os.path.exists(Logfiles):
    print("Log folder for Dx exist")
else:
    print("Create Dx log folder")
    os.mkdir(Logfiles)  
#Get name for log folder
logname = datetime.strftime(datetime.now(), "%Y.%m.%d.-%H.%M.%S") + '_YD_upload.log'
print("Log file: " + logname + " created")
#Config logger
logging.basicConfig(level=logging.INFO, filename=os.path.join(Logfiles, logname), format='%(asctime)s %(levelname)s:%(message)s')
#Create folder csvFold
if os.path.exists(csvFold):
    logging.info("Folder UFOOrbit exist")
    print("Folder UFOOrbit exist")
else:
    os.mkdir(csvFold)   
#Copy csv-files to csvFold: https://coderoad.ru/296173/
files = glob.iglob(os.path.join(targetPattern))
for file in files:
    if os.path.isfile(file):
        shutil.copy2(file, csvFold)
#Check exist temporal folder
if os.path.exists(temp_fold):
    shutil.rmtree(temp_fold)
#Connect to Dropbox
dbx = dropbox.Dropbox(TOKEN)
#Check and refresh TOKEN
dbx.check_and_refresh_access_token()
#Create Dropbox-disk folder
#Check folder
flag1 = False
# List file items in folder
for entry in dbx.files_list_folder('').entries:
    if (entry.path_display == DxFold):
        flag1 = True
        print('Folder Dx exist!')
        logging.info('Folder Dx exist!')
        '''
        #https://practicaldatascience.co.uk/data-science/how-to-use-the-dropbox-api-with-python
        sharedlink = dbx.sharing_get_shared_links(DxFold).links[0].url
        print('URL:\n', sharedlink)
        logging.info('URL:')
        logging.info(sharedlink)
        '''
       
#Create folder 
if (flag1 == False):
    print('Create Dx folder!')
    logging.info('Create Dx folder!')
    dbx.files_create_folder(DxFold)
    '''
    #Share cloud folder
    shared_link_metadata = dbx.sharing_create_shared_link(DxFold).url
    print('URL:\n', shared_link_metadata)
    logging.info('URL:')
    logging.info(shared_link_metadata)
    '''
#Sorting files
#===============================================================================================
#Types of files
Files_on_PC = []
UploadedFiles = []
#Get list of files on PC
for i in os.walk(csvFold):
    Files_on_PC.append(i)
Files_on_PC = i[2]
#Get list of files on cloud
for entry in dbx.files_list_folder(DxFold).entries:
    UploadedFiles.append(entry.name)
#Get list of files for upload
Files_for_upload = list(set(Files_on_PC) - set(UploadedFiles))
print('\n====================================================================================')
print('\nOn PC:', *Files_on_PC, sep = '\n')
print('\nOn Cloud:', *UploadedFiles, sep = '\n')
print('\nDifference:', *Files_for_upload, sep = '\n')
print('====================================================================================\n')
#Create temporal folder
os.mkdir(temp_fold)
#Move files for upload to temporal folder
for file in Files_for_upload:
    shutil.copy2(csvFold + '/' + file, temp_fold)
#===============================================================================================
logging.info("Upload files...")
print("Upload files...")
#Upload a small file (150 MB or less)
for path_ in glob.glob(os.path.join(temp_fold, '*'+ form)):
    with open(path_, 'rb') as file:
        #Get filename
        filename = os.path.splitext(os.path.basename(path_))[0]
        print(filename + form)
        logging.info(filename + form)
        #Upload files
        dbx.files_upload(file.read(), DxFold + '/' + filename + form)
print('Upload sucsessfull!')
logging.info('Upload sucsessfull!')
#Delete csvFold?
if flag:
    logging.info("Folder UFOOrbit_files created")
    print("Folder UFOOrbit_files created")
    shutil.rmtree(temp_fold)
else:
    logging.info("Remove temporal folders")
    print("Remove temporal folders")
    shutil.rmtree(csvFold)
logging.info("Done!")
print("Done!")

Все работает в питон версии 3.8.10 Однако, при запуске на RaspberryPi 3B+, на которой стоит версия 3.4. Выскакивает сообщение об ошибке:

Traceback (most recent call last):
File "/home/pi/UploadDx/DxRMS.py", line 85, in <module>
sharedlink = dbx.sharing_get_shared_links(DxFold).links[0].url
File "/home/pi/.local/lib/python3.4/site-packages/dropbox/base.py", line 4350, in sharing_get_shared_links
None,
File "/home/pi/.local/lib/python3.4/site-packages/dropbox/dropbox_client.py", line 345, in request
returned_data_type, obj, strict=False)
File "/home/pi/.local/lib/python3.4/site-packages/stone/backends/python_rsrc/stone_serializers.py", line 978, in json_compat_obj_decode
data_type, obj)
File "/home/pi/.local/lib/python3.4/site-packages/stone/backends/python_rsrc/stone_serializers.py", line 558, in json_compat_obj_decode_helper
return self.decode_struct(data_type, obj)
File "/home/pi/.local/lib/python3.4/site-packages/stone/backends/python_rsrc/stone_serializers.py", line 607, in decode_struct
self.decode_struct_fields(ins, all_fields, obj)
File "/home/pi/.local/lib/python3.4/site-packages/stone/backends/python_rsrc/stone_serializers.py", line 626, in decode_struct_fields
v = self.json_compat_obj_decode_helper(field_data_type, obj[name])
File "/home/pi/.local/lib/python3.4/site-packages/stone/backends/python_rsrc/stone_serializers.py", line 566, in json_compat_obj_decode_helper
data_type, obj)
File "/home/pi/.local/lib/python3.4/site-packages/stone/backends/python_rsrc/stone_serializers.py", line 844, in decode_list
for item in obj]
File "/home/pi/.local/lib/python3.4/site-packages/stone/backends/python_rsrc/stone_serializers.py", line 844, in <listcomp>
for item in obj]
File "/home/pi/.local/lib/python3.4/site-packages/stone/backends/python_rsrc/stone_serializers.py", line 556, in json_compat_obj_decode_helper
return self.decode_struct_tree(data_type, obj)
File "/home/pi/.local/lib/python3.4/site-packages/stone/backends/python_rsrc/stone_serializers.py", line 797, in decode_struct_tree
return self.decode_struct(subtype, obj)
File "/home/pi/.local/lib/python3.4/site-packages/stone/backends/python_rsrc/stone_serializers.py", line 607, in decode_struct
self.decode_struct_fields(ins, all_fields, obj)
File "/home/pi/.local/lib/python3.4/site-packages/stone/backends/python_rsrc/stone_serializers.py", line 626, in decode_struct_fields
v = self.json_compat_obj_decode_helper(field_data_type, obj[name])
File "/home/pi/.local/lib/python3.4/site-packages/stone/backends/python_rsrc/stone_serializers.py", line 563, in json_compat_obj_decode_helper
return self.decode_union(data_type, obj)
File "/home/pi/.local/lib/python3.4/site-packages/stone/backends/python_rsrc/stone_serializers.py", line 662, in decode_union
return data_type.definition(six.ensure_str(tag), val)
AttributeError: 'module' object has no attribute 'ensure_str'

Я закомментировал проблемный участок кода, содержащий
dbx.sharing_create_shared_link()
но хотелось бы, чтобы он работал.

ВОПРОС. Как это устранить на текущей версии питона? Устнавливать на малину ничего нельзя - в этом корень проблемы. Подскажите кто разбирается. Заранее спасибо! Всех с праздником!

Офлайн

#7 Янв. 2, 2022 02:42:44

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

Dropbox API TOKEN

VasiliyS
Как это устранить на текущей версии питона?
Создай абсолютно новый файл на питоне. Дальше в него занеси код входа на Dropbox. Если работает вход (как на версии питона 3.8, так и на версии питона 3.4), то добавь в него код закачивания одного файла на Dropbox после входа на Dropbox. Если работает вход и закачивание одного файла (как на версии питона 3.8, так и на версии питона 3.4), то скопируй содержимое этого скрипта в новый файл на питоне и потом добавь в этот новый файл на питоне некоторые куски своего исходного скрипта. Постепенно добавляй что-то, потом сразу проверяй, работает ли оно. Когда убедился, что работает, продолжай добавлять понемногу.

Не надо писать весь код сразу, потому что ты писать не умеешь. А когда он весь написан неправильно, ты никогда не знаешь, где именно ошибка, потому что ошибки везде и они все друг на друга накладываются. Именно из-за этого ты и не можешь отладить свой изначальный скрипт.

Когда научишься, тогда и будешь всё сразу писать. И то ты будешь всё писать в голове сначала, а уже только потом готовый в голове код просто записывать в компьютере.



Отредактировано py.user.next (Янв. 2, 2022 02:45:27)

Офлайн

#8 Янв. 2, 2022 15:50:02

VasiliyS
Зарегистрирован: 2021-10-13
Сообщения: 21
Репутация: +  -1  -
Профиль  

Dropbox API TOKEN

Я написал какая функция не работает.

dbx.sharing_create_shared_link()
dbx.sharing_get_shared_links()

Почему данная функция не работает на RaspberryPi.

Отредактировано VasiliyS (Янв. 3, 2022 21:30:23)

Офлайн

#9 Янв. 3, 2022 02:22:59

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

Dropbox API TOKEN

VasiliyS
Я задал вопрос. Почему данная функция не работает на RaspberryPi.
Да там может быть 100500 причин и все они проистекают из твоей тупости. Так что чтобы время не тратить просто впустую на выяснение всех обстоятельств и закутков твоей тупизны, я тебе сказал, что нужно делать, чтобы достичь результа. Тебе же нужно не про RaspberryPi что-то узнать, а чтобы всё выкладывалось на Dropbox.

А ты же решил что-то поумничать и в итоге обосрался только прилюдно.

Кстати, FishHook выше тоже не стал слушать твои умности про Selenium, а просто сразу посоветовал верное направление - задействовать API Dropbox'а. Наверное, не такой уж ты умный? раз сам с API не начал.

Так что делай то, что тебе говорят, иначе сразу будешь зачислен в бронелобые дебилы и потом просто помощи не дождёшься вообще ни от кого.

VasiliyS
Всех с праздником!
Тебя тоже с праздником! Надеюсь, мой маленький подарок повысит тебе настроение.



Отредактировано py.user.next (Янв. 3, 2022 02:23:29)

Офлайн

#10 Янв. 3, 2022 15:33:58

VasiliyS
Зарегистрирован: 2021-10-13
Сообщения: 21
Репутация: +  -1  -
Профиль  

Dropbox API TOKEN

Мда. Кое-кому стоит научиться читать внимательнее.

Во-первых. Тема называется Dropbox API TOKEN.
Во-вторых, в третьем сообщении я написал что ошибся ссылкой. Это совсем другое задание.
В-третьих, в моем коде, приводимом выше, во второй строке:

 import dropbox

При чем здесь Селениум я не понимаю. Откуда его здесь взяли я так и не понял.
В дополнение - тестовый код

 #!/usr/bin/python3
import dropbox
TOKEN = "000000000000000000000000000000000000000000000000000000000000000"
#Connect to Dropbox
dbx = dropbox.Dropbox(TOKEN)
DxFold = '/2021'
shared_link_metadata = dbx.sharing_create_shared_link(DxFold)
sharedlink = dbx.sharing_get_shared_links(DxFold)
print('URL:\n', sharedlink)

Ведет себя точно так же как и основная программа.

Отредактировано VasiliyS (Янв. 3, 2022 15:54:59)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version