基于Mixin Network的C#语言比特币开发教程 : 用 Mixin Messenger 机器人接受和发送比特币…

基于Mixin Network的C#语言比特币开发教程 : 用 Mixin Messenger 机器人接受和发送比特币…

上一篇教程中, 我们创建了自动回复消息的机器人,当用户发送消息”Hello,World!”时,机器人会自动回复同一条消息!

按本篇教程后学习后完成后,你的机器人将会接受用户发送过来的加密货币,然后立即转回用户。 完整代码如下:

Program.cs

using System;
using System.Collections.Generic;
using MixinSdk;
using MixinSdk.Bean;
using Newtonsoft.Json;
using Org.BouncyCastle.Asn1.X509;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Prng;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.X509;

namespace echo_bot
{
    class Program
    {
        static void Main(string[] args) {
            MixinApi mixinApi = new MixinApi();
            mixinApi.Init(USRCONFIG.ClientId, USRCONFIG.ClientSecret, USRCONFIG.SessionId, USRCONFIG.PinToken, USRCONFIG.PrivateKey);

            mixinApi.WebSocketConnect(HandleOnRecivedMessage).Wait();

            mixinApi.StartRecive();

            do
            {
                var msg = Console.ReadLine();


            } while (true);

        }


        static void HandleOnRecivedMessage(object sender, EventArgs args, string message) {
            var incomingMessage = JsonConvert.DeserializeObject<RecvWebSocketMessage>(message);
            Console.WriteLine(incomingMessage);
            if ( (incomingMessage.action == "CREATE_MESSAGE") && (incomingMessage.data != null) ) {
                // Console.WriteLine(incomingMessage.data.conversation_id);
                MixinApi callback = (MixinApi)sender;
                //send ack for every Create Message!
                callback.SendMessageResponse(incomingMessage.data.message_id).Wait();
                if (incomingMessage.data.category == "PLAIN_TEXT") {
                  byte[] strOriginal = Convert.FromBase64String(incomingMessage.data.data);
                  string clearText = System.Text.Encoding.UTF8.GetString(strOriginal);
                  Console.WriteLine(clearText);
                  string thisMessageId = Guid.NewGuid().ToString();
                  System.Console.WriteLine("Send echo with message id:" + thisMessageId);
                  if (clearText == "a") {
                    AppCard appCard      = new AppCard();
                    appCard.title        = "Pay BTC 0.0001";
                    appCard.icon_url     = "https://images.mixin.one/HvYGJsV5TGeZ-X9Ek3FEQohQZ3fE9LBEBGcOcn4c4BNHovP4fW4YB97Dg5LcXoQ1hUjMEgjbl1DPlKg1TW7kK6XP=s128";
                    appCard.description  = "hi";
                    appCard.action       = "https://mixin.one/pay?recipient=" +
                              							 USRCONFIG.ClientId  + "&asset=" +
                              							 "c6d0c728-2624-429b-8e0d-d9d19b6592fa"   +
                              							 "&amount=" + "0.001" +
                              							 "&trace="  + System.Guid.NewGuid().ToString() +
                              							 "&memo=";
                    callback.SendAppCardMessage(incomingMessage.data.conversation_id,appCard);
                  } else if (clearText == "g") {
                    List<AppButton> appBtnList = new List<AppButton>();
                    string payLinkEOS = "https://mixin.one/pay?recipient=" +
                        							 USRCONFIG.ClientId  + "&asset=" +
                        							 "6cfe566e-4aad-470b-8c9a-2fd35b49c68d"   +
                        							 "&amount=" + "0.1" +
                        							 "&trace="  + System.Guid.NewGuid().ToString() +
                        							 "&memo=";
              		  string payLinkBTC = "https://mixin.one/pay?recipient=" +
                        							 USRCONFIG.ClientId  + "&asset=" +
                        							 "c6d0c728-2624-429b-8e0d-d9d19b6592fa"   +
                        							 "&amount=" + "0.001" +
                        							 "&trace="  + System.Guid.NewGuid().ToString() +
                        							 "&memo=";
                    AppButton btnBTC = new AppButton();
                    btnBTC.label     = "Pay BTC 0.001";
                    btnBTC.color     = "#0080FF";
                    btnBTC.action    = payLinkBTC;

                    AppButton btnEOS = new AppButton();
                    btnEOS.label     = "Pay EOS 0.1";
                    btnEOS.color     = "#8000FF";
                    btnEOS.action    = payLinkEOS;
                    appBtnList.Add(btnBTC);
                    appBtnList.Add(btnEOS);
              			callback.SendAppButtonGroupMessage(incomingMessage.data.conversation_id,appBtnList);
                  } else  callback.SendTextMessage(incomingMessage.data.conversation_id, clearText,thisMessageId);

                }
                if (incomingMessage.data.category == "SYSTEM_ACCOUNT_SNAPSHOT") {
                  byte[] strOriginal = Convert.FromBase64String(incomingMessage.data.data);
                  string clearText = System.Text.Encoding.UTF8.GetString(strOriginal);
                  Console.WriteLine(clearText);
                  Transfer trsInfo = JsonConvert.DeserializeObject<Transfer>(clearText);
                  Console.WriteLine(trsInfo.asset_id);
                  Console.WriteLine(trsInfo.opponent_id);
                  Console.WriteLine(trsInfo.amount);
                  if ( Int32.Parse(trsInfo.amount) > 0 ) {
                    Transfer reqInfo = callback.Transfer(trsInfo.asset_id,
                                                        trsInfo.opponent_id,
                                                        trsInfo.amount,
                                                        USRCONFIG.PinCode,
                                                        System.Guid.NewGuid().ToString(),
                                                        "");
                    Console.WriteLine(reqInfo);
                  }
                }
            }
            // Console.WriteLine(incomingMessage);
            if (incomingMessage.action == "ACKNOWLEDGE_MESSAGE_RECEIPT")
            {
                if (incomingMessage.data != null) {
                  System.Console.WriteLine("The message delivery status: " +
                                            incomingMessage.data.message_id + " "
                                            + incomingMessage.data.status);
                }
            }
            if (incomingMessage.action == "LIST_PENDING_MESSAGES")
            {
                System.Console.WriteLine("The bot is listening!");
            }
        }

    }
}


复制代码

你好, 比特币!

在项目目录下编译并执行

  • dot build 编译项目.
  • dotnet bin/Debug/netcoreapp2.0/echo_bot.dll 运行机器人程序.
wenewzha:echo_bot wenewzhang$ dotnet build
Microsoft (R) Build Engine version 15.9.20+g88f5fadfbe for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  Restore completed in 154.16 ms for /Users/wenewzhang/Documents/sl/mixin_labs-csharp-bot/echo_bot/echo_bot.csproj.
  Restore completed in 154.19 ms for /Users/wenewzhang/Documents/sl/mixin_labs-csharp-bot/mixin-csharp-sdk/mixin-csharp-sdk/mixin-csharp-sdk.csproj.
  mixin-csharp-sdk -> /Users/wenewzhang/Documents/sl/mixin_labs-csharp-bot/mixin-csharp-sdk/mixin-csharp-sdk/bin/Debug/netstandard2.0/mixin-csharp-sdk.dll
  Created package at /Users/wenewzhang/Documents/sl/mixin_labs-csharp-bot/mixin-csharp-sdk/mixin-csharp-sdk/bin/Debug/MixinCSharpSdk.0.1.0.nupkg.
  echo_bot -> /Users/wenewzhang/Documents/sl/mixin_labs-csharp-bot/echo_bot/bin/Debug/netcoreapp2.0/echo_bot.dll

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:03.33
wenewzha:echo_bot wenewzhang$ dotnet bin/Debug/netcoreapp2.0/echo_bot.dll

{
   "id":"dd52dfe5-7f12-4c0e-bb44-d1865308e628","action":"LIST_PENDING_MESSAGES","data":null}
The bot is listening!
复制代码

开发者可以通过消息面板,给机器人转比特币,当机器人收到比特币后,马上返还给用户!

事实上,用户可以发送任意的币种给机器人,它都能马上返还!

源代码解释

if (incomingMessage.data.category == "SYSTEM_ACCOUNT_SNAPSHOT") {
	byte[] strOriginal = Convert.FromBase64String(incomingMessage.data.data);
	string clearText = System.Text.Encoding.UTF8.GetString(strOriginal);
	Transfer trsInfo = JsonConvert.DeserializeObject<Transfer>(clearText);
if ( Int32.Parse(trsInfo.amount) > 0 ) {
	Transfer reqInfo = callback.Transfer(trsInfo.asset_id,
																			trsInfo.opponent_id,
																			trsInfo.amount,
																			USRCONFIG.PinCode,
																			System.Guid.NewGuid().ToString(),
																			"");
	Console.WriteLine(reqInfo);
}
复制代码

如果机器人收到币,trsInfo.amount 大于零;如果机器人支付币给用户,接收到的消息是一样的,唯一不同的是,trsInfo.amount是一个负数. 最后一步,调用SDK的 callback.Transfer 将币返还用户!

高级用法

APP_BUTTON_GROUP

在一些应用场景,比如:有一个交易所想提供换币服务,将比特币换成以太坊,EOS,比特币现金等, 你想显示给用户一组按钮,它们分别代表不同的币与不同的数量,APP_BUTTON_GROUP可以帮你做到这一点.

  List<AppButton> appBtnList = new List<AppButton>();
  string payLinkEOS = "https://mixin.one/pay?recipient=" +
                     USRCONFIG.ClientId  + "&asset=" +
                     "6cfe566e-4aad-470b-8c9a-2fd35b49c68d"   +
                     "&amount=" + "0.1" +
                     "&trace="  + System.Guid.NewGuid().ToString() +
                     "&memo=";
  string payLinkBTC = "https://mixin.one/pay?recipient=" +
                     USRCONFIG.ClientId  + "&asset=" +
                     "c6d0c728-2624-429b-8e0d-d9d19b6592fa"   +
                     "&amount=" + "0.001" +
                     "&trace="  + System.Guid.NewGuid().ToString() +
                     "&memo=";
  AppButton btnBTC = new AppButton();
  btnBTC.label     = "Pay BTC 0.001";
  btnBTC.color     = "#0080FF";
  btnBTC.action    = payLinkBTC;

  AppButton btnEOS = new AppButton();
  btnEOS.label     = "Pay EOS 0.1";
  btnEOS.color     = "#8000FF";
  btnEOS.action    = payLinkEOS;
  appBtnList.Add(btnBTC);
  appBtnList.Add(btnEOS);
  callback.SendAppButtonGroupMessage(incomingMessage.data.conversation_id,appBtnList);
复制代码

这里演示给用户BTC与EOS两种,你还可以增加更多的按钮.

APP_CARD

如果你觉得一组按钮太单调了,可以试一下APP_CARD,它提供一个图标的链接

  AppCard appCard      = new AppCard();
  appCard.title        = "Pay BTC 0.0001";
  appCard.icon_url     = "https://images.mixin.one/HvYGJsV5TGeZ-X9Ek3FEQohQZ3fE9LBEBGcOcn4c4BNHovP4fW4YB97Dg5LcXoQ1hUjMEgjbl1DPlKg1TW7kK6XP=s128";
  appCard.description  = "hi";
  appCard.action       = "https://mixin.one/pay?recipient=" +
                           USRCONFIG.ClientId  + "&asset=" +
                           "c6d0c728-2624-429b-8e0d-d9d19b6592fa"   +
                           "&amount=" + "0.001" +
                           "&trace="  + System.Guid.NewGuid().ToString() +
                           "&memo=";
  callback.SendAppCardMessage(incomingMessage.data.conversation_id,appCard);
复制代码

Full code is here

转载于:https://juejin.im/post/5c8661575188257ec705336b

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/101057.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • hashmap和hashtable和hashset的区别_为什么要用hashmap

    hashmap和hashtable和hashset的区别_为什么要用hashmap1.HashMap1) hashmap的数据结构     Hashmap是一个数组和链表的结合体(在数据结构称“链表散列“),如下图示:     当我们往hashmap中put元素的时候,先根据key的hash值得到这个元素在数组中的位置(即下标),然后就可以把这个元素放到对应的位置中了。如果这个元素所在的位子上已经存放有其他元素了,那么在同一个位子上的元素将以链表的形

  • virsh命令行_怎么进入命令行窗口

    virsh命令行_怎么进入命令行窗口[@TOC]定义存储池与其目录创建已定义的存储池激活并自动启动已定义的存储池在存储池中创建虚拟机存储卷kvm存储池主要体现一种管理方式,可以通过挂载存储目录,lvm逻辑卷的方式创建存储池,虚拟机存储卷创建完成后,剩下的操作与无存储卷的方式无任何区别KVM存储池也要用于虚拟机迁移任务存储池相关管理命令二、生产环境存储池使用添加lvm和远程存储即可rawqcowqocw2qed什么是写时拷贝四、挂载磁盘使用libguestfsLinux工具可以在虚拟机无

  • Selenium WebDriver下载与安装[通俗易懂]

    Selenium WebDriver下载与安装[通俗易懂]1.python(anaconda环境)condainfo–envsactivateuntitled2.pip/condainstallselenium3.seleniumdriver(放在anaconda环境path中)Chrome(32位)http://chromedriver.storage.proxy.ustclug.org/index.htmlFire…

  • 利用 SSDP 协议生成 100 Gbps DDoS 流量的真相探秘「建议收藏」

    利用 SSDP 协议生成 100 Gbps DDoS 流量的真相探秘「建议收藏」原文地址https://www.4hou.com/technology/5979.html上个月我们分享过一些反射型DDoS攻击数据,SSDP攻击的平均大小是12Gbps,我们记录的最大的反射式DDoS攻击是:1.30Mpps(每秒数百万个数据包)2.80Gbps(每秒数十亿位)3.使用940k反射器的IP几天前,我们注意到了一个不寻常的SSDP超级放大情况的发生…

    2022年10月10日
  • Selenium面试题

    Selenium面试题NO.1Selenium是什么是一个开源的web自动化测试的框架,支持多种编程语言,支持跨浏览器平台进行测试NO.2Selenium中有哪些验证点?Selenium主要有三种验证点检查页面标题检查某些文字检查某些元素(文本框,下拉菜单,表等)NO.3你如何从Selenium连接到数据库?Selenium是一个WebUI自动化工具。它不提供任何API来建立数据库连接。这取决于你使用Selenium进行自动化的编程语言。NO.4如何提高selenium脚本的执行速度?1.优

  • pycharm3.2激活码【在线注册码/序列号/破解码】

    pycharm3.2激活码【在线注册码/序列号/破解码】,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号