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