Mixin NetworkベースのPHPビットコイン開発チュートリアルの1つ:ロボットの作成


英語の原文
Mixin Networkは無料の極速のエンドツーエンド暗号化デジタル通貨取引システムである.この章では、チュートリアルに従ってMixin Messengerにbotを作成してユーザーメッセージを受信し、ロボットにビットコインを転送する方法や、ロボットにビットコインを転送する方法を学ぶことができます.
Mixin networkリソースの概要
カリキュラムの概要
  • メッセージを受け取るロボット
  • を作成する.
  • ロボットはビットコインを受け取り、直ちにユーザー
  • に返却する.
  • Mixin Network APIから新しいアカウントを作成する方法
  • メッセージを受信するロボットを作成
    このチュートリアルでは、PHPでロボットアプリを作成し、メッセージを受け入れる方法を学びます.
    PHP環境設置:
    このチュートリアルのプログラムはPHP 7に基づいて開発されているので、まずPHP 7をインストールする必要があります.2/PHP7.3とcomposer、そのうち、composerはPHPのパッケージ管理システムです!
    on macOS
    brew update
    brew install [email protected]
    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/[email protected]/bin   ,         :composer
    php composer-setup.php --install-dir=/usr/local/opt/[email protected]/bin --filename=composer
    php -r "unlink('composer-setup.php');"

    php 7.1以降のphpバージョンをインストールした場合はbrew unlinkを実行します[email protected]これらのリンクを削除してからbrew linkを実行します[email protected] 7.3をphpにリンクする.
    wenewzha:mixin_labs-php-bot wenewzhang$ brew unlink [email protected]
    Unlinking /usr/local/Cellar/php/7.1.23... 24 symlinks removed
    wenewzha:mixin_labs-php-bot wenewzhang$ brew link [email protected]
    Warning: [email protected] is keg-only and must be linked with --force
    
    If you need to have this software first in your PATH instead consider running:
      echo 'export PATH="/usr/local/opt/[email protected]/bin:$PATH"' >> ~/.bash_profile
      echo 'export PATH="/usr/local/opt/[email protected]/sbin:$PATH"' >> ~/.bash_profile

    その後、あなたのシステムの実際の状況に基づいてphp-vが成功するかどうかを見て、もしだめならば、デフォルトのPATH設定を保存します.bash_profile.
    echo 'export PATH="/usr/local/opt/[email protected]/bin:$PATH"' >> ~/.bash_profile
    echo 'export PATH="/usr/local/opt/[email protected]/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/[email protected]/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 Technologies
        with 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 init
     Welcome to the Composer config generator
    This command will guide you through creating your composer.json config.
    Package name (/) [user/mixin_labs-php-bot]:
    Description []: PHP 7 bot for Mixin Messenger
    Author [, n to skip]: JimmyZhang 
    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": "[email protected]"
           }
       ],
       "require": {}
    }
    Do you confirm generation [yes]? yes

    このチュートリアルでは、mixin-sdk-phpとRatchet pawl、mixin-sdk-phpはMixin Network PHP SDK、Ratchet pawlはWebSocketクライアントを参照します.開くjson、requireに2行の参照を追加します.
    "require": {
        "exinone/mixin-sdk-php": "^1.1",
        "ratchet/pawl": "^0.3.3",
    },

    保存する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'   => <<

    置換するパラメータには、mixin_が含まれます.id, client_id, client_secret, and the pin, pin token, session_id, private key.
    クラシックなハローワールド
    プロジェクトディレクトリの下にappを作成します.phpファイル、次のコードをコピーします.
     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 "
    Need reply server a receipt!
    "; $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})
    "; }); /* 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()}
    "; $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をインストールし、マシンを友達に追加します(例えば、このロボットは700101639です)、メッセージを送信します.効果は以下の通りです.
    ソースコードの解釈
    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 "
    Need reply server a receipt!
    "; $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})
    "; });

    Mixin Messengerがサポートするメッセージのタイプは多く、具体的には次のリンクで参照できます:WebSocketメッセージのタイプ.
    メッセージが受信されるたびに、メッセージ番号(message_id)でサーバーに「既読」のメッセージを返信する必要があります.ロボットが再ログインした後、サーバーが処理したメッセージを再送信しないようにします.
    echo "
    Need reply server a receipt!
    "; $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; }

    完了
    今、ロボットアプリが稼働していますが、ロボットをどのように改造するつもりですか?
    完全なコードはこちらです
    次のレッスンではロボットが暗号化された通貨を受信して処理します