文昌链 avata python sdk

由于Avata 开发者文档 (bianjie.ai)只给了gojavaphp的列子,这里给一个python的例子

import json
import uuid
import datetime
import hashlib
import logging
import requests

class WenChangBase(object):

    def __init__(self, api_key, api_serect, host):
        self.api_key = api_key
        self.api_serect = api_serect
        self.host = host

    def get_headers(self, path, params={}, data={}):
        '''获取headers'''
        timestamp = str(int(datetime.datetime.timestamp(datetime.datetime.now()) * 1000))
        sign = self.get_signature(timestamp=timestamp, path=path, params=params, data=data)

        return {
            'Content-Type': 'application/json',
            'X-Api-Key': self.api_key,
            'X-Signature': sign,
            'X-Timestamp': timestamp
        }

    def get_signature(self, timestamp, path, params={}, data={}):
        '''获取签名'''

        merged_params = {'path_url': path}

        # url_query参数
        for k, v in params.items():
            merged_params['query_' + k] = v

        # body参数
        for k, v in data.items():
            merged_params['body_' + k] = v

        # 排序
        sorted_params = dict(sorted(merged_params.items(), key=lambda x: x[0]))
        sorted_params_str = json.dumps(sorted_params, separators=(',', ':'), ensure_ascii=False) + timestamp + self.api_serect

        # 计算签名
        sha256 = hashlib.sha256()
        sha256.update(sorted_params_str.encode('utf-8'))
        return sha256.hexdigest()

    def get_operation_id(self):
        '''返回唯一操作id'''
        return uuid.uuid4().hex + uuid.uuid4().hex

    def fetch(self, method, path, params={}, data={}, timeout=15):
        try:
            headers = self.get_headers(path=path, params=params, data=data)
            result = requests.request(method=method, url=self.host + path, headers=headers, params=params, json=data, timeout=timeout).json()
            return result
        except Exception as e:
            logging.error(e)
            return {}

    def create_accounts(self, count=1):
        '''创建链账户'''
        data = {'count': count, 'operation_id': self.get_operation_id()}
        return self.fetch(method="POST", path="/v1beta1/accounts", data=data)

    def get_accounts(self, account=None, start_date=None, end_date=None, page_index=1, page_size=10, sort="DATE_DESC"):
        '''查询链账户'''
        data = {
            'account': account, 'start_date': start_date, 'end_date': end_date,
            'offset': max(page_index - 1, 0), 'limit': max(page_size, 50), 'sort_by': sort
        }
        return self.fetch(method="GET", path="/v1beta1/accounts", data=data)

    def get_accounts_history(self, account=None, module=None, operation=None, start_date=None, end_date=None,
                             page_index=1, page_size=10, sort="DATE_DESC"):
        '''查询链账户操作记录'''
        data = {
            'account': account, 'module': module, 'operation': operation, 'start_date': start_date, 'end_date': end_date,
            'offset': max(page_index - 1, 0), 'limit': max(page_size, 50), 'sort_by': sort
        }
        return self.fetch(method="GET", path="/v1beta1/accounts/history", data=data)

    def get_tx(self, task_id):
        '''上链结果查询'''
        return self.fetch(method="GET", path="/v1beta1/tx/%s" % task_id)

    def create_nft_class(self, owner, name, symbol=None, des=None, uri=None, uri_hash=None, meta_data=None, tag={}):
        '''创建 NFT 类别'''
        data = {
            'owner': owner, 'name': name, 'symbol': symbol, 'description': des, 'uri': uri,
            'uri_hash': uri_hash, 'data': meta_data, 'tag': tag, 'operation_id': self.get_operation_id()
        }
        return self.fetch(method="POST", path="/v1beta1/nft/classes", data=data)

    def get_nft_classes(self, class_id=None, owner=None, start_date=None, end_date=None, page_index=1, page_size=10, sort="DATE_DESC"):
        '''查询 NFT 类别'''
        data = {
            'class_id': class_id, 'owner': owner, 'start_date': start_date, 'end_date': end_date,
            'offset': max(page_index - 1, 0), 'limit': max(page_size, 50), 'sort_by': sort
        }
        return self.fetch(method="GET", path="/v1beta1/nft/classes", data=data)

    def get_nft_class_detail(self, class_id):
        '''查询 NFT 类别详情'''
        return self.fetch(method="GET", path="/v1beta1/nft/classes/%s" % class_id)

    def transfer_nft_class(self, class_id, owner, recipient):
        '''转让 NFT 类别'''
        data = {'recipient': recipient, 'operation_id': self.get_operation_id()}
        return self.fetch(method="POST", path="/v1beta1/nft/class-transfers/%s/%s" % (class_id, owner), data=data)

    def create_nft(self, class_id, name, uri=None, uri_hash=None, data=None, recipient=None, tag={}):
        '''发行 NFT'''
        data = {
            'name': name, 'uri': uri, 'uri_hash': uri_hash, 'data': data, 'recipient': recipient,
            'tag': tag, 'operation_id': self.get_operation_id()
        }
        return self.fetch(method="POST", path="/v1beta1/nft/nfts/%s" % (class_id), data=data)

    def transfer_nft(self, class_id, owner, nft_id, recipient, tag={}):
        '''转让 NFT'''
        data = {
            'recipient': recipient, 'tag': tag, 'operation_id': self.get_operation_id()
        }
        return self.fetch(method="POST", path="/v1beta1/nft/nft-transfers/%s/%s/%s" % (class_id, owner, nft_id), data=data)

    def modify_nft(self, class_id, owner, nft_id, name, uri=None, data=None, tag={}):
        '''编辑 NFT'''
        data = {
            'name': name, 'uri': uri, 'data': data, 'tag': tag
        }
        return self.fetch(method="PATCH", path="/v1beta1/nft/nfts/%s/%s/%s" % (class_id, owner, nft_id), data=data)

    def remove_nft(self, class_id, owner, nft_id, tag={}):
        '''删除 NFT'''
        data = {
            'tag': tag
        }
        return self.fetch(method="DELETE", path="/v1beta1/nft/nfts/%s/%s/%s" % (class_id, owner, nft_id), data=data)

    def get_nfts(self, class_id=None, nft_id=None, owner=None, tx_hash=None, start_date=None, end_date=None, page_index=1,
                 page_size=10, sort="DATE_DESC", status="active"):
        '''查询 NFT 类别'''
        data = {
            'id': nft_id, 'class_id': class_id, 'owner': owner, 'tx_hash': tx_hash, 'start_date': start_date,
            'end_date': end_date, 'offset': max(page_index - 1, 0), 'limit': max(page_size, 50), 'sort_by': sort, 'status': status
        }
        return self.fetch(method="GET", path="/v1beta1/nft/nfts", data=data)

    def get_nft_detail(self, class_id, nft_id):
        '''查询 NFT 详情'''
        return self.fetch(method="GET", path="/v1beta1/nft/nfts/%s/%s" % (class_id, nft_id))

    def get_nft_history(self, class_id, nft_id, signer=None, tx_hash=None, operation=None, start_date=None, end_date=None,
                        page_index=1, page_size=10, sort="DATE_DESC"):
        '''查询 NFT 操作记录'''
        data = {
            'signer': signer, 'tx_hash': tx_hash, 'operation': operation, 'start_date': start_date, 'end_date': end_date,
            'offset': max(page_index - 1, 0), 'limit': max(page_size, 50), 'sort_by': sort
        }
        return self.fetch(method="GET", path="/v1beta1/nft/nfts/%s/%s" % (class_id, nft_id), data=data)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352