import hashlib import json import os import time import aliyunsdkcore import oss2 as oss2 from aliyunsdkcloudphoto.request.v20170711 import ListPhotoStoresRequest, FetchLibrariesRequest, \ CreateTransactionRequest, CreatePhotoRequest, EditPhotosRequest, GetPublicAccessUrlsRequest, ListPhotosRequest, \ DeletePhotosRequest, InactivatePhotosRequest, GetLibraryRequest from aliyunsdkcore.auth.credentials import RamRoleArnCredential from aliyunsdkcore.client import AcsClient from aliyunsdkcore.profile import region_provider from aliyunsdkcore.request import CommonRequest region_id = 'cn-shanghai' ak = 'LTAIWzPnmkJs2qpL' secret = 'LIIq3HumctXPp0WT8c06yDiFbKKiVe' region_provider.add_endpoint('Oss', region_id, 'oss-cn-shanghai.aliyuncs.com') region_provider.add_endpoint('CloudPhoto', region_id, 'cloudphoto.cn-shanghai.aliyuncs.com') aliyunsdkcore.request.set_default_protocol_type("https") class MyClient(AcsClient): def __init__(self, arn, sessionName): super().__init__(region_id=region_id, credential=RamRoleArnCredential(ak, secret, arn, sessionName)) self.StoreName = None def get_md5_01(self, file_path): md5 = None if os.path.isfile(file_path): f = open(file_path, 'rb') md5_obj = hashlib.md5() md5_obj.update(f.read()) hash_code = md5_obj.hexdigest() f.close() md5 = str(hash_code).lower() return md5 def do_action_with_exception(self, acs_request): return json.loads(super().do_action_with_exception(acs_request).decode()) def showOption(self, options, key, desc): choose = [] for index, option in enumerate(options): choose.append(option[key]) print('{index}:{name}'.format(index=index + 1, name=option[key])) return choose[(int)(input('输入{desc}\n'.format(desc=desc))) - 1] def listPhotoStores(self): request = ListPhotoStoresRequest.ListPhotoStoresRequest() response = self.do_action_with_exception(request) print('PhotoStores:') photoStores = response['PhotoStores'] self.StoreName = self.showOption(photoStores, 'Name', 'StoreName') def listLibraries(self): request = FetchLibrariesRequest.FetchLibrariesRequest() request.set_StoreName(self.StoreName) response = self.do_action_with_exception(request) self.Libraries = response['Libraries'] def uploadPhoto(self): if self.StoreName is None: self.listPhotoStores() request = CreateTransactionRequest.CreateTransactionRequest() filePath = input('输入上传文件路径\n').replace('\\', '/') fileName = filePath.split('/')[-1] request.set_Size(os.path.getsize(filePath)) request.set_Ext(fileName[-fileName[::-1].index('.'):]) request.set_Md5(self.get_md5_01(filePath)) request.set_StoreName(self.StoreName) response = self.do_action_with_exception(request) print(response) Upload = response['Transaction']['Upload'] FileId = Upload['FileId'] SessionId = Upload['SessionId'] Bucket = Upload['Bucket'] OssEndpoint = Upload['OssEndpoint'] ObjectKey = Upload['ObjectKey'] auth = oss2.StsAuth(self._signer._session_credential[0], self._signer._session_credential[1], self._signer._session_credential[2]) bucket = oss2.Bucket(auth, OssEndpoint, Bucket) with open(filePath, 'rb') as fileobj: result = bucket.put_object(ObjectKey, fileobj) print('文件上传状态{status}'.format(status=result.status)) request = CreatePhotoRequest.CreatePhotoRequest() request.set_FileId(FileId) request.set_PhotoTitle(fileName) request.set_SessionId(SessionId) request.set_StoreName(self.StoreName) request.set_UploadType('manual') response = self.do_action_with_exception(request) print(response) def listPhotos(self): if self.StoreName == None: self.listPhotoStores() request = ListPhotosRequest.ListPhotosRequest() request.set_StoreName(self.StoreName) request.set_State('all') response = self.do_action_with_exception(request) print(response) return response['Photos'] def getPhoto(self): return self.showOption(self.listPhotos(), 'IdStr', '照片Id') def sharePhoto(self): IdStr = self.getPhoto() request = EditPhotosRequest.EditPhotosRequest() request.set_PhotoIds([IdStr]) request.set_StoreName(self.StoreName) request.set_ShareExpireTime((int(round(time.time())) + 60 * 60) * 1000) response = self.do_action_with_exception(request) print(response) request = GetPublicAccessUrlsRequest.GetPublicAccessUrlsRequest() request.set_DomainType('OSS') request.set_PhotoIds([IdStr]) request.set_StoreName(self.StoreName) request.set_ZoomType('style/2') response = self.do_action_with_exception(request) print(response) def client(arn, sessionName): ram_role_arn_credential = RamRoleArnCredential('LTAIWzPnmkJs2qpL', 'LIIq3HumctXPp0WT8c06yDiFbKKiVe', arn, sessionName) return AcsClient(region_id='cn-shanghai', credential=ram_role_arn_credential) if __name__ == '__main__': myClient = MyClient('acs:ram::1098806312754985:role/aliyunosstokengeneratorrole', 'pqh001') myClient.listPhotoStores() myClient.sharePhoto()