SDK

官方 JavaScript SDK 会替您构造登录地址和签名链接,并调用 Hivesigner API。Python 方面有社区提供的库。其他任何语言都可以直接调用 REST API

JavaScript SDK

SDK 就是 npm 包 hivesigner。它的源码在 https://github.com/ecency/hivesigner-sdk。它用 TypeScript 编写,并自带类型定义。

版本 4 需要 Node.js 18 或更高版本,因为它使用内置的 fetch。在浏览器中它需要 ES2017 或更高版本。在没有全局 fetch 的环境里,请在使用 SDK 之前加上 polyfill。在更老的 Node.js 上,请继续使用版本 3。

安装

npm install hivesigner

对于没有构建步骤的页面,请加载浏览器打包版。它会定义一个全局变量 hivesigner

<script src="https://cdn.jsdelivr.net/npm/hivesigner@4/lib/hivesigner.min.js"></script>

创建客户端

import { Client } from 'hivesigner';

const client = new Client({
  app: 'CLIENT_ID',
  callbackURL: 'REDIRECT_URI',
  scope: ['posting'],
});
选项 含义
app 您的应用账户,作为 client_id 发送。
callbackURL Hivesigner 把用户送回的地址。它必须与您应用的某个回调地址逐字符一致(使用普通 http 的回环回调地址在主机和端口上可以不同,参见回调地址)。
scope 一个列表,用逗号连接后放入 scope 参数。参见权限范围
responseType 授权码流程用 'code'。令牌流程则不填。
accessToken 用户的访问令牌,如果您已经有了。
apiURL API 的源地址。SDK 会在后面加上 /api/。默认值是 https://hivesigner.com

setAppsetCallbackURLsetScopesetAccessTokenremoveAccessTokensetApiURL 可以在之后修改客户端。每个方法都返回该客户端。

为用户登录

getLoginURL(state, account) 返回登录地址:

const url = client.getLoginURL('STATE');
// https://hivesigner.com/oauth2/authorize?client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&scope=posting&state=STATE
  • state 会原样回到您的回调地址。用它把回答和请求对应起来。
  • account 是可选的:一个用户名。该账户在设备上时 Hivesigner 会选中它,否则忽略。

在浏览器中,client.login({ state: 'STATE' }) 会把用户送到同一个地址,但不带账户。

在令牌流程中,您的回调地址会收到 access_tokenexpires_inusername。请把令牌交给客户端:

client.setAccessToken('ACCESS_TOKEN');

SDK 没有提供授权码流程中兑换授权码的方法。您的服务器要自行把授权码和客户端密钥发送到 API,正如兑换授权码所示。

获取用户

const me = await client.me();
// { user, _id, name, account, scope, user_metadata }

account 是链上返回的用户 Hive 账户。scope 列出该令牌允许的内容。

广播

broadcast(operations) 把操作发送到 API,由 API 替用户广播。API 只接受由令牌所属用户撰写的发布类操作:votecommentdelete_commentcomment_options、使用发布权限的 custom_jsonclaim_reward_balance 以及用于资料元数据的 account_update2。参见广播接受哪些操作

await client.broadcast([
  ['vote', { voter: 'USERNAME', author: 'AUTHOR', permlink: 'PERMLINK', weight: 10000 }],
]);

请在每个操作中写明用户。API 不会替换 __signer

以下辅助方法各自构造一个操作并调用 broadcast

方法 广播什么
vote(voter, author, permlink, weight) voteweight 取值从 -1000010000(100%)。
comment(parentAuthor, parentPermlink, author, permlink, title, body, jsonMetadata) comment。发新帖时 parentAuthor''jsonMetadata 可以是对象:SDK 会把它转成字符串。
deleteComment(author, permlink) delete_comment
customJson(requiredAuths, requiredPostingAuths, id, json) custom_jsonrequiredAuths[]requiredPostingAuths['USERNAME']json 是字符串。
reblog(account, author, permlink) id 为 followcustom_json,用于转发帖子
follow(follower, following) id 为 followwhat: ['blog']custom_json
unfollow(unfollower, unfollowing) id 为 followwhat: []custom_json
ignore(follower, following) id 为 followwhat: ['ignore']custom_json(屏蔽)
claimRewardBalance(account, rewardHive, rewardHbd, rewardVests) claim_reward_balance。金额是字符串,例如 '0.000 HIVE''0.000 HBD''1.000000 VESTS'

updateUserMetadata() 已弃用。要更改用户资料,请广播带有新 posting_json_metadataaccount_update2

退出登录

revokeToken() 是 SDK 的退出调用。它把令牌发送到 API 的撤销端点,然后把它从客户端移除。当该调用被拒绝时,请自行调用 removeAccessToken()。同时也要在您的应用保存令牌的地方把它删除。

要彻底终止您应用的访问权限,需由用户在 https://hivesigner.com/authorized-apps 移除。参见查看并移除应用的访问权限

sendOperation(op, params)sendOperations(ops, params)sendTransaction(tx, params) 返回一个 https://hivesigner.com/sign/... 链接。params 接受 callbackno_broadcastsigner。参见签名链接

import { sendOperation } from 'hivesigner';

const link = sendOperation(
  ['transfer', { from: '__signer', to: 'RECIPIENT', amount: '1.000 HIVE', memo: 'MEMO' }],
  { callback: 'https://YOUR_APP/paid' },
);

在 TypeScript 中,类型要求必须有第三个参数:传入 undefined 即可取回链接。

在浏览器中,把一个函数作为第三个参数传入,可改为在新标签页中打开链接。该函数不会被调用,也不会返回任何内容。请在点击处理函数中调用它,否则浏览器可能会拦截新标签页,调用也会抛出错误。

Promise 与回调

mebroadcast、各个辅助方法以及 revokeToken 都返回 Promise。若想改用回调,请把一个函数作为最后一个参数传入。它会收到 (error, result)

// Promise
try {
  const result = await client.vote('USERNAME', 'AUTHOR', 'PERMLINK', 10000);
} catch (error) {
  console.error(error.error, error.error_description);
}

// Callback
client.vote('USERNAME', 'AUTHOR', 'PERMLINK', 10000, (error, result) => {
  if (error) console.error(error.error, error.error_description);
});

当 API 以错误作答时,Promise 会以 API 的错误主体 { error, error_description } 被拒绝。使用回调时,该主体就是 error 参数。当回答不是 JSON 时,Promise 会以解析错误被拒绝。

Python

以下库来自社区。它们由各自的作者维护,而非 Hivesigner 团队。在依赖它们之前,请对照 REST API 核实。

作者
hivesigner-python-client:https://github.com/emre/hivesigner-python-client emrebeyler
beem,beem.hivesigner 模块:https://beem.readthedocs.io/en/latest/beem.hivesigner.html holger80