基于Mixin Network的PHP比特币开发教程 之一:创建机器人
英文原文
Mixin Network 是一个免费的 极速的端对端加密数字货币交易系统.
在本章中,你可以按教程在Mixin Messenger中创建一个bot来接收用户消息, 学到如何给机器人转比特币 或者 让机器人给你转比特币.
Mixin network 资源汇总
课程简介
- 创建一个接受消息的机器人
- 机器人接受比特币并立即退还用户
- 如何通过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 -v 或 composer -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比特币开发教程 之一:创建机器人相关推荐
- mixin network_基于Mixin Network的Ruby比特币开发教程
Mixin Network 是一个免费的 极速的端对端加密数字货币交易系统. 在本章中,你可以按教程在Mixin Messenger中创建一个bot来接收用户消息, 学到如何给机器人转比特币 或者 让 ...
- mixin network_基于Mixin Network的PHP比特币开发教程: 机器人接受比特币并立即退还用户...
在 上一篇教程中, 我们创建了自动回复消息的机器人,当用户发送消息"Hello,World!"时,机器人会自动回复同一条消息! 按本篇教程后学习后完成后,你的机器人将会接受用户发送 ...
- mixin network_基于Mixin Network的Go语言比特币开发教程 : 用 Mixin Messenger 机器人接受和发送比特币...
基于Mixin Network的Go语言比特币开发教程 : 用 Mixin Messenger 机器人接受和发送比特币 在 上一篇教程中, 我们创建了自动回复消息的机器人,当用户发送消息"H ...
- 基于以太坊的智能合约开发教程Solidity modifier
基于以太坊的智能合约开发教程Solidity modifier pragma solidity ^0.4.0;contract modifierTest{address owner;uint publ ...
- 视频教程-基于python的微信公众号开发教程-微信开发
基于python的微信公众号开发教程 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资格考试(软考)--"信 ...
- iOS 9应用开发教程之创建iOS 9项目与模拟器介绍
iOS 9应用开发教程之创建iOS 9项目与模拟器介绍 编写第一个iOS 9应用 本节将以一个iOS 9应用程序为例,为开发者讲解如何使用Xcode 7.0去创建项目,以及iOS模拟器的一些功能.编辑 ...
- Wear OS手表应用开发教程之-创建应用
本文目录 点击直达 Wear OS手表应用开发系列教程 点击直达 本文标签 `路过的年轻人啊,你是要用左手点个赞呢,还是要右手点个关注呢` 前言: Android Studio自动创建: 创建应用: ...
- [Minecraft]基于Forge的1.8.9MOD开发教程——第一讲:搭建开发环境
(第一次写教程,有点小紧张呢..) 作者的话 我一开始学习MOD开发时,也曾在各大网站搜索过一些教程,感觉国内的MOD开发教程是真心的少:CSDN没找到,优酷.爱奇艺.腾讯.B站也几乎没有(除了优酷的 ...
- 基于python的微信公众号开发教程_基于python的微信公众号开发教程
应广大python学员的期盼,九宝老师精心制作的"基于python的微信公众号开发"视频教程即将上线. 该课程秉承九宝培训一贯的"简单.高效.快速"的讲课原则, ...
最新文章
- Cash Shuffle初次测试成功,BCH隐私研究逐步推进
- CTFshow php特性 web110
- ABAP:SmartForms--设计
- leetcode 384. Shuffle an Array | 384. 打乱数组(Fisher-Yates洗牌算法)
- 泛型数组列表ArrayList
- 【java】Java 原子性、有序性与Happens-Before
- 穷人为什么会越穷,穷的时候以下三个事情不能干
- Visio 中如何画实现接口的连线
- Visual Studio 2012 实用快捷键
- 未来智能穿戴把计算机织进纤维里,未来智能穿戴 把计算机“织”进纤维里
- 四、文件信息 五、进程环境
- SQL计算两个日期之间的工作日天数,去除法定节假日和周末
- 戴尔科技云平台:赋能“新基建”, 打造“云底座”
- linux软件都能安装在Uos,在uos 20/deepin V20中添加华为软件源,就能打开应用商店和安装软件...
- P1231 教辅的组成
- 软件、宇宙、人生、扯淡
- springboot课堂管理系统的设计与实现
- 关于惠普无线网卡驱动报警无法连接网络解决办法
- 用计算机修图属于,手机APP和电脑修图有什么区别?能否用手机替代电脑修图? | 摄影早自习第1082天...
- 晋江作者自查收藏数、评论数、点击量变化并利用微信发送给自己Python代码
热门文章
- Dialog 去白色边框及透明
- docker centos 无法用systemctl 启动服务的问题
- vim中权限不足时不用退出而强制保存
- linux 能访问内网,但不能访问外网?解决方案
- Thrift Direct Memory OOM问题解决方法
- 《iPhone开发基础教程》第13章 我在哪里?使用Core Location定位功能
- inittab 文件分析
- VMware Workstation 6.0全貌概览
- 车牌识别算法_PC端车牌识别SDK融入好算法
- 模拟请求分页管理中地址转换和缺页中断处理_Linux内存管理:缺页异常(一)