吧务
level 12
测试1代码 api.php
<?php
// 连接BOINC数据库或API获取用户数据
function getUserStats($user_id) {
// 这里实现从BOINC数据库或API获取用户统计数据的逻辑
return [
'total_credit' => 10000,
'avg_credit' => 500,
'projects' => ['SETI@home', 'Einstein@Home']
];
}
// 生成签名图片
function generateSignature($user_data) {
// 使用GD库或Imagick创建图片
$image = imagecreatetruecolor(400, 100);
// 添加背景、文字和统计图表
return $image;
}
// 主处理逻辑
$user_id = $_GET['user_id'] ?? 0;
$user_data = getUserStats($user_id);
$signature = generateSignature($user_data);
header('Content-Type: image/png');
imagepng($signature);
imagedestroy($signature);
?>
2025年08月27日 02点08分
1
吧务
level 12
index.html
<!DOCTYPE html>
<html>
<head>
<title>BOINC签名生成器</title>
<style>
.signature-preview {
border: 1px solid #ccc;
margin: 20px;
}
.options-form {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 15px;
}
</style>
</head>
<body>
<h1>BOINC签名生成器</h1>
<form class="options-form">
<label>BOINC用户ID: <input type="text" name="user_id" required></label>
<label>背景颜色: <input type="color" name="bg_color" value="#000000"></label>
<!-- 更多自定义选项 -->
<button type="submit">生成签名</button>
</form>
<div class="signature-preview">
<img id="signature-img" src="" alt="您的BOINC签名将显示在这里">
</div>
<script>
// 这里添加表单提交和图片更新的逻辑
</script>
</body>
</html>
2025年08月27日 02点08分
2
吧务
level 12
直接连接BOINC数据库
import mysql.connector
def query_boinc_database():
config = {
'host': 'boinc_db_host',
'user': 'boinc_user',
'password': 'your_password',
'database': 'boinc_project'
}
try:
conn = mysql.connector.connect(**config)
cursor = conn.cursor(dictionary=True)
cursor.execute("""
SELECT u.id, u.name, u.total_credit, u.expavg_credit,
t.teamid, t.name as team_name
FROM user u
LEFT JOIN team t ON u.teamid = t.id
WHERE u.id = %s
""", (user_id,))
return cursor.fetchone()
finally:
cursor.close()
conn.close()
2025年08月27日 03点08分
4
吧务
level 12
pythonAPI使用基本认证
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/xml", # BOINC API通常使用XML格式
"Accept": "application/xml"
}
2025年08月27日 03点08分
5
吧务
level 12
API返回XML格式数据
def parse_boinc_xml(xml_string):
root = ET.fromstring(xml_string)
stats = {}
for child in root:
if child.tag == 'user':
stats['total_credit'] = float(child.find('total_credit').text)
stats['expavg_credit'] = float(child.find('expavg_credit').text)
elif child.tag == 'team':
stats['team_name'] = child.find('name').text
return stats
2025年08月27日 03点08分
6
吧务
level 12
签名图片生成
from PIL import Image, ImageDraw, ImageFont
import textwrap
def generate_signature_image(user_data, output_path="signature.png"):
# 创建画布
img = Image.new('RGB', (500, 150), color=(30, 30, 40))
d = ImageDraw.Draw(img)
# 加载字体
try:
font_large = ImageFont.truetype("arial.ttf", 24)
font_small = ImageFont.truetype("arial.ttf", 14)
except:
font_large = ImageFont.load_default()
font_small = ImageFont.load_default()
# 绘制用户信息
d.text((10, 10), f"BOINC用户: {user_data['name']}", fill=(255, 255, 255), font=font_large)
# 绘制统计信息
stats_text = f"""
总积分: {user_data['total_credit']:,.0f}
近期平均积分: {user_data['expavg_credit']:,.2f}
团队: {user_data.get('team_name', '无')}
"""
for i, line in enumerate(textwrap.dedent(stats_text).strip().split('\n')):
d.text((10, 50 + i*25), line, fill=(200, 200, 200), font=font_small)
# 保存图片
img.save(output_path)
return output_path
2025年08月27日 03点08分
7
吧务
level 12
Flask创建RESTful API服务
from flask import Flask, request, jsonify, send_file
import os
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'signatures'
@app.route('/api/generate_signature', methods=['GET'])
def generate_signature():
user_id = request.args.get('user_id')
api_key = request.args.get('api_key')
try:
# 获取用户数据
user_data = get_boinc_stats(api_key, user_id)
# 生成签名图片
filename = f"signature_{user_id}.png"
output_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
generate_signature_image(user_data, output_path)
return send_file(output_path, mimetype='image/png')
except Exception as e:
return jsonify({"error": str(e)}), 500
if __name__ == '__main__':
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
app.run(debug=True)
2025年08月27日 03点08分
8
吧务
level 12
前端调用示例
<!DOCTYPE html>
<html>
<head>
<title>BOINC签名生成器</title>
<style>
body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }
.signature-container { margin: 20px 0; border: 1px solid #ddd; padding: 15px; }
#signature-img { max-width: 100%; }
</style>
</head>
<body>
<h1>BOINC签名生成器</h1>
<form id="signature-form">
<div>
<label for="user-id">BOINC用户ID:</label>
<input type="text" id="user-id" required>
</div>
<div>
<label for="api-key">API密钥:</label>
<input type="password" id="api-key" required>
</div>
<button type="submit">生成签名</button>
</form>
<div class="signature-container">
<h3>您的签名:</h3>
<img id="signature-img" src="" alt="BOINC签名将显示在这里">
</div>
<script>
document.getElementById('signature-form').addEventListener('submit', async (e) => {
e.preventDefault();
const userId = document.getElementById('user-id').value;
const apiKey = document.getElementById('api-key').value;
try {
const response = await fetch(`/api/generate_signature?user_id=${userId}&api_key=${apiKey}`);
if (response.ok) {
const imgUrl = URL.createObjectURL(await response.blob());
document.getElementById('signature-img').src = imgUrl;
} else {
alert('生成签名失败: ' + (await response.text()));
}
} catch (error) {
alert('请求出错: ' + error.message);
}
});
</script>
</body>
</html>
2025年08月27日 03点08分
9
吧务
level 12
安装依赖:pip install -r requirements.txt
Flask==2.0.1
Pillow==8.3.1
mysql-connector-python==8.0.26
requests==2.26.0
redis==3.5.3
2025年08月27日 03点08分
10