25 Commits

Author SHA1 Message Date
hackrobot
2e08a0259a 'update 2024-09-14 13:03:45 +08:00
hackrobot
a1a21ab269 update 2024-09-14 13:03:18 +08:00
hackrobot
70ae70d20a 'update 2024-09-14 13:01:36 +08:00
hackrobot
00f407c7d5 'ss' 2024-09-14 12:57:51 +08:00
hackrobot
842a2101bf update 2024-09-14 09:41:12 +08:00
hackrobot
754b5e98c9 update 2024-09-13 13:10:38 +08:00
hackrobot
4f5d38577d qwfqwf 2024-09-12 18:47:04 +08:00
hackrobot
e6f06b5f38 update 2024-09-12 18:42:43 +08:00
hackrobot
a548fdfbb2 qwfwfqw 2024-09-12 18:38:21 +08:00
hackrobot
421a87a9ec wfqwf 2024-09-12 18:34:36 +08:00
hackrobot
fe65f000eb qwfqwf 2024-09-12 18:05:01 +08:00
hackrobot
7e6001bc1f update 2024-09-12 18:00:49 +08:00
hackrobot
4275b33f24 update 2024-09-12 16:33:49 +08:00
hackrobot
2c1a565dda update 2024-08-10 19:10:22 +08:00
hackrobot
76d644c447 新增支付接口 2024-08-10 18:24:27 +08:00
hackrobot
55605dd755 update 2024-08-10 17:03:15 +08:00
hackrobot
326348aff4 fix:迁移mysql 2024-08-10 16:51:37 +08:00
hackrobot
558176dcea fix: 修改数据库端口 2024-08-10 16:49:38 +08:00
hackrobot
cf688fe5fc update 2024-08-10 16:47:23 +08:00
hackrobot
c4ec077569 update 2024-07-21 15:18:58 +08:00
eric
80e689446c cc 2024-07-21 07:11:33 +00:00
hackrobot
e11b70ad52 update 2024-07-21 15:06:57 +08:00
hackrobot
5e424e792c update 2024-07-21 14:58:18 +08:00
hackrobot
4ac1c79f6f update 2024-07-21 14:56:06 +08:00
hackrobot
a1b36c2c4e update 2024-07-21 14:53:08 +08:00
24 changed files with 191 additions and 26 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -2,10 +2,15 @@ from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker from sqlalchemy.orm import sessionmaker
SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db" # SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
# engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
# SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}) # 使用 MySQL 连接
# SQLALCHEMY_DATABASE_URL = "mysql+pymysql://hackrobot:Xiao4669805@192.168.31.184:3400/hackrobot"
SQLALCHEMY_DATABASE_URL = "mysql+pymysql://hackrobot:Xiao4669805@localhost:3400/hackrobot"
engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base() Base = declarative_base()

View File

@@ -3,6 +3,7 @@ from fastapi import BackgroundTasks, FastAPI, HTTPException, Depends, Query
from fastapi.responses import JSONResponse, PlainTextResponse from fastapi.responses import JSONResponse, PlainTextResponse
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from typing import List, Optional, Any from typing import List, Optional, Any
from pydantic import BaseModel
from app import models, schemas, crud from app import models, schemas, crud
from app.database import SessionLocal, engine from app.database import SessionLocal, engine
@@ -15,12 +16,60 @@ from fastapi.staticfiles import StaticFiles
# from app import tgMessage # type: ignore #发送tg消息 # from app import tgMessage # type: ignore #发送tg消息
from datetime import datetime from datetime import datetime
import requests import requests
from tentcentSMS import sendSms # from tentcentSMS import sendSms
import random import random
from tencentcloud.common import credential
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.sms.v20210111 import sms_client, models as smsmodels
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
import hashlib
from urllib.parse import urlencode, unquote
import time
# 初始化数据库 # 初始化数据库
models.Base.metadata.create_all(bind=engine) models.Base.metadata.create_all(bind=engine)
"""
JSAPI 支付
"""
key = "zA2hBU6pv6CIBzkW" # 填写通信密钥
mchid = "1561724891" # 特写商户号
# 构造签名函数
def sign(attributes):
attributes_new = {k: attributes[k] for k in sorted(attributes.keys())}
return (
hashlib.md5(
(unquote(urlencode(attributes_new)) + "&key=" + key).encode(
encoding="utf-8"
)
)
.hexdigest()
.upper()
)
class Item(BaseModel):
event: str
EventGroupMsg: None = None
prirobot_wxidce: None = None
type: None = None
# event
# "":"EventGroupMsg",//事件标示(当前值为群消息事件)
# "robot_wxid":"wxid_5hxa04j4z6pg22",//机器人wxid
# "robot_name":"",//机器人昵称,一般为空
# "type":1,//1/文本消息 3/图片消息 34/语音消息 42/名片消息 43/视频 47/动态表情 48/地理位置 49/分享链接 2000/转账 2001/红包 2002/小程序 2003/群邀请
# "from_wxid":"18900134932@chatroom",//群id群消息事件才有
# "from_name":"微群测",//群名字
# "final_from_wxid":"sundreamer",//发该消息的用户微信id
# "final_from_name":"遗忘悠剑o",//微信昵称
# "to_wxid":"wxid_5hxa04j4z6pg22",//接收消息的人id一般是机器人收到了也有可能是机器人发出的消息别人收到了那就是别人
# "msg":"图片https://b3logfile.com/bing/20201024.jpg",//消息内容(string/array) 使用时候根据不同的事件标示来定义这个值,字符串类型或者数据类型
# "money":0.01 //金额,只有"EventReceivedTransfer"事件才有该参数
app = FastAPI() app = FastAPI()
# 挂载 images 文件夹 # 挂载 images 文件夹
@@ -53,6 +102,39 @@ def get_db():
# return {"message": "Hello World"} # return {"message": "Hello World"}
# phoneNum="+8613243889782"
def sendSms(phoneNum,verification_code=None):
try:
cred = credential.Credential("AKIDOaT6SZQ0JL7cqnTryoOhkW1FBqELAizz",
"kDPKyMTJs99sKVP1NREkzxKQFo66pIUP")
httpProfile = HttpProfile()
httpProfile.reqMethod = "POST" # post请求(默认为post请求)
httpProfile.reqTimeout = 30 # 请求超时时间,单位为秒(默认60秒)
httpProfile.endpoint = "sms.tencentcloudapi.com" # 指定接入地域域名(默认就近接入)
clientProfile = ClientProfile()
clientProfile.signMethod = "TC3-HMAC-SHA256" # 指定签名算法
clientProfile.language = "en-US"
clientProfile.httpProfile = httpProfile
client = sms_client.SmsClient(cred, "ap-beijing", clientProfile)
req = smsmodels.SendSmsRequest()
req.SmsSdkAppId = "1400808237"
req.SignName = "异度世界公众号"
req.TemplateId = "1795415" #验证码为:{1}, 若非本人操作,请忽略。
req.TemplateParamSet = [verification_code]
newphoneNum = '+86' + phoneNum
req.PhoneNumberSet = [newphoneNum]
req.SessionContext = ""
req.ExtendCode = ""
req.SenderId = ""
resp = client.SendSms(req)
print(resp.to_json_string(indent=2))
except TencentCloudSDKException as err:
print(err)
def sengTgmesage(message): def sengTgmesage(message):
url = "http://192.168.31.38:8521/send_message" url = "http://192.168.31.38:8521/send_message"
data = {"message": message} data = {"message": message}
@@ -73,11 +155,42 @@ def hello():
return PlainTextResponse(content=response) return PlainTextResponse(content=response)
@app.post("/payh5")
async def payh5(item: dict):
print('item', item)
# 时间戳
timenew = str(int(time.time()))
order = {
"mchid": mchid,
"body": timenew, # 订单标题
"out_trade_no": timenew, # 订单号
"total_fee":item['total_fee'], # 金额,单位:分
# "openid": "o7LFAwWu3OhSrs49-1x5cSlFm0D8", # 通过openid接口获取到的openid
# "notify_url": ""
# "callback_url":'https://aiimg.hackrobot.cn/api'
}
order["callback_url"] =item['callback_url']
order["openid"] =item['openid']
order["sign"] = sign(order)
request_url = "https://payjs.cn/api/jsapi"
# 返回结果中包含`jsapi`字段该字段的值即是前端发起时所需的6个支付参数
headers = {"content-type": "application/x-www-form-urlencoded"}
response = requests.post(request_url, data=order, headers=headers)
if response:
print(response.json())
return response.json()
@app.get("/tgMessage") @app.get("/tgMessage")
def tgMessagefun(openid: Optional[str] = None, db: Session = Depends(get_db)): def tgMessagefun(openid: Optional[str] = None, db: Session = Depends(get_db)):
current_time = datetime.now() current_time = datetime.now()
print("Current Date and Time:", current_time) # 格式化日期和时间,不包含空格
formatted_now = current_time.strftime("%Y%m%d%H%M%S")
print("Current Date and Time:", formatted_now)
# 发送tg消息通知 wxid_4413224132412 || o7LFAwR32hWGq9XOpd7ZxK1wZxq8 # 发送tg消息通知 wxid_4413224132412 || o7LFAwR32hWGq9XOpd7ZxK1wZxq8
# openid = "o7LFAwR32hWGq9XOpd7ZxK1wZxq8" # openid = "o7LFAwR32hWGq9XOpd7ZxK1wZxq8"
@@ -91,14 +204,14 @@ def tgMessagefun(openid: Optional[str] = None, db: Session = Depends(get_db)):
if userInfo: if userInfo:
# print('userInfo==>', userInfo) # print('userInfo==>', userInfo)
# message = f"{userInfo['nickname']}/{userInfo['gender']}在{current_time}进行了访问" # message = f"{userInfo['nickname']}/{userInfo['gender']}在{current_time}进行了访问"
message = f"{userInfo.nickname}/{userInfo.gender}{current_time}进行了访问" message = f"{userInfo.nickname}/{userInfo.gender}{formatted_now}进行了访问"
print(message) print(message)
sengTgmesage(message) sengTgmesage(message)
# tgMessage.sendTg(message) # tgMessage.sendTg(message)
else: else:
print('openid未关联') print('openid未关联')
message = f'openid: {openid}-未关联,在{current_time}访问网页' message = f'openid: {openid}-未关联,在{formatted_now}访问网页'
print(message) print(message)
sengTgmesage(message) sengTgmesage(message)
@@ -164,10 +277,12 @@ def generateqr(url="http://nomad.hackrobot.cn",
group_image.height - qr_image.height - 50) # 距离20像素 group_image.height - qr_image.height - 50) # 距离20像素
# 在原图上添加二维码 # 在原图上添加二维码
group_image.paste(qr_image, qr_position) group_image.paste(qr_image, qr_position)
current_time = datetime.now()
# 格式化日期和时间,不包含空格
formatted_now = current_time.strftime("%Y%m%d%H%M%S")
# 保存合成的图像 # 保存合成的图像
# combined_image_path = f"images/combined_{wxid}_{datetime.now()}.jpg" # combined_image_path = f"images/combined_{wxid}_{datetime.now()}.jpg"
combined_image_path = f"images/combined_{wxid}_{datetime.date.today()}.jpg" combined_image_path = f"images/combined_{wxid}_{formatted_now}.jpg"
group_image.save(combined_image_path) group_image.save(combined_image_path)
# 压缩图片 # 压缩图片
@@ -200,13 +315,16 @@ def add_user(nickname: Optional[Any] = None,
wxid=wxid, wxid=wxid,
gender=gender, gender=gender,
# friendaddtime=friendaddtime, # friendaddtime=friendaddtime,
friendaddtime=str(datetime.now()), friendaddtime=str(datetime.now().strftime("%Y%m%d%H%M%S")),
openid=openid) openid=openid)
if background_tasks: if background_tasks:
background_tasks.add_task(create_user_task, db, user_data) background_tasks.add_task(create_user_task, db, user_data)
# response = f"{nickname}你好,\n..........................\n一名开发者\n副业:跨境电商\n#公众号:异度世界\n..........................\n回复关键词,了解更多:\n1. 微信机器人\n2. 数字游民\n3. 加群\n..........................\n[该消息是接受好友自动回复]" # response = f"{nickname}你好,\n..........................\n一名开发者\n副业:跨境电商\n#公众号:异度世界\n..........................\n回复关键词,了解更多:\n1. 微信机器人\n2. 数字游民\n3. 加群\n..........................\n[该消息是接受好友自动回复]"
response = f"{nickname}你好,\n..........................\n一名开发者\n副业:跨境电商\n#公众号:异度世界\n..........................\n回复关键词,了解更多:\n1. 数字游民\n..........................\n[该消息是接受好友自动回复]" if gender=="":
response = f"{nickname},你好:\n..........................\n一名开发者\n副业:youtube/跨境电商\n#公众号:异度世界\n..........................\n参加沙龙:\nnomad.hackrobot.cn\n..........................\n[本消息是🤖接受好友自动回复]\n我会不定时看消息"
else:
# ..........................\n回复关键词: 加群\n
response = f"{nickname},你好:\n..........................\n一名开发者\n副业:youtube/跨境电商\n#公众号:异度世界\n..........................\n加群:\nbot.hackrobot.cn\n..........................\n[本消息是🤖接受好友自动回复]\n我会不定时看消息"
# 关键词回复 # 关键词回复
if keyword == '加群' or keyword == "数字游民" or keyword == "3" or keyword == "1": if keyword == '加群' or keyword == "数字游民" or keyword == "3" or keyword == "1":
print("keyword==加群") print("keyword==加群")
@@ -238,6 +356,7 @@ def add_user(nickname: Optional[Any] = None,
return FileResponse(combined_image_path) return FileResponse(combined_image_path)
else: else:
print('其他keyword') print('其他keyword')
print('response',response)
return PlainTextResponse(content=response) return PlainTextResponse(content=response)
@@ -295,6 +414,7 @@ def get_verification_code(wxid: str,
user.phone_number = phone_number user.phone_number = phone_number
user.verification_code = verification_code user.verification_code = verification_code
db.commit() db.commit()
sendSms(phone_number)
return { return {
"message": "Verification code sent", "message": "Verification code sent",

View File

@@ -9,19 +9,34 @@ from sqlalchemy.orm.attributes import get_history
class User(Base): class User(Base):
__tablename__ = "users" __tablename__ = "users"
# id = Column(Integer, primary_key=True, index=True)
# nickname = Column(String, index=True)
# remark = Column(String)
# wechat_number = Column(String)
# wxid = Column(String, index=True, unique=True)
# gender = Column(String)
# friendaddtime = Column(String)
# openid = Column(String, index=True)
# ebook = Column(Boolean, default=False) # 新增电子书字段
# activity_status = Column(String, default="0") # 新增活动报名字段
# vip_member = Column(Boolean, default=False) # 新增VIP会员字段
# verification_code = Column(String, index=True) # 新增验证码字段
# phone_number = Column(String, index=True, unique=True) # 新增手机号字段
# 迁移mysql
id = Column(Integer, primary_key=True, index=True) id = Column(Integer, primary_key=True, index=True)
nickname = Column(String, index=True) nickname = Column(String(255), index=True) # 添加长度限制
remark = Column(String) remark = Column(String(255)) # 你也可以为其他字符串列添加长度限制
wechat_number = Column(String) wechat_number = Column(String(255))
wxid = Column(String, index=True, unique=True) wxid = Column(String(255), index=True, unique=True)
gender = Column(String) gender = Column(String(10)) # 可以考虑为性别列添加长度限制
friendaddtime = Column(String) friendaddtime = Column(String(50)) # 你也可以为日期时间字段选择合适的长度
openid = Column(String, index=True) openid = Column(String(255), index=True)
ebook = Column(Boolean, default=False) # 新增电子书字段 ebook = Column(Boolean, default=False)
activity_status = Column(String, default="0") # 新增活动报名字段 activity_status = Column(String(50)) # 为活动状态添加合适的长度
vip_member = Column(Boolean, default=False) # 新增VIP会员字段 vip_member = Column(Boolean, default=False)
verification_code = Column(String, index=True) # 新增验证码字段 verification_code = Column(String(50), index=True) # 验证码的长度
phone_number = Column(String, index=True, unique=True) # 新增手机号字段 phone_number = Column(String(20), index=True, unique=True) # 电话号码长度
def sengTgmesage(message): def sengTgmesage(message):

View File

@@ -121,4 +121,3 @@ def sendSms(phoneNum,verification_code=None):
except TencentCloudSDKException as err: except TencentCloudSDKException as err:
print(err) print(err)
sendSms('13243889782')

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

4
run.py
View File

@@ -1,6 +1,6 @@
import uvicorn import uvicorn
if __name__ == "__main__": if __name__ == "__main__":
uvicorn.run("app.main:app", host="0.0.0.0", port=8700, reload=True) # uvicorn.run("app.main:app", host="0.0.0.0", port=8700, reload=True)
# uvicorn.run("app.main:app", host="127.0.0.1", port=8700, reload=True) uvicorn.run("app.main:app", host="127.0.0.1", port=8700, reload=True)

26
test Normal file
View File

@@ -0,0 +1,26 @@
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mysql_db
environment:
MYSQL_ROOT_PASSWORD: Xiao4669805
MYSQL_DATABASE: hackrobot
MYSQL_USER: hackrobot
MYSQL_PASSWORD: Xiao4669805
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
adminer:
image: adminer
container_name: adminer
ports:
- "8080:8080"
restart: always # 为 Adminer 容器添加自动重启配置
volumes:
mysql_data:
driver: local

BIN
test.db

Binary file not shown.

BIN
testbackup.db Normal file

Binary file not shown.