fetch_tx_details.py hinzugefügt
This commit is contained in:
commit
e005f0104e
110
fetch_tx_details.py
Normal file
110
fetch_tx_details.py
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
import requests
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
# --- Configuration ---
|
||||||
|
# The base URL for your mempool API instance.
|
||||||
|
BASE_URL = "https://mempool.mikoshi.de/api/tx/"
|
||||||
|
|
||||||
|
def format_transaction_details(tx_data):
|
||||||
|
"""Formats the JSON data from the API into a human-readable string."""
|
||||||
|
|
||||||
|
txid = tx_data.get("txid", "N/A")
|
||||||
|
fee = tx_data.get("fee", 0)
|
||||||
|
size = tx_data.get("size", 0)
|
||||||
|
weight = tx_data.get("weight", 0)
|
||||||
|
|
||||||
|
# Status details
|
||||||
|
status = tx_data.get("status", {})
|
||||||
|
confirmed = status.get("confirmed", False)
|
||||||
|
if confirmed:
|
||||||
|
block_height = status.get("block_height", "N/A")
|
||||||
|
block_time_unix = status.get("block_time", 0)
|
||||||
|
block_time_str = datetime.utcfromtimestamp(block_time_unix).strftime('%Y-%m-%d %H:%M:%S UTC')
|
||||||
|
status_str = f"✅ Confirmed in block {block_height} at {block_time_str}"
|
||||||
|
else:
|
||||||
|
status_str = "⌛ Unconfirmed"
|
||||||
|
|
||||||
|
# --- Start building the output string ---
|
||||||
|
output = []
|
||||||
|
output.append("=" * 80)
|
||||||
|
output.append(f"TRANSACTION DETAILS FOR: {txid}")
|
||||||
|
output.append("=" * 80)
|
||||||
|
|
||||||
|
# General Info
|
||||||
|
output.append("\n--- General ---")
|
||||||
|
output.append(f"Status: {status_str}")
|
||||||
|
output.append(f"Fee: {fee} sats")
|
||||||
|
output.append(f"Size: {size} bytes")
|
||||||
|
output.append(f"Weight: {weight} vB")
|
||||||
|
output.append(f"Fee Rate: {fee/(weight/4):.2f} sat/vB")
|
||||||
|
|
||||||
|
# Inputs (vin)
|
||||||
|
vin = tx_data.get("vin", [])
|
||||||
|
output.append(f"\n--- Inputs ({len(vin)}) ---")
|
||||||
|
if not vin:
|
||||||
|
output.append("No inputs found (likely a coinbase transaction).")
|
||||||
|
for i, an_input in enumerate(vin, 1):
|
||||||
|
prev_txid = an_input.get("txid", "N/A")
|
||||||
|
prev_vout = an_input.get("vout", "N/A")
|
||||||
|
prevout = an_input.get("prevout", {})
|
||||||
|
value = prevout.get("value", "N/A")
|
||||||
|
address = prevout.get("scriptpubkey_address", "Address not available")
|
||||||
|
output.append(f" {i}. From TX: {prev_txid[:20]}... | Output Index: {prev_vout}")
|
||||||
|
output.append(f" Value: {value} sats | Spent by: {address}")
|
||||||
|
|
||||||
|
# Outputs (vout)
|
||||||
|
vout = tx_data.get("vout", [])
|
||||||
|
output.append(f"\n--- Outputs ({len(vout)}) ---")
|
||||||
|
for i, an_output in enumerate(vout, 1):
|
||||||
|
value = an_output.get("value", "N/A")
|
||||||
|
address = an_output.get("scriptpubkey_address", "Address not available")
|
||||||
|
output.append(f" {i}. Value: {value} sats | To Address: {address}")
|
||||||
|
|
||||||
|
output.append("\n" * 2) # Add space before the next transaction
|
||||||
|
return "\n".join(output)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""Main function to run the script."""
|
||||||
|
if len(sys.argv) != 3:
|
||||||
|
print("Usage: python fetch_tx_details.py <input_file.txt> <output_file.txt>")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
input_filename = sys.argv[1]
|
||||||
|
output_filename = sys.argv[2]
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(input_filename, 'r') as f:
|
||||||
|
txids = [line.strip() for line in f if line.strip()]
|
||||||
|
except FileNotFoundError:
|
||||||
|
print(f"Error: Input file '{input_filename}' not found.")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
print(f"Found {len(txids)} transaction IDs. Fetching details...")
|
||||||
|
|
||||||
|
with open(output_filename, 'w') as out_file:
|
||||||
|
for i, txid in enumerate(txids):
|
||||||
|
print(f"({i+1}/{len(txids)}) Fetching {txid}...")
|
||||||
|
try:
|
||||||
|
response = requests.get(f"{BASE_URL}{txid}", timeout=10)
|
||||||
|
# Check if the request was successful
|
||||||
|
if response.status_code == 200:
|
||||||
|
data = response.json()
|
||||||
|
formatted_data = format_transaction_details(data)
|
||||||
|
out_file.write(formatted_data)
|
||||||
|
else:
|
||||||
|
error_message = f"Failed to fetch {txid}. Status Code: {response.status_code}. Response: {response.text}\n\n"
|
||||||
|
print(error_message)
|
||||||
|
out_file.write(error_message)
|
||||||
|
except requests.RequestException as e:
|
||||||
|
error_message = f"An error occurred while fetching {txid}: {e}\n\n"
|
||||||
|
print(error_message)
|
||||||
|
out_file.write(error_message)
|
||||||
|
|
||||||
|
print(f"\n✅ Done! All details have been saved to '{output_filename}'.")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
Loading…
x
Reference in New Issue
Block a user