diff --git a/app/__pycache__/main.cpython-310.pyc b/app/__pycache__/main.cpython-310.pyc index 2cff541..0961716 100644 Binary files a/app/__pycache__/main.cpython-310.pyc and b/app/__pycache__/main.cpython-310.pyc differ diff --git a/app/__pycache__/models.cpython-310.pyc b/app/__pycache__/models.cpython-310.pyc index ab08cdf..1f4257d 100644 Binary files a/app/__pycache__/models.cpython-310.pyc and b/app/__pycache__/models.cpython-310.pyc differ diff --git a/app/__pycache__/schemas.cpython-310.pyc b/app/__pycache__/schemas.cpython-310.pyc index 3ee5a04..5486931 100644 Binary files a/app/__pycache__/schemas.cpython-310.pyc and b/app/__pycache__/schemas.cpython-310.pyc differ diff --git a/app/main.py b/app/main.py index 9a0c5c4..ea4f1d3 100644 --- a/app/main.py +++ b/app/main.py @@ -1,4 +1,5 @@ -from fastapi import FastAPI, HTTPException, Depends +from sqlite3 import IntegrityError +from fastapi import BackgroundTasks, FastAPI, HTTPException, Depends, Query from fastapi.responses import JSONResponse, PlainTextResponse from sqlalchemy.orm import Session from typing import List, Optional, Any @@ -6,12 +7,20 @@ from typing import List, Optional, Any from app import models, schemas, crud from app.database import SessionLocal, engine from fastapi.middleware.cors import CORSMiddleware +from PIL import Image +import qrcode +import os +from fastapi.responses import FileResponse +from fastapi.staticfiles import StaticFiles # 初始化数据库 models.Base.metadata.create_all(bind=engine) app = FastAPI() +# 挂载 images 文件夹 +app.mount("/images", StaticFiles(directory="images"), name="images") + # 允许所有来源跨域访问(不推荐用于生产环境) origins = ["*"] @@ -34,17 +43,33 @@ def get_db(): db.close() -@app.get("/") -def root(): - return {"message": "Hello World"} +# @app.get("/") +# def root(): +# return {"message": "Hello World"} @app.get("/hello") def hello(): - return {"message": "Hello World"} + response = f"你好,\n..........................\n一名开发者\n副业:跨境电商\n#公众号:异度世界\n..........................\n回复关键词,了解更多:\n1. 微信机器人\n2. 数字游民\n3. 加群\n..........................\n[该消息是接受好友自动回复]" + return PlainTextResponse(content=response) + + +def create_user_task(db: Session, user: schemas.UserCreate): + try: + existing_user = db.query( + models.User).filter(models.User.wxid == user.wxid).first() + if existing_user: + # 可以选择更新用户信息或返回错误 + # print("用户已存在") + return "用户已存在" + db.add(user) + db.commit() + except IntegrityError: + db.rollback() + print("用户已存在") + return "用户已存在" -# @app.get("/add", response_model=schemas.User) @app.get("/add") def add_user(nickname: Optional[Any] = None, remark: Optional[Any] = None, @@ -53,23 +78,21 @@ def add_user(nickname: Optional[Any] = None, gender: Optional[Any] = None, friendaddtime: Optional[Any] = None, openid: Optional[Any] = None, - db: Session = Depends(get_db)): - crud.create_user(db=db, - user=schemas.UserCreate(nickname=nickname, - remark=remark, - wechat_number=wechat_number, - wxid=wxid, - gender=gender, - friendaddtime=friendaddtime, - openid=openid)) - # response=f'''{nickname}你好,\n我是机器人助理\n一名开发者,副业:跨境电商,#公众号:异度世界''' - # headers = {"Content-Type": "application/json"} - # return JSONResponse(content=response, headers=headers) - - response = f"{nickname}你好,\n我是机器人助理\n一名开发者,副业:跨境电商,#公众号:异度世界" - return PlainTextResponse(content=response) + db: Session = Depends(get_db), + background_tasks: BackgroundTasks = None): - # return '{nickname}你好,\n我是机器人助理\n一名开发者,副业:跨境电商,#公众号:异度世界' + user_data = schemas.UserCreate(nickname=nickname, + remark=remark, + wechat_number=wechat_number, + wxid=wxid, + gender=gender, + friendaddtime=friendaddtime, + openid=openid) + if background_tasks: + background_tasks.add_task(create_user_task, db, user_data) + + response = f"{nickname}你好,\n..........................\n一名开发者\n副业:跨境电商\n#公众号:异度世界\n..........................\n回复关键词,了解更多:\n1. 微信机器人\n2. 数字游民\n3. 加群\n..........................\n[该消息是接受好友自动回复]" + return PlainTextResponse(content=response) @app.get("/users/") @@ -102,3 +125,50 @@ def update_user(identifier: str, raise HTTPException(status_code=404, detail="User not found") return crud.update_user(db=db, user=user, user_update=user_update) + + +@app.get("/generate_qr") +def generate_qr(wxid: Optional[str] = Query(None), db: Session = Depends(get_db)): + # 选择网络图片 + # return FileResponse('images/111.png') + + + + url = "https://web.hackrobot.cn" + if wxid: + url += f"?wxid={wxid}" + + # 创建二维码 + qr = qrcode.QRCode(version=1, box_size=5, border=2) # 调整二维码大小 + qr.add_data(url) + qr.make(fit=True) + img = qr.make_image(fill='black', back_color='white') + + # 保存二维码图像 + qr_image_path = f"images/{wxid}-qr_code.png" + img.save(qr_image_path) + + # 加载原图 + group_image_path = "images/group.jpg" + + # 在原图上添加二维码(右下角) + group_image = Image.open(group_image_path) + qr_image = Image.open(qr_image_path) + + # 将二维码放置在右下角 + qr_image = qr_image.resize((200, 200)) # 调整二维码大小 + qr_position = (group_image.width - qr_image.width - 50, group_image.height - qr_image.height - 50) # 距离20像素 + # 在原图上添加二维码 + group_image.paste(qr_image, qr_position) + + + # 保存合成的图像 + combined_image_path = f"images/combined_{wxid}.jpg" + group_image.save(combined_image_path) + # 压缩图片 + group_image.save(combined_image_path, "JPEG", quality=10) # 85 是压缩质量,可根据需要调整 + + # 删除二维码文件 + os.remove(qr_image_path) + print(combined_image_path) + return FileResponse(combined_image_path) \ No newline at end of file