{"id":18635088,"url":"https://github.com/wenewzhang/mixin_labs-java-bot","last_synced_at":"2025-04-11T08:30:31.214Z","repository":{"id":140159453,"uuid":"166776499","full_name":"wenewzhang/mixin_labs-java-bot","owner":"wenewzhang","description":"java bot for Mixin Network","archived":false,"fork":false,"pushed_at":"2019-05-03T01:58:46.000Z","size":6133,"stargazers_count":8,"open_issues_count":0,"forks_count":4,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-10T20:32:08.879Z","etag":null,"topics":["java","kotlin","mixin","mixin-network","mixin-sdk"],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wenewzhang.png","metadata":{"files":{"readme":"README-zhchs.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-01-21T08:29:55.000Z","updated_at":"2024-12-30T03:27:47.000Z","dependencies_parsed_at":"2023-05-22T14:15:42.202Z","dependency_job_id":null,"html_url":"https://github.com/wenewzhang/mixin_labs-java-bot","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wenewzhang%2Fmixin_labs-java-bot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wenewzhang%2Fmixin_labs-java-bot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wenewzhang%2Fmixin_labs-java-bot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wenewzhang%2Fmixin_labs-java-bot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wenewzhang","download_url":"https://codeload.github.com/wenewzhang/mixin_labs-java-bot/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248361450,"owners_count":21090900,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","kotlin","mixin","mixin-network","mixin-sdk"],"created_at":"2024-11-07T05:23:26.870Z","updated_at":"2025-04-11T08:30:31.209Z","avatar_url":"https://github.com/wenewzhang.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 基于Mixin Network的Java比特币开发教程\n![cover](https://github.com/wenewzhang/mixin_labs-java-bot/raw/master/bitcoin_wallet-java/mixin-bitcoin-java.jpg)\n\n[Mixin Network](https://mixin.one) 是一个免费的 极速的端对端加密数字货币交易系统.\n在本章中，你可以按教程在Mixin Messenger中创建一个bot来接收用户消息, 学到如何给机器人转**比特币** 或者 让机器人给你转**比特币**.\n\n## 课程简介\n1. [创建一个接受消息的机器人](https://github.com/wenewzhang/mixin_labs-java-bot/blob/master/README-zhchs.md)\n2. [机器人接受比特币并立即退还用户](https://github.com/wenewzhang/mixin_labs-java-bot/blob/master/README2-zhchs.md)\n\n## 安装Java\n如果你运行的是macOS, 手动到此[下载JDK12](https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html), 下载完成后，双击 jdk-11.0.2_osx-x64_bin.dmg, 在弹出的新窗口中，点击 JDK 11.0.2.pkg文件，依提示一步一步完成安装， Java会安装在 /Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home/bin/ 目录中，将这个路径加入到$PATH\n\n```bash\necho 'export PATH=/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home/bin/:$PATH' \u003e\u003e ~/.bash_profile\nsource ~/.bash_profile\n```\n安装成功后，执行 **java --version** 将得到如下信息:\n\n```bash\nwenewzha:mixin_labs-java-bot wenewzhang$ java --version\njava 11.0.2 2019-01-15 LTS\nJava(TM) SE Runtime Environment 18.9 (build 11.0.2+9-LTS)\nJava HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.2+9-LTS, mixed mode)\n```\nUbuntu\n```bash\napt update\napt upgrade\napt install unzip\njava --version\n```\n以Ubuntu 16.04为例， openjdk版本的Java已经安装好了， 执行 **java --version**来验证安装情况。\n```bash\nroot@ubuntu:~# java --version\nopenjdk 10.0.2 2018-07-17\nOpenJDK Runtime Environment (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)\nOpenJDK 64-Bit Server VM (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4, mixed mode)\n```\n## 在操作系统中安装最新版本的Gradle\n本教程采用Gradle来构建，你可从下面的地址来下载安装！[Gradle下载](https://gradle.org/install/#manually)\n\nmacOS\n```bash\nbrew update\nbrew install gradle\n```\nUbuntu下的Gradle太旧，我们手动安装它:\n```bash\ncd ~/Downloads\nwget https://services.gradle.org/distributions/gradle-5.1.1-bin.zip\nunzip gradle-5.1.1-bin.zip\n```\n解压gradle-5.1.1-bin.zip后，增加安装目录到$PATH中：\n```bash\necho 'export PATH=/root/gradle-5.1.1/bin:$PATH' \u003e\u003e ~/.bashrc\nsource ~/.bashrc\n```\n当Gradle安装成功后， 执行**gradle -v**来验证安装情况：\n```bash\nroot@ubuntu:~# gradle -v\n------------------------------------------------------------\nGradle 5.1.1\n------------------------------------------------------------\n...\n```\n\n### 创建第一个机器人APP\n按下面的提示，到mixin.one创建一个APP[tutorial](https://mixin-network.gitbook.io/mixin-network/mixin-messenger-app/create-bot-account).\n\n### 生成相应的参数\n记下这些[生成的参数](https://mixin-network.gitbook.io/mixin-network/mixin-messenger-app/create-bot-account#generate-secure-parameter-for-your-app)\n它们将用于Config.java中.\n\n![mixin_network-keys](https://github.com/wenewzhang/mixin_labs-php-bot/blob/master/mixin_network-keys.jpg)\n\n## Hello,World!\n进入到你的工作目录，创建mixin_labs-java-bot目录, 执行**gradle init**来生成基本信息资料.\n```bash\ngradle init --dsl kotlin --type java-application --test-framework junit --project-name mixin_labs-java-bot\n```\n进入src/main/java/mixin_labs/java/bot目录，新建一个Config.java, 填写如下内容：\n\u003e Config.java\n```java\npackage mixin_labs.java.bot;\nimport mixin.java.sdk.MixinUtil;\nimport java.security.PrivateKey;\nimport java.security.interfaces.RSAPrivateKey;\nimport java.util.Base64;\nimport mixin.java.sdk.PrivateKeyReader;\npublic class Config {\n\npublic static final String CLIENT_ID     = \"b1ce2967-a534-417d-bf12-c86571e4eefa\";\npublic static final String CLIENT_SECRET = \"e6b14c6bbb20a43c603c468e225e6e4c666c940792cde43e41b34c3f1dd45713\";\npublic static final String PIN           = \"536071\";\npublic static final String SESSION_ID    = \"2f1c44a3-d4d2-4dd2-bdb6-8eda67694b91\";\npublic static final String PIN_TOKEN     = \"ajJJngHmWgIfH3S2mgH4bAsoPeoXV6hI1KoTZW9AvFUK1R8e28X1zVRCcrOMVeXkvBKQeEMgRdX1kRgH3ksITTBm2mgK5eUnfBHUuRC85oKoQGB9e2Bp4O4ZKGg/6bqLeD66pnBPcO2s7VtgLSAK0tHa2jMzmGlWuxsO6Wo5JHE=\";\n\n  private static RSAPrivateKey loadPrivateKey() {\n    try {\n\n      PrivateKey key =\n        new PrivateKeyReader(Config.class.getClassLoader().getResourceAsStream(\"rsa_private_key.txt\"))\n          .getPrivateKey();\n      System.out.println(key);\n      return (RSAPrivateKey) key;\n    } catch (Exception e) {\n      e.printStackTrace();\n      System.exit(1);\n      return null;\n    }\n  }\n\n  public static final RSAPrivateKey RSA_PRIVATE_KEY = loadPrivateKey();\n  public static final byte[] PAY_KEY = MixinUtil.decrypt(RSA_PRIVATE_KEY, PIN_TOKEN, SESSION_ID);\n}\n\n```\n用你创建的APP的参数，替换文件中的内容: CLIENT_ID, client_id, CLIENT_SECRET, and the PIN, PIN_TOKEN, SESSION_ID.\n\n创建App.java文件，内容如下：\n\u003e App.java\n```java\n/*\n * This Java source file was generated by the Gradle 'init' task.\n */\npackage mixin_labs.java.bot;\nimport mixin.java.sdk.MixinBot;\nimport mixin.java.sdk.MixinUtil;\nimport mixin.java.sdk.MIXIN_Category;\nimport mixin.java.sdk.MIXIN_Action;\n\nimport java.security.PrivateKey;\nimport java.security.interfaces.RSAPrivateKey;\nimport com.google.gson.JsonObject;\nimport com.google.gson.JsonParser;\n// import java.util.Base64;\nimport org.apache.commons.codec.binary.Base64;\nimport okhttp3.Response;\nimport okhttp3.WebSocket;\nimport okhttp3.WebSocketListener;\nimport okio.ByteString;\n\n\npublic class App {\n\n    public static void main(String[] args) {\n        MixinBot.connectToRemoteMixin(new WebSocketListener() {\n        @Override\n        public void onOpen(WebSocket webSocket, Response response) {\n          System.out.println(\"[onOpen !!!]\");\n          System.out.println(\"request header:\" + response.request().headers());\n          System.out.println(\"response header:\" + response.headers());\n          System.out.println(\"response:\" + response);\n\n          // 请求获取所有 pending 的消息\n          MixinBot.sendListPendingMessages(webSocket);\n        }\n\n        @Override\n        public void onMessage(WebSocket webSocket, String text) {\n          System.out.println(\"[onMessage !!!]\");\n          System.out.println(\"text: \" + text);\n        }\n\n        @Override\n        public void onMessage(WebSocket webSocket, ByteString bytes) {\n          try {\n            System.out.println(\"[onMessage !!!]\");\n            String msgIn = MixinUtil.bytesToJsonStr(bytes);\n            System.out.println(\"json: \" + msgIn);\n            JsonObject obj = new JsonParser().parse(msgIn).getAsJsonObject();\n            MIXIN_Action action = MIXIN_Action.parseFrom(obj);\n            System.out.println(action);\n            MIXIN_Category category = MIXIN_Category.parseFrom(obj);\n            System.out.println(category);\n            if (action == MIXIN_Action.CREATE_MESSAGE \u0026\u0026 obj.get(\"data\") != null \u0026\u0026\n                category != null ) {\n              String userId;\n              String messageId = obj.get(\"data\").getAsJsonObject().get(\"message_id\").getAsString();\n              MixinBot.sendMessageAck(webSocket, messageId);\n              switch (category) {\n                case PLAIN_TEXT:\n                    String conversationId =\n                      obj.get(\"data\").getAsJsonObject().get(\"conversation_id\").getAsString();\n                    userId =\n                      obj.get(\"data\").getAsJsonObject().get(\"user_id\").getAsString();\n                    byte[] msgData = Base64.decodeBase64(obj.get(\"data\").getAsJsonObject().get(\"data\").getAsString());\n                    MixinBot.sendText(webSocket,conversationId,userId,new String(msgData,\"UTF-8\"));\n                    break;\n                default:\n                    System.out.println(\"Category: \" + category);\n              }\n            }\n          } catch (Exception e) {\n            e.printStackTrace();\n          }\n        }\n\n        @Override\n        public void onClosing(WebSocket webSocket, int code, String reason) {\n          System.out.println(\"[onClosing !!!]\");\n          System.out.println(\"code: \" + code);\n          System.out.println(\"reason: \" + reason);\n        }\n\n        @Override\n        public void onClosed(WebSocket webSocket, int code, String reason) {\n          System.out.println(\"[onClosed !!!]\");\n          System.out.println(\"code: \" + code);\n          System.out.println(\"reason: \" + reason);\n        }\n\n        @Override\n        public void onFailure(WebSocket webSocket, Throwable t, Response response) {\n          System.out.println(\"[onFailure !!!]\");\n          System.out.println(\"throwable: \" + t);\n          System.out.println(\"response: \" + response);\n        }\n      }, Config.RSA_PRIVATE_KEY, Config.CLIENT_ID, Config.SESSION_ID);\n    }\n}\n\n```\n进入src/main/resources, 新建文件：rsa_private_key.txt, 填写私钥信息:\n\u003e rsa_private_key.txt\n```java\n-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----\n```\n本教程依赖 [mixin-java-sdk](https://github.com/wenewzhang/mixin-java-sdk)\n现在回到项目目录，从github下载mixin-java-sdk\n\n```bash\nmkdir libs\ncd libs\nwget https://github.com/wenewzhang/mixin-java-sdk/releases/download/v2/mixin-java-sdk.jar\n```\n增加依赖到build.gradle.kts，增加编译文件compile(files(\"libs/mixin-java-sdk.jar\")), 完整的依赖包如下：\n```kotlin\ndependencies {\n    // This dependency is found on compile classpath of this component and consumers.\n    implementation(\"com.google.guava:guava:26.0-jre\")\n    // dependent on mixin-java-sdk, copy it to libs directory\n    compile(files(\"libs/mixin-java-sdk.jar\"))\n    implementation(\"commons-codec:commons-codec:1.11\")\n    implementation(\"com.auth0:java-jwt:3.5.0\")\n    implementation(\"com.squareup.okio:okio:2.2.1\")\n    implementation(\"com.squareup.okhttp3:okhttp:3.12.1\")\n    implementation(\"com.google.code.gson:gson:2.8.5\")\n    // Use JUnit test framework\n    testImplementation(\"junit:junit:4.12\")\n}\n```\n进入到 src/test/java/mixin_labs/java/bot, 注释掉下面的代码\n\u003e AppTest.java\n```java\n        // assertNotNull(\"app should have a greeting\", classUnderTest.getGreeting());\n```\n最后一步，回到项目目录mixin_labs-java-bot, 编译并运行.\n```bash\ngradle build\ngradle run\n```\n如果你看到如下信息，表示已经连接成功了，机器人小程序已经就绪，你可以发信息给他了！\n\n```bash\nresponse:Response{protocol=http/1.1, code=101, message=Switching Protocols, url=https://blaze.mixin.one/}\n[onMessage !!!]\njson: {\"id\":\"4ee01b68-817e-4f29-bcb4-b40f7c163f61\",\"action\":\"LIST_PENDING_MESSAGES\"}\nLIST_PENDING_MESSAGES\n```\n![mixin_messenger](https://github.com/wenewzhang/mixin_labs-php-bot/blob/master/helloworld.jpeg)\n信息如上图所示！\n\n## 源代码解释\n```java\nMixinBot.connectToRemoteMixin(new WebSocketListener() {\n@Override\npublic void onOpen(WebSocket webSocket, Response response) {\n  MixinBot.sendListPendingMessages(webSocket);\n}\n```\n连接到Mixin Network并发送\"LISTPENDINGMESSAGES\"消息，服务器以后会将收到的消息转发给此程序!\n#### 消息处理回调函数\n```java\n        public void onMessage(WebSocket webSocket, ByteString bytes) {\n          try {\n            System.out.println(\"[onMessage !!!]\");\n            String msgIn = MixinUtil.bytesToJsonStr(bytes);\n\n```\n当服务器给机器人推送消息的时候，机器人的onMessage函数会被调用\n\n#### 发送消息响应\n```java\nString messageId = obj.get(\"data\").getAsJsonObject().get(\"message_id\").getAsString();\nMixinBot.sendMessageAck(webSocket, messageId);\n```\n机器人收到消息后需要发送响应给服务器，这样服务器就知道消息已经收到，不会再发一遍\n\n#### 消息回应\n```java\nswitch (category) {\n  case PLAIN_TEXT:\n      String conversationId =\n        obj.get(\"data\").getAsJsonObject().get(\"conversation_id\").getAsString();\n      userId =\n        obj.get(\"data\").getAsJsonObject().get(\"user_id\").getAsString();\n      byte[] msgData = Base64.decodeBase64(obj.get(\"data\").getAsJsonObject().get(\"data\").getAsString());\n      MixinBot.sendText(webSocket,conversationId,userId,new String(msgData,\"UTF-8\"));\n```\n\n好了，你的第一个机器人小程序已经运行起来了， 你有什么新的想法，来试试吧！\n\n完整的代码 [这儿](https://github.com/wenewzhang/mixin_labs-java-bot/blob/master/src/main/java/mixin_labs/java/bot/App.java)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwenewzhang%2Fmixin_labs-java-bot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwenewzhang%2Fmixin_labs-java-bot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwenewzhang%2Fmixin_labs-java-bot/lists"}