python脚本调用bitcoin-cli接口命令

news2024/9/19 23:47:36

脚本需求
1、python一个对外接口
2、不同的bitcoin命令通过传不同的参数实现
3、接口及接口的参数依次往后传递
4、日志全部打印到日志文件中并且日志文件按天进行切割

#!/usr/bin/python3

from flask import Flask, request, jsonify
import subprocess
import json
import os
import re
import logging
from logging.handlers import TimedRotatingFileHandler

# 创建一个 TimedRotatingFileHandler,按天切割日志文件,并在每天的凌晨 12 点创建新的日志文件
handler = TimedRotatingFileHandler(filename='ordi-info.log', when='midnight', interval=1, backupCount=7)
handler.suffix = '%Y-%m-%d'  # 添加日期后缀

# 配置日志输出格式和日志级别,并添加处理器
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[handler])


# 配置日志输出格式和日志级别,并将日志写入到文件中
#logging.basicConfig(filename='ordi-info.log', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

app = Flask(__name__)

ord_cmd = ["/data/ord/target/release/ord", "--cookie-file=/data/btc/btcdata/regtest/.cookie", "--rpc-url=127.0.0.1:8540", "-r"]
bitcoincli_cmd=["/data/btc/bin/bin/bitcoin-cli", "-regtest", "--conf=/data/btc/conf/bitcoin.conf"]


def run_command(command):
    try:
        # 使用 subprocess.run 获取命令执行结果和错误输出
        result = subprocess.run(command, capture_output=True, text=True)

        # 如果命令返回非零退出码,表示发生错误
        if result.returncode != 0:
            # 从错误输出中提取包含 "error" 的部分
            match = re.search(r'error:.*', result.stderr, re.IGNORECASE)
            processed_error_message = match.group(0) if match else "Unknown error"

            # 记录错误到日志
            logging.error("Error in command execution: %s", result.stderr)

            # 手动创建 JSON 响应并设置状态码
            response = jsonify({"error": processed_error_message, "normal_output": result.stdout.strip()})
            response.status_code = 500
            return response

        # 记录正常输出到日志
        logging.info("Normal output in command execution: %s", result.stdout)

        # 返回正常输出到客户端
        return result.stdout.strip()

    except Exception as e:
        # 记录异常到日志
        logging.error("Error in command execution: %s", str(e))
        return str(e), 500

@app.route('/bitcoin_method', methods=['POST'])
def bitcoin_method():
    try:
        bitcoin_method_args = request.json['bitcoin_method_args']
        return bitcoin_method_impl(*bitcoin_method_args)
    except Exception as e:
        return jsonify({"error": str(e)}), 400

def bitcoin_method_impl(*bitcoin_method_args):
    command = bitcoincli_cmd + list(bitcoin_method_args)

    # 使用 subprocess.run 获取命令执行结果和错误输出
    result = subprocess.run(command, capture_output=True, text=True)
    return run_command(command)

if __name__ == '__main__':
    app.run(debug=False, host='0.0.0.0', port=2757)	

脚本测试

1、bitcoin-cli --conf=/data/btc/conf/bitcoin.conf -regtest -rpcwallet=btcregtest listwallets
参数内容{"bitcoin_method_args": ["-rpcwallet=btcregtest", "listwallets"]}
在这里插入图片描述
2、bitcoin-cli --conf=/data/btc/conf/bitcoin.conf -regtest -rpcwallet=btcregtest getbalances
参数内容{"bitcoin_method_args": ["-rpcwallet=btcregtest", "getbalances"]}
在这里插入图片描述
3、bitcoin-cli --conf=/data/btc/conf/bitcoin.conf -regtest -rpcwallet=btcregtest getbalance
参数内容{"bitcoin_method_args": ["-rpcwallet=btcregtest", "getbalance"]}
在这里插入图片描述
4、bitcoin-cli --conf=/data/btc/conf/bitcoin.conf -regtest -rpcwallet=btcregtest listunspent
参数内容{"bitcoin_method_args": ["-rpcwallet=btcregtest", "listunspent"]}
在这里插入图片描述
5、bitcoin-cli --conf=/data/btc/conf/bitcoin.conf -regtest -rpcwallet=btcregtest getrawchangeaddress
参数内容{"bitcoin_method_args": ["-rpcwallet=btcregtest", "getrawchangeaddress"]}
在这里插入图片描述
6、bitcoin-cli --conf=/data/btc/conf/bitcoin.conf -regtest -rpcwallet=btcregtest listaddressgroupings
参数内容{"bitcoin_method_args": ["-rpcwallet=btcregtest", "listaddressgroupings"]}
在这里插入图片描述
7、bitcoin-cli --conf=/data/btc/conf/bitcoin.conf -regtest getblockchaininfo
参数内容{"bitcoin_method_args": ["getblockchaininfo"]}
在这里插入图片描述
5、bitcoin-cli --conf=/data/btc/conf/bitcoin.conf -regtest -rpcwallet=btcregtest getrawchangeaddress bech32m
参数内容{"bitcoin_method_args": ["-rpcwallet=btcregtest", "getrawchangeaddress", "bech32m"]}

在这里插入图片描述

日志

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1471500.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS中简单实现讯飞星火大模型API调用

文章目录 前言一、申请试用二、ROS中使用1.配置环境变量2.编写ros功能包总结前言 讯飞星火认知大模型是由科大讯飞自主研发的认知智能大模型,通过学习海量的文本、代码和图像,具备跨领域的知识和语言理解能力,能基于自然对话方式理解和执行任务。目前开放了API接口供用户使…

主数据管理是数字化转型成功的基石——江淮汽车案例分享

汽车行业数字化转型的背景 在新冠疫情导火索的影响下,经济全球化政治基础逐渐动摇。作为全球最大的汽车市场,我国的汽车市场逐渐由增量转为存量市场。 在数字化改革大背景下,随着工业4.0时代的到来,江淮汽车集团力争实现十四五数…

【汽车电子】万字详解汽车标定与XCP协议

XCP协议基础 文章目录 XCP协议基础一、引言1.1 什么是标定1.2 什么时候进行标定1.3 标定的意义 二、XCP协议简介2.1 xcp简介2.2 XCP如何加快开发过程?2.3 XCP的主要作用 三、XCP工作过程3.1 工作过程3.2 通讯模型3.3 测量与标定 四、XCP报文解析4.1 数据包报文格式4…

会分期完成2.3亿元C轮融资,它们都使用了拼音域名

易名科技()1月10日报道,致力于帮助租户缓解资金压力的汇分公司近日宣布完成2.3亿元C轮融资,由联络互动领投。 值得注意的是,它们都使用拼音域名。 他们分别是。 图:接触互动 汇分是汇房房旗下的租房分期平台。 打破了传统的押一付…

如何进行单元测试和集成测试

前端开发:如何进行单元测试和集成测试 在前端开发中,单元测试和集成测试是确保代码质量和稳定性不可或缺的一环。单元测试用于测试代码中的最小单元,而集成测试则是测试各个单元之间的交互和整体功能。通过合理的测试策略和工具,…

芯品荟 | 电动牙刷应用介绍

PART ONE 市场简介 - Market Profile - 电动牙刷个护是小家电最炙手可热的细分赛道之一。 随着居民的消费水平不断提升,口腔保健意识也逐步增强,中国电动牙刷市场迎来高速发展阶段。目前电动牙刷全球年用量在1亿只左右。 PART TWO 产品应用框图 - Bl…

【电机仿真】HFI算法脉振高频电压信号注入观测器-PMSM无感FOC控制

【电机仿真】HFI算法脉振高频电压信号注入观测器-PMSM无感FOC控制 文章目录 前言一、脉振高频电压注入法简介(注入在旋转坐标系的d轴)1.旋转高频电压(电流)注入法2.脉振高频电压注入法 二、高频注入理论1.永磁同步电机的高频模型2…

【小沐学QT】QT学习之Web控件的使用

文章目录 1、简介1.1 Qt简介1.2 Qt下载和安装1.3 Qt快捷键1.4 Qt帮助 2、QtWeb控件2.1 测试代码1(QApplication)2.2 测试代码2(QApplicationQWidget)2.3 测试代码3(QApplicationQMainWindow)2.4 测试代码4&…

【Flink CDC(一)】实现mysql整表与增量读取

文章目录 一. 运行前准备1. 依赖1.1. Maven dependency1.2. SQL Client JAR(推荐) 2. 配置 MySQL 服务器(必须) 二. 功能说明1. 启动模式2. 全量阶段支持 checkpoint3. 关于无主键表Exactly-Once 处理 三. 实战1. 实现mysql整表与…

【Node.js】自动生成 API 文档

目录 1、直接使用swagger-ui-express 2、配合swagger-jsdoc 如何在Node.js项目中使用 Swagger 来自动生成 API接口文档,使用生成方式有很多种。本文基于swagger-jsdocswagger-ui-express快速实现 1、直接使用swagger-ui-express // 方便来浏览和测试api npm i sw…

数据可视化引领智慧工业新时代

在智慧工业的大潮中,数据可视化崭露头角,以其直观、清晰的方式赋能工业生产,为智慧工业的高效运转提供了强有力的支持。下面我就以可视化从业者的角度,简单聊聊这个话题。 数据可视化首先在智慧工业的生产监控中大显身手。通过将…

外贸干货|到底跟踪多少次才能拿下客户?

80%的销售来源于第4至11次的跟踪!这样的调查数据充分说明了深入顾客关系的重要性。而多数情况下,人们只做到了前3层,就放弃了。 作为一名销售,你会对客户坚持跟踪么?在跟踪过程中,该采取什么样…

免费SSL证书申请流程及地址

1,选择证书提供商:有许多机构提供免费的SSL证书,如JoySSL。选择一个可靠的提供商是第一步。 免费SSL证书申请地址https://www.joyssl.com/certificate/select/free.html?nid5 2,验证域名:根据提供商的要求&#xff…

二叉树的链式结构实现

二叉树的链式结构实现 1. 链式存储2. 二叉树的遍历前序遍历中序遍历后序遍历 3. 二叉树遍历的代码实现前序遍历中序遍历后序遍历 4. 二叉树各种相关函数的实现二叉树节点个数二叉树叶子节点个数二叉树的高度二叉树第k层节点个数二叉树查找值为x的节点 5. 代码验证 1. 链式存储 …

Linux系统---nginx(1)

目录 一.Nginx概述 1.定义 2.Nginx模块作用 (1)main模块 (2)stream服务模块 (3)邮件服务模块 (4)第三方模块 (5)events模块 (6&#xff0…

Go的CSP并发模型实现M, P, G简介

GMP概念简介 G: goroutine(协程,也叫用户态线程) M: 工作线程(内核态线程) P: 上下文(也可以认为是cpu,逻辑cpu数量,可以在程序启动的时候设置这个数量,gomaxprocs函数设置) GMP 模型 在 Go 中&#xff…

力扣--动态规划1027.最长等差数列

思路分析: 使用动态规划的思想,定义二维数组dp,其中dp[i][j]表示以nums[i]为结尾,公差为(j-1000)的等差数列长度。为了适应负数的情况,将公差的范围设为[-1000, 1000],并且加上1000作为数组索引。 初始化r…

115/200V 航空交流静变电源 115/200V机场直线加电设备

一、 115/200V 航空交流静变电源简介: 随着全球科技的快速发展和航空产业的不断进步,飞机的性能和功能要求日益提升,对电源设备的需求也更加严格。其中,“115/200V 航空交流静变电源”作为飞机的115/200V机场直线加电设备&#x…

【b站咸虾米】chapter5_uniapp-API_新课uniapp零基础入门到项目打包(微信小程序/H5/vue/安卓apk)全掌握

课程地址:【新课uniapp零基础入门到项目打包(微信小程序/H5/vue/安卓apk)全掌握】 https://www.bilibili.com/video/BV1mT411K7nW/?p12&share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 5 API 5.1 页面和路…

pytest钩子函数-pytest_runtest_logreport提取测试用例相关信息

问题:想在每个日志中记录测试用例开始结束时间,获取到测试用例的名称。 解决办法:使用钩子pytest_runtest_logreport 在pytest中,想要在conftest.py文件中获取正在运行的测试用例的名称,可以使用pytest_runtest_logre…