英文原文

Mixin Network 是一个免费的 极速的端对端加密数字货币交易系统.
在本章中,你可以按教程在Mixin Messenger中创建一个bot来接收用户消息, 学到如何给机器人转比特币 或者 让机器人给你转比特币.

Mixin network 资源汇总

课程简介

  1. 创建一个接受消息的机器人
  2. 机器人接受比特币并立即退还用户
  3. 如何通过Mixin Network API创建新帐号

创建一个接受消息的机器人

通过本教程,你将学会如何用PHP创建一个机器人APP,让它能接受消息.

PHP 环境安装:

本教程的程序基于PHP 7开发,所以你需要先安装PHP7.2/PHP7.3与composer, 其中,composer是PHP的包管理系统!

on macOS

brew update
brew install php@7.2
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
//将PHP安装到/usr/local/opt/php@7.2/bin 目录,并取一个简单的各字:composer
php composer-setup.php --install-dir=/usr/local/opt/php@7.2/bin --filename=composer
php -r "unlink('composer-setup.php');"

如果之前你安装过php 7.1 或者更旧的php版本,执行brew unlink php@7.1删除这些链接,然后再执行brew link php@7.3将php 7.3链接到php.

wenewzha:mixin_labs-php-bot wenewzhang$ brew unlink php@7.1
Unlinking /usr/local/Cellar/php/7.1.23... 24 symlinks removed
wenewzha:mixin_labs-php-bot wenewzhang$ brew link php@7.3
Warning: php@7.3 is keg-only and must be linked with --forceIf you need to have this software first in your PATH instead consider running:echo 'export PATH="/usr/local/opt/php@7.3/bin:$PATH"' >> ~/.bash_profileecho 'export PATH="/usr/local/opt/php@7.3/sbin:$PATH"' >> ~/.bash_profile

之后,根据你的系统实际情况,看看php -v能不能执行成功,如果不行,将默认的PATH设置并保存到.bash_profile.

echo 'export PATH="/usr/local/opt/php@7.3/bin:$PATH"' >> ~/.bash_profile
echo 'export PATH="/usr/local/opt/php@7.3/sbin:$PATH"' >> ~/.bash_profile
source ~/.bash_profile

on Ubuntu

apt update
apt upgrade//install php 7.2
apt-get install software-properties-common python-software-properties
add-apt-repository -y ppa:ondrej/php
apt-get update
apt-get install php7.2 php7.2-cli php7.2-common
//install composer
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
//将PHP安装到/usr/local/opt/php@7.2/bin 目录,并取一个简单的各字:composer
php composer-setup.php --install-dir=/usr/local/bin --filename=composer
php -r "unlink('composer-setup.php');"

最新的Composer在这儿Composer
请确保PHP与composer安装在$PATH包含的目录之内,直接运行php -vcomposer -V 就可以检查出来,如果提示如下,表示安装正确!

wenewzha:minecraft wenewzhang$ php -v
PHP 7.2.13 (cli) (built: Dec  7 2018 10:41:23) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologieswith Zend OPcache v7.2.13, Copyright (c) 1999-2018, by Zend Technologies
wenewzha:minecraft wenewzhang$ composer -V
Composer version 1.8.0 2018-12-03 10:31:16

如果提示command not found,表示bash没有在$PATH下找到php,请重复以上的安装步骤!

wenewzha:mixin_network-nodejs-bot2 wenewzhang$ php -v
-bash: php: command not found

创建你的项目

到你的工作文档中,创建一个目录,并取一个名字,比如:mixin_labs-php-bot

mkdir mixin_labs-php-bot
cd mixin_labs-php-bot

转到新创建的项目目录下, 执行 composer init, 依提示完成 composer.json的创建,

root@iZj6cbmqen2lqp7l48nfgkZ:~/mixin_labs-php-bot# composer initWelcome to the Composer config generator
This command will guide you through creating your composer.json config.
Package name (<vendor>/<name>) [user/mixin_labs-php-bot]:
Description []: PHP 7 bot for Mixin Messenger
Author [, n to skip]: JimmyZhang <this-a-email-address@nodomain.com>
Minimum Stability []:
Package Type (e.g. library, project, metapackage, composer-plugin) []:
License []:
Define your dependencies.
Would you like to define your dependencies (require) interactively [yes]? no
Would you like to define your dev dependencies (require-dev) interactively [yes]? no
{"name": "user/mixin_labs-php-bot","description": "PHP 7 bot for Mixin Messenger","authors": [{"name": "JimmyZhang","email": "this-a-email-address@nodomain.com"}],"require": {}
}
Do you confirm generation [yes]? yes

本教程引用了 mixin-sdk-php 与 Ratchet pawl, mixin-sdk-php 是一个Mixin Network PHP SDK , Ratchet pawl 是一个WebSocket客户端.
打开composer.json, 在"require"增加两行引用:

"require": {"exinone/mixin-sdk-php": "^1.1","ratchet/pawl": "^0.3.3",
},

保存composer.json后,执行 composer install 来下载:

composer install

下载完成后,目录下会出现一个vendor的子目录。

root@iZj6cbmqen2lqp7l48nfgkZ:~/mixin_labs-php-bot# ls
composer.json  composer.lock  vendor

如果你是git克隆的源代码,直接执行 composer install 来下载依赖包。

创建第一个机器人APP

按下面的提示,到mixin.one创建一个APPtutorial.

生成相应的参数

记下这些生成的参数
它们将用于config.php中.


在项目目录下,创建config.php,将生成的参数,替换成你的!

config.php

return ['mixin_id'      => '7000101716','client_id'     => 'a1ce2967-a534-417d-bf12-c86571e4eefa','client_secret' => '7339866727d24eeec1c4ebb6c634fd25a7b9057ee6d5939cca9b6b9fc15f4d1f','pin'           => '512772','pin_token'     => 'abRdNq6soRALRG434IgR7WS/qP7LOcpfviqSfWfABdIKyZGLnWXFMrVCHpChIkBRGRAcsUguni0OoNsShddPVL3qoD5fxbF5dRUiRv14urH1Pmdl6zIZdCH159QMr5wLmmSHSGu2AihNkUHUo3bAJsrvOW0nke5y6R5YE/pNNfo=','session_id'    => '51faabbf-48ff-4df2-898d-e9b318afae35','private_key'   => <<<EOF
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCuKI65sJR9lQ1+kyKouWu3CpmkPdJKaFqKVMEWk9RRH1Wgju9n
z/y5MiBVZKUeeIYtwrCNKbbdkSPqMoj1kLh5XUk4HaV9DUt+s9USBHOgU8m5Pxov
Km+HQ+Pam62lHWn6ClYaNrDihpcdDg9i7Y8hY1cgKiUcdkFQmDQ9lz2VHwIDAQAB
AoGANHJSSOk8TnVMkwmMLnNoVL8EdcmIQpAac/4CB+KM1cEx8CAbSJAB82N9CTo9
32c8QRuYP2qIf0DuJ+EADbN/Wc3o9zRY3dkbnLo144g3YaKwDccSgUMux03ANHlP
MEPDxOUbxJTRPXmKgUZmGJrkAClGbr3pPyQDDHDWRQc9JUECQQDT7pUYcXtu+hSc
nAlZllzqkBG2gZrDYpPJ0JirpfNhaApBo+CGZYKQ1961o6+HcI9gZmZA8hPEhT6p
PlubjqxbAkEA0l89du8TIUGrY9/sxyfZif6aeEztXPwBHZ9r8dm0L8Mlu5zTrOX2
SUgu3znM6djmuRMS45iPHJbPkvw9ilaljQJBAJRN323Ec/D79ZKGKpDThN/rw0lo
tolFoU/Xtg5fycl/CbZXXFYQEOcU+Nc43Ss1HFAEOEf4Xtbluyyp42ce1wMCQElv
P4htyhK41rglaYTXr0NRYeCOkej8evM5PDgPU6u8hkZoZyeamo9YKCx6A8K5mUiP
lO9nyMUlC852SJEqz90CQQDBguGg5GGcfehpIZwERlMJgKGg1+13/9GfnEPdAW2v
px7DZoMG/pQ/SEa53tJHmGGD9+qyp93z/fEPXsD5RSwx
-----END RSA PRIVATE KEY-----
EOF,  //import your private_key
];

需要替换的参数包括: mixin_id, client_id, client_secret, and the pin, pin token, session_id, private key.

经典的Hello world

在项目目录下创建一个app.php文件,将下面的代码拷进去:

<?phprequire __DIR__ . '/vendor/autoload.php';
use ExinOne\MixinSDK\Traits\MixinSDKTrait;
use ExinOne\MixinSDK\MixinSDK;
use Ramsey\Uuid\Uuid;
use Ratchet\RFC6455\Messaging\Frame;$loop = \React\EventLoop\Factory::create();
$reactConnector = new \React\Socket\Connector($loop, ['timeout' => 15
]);
$connector = new \Ratchet\Client\Connector($loop,$reactConnector);
class callTraitClass {use MixinSDKTrait;public $config;public function __construct(){$config = require(__DIR__.'/config.php');$this->config        = $config;}
}
$callTrait = new callTraitClass();
$Token = $callTrait->getToken('GET', '/', '');
// $connector('ws://127.0.0.1:9000', ['protocol' => 'Mixin-Blaze-1'], ['Origin' => 'http://localhost',
$connector('wss://blaze.mixin.one', ['protocol' => 'Mixin-Blaze-1'],['Authorization' => 'Bearer '.$Token])
->then(function(Ratchet\Client\WebSocket $conn) {$conn->on('message', function(\Ratchet\RFC6455\Messaging\MessageInterface $msg) use ($conn) {$jsMsg = json_decode(gzdecode($msg));print_r($jsMsg);if ($jsMsg->action === 'CREATE_MESSAGE' and property_exists($jsMsg,'data')) {echo "\nNeed reply server a receipt!\n";$RspMsg = generateReceipt($jsMsg->data->message_id);$msg = new Frame(gzencode(json_encode($RspMsg)),true,Frame::OP_BINARY);$conn->send($msg);if ($jsMsg->data->category === 'PLAIN_TEXT') {$msgData = sendPlainText($jsMsg->data->conversation_id,base64_decode($jsMsg->data->data));$msg = new Frame(gzencode(json_encode($msgData)),true,Frame::OP_BINARY);$conn->send($msg);} //end of PLAIN_TEXT} //end of CREATE_MESSAGE});$conn->on('close', function($code = null, $reason = null) {echo "Connection closed ({$code} - {$reason})\n";});
/*                   start listen for the incoming message          */$message = ['id'     => Uuid::uuid4()->toString(),'action' => 'LIST_PENDING_MESSAGES',];print_r(json_encode($message));$msg = new Frame(gzencode(json_encode($message)),true,Frame::OP_BINARY);$conn->send($msg);// $conn->send(gzencode($msg,1,FORCE_DEFLATE));
}, function(\Exception $e) use ($loop) {echo "Could not connect: {$e->getMessage()}\n";$loop->stop();
});$loop->run();function sendPlainText($conversation_id,$msgContent):Array {$msgParams = ['conversation_id' => $conversation_id,'category'        => 'PLAIN_TEXT','status'          => 'SENT','message_id'      => Uuid::uuid4()->toString(),'data'            => base64_encode($msgContent),//base64_encode("hello!"),];$msgPayButton = ['id'     =>  Uuid::uuid4()->toString(),'action' =>  'CREATE_MESSAGE','params' =>   $msgParams,];return $msgPayButton;
}function generateReceipt($msgID):Array {$IncomingMsg = ["message_id" => $msgID, "status" => "READ"];$RspMsg = ["id" => Uuid::uuid4()->toString(), "action" => "ACKNOWLEDGE_MESSAGE_RECEIPT","params" => $IncomingMsg];return $RspMsg;
}

保存,并在终端里执行app.php

php app.php

如果一切正常,提示如下:

wenewzha:mixin_labs-php-bot wenewzhang$ php app.php
a1ce2967-a534-417d-bf12-c86571e4eefa{"id":"4454b6c5-4a89-440c-bd22-7a79cf4954ca","action":"LIST_PENDING_MESSAGES"}stdClass Object
([id] => 4454b6c5-4a89-440c-bd22-7a79cf4954ca[action] => LIST_PENDING_MESSAGES
)

在手机安装 Mixin Messenger,增加机器人为好友,(比如这个机器人是7000101639) 然后发送消息给它,效果如下!

源代码解释

WebSocket是建立在TCP基础之上的全双工通讯方式,我们需要建立一个loop循环来维持通迅。

$loop = \React\EventLoop\Factory::create();
$reactConnector = new \React\Socket\Connector($loop, ['timeout' => 15
]);
$connector = new \Ratchet\Client\Connector($loop,$reactConnector);

机器人APP通过Mixin Messenger服务器来接收用户发过来的消息,连接服务器,需要Token来验证用户的身份,
详细资料可参考如下链接:
Token认证, 接收服务器消息

mixin-sdk-php 实现了令牌Token的生成(getToken), 调用代码如下:

class callTraitClass {use MixinSDKTrait;public $config;public function __construct(){$config = require(__DIR__.'/config.php');$this->config        = $config;}
}
$callTrait = new callTraitClass();
$Token = $callTrait->getToken('GET', '/', '');

连接到服务器,注意协议类型与Token:

$connector('wss://blaze.mixin.one', ['protocol' => 'Mixin-Blaze-1'],['Authorization' => 'Bearer '.$Token])

向服务器发送"LIST_PENDING_MESSAGES",这样服务器才会将收到的消息发送给机器人APP.

/*                   start listen for the incoming message          */$message = ['id'     => Uuid::uuid4()->toString(),'action' => 'LIST_PENDING_MESSAGES',];print_r(json_encode($message));$msg = new Frame(gzencode(json_encode($message)),true,Frame::OP_BINARY);$conn->send($msg);

增加侦听 onMessage 接收并分析消息:

->then(function(Ratchet\Client\WebSocket $conn) {$conn->on('message', function(\Ratchet\RFC6455\Messaging\MessageInterface $msg) use ($conn) {$jsMsg = json_decode(gzdecode($msg));print_r($jsMsg);if ($jsMsg->action === 'CREATE_MESSAGE' and property_exists($jsMsg,'data')) {echo "\nNeed reply server a receipt!\n";$RspMsg = generateReceipt($jsMsg->data->message_id);$msg = new Frame(gzencode(json_encode($RspMsg)),true,Frame::OP_BINARY);$conn->send($msg);if ($jsMsg->data->category === 'PLAIN_TEXT') {$msgData = sendPlainText($jsMsg->data->conversation_id,base64_decode($jsMsg->data->data));$msg = new Frame(gzencode(json_encode($msgData)),true,Frame::OP_BINARY);$conn->send($msg);} //end of PLAIN_TEXT} //end of CREATE_MESSAGE});$conn->on('close', function($code = null, $reason = null) {echo "Connection closed ({$code} - {$reason})\n";});                                      

Mixin Messenger支持的消息类型很多,具体可到下面链接查看: WebSocket消息类型.

每接收到一个消息,需要按消息编号(message_id)给服务器回复一个"已读"的消息,避免服务器在机器人重新登入后,再次发送处理过的消息!

echo "\nNeed reply server a receipt!\n";
$RspMsg = generateReceipt($jsMsg->data->message_id);
$msg = new Frame(gzencode(json_encode($RspMsg)),true,Frame::OP_BINARY);
$conn->send($msg);function generateReceipt($msgID):Array {$IncomingMsg = ["message_id" => $msgID, "status" => "READ"];$RspMsg = ["id" => Uuid::uuid4()->toString(), "action" => "ACKNOWLEDGE_MESSAGE_RECEIPT","params" => $IncomingMsg];return $RspMsg;
}

完成

现在你的机器人APP运行起来了,你打算如何改造你的机器人呢?

完整的代码在这儿

下一课机器人接收与处理加密货币

基于Mixin Network的PHP比特币开发教程 之一:创建机器人相关推荐

  1. mixin network_基于Mixin Network的Ruby比特币开发教程

    Mixin Network 是一个免费的 极速的端对端加密数字货币交易系统. 在本章中,你可以按教程在Mixin Messenger中创建一个bot来接收用户消息, 学到如何给机器人转比特币 或者 让 ...

  2. mixin network_基于Mixin Network的PHP比特币开发教程: 机器人接受比特币并立即退还用户...

    在 上一篇教程中, 我们创建了自动回复消息的机器人,当用户发送消息"Hello,World!"时,机器人会自动回复同一条消息! 按本篇教程后学习后完成后,你的机器人将会接受用户发送 ...

  3. mixin network_基于Mixin Network的Go语言比特币开发教程 : 用 Mixin Messenger 机器人接受和发送比特币...

    基于Mixin Network的Go语言比特币开发教程 : 用 Mixin Messenger 机器人接受和发送比特币 在 上一篇教程中, 我们创建了自动回复消息的机器人,当用户发送消息"H ...

  4. 基于以太坊的智能合约开发教程Solidity modifier

    基于以太坊的智能合约开发教程Solidity modifier pragma solidity ^0.4.0;contract modifierTest{address owner;uint publ ...

  5. 视频教程-基于python的微信公众号开发教程-微信开发

    基于python的微信公众号开发教程 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资格考试(软考)--"信 ...

  6. iOS 9应用开发教程之创建iOS 9项目与模拟器介绍

    iOS 9应用开发教程之创建iOS 9项目与模拟器介绍 编写第一个iOS 9应用 本节将以一个iOS 9应用程序为例,为开发者讲解如何使用Xcode 7.0去创建项目,以及iOS模拟器的一些功能.编辑 ...

  7. Wear OS手表应用开发教程之-创建应用

    本文目录 点击直达 Wear OS手表应用开发系列教程 点击直达 本文标签 `路过的年轻人啊,你是要用左手点个赞呢,还是要右手点个关注呢` 前言: Android Studio自动创建: 创建应用: ...

  8. [Minecraft]基于Forge的1.8.9MOD开发教程——第一讲:搭建开发环境

    (第一次写教程,有点小紧张呢..) 作者的话 我一开始学习MOD开发时,也曾在各大网站搜索过一些教程,感觉国内的MOD开发教程是真心的少:CSDN没找到,优酷.爱奇艺.腾讯.B站也几乎没有(除了优酷的 ...

  9. 基于python的微信公众号开发教程_基于python的微信公众号开发教程

    应广大python学员的期盼,九宝老师精心制作的"基于python的微信公众号开发"视频教程即将上线. 该课程秉承九宝培训一贯的"简单.高效.快速"的讲课原则, ...

最新文章

  1. Cash Shuffle初次测试成功,BCH隐私研究逐步推进
  2. CTFshow php特性 web110
  3. ABAP:SmartForms--设计
  4. leetcode 384. Shuffle an Array | 384. 打乱数组(Fisher-Yates洗牌算法)
  5. 泛型数组列表ArrayList
  6. 【java】Java 原子性、有序性与Happens-Before
  7. 穷人为什么会越穷,穷的时候以下三个事情不能干
  8. Visio 中如何画实现接口的连线
  9. Visual Studio 2012 实用快捷键
  10. 未来智能穿戴把计算机织进纤维里,未来智能穿戴 把计算机“织”进纤维里
  11. 四、文件信息 五、进程环境
  12. SQL计算两个日期之间的工作日天数,去除法定节假日和周末
  13. 戴尔科技云平台:赋能“新基建”, 打造“云底座”
  14. linux软件都能安装在Uos,在uos 20/deepin V20中添加华为软件源,就能打开应用商店和安装软件...
  15. P1231 教辅的组成
  16. 软件、宇宙、人生、扯淡
  17. springboot课堂管理系统的设计与实现
  18. 关于惠普无线网卡驱动报警无法连接网络解决办法
  19. 用计算机修图属于,手机APP和电脑修图有什么区别?能否用手机替代电脑修图? | 摄影早自习第1082天...
  20. 晋江作者自查收藏数、评论数、点击量变化并利用微信发送给自己Python代码

热门文章

  1. Dialog 去白色边框及透明
  2. docker centos 无法用systemctl 启动服务的问题
  3. vim中权限不足时不用退出而强制保存
  4. linux 能访问内网,但不能访问外网?解决方案
  5. Thrift Direct Memory OOM问题解决方法
  6. 《iPhone开发基础教程》第13章 我在哪里?使用Core Location定位功能
  7. inittab 文件分析
  8. VMware Workstation 6.0全貌概览
  9. 车牌识别算法_PC端车牌识别SDK融入好算法
  10. 模拟请求分页管理中地址转换和缺页中断处理_Linux内存管理:缺页异常(一)