Overview
Integrate QrX into your Python applications using the popularrequests library. These examples are suitable for web applications, automation scripts, and data processing pipelines.
Installation
First, install the requests library if you haven’t already:Copy
pip install requests
Basic Usage
Simple Request
Copy
import requests
response = requests.get(
'https://qrgen.maybesurya.live/api/qrgen',
params={'data': 'Hello World'}
)
if response.status_code == 200:
with open('qrcode.png', 'wb') as f:
f.write(response.content)
print('QR code saved successfully!')
else:
print(f'Error: {response.status_code}')
Authenticated Requests
Using API Key in Header
Copy
import requests
import os
# Store API key in environment variable
api_key = os.environ.get('QRX_API_KEY')
response = requests.get(
'https://qrgen.maybesurya.live/api/qrgen',
params={'data': 'Hello World'},
headers={'x-api-key': api_key}
)
if response.status_code == 200:
with open('qrcode.png', 'wb') as f:
f.write(response.content)
print('✓ QR code generated successfully!')
else:
print(f'✗ Error: HTTP {response.status_code}')
Store your API key in an environment variable for security:
bash export QRX_API_KEY="sk_YOUR_API_KEY" Complete Examples
QR Code Generator Function
Copy
import requests
import os
from pathlib import Path
def generate_qr_code(data: str, output_path: str = 'qrcode.png', api_key: str = None) -> bool:
"""
Generate a QR code from the given data.
Args:
data: The text or URL to encode
output_path: Path where the QR code will be saved
api_key: Optional API key for higher rate limits
Returns:
True if successful, False otherwise
"""
url = 'https://qrgen.maybesurya.live/api/qrgen'
params = {'data': data}
headers = {}
if api_key:
headers['x-api-key'] = api_key
try:
response = requests.get(url, params=params, headers=headers, timeout=10)
if response.status_code == 200:
with open(output_path, 'wb') as f:
f.write(response.content)
print(f'✓ QR code saved to {output_path}')
return True
elif response.status_code == 429:
print('✗ Rate limit exceeded. Please wait and try again.')
elif response.status_code == 401:
print('✗ Invalid API key.')
else:
print(f'✗ Error: HTTP {response.status_code}')
return False
except requests.exceptions.RequestException as e:
print(f'✗ Network error: {e}')
return False
# Usage
api_key = os.environ.get('QRX_API_KEY')
generate_qr_code('https://maybesurya.dev', 'website.png', api_key)
Batch Processing
Copy
import requests
import os
import time
from typing import List, Dict
class QRXClient:
def __init__(self, api_key: str = None):
self.base_url = 'https://qrgen.maybesurya.live/api/qrgen'
self.api_key = api_key or os.environ.get('QRX_API_KEY')
self.session = requests.Session()
if self.api_key:
self.session.headers.update({'x-api-key': self.api_key})
def generate(self, data: str, output_path: str) -> Dict:
"""Generate a single QR code."""
try:
response = self.session.get(
self.base_url,
params={'data': data},
timeout=10
)
if response.status_code == 200:
with open(output_path, 'wb') as f:
f.write(response.content)
return {
'success': True,
'data': data,
'output': output_path
}
else:
return {
'success': False,
'data': data,
'error': f'HTTP {response.status_code}'
}
except Exception as e:
return {
'success': False,
'data': data,
'error': str(e)
}
def batch_generate(self, items: List[Dict], delay: float = 0.6) -> List[Dict]:
"""
Generate multiple QR codes with rate limiting.
Args:
items: List of dicts with 'data' and 'output' keys
delay: Delay between requests in seconds (default: 0.6 for 100/min limit)
Returns:
List of result dictionaries
"""
results = []
for i, item in enumerate(items):
print(f'Processing {i+1}/{len(items)}: {item["data"]}')
result = self.generate(item['data'], item['output'])
results.append(result)
if result['success']:
print(f' ✓ Saved to {result["output"]}')
else:
print(f' ✗ Error: {result["error"]}')
# Don't delay after the last item
if i < len(items) - 1:
time.sleep(delay)
return results
# Usage
client = QRXClient(api_key=os.environ.get('QRX_API_KEY'))
# Batch generate QR codes
items = [
{'data': 'https://maybesurya.dev', 'output': 'website.png'},
{'data': 'mailto:[email protected]', 'output': 'email.png'},
{'data': 'tel:+1234567890', 'output': 'phone.png'},
]
results = client.batch_generate(items)
# Print summary
successful = sum(1 for r in results if r['success'])
print(f'\nCompleted: {successful}/{len(results)} successful')
Django Integration
Copy
# views.py
from django.http import HttpResponse, JsonResponse
from django.views import View
import requests
import os
class GenerateQRView(View):
def get(self, request):
data = request.GET.get('data')
if not data:
return JsonResponse({'error': 'Missing data parameter'}, status=400)
api_key = os.environ.get('QRX_API_KEY')
try:
response = requests.get(
'https://qrgen.maybesurya.live/api/qrgen',
params={'data': data},
headers={'x-api-key': api_key} if api_key else {},
timeout=10
)
if response.status_code == 200:
return HttpResponse(
response.content,
content_type='image/png',
headers={'Content-Disposition': 'inline; filename="qrcode.png"'}
)
else:
return JsonResponse(
{'error': f'QR generation failed: {response.status_code}'},
status=response.status_code
)
except requests.exceptions.RequestException as e:
return JsonResponse({'error': str(e)}, status=500)
# urls.py
from django.urls import path
from .views import GenerateQRView
urlpatterns = [
path('api/generate-qr/', GenerateQRView.as_view(), name='generate_qr'),
]
Flask Integration
Copy
from flask import Flask, request, send_file, jsonify
import requests
import os
from io import BytesIO
app = Flask(__name__)
@app.route('/api/generate-qr')
def generate_qr():
data = request.args.get('data')
if not data:
return jsonify({'error': 'Missing data parameter'}), 400
api_key = os.environ.get('QRX_API_KEY')
headers = {'x-api-key': api_key} if api_key else {}
try:
response = requests.get(
'https://qrgen.maybesurya.live/api/qrgen',
params={'data': data},
headers=headers,
timeout=10
)
if response.status_code == 200:
return send_file(
BytesIO(response.content),
mimetype='image/png',
as_attachment=False,
download_name='qrcode.png'
)
else:
return jsonify({
'error': f'QR generation failed: {response.status_code}'
}), response.status_code
except requests.exceptions.RequestException as e:
return jsonify({'error': str(e)}), 500
if __name__ == '__main__':
app.run(debug=True)
FastAPI Integration
Copy
from fastapi import FastAPI, HTTPException, Query
from fastapi.responses import StreamingResponse
import requests
import os
from io import BytesIO
app = FastAPI()
@app.get("/api/generate-qr")
async def generate_qr(data: str = Query(..., description="Data to encode in QR code")):
"""Generate a QR code using QrX API."""
api_key = os.environ.get('QRX_API_KEY')
headers = {'x-api-key': api_key} if api_key else {}
try:
response = requests.get(
'https://qrgen.maybesurya.live/api/qrgen',
params={'data': data},
headers=headers,
timeout=10
)
if response.status_code == 200:
return StreamingResponse(
BytesIO(response.content),
media_type="image/png",
headers={"Content-Disposition": "inline; filename=qrcode.png"}
)
elif response.status_code == 429:
raise HTTPException(status_code=429, detail="Rate limit exceeded")
elif response.status_code == 401:
raise HTTPException(status_code=401, detail="Invalid API key")
else:
raise HTTPException(
status_code=response.status_code,
detail=f"QR generation failed"
)
except requests.exceptions.RequestException as e:
raise HTTPException(status_code=500, detail=str(e))
# Run with: uvicorn main:app --reload
Error Handling
Copy
import requests
from requests.exceptions import RequestException, Timeout, HTTPError
def generate_qr_with_error_handling(data: str, output_path: str, api_key: str = None):
"""Generate QR code with comprehensive error handling."""
url = 'https://qrgen.maybesurya.live/api/qrgen'
params = {'data': data}
headers = {'x-api-key': api_key} if api_key else {}
try:
response = requests.get(
url,
params=params,
headers=headers,
timeout=10
)
# Raise an exception for bad status codes
response.raise_for_status()
# Save the QR code
with open(output_path, 'wb') as f:
f.write(response.content)
print(f'✓ QR code saved to {output_path}')
return True
except Timeout:
print('✗ Request timed out. Please try again.')
except HTTPError as e:
if e.response.status_code == 429:
print('✗ Rate limit exceeded. Please wait and try again.')
elif e.response.status_code == 401:
print('✗ Invalid API key.')
else:
print(f'✗ HTTP error: {e.response.status_code}')
except RequestException as e:
print(f'✗ Network error: {e}')
except IOError as e:
print(f'✗ File error: {e}')
except Exception as e:
print(f'✗ Unexpected error: {e}')
return False
Best Practices
✅ Do: - Use environment variables for API keys - Handle all exceptions
properly - Use sessions for multiple requests - Set reasonable timeouts -
Respect rate limits with delays
❌ Don’t: - Hardcode API keys in your code - Ignore HTTP status codes -
Make requests without timeouts - Exceed rate limits - Commit
.env files to
version control