حزم التطوير

تبني حزمة JavaScript الرسمية عناوين تسجيل الدخول وروابط التوقيع وتستدعي واجهة Hivesigner نيابةً عنك. ولـ Python توجد مكتبات من المجتمع. وأي لغة أخرى تستطيع استدعاء واجهة REST مباشرةً.

حزمة JavaScript

الحزمة هي حزمة npm باسم hivesigner. وشيفرتها المصدرية على https://github.com/ecency/hivesigner-sdk. وهي مكتوبة بـ TypeScript وتأتي بأنواعها.

يحتاج الإصدار 4 إلى Node.js 18 أو أحدث، لأنه يستخدم fetch المدمج. وفي المتصفحات يحتاج إلى ES2017 أو أحدث. وحيث لا يوجد fetch عام، أضف 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/ إليه. والقيمة الافتراضية هي https://hivesigner.com.

وsetApp وsetCallbackURL وsetScope وsetAccessToken وremoveAccessToken وsetApiURL تغيّر العميل لاحقًا. وكل واحدة تعيد العميل.

سجّل دخول المستخدم

تعيد 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_token وexpires_in وusername. أعطِ الرمز للعميل:

client.setAccessToken('ACCESS_TOKEN');

ولا تملك الحزمة أي دالة لتبادل التدفق بالكود. فخادمك يرسل الكود والمفتاح السري للعميل إلى الواجهة بنفسه، كما يوضح استبدل الكود.

احصل على المستخدم

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

account هو حساب Hive الخاص بالمستخدم كما تعيده السلسلة. وscope يسرد ما يسمح به الرمز.

البثّ

ترسل broadcast(operations) العمليات إلى الواجهة، التي تبثّها نيابةً عن المستخدم. ولا تقبل الواجهة إلا عمليات النشر التي يكون مؤلفها مستخدم الرمز: vote وcomment وdelete_comment وcomment_options وcustom_json بصلاحية النشر وclaim_reward_balance وaccount_update2 لبيانات الملف الشخصي. راجع ما يقبله البثّ.

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

سمِّ المستخدم في كل عملية. فالواجهة لا تستبدل __signer.

وهذه الدوال المساعدة تبني عملية واحدة لكل منها وتستدعي broadcast:

الدالة تبثّ
vote(voter, author, permlink, weight) vote. وweight يمتد من -10000 إلى 10000 (100%).
comment(parentAuthor, parentPermlink, author, permlink, title, body, jsonMetadata) comment. وللمنشور الجديد يكون parentAuthor هو ''. وjsonMetadata يمكن أن يكون كائنًا: فالحزمة تحوّله إلى نص.
deleteComment(author, permlink) delete_comment
customJson(requiredAuths, requiredPostingAuths, id, json) custom_json. مرّر [] كـ requiredAuths و['USERNAME'] كـ requiredPostingAuths. وjson نص.
reblog(account, author, permlink) custom_json بمعرّف follow، يعيد نشر المنشور
follow(follower, following) custom_json بمعرّف follow، مع what: ['blog']
unfollow(unfollower, unfollowing) custom_json بمعرّف follow، مع what: []
ignore(follower, following) custom_json بمعرّف follow، مع what: ['ignore'] (كتم)
claimRewardBalance(account, rewardHive, rewardHbd, rewardVests) claim_reward_balance. والمبالغ نصوص مثل '0.000 HIVE' و'0.000 HBD' و'1.000000 VESTS'.

وupdateUserMetadata() متوقفة. ولتغيير الملف الشخصي لمستخدم، ابثّ account_update2 مع posting_json_metadata جديد.

تسجيل الخروج

revokeToken() هي دالة تسجيل الخروج في الحزمة. فهي ترسل الرمز إلى نقطة الإلغاء في الواجهة ثم تزيله من العميل. وعندما يُرفض الاستدعاء، استدعِ removeAccessToken() بنفسك. واحذف الرمز أيضًا أينما خزّنه تطبيقك.

ولإنهاء وصول تطبيقك نهائيًا، يزيله المستخدم على https://hivesigner.com/authorized-apps. راجع عرض وصول تطبيق وإزالته.

تعيد sendOperation(op, params) وsendOperations(ops, params) وsendTransaction(tx, params) رابط https://hivesigner.com/sign/.... ويأخذ params القيم callback وno_broadcast وsigner. راجع روابط التوقيع.

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 لتستعيد الرابط.

وفي المتصفح، مرّر دالة كوسيط ثالث لفتح الرابط في تبويب جديد. ولا تُستدعى الدالة ولا يُعاد شيء. استدعِها من معالج نقر، وإلا فقد يحجب المتصفح التبويب الجديد ويرمي الاستدعاء خطأ.

الوعود ودوال الاستدعاء

تعيد me وbroadcast والدوال المساعدة وrevokeToken وعدًا. ومرّر دالة كوسيط أخير لاستخدام دالة استدعاء بدلًا من ذلك. فهي تستقبل (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);
});

وعندما تجيب الواجهة بخطأ، يُرفض الوعد بجسم خطأ الواجهة، { error, error_description }. ومع دالة الاستدعاء، يكون ذلك الجسم هو الوسيط error. وعندما لا تكون الإجابة JSON، يُرفض بخطأ التحليل.

Python

هذه المكتبات من المجتمع. ويتولى صيانتها مؤلفوها، لا فريق Hivesigner. راجعها مقابل واجهة REST قبل أن تعتمد عليها.

المكتبة المؤلف
hivesigner-python-client: https://github.com/emre/hivesigner-python-client emrebeyler
beem، الوحدة beem.hivesigner: https://beem.readthedocs.io/en/latest/beem.hivesigner.html holger80