from hypertor import OnionApp
from dataclasses import dataclass
from typing import Optional
import json
app = OnionApp()
@app.get("/")
async def homepage():
return {
"service": "hypertor-example",
"message": "Welcome to my anonymous onion service! 🧅",
"endpoints": ["/", "/api/info", "/api/echo", "/api/health"]
}
@app.get("/api/info")
async def service_info():
return {
"name": "HyperTor Example Service",
"version": "1.0.0",
"anonymous": True,
"powered_by": "hypertor"
}
@app.get("/api/health")
async def health_check():
return {
"status": "healthy",
"tor_connected": True
}
@app.post("/api/echo")
async def echo(request):
try:
body = await request.json()
return {
"echoed": body,
"message": "Your data was received anonymously!"
}
except Exception:
return {"error": "Invalid JSON body"}, 400
@dataclass
class Message:
content: str
sender: Optional[str] = "anonymous"
messages: list[Message] = []
@app.get("/api/messages")
async def list_messages():
return {
"count": len(messages),
"messages": [
{"content": m.content, "sender": m.sender}
for m in messages
]
}
@app.post("/api/messages")
async def create_message(request):
try:
data = await request.json()
msg = Message(
content=data.get("content", ""),
sender=data.get("sender", "anonymous")
)
messages.append(msg)
return {
"success": True,
"message": "Message created",
"data": {"content": msg.content, "sender": msg.sender}
}, 201
except Exception as e:
return {"error": str(e)}, 400
@app.middleware
async def logging_middleware(request, call_next):
print(f"📨 Request: {request.method} {request.path}")
response = await call_next(request)
print(f"📤 Response: {response.status_code}")
return response
async def main():
print("🧅 hypertor - Onion Service Example")
print("=" * 50)
print()
print("Starting onion service...")
print()
await app.run(
)
if __name__ == "__main__":
import asyncio
print("""
╔══════════════════════════════════════════════════════════════╗
║ HyperTor Onion Service ║
║ ║
║ This will create a real .onion address accessible via Tor ║
║ Share your .onion URL only with trusted parties! ║
╚══════════════════════════════════════════════════════════════╝
""")
try:
asyncio.run(main())
except KeyboardInterrupt:
pass