WeChatMsg/app/DB/data.py
2023-01-11 13:04:19 +08:00

405 lines
11 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
"""
@File : data.py
@Author : Shuaikang Zhou
@Time : 2022/12/13 20:59
@IDE : Pycharm
@Version : Python3.10
@comment : ···
"""
import json
import pymysql
import random
import time
import hashlib
import datetime
import os
import shutil
f = open('./app/data/config.json','r')
config = json.loads(f.read())
username = config['username']
password = config['password']
database = config['database']
# 打开数据库连接t
db = pymysql.connect(
host='localhost',
user=username,
password=password,
database=database,
autocommit=True
)
cursor = db.cursor()
def register(username, password, nickname):
"""
注册账号
:param username: 用户名
:param password: 密码
:param nickname: 昵称
:return:
"""
try:
create = 'insert into users (username,password,createTime) values (%s,%s,%s)'
timestamp = float(time.time())
dt = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
cursor.execute(create, [username, password, dt])
create = 'insert into userinfo (username,nickname) values (%s,%s)'
cursor.execute(create, [username, nickname])
db.commit()
try:
sql = f'''
create view msg_view_{username}
as
select msgId,type,IsSend,createTime,content,talkerId from message
where username = %s
order by msgId;
'''
cursor.execute(sql, [username])
sql = f'''
create view contact_view_{username}
as
select contactId,conRemark,type,addTime from contact
where username = %s;
'''
cursor.execute(sql, [username])
sql = f'''
create view group_view_{username}
as
select g_id,g_name,gu_nickname,gu_type,gu_time from group_users,`group`
where gu_uid=%s and group_users.gu_gid=`group`.g_id;
'''
cursor.execute(sql, [username])
db.commit()
except pymysql.err.OperationalError:
print('视图已经存在')
except pymysql.err.IntegrityError:
print('用户已存在')
return False
return True
def login(username, password):
select = 'select * from users where username = %s and password = %s'
cursor.execute(select, [username, password])
result = cursor.fetchall()
if result:
return True
return False
def del_user(username):
sql = 'delete from users where username = %s'
cursor.execute(sql, [username])
db.commit()
return True
def searchUser(username):
select = 'select * from users where username = %s'
cursor.execute(select, [username])
result = cursor.fetchall()
if result:
return True
return False
def add_contact(username, contactId, conRemark, _type=3):
send = 'insert into contact (username,conRemark,type,addTime,contactId) values(%s,%s,%s,%s,%s)'
dt = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
select = 'select * from userinfo where username = %s '
cursor.execute(select, [username])
result = cursor.fetchall()
if not result:
return False
if not conRemark:
conRemark = None
try:
if _type == 3:
cursor.execute(send, [username, conRemark, 3, dt, contactId])
db.commit()
return (contactId, conRemark, 3, dt)
except:
return False
def get_userinfo(username):
sql = 'select * from userinfo where username = %s'
cursor.execute(sql, [username])
result = cursor.fetchone()
return result[0]
def online(username, socket=None):
status = random.randint(32010, 52090)
sql = 'update userinfo set status = %s where username=%s'
cursor.execute(sql, [status, username])
db.commit()
return status
def tell_online(username, socket):
if socket:
contacts = get_contacts(username)
for contact in contacts:
contactID = contact[0]
status = check_online(contactID)
if status != -1:
ta_addr = ('localhost', status)
send_data = {
'type': 'T',
'username': username,
'content': '在线0000_1'
}
socket.sendto(json.dumps(send_data).encode('utf-8'), ta_addr)
def offline(username):
status = -1
sql = 'update userinfo set status = %s where username=%s'
cursor.execute(sql, [status, username])
db.commit()
return status
def check_online(username):
db.commit()
sql = 'select status from userinfo where username=%s'
cursor.execute(sql, [username])
db.commit()
result = cursor.fetchone()
# print(username, '端口号:', result)
if result:
return result[0]
else:
return -1
def send_msg(IsSend, msg, ta, me, status=-1, _type=3):
if status == -1:
return False
send = 'insert into message (type,isSend,createTime,content,talkerId,username) values(%s,%s,%s,%s,%s,%s)'
dt = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
if _type == 3:
cursor.execute(send, [_type, IsSend, dt, msg, ta, me])
db.commit()
return 1, _type, IsSend, datetime.datetime.now(), msg, ta
def send_group_msg(gid, msg, talker, IsSend=0, _type=3):
send = 'insert into group_message (g_id,gm_type,gm_content,gm_time,gm_talker,gm_isSend) values(%s,%s,%s,%s,%s,%s)'
dt = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
if _type == 3:
cursor.execute(send, [gid, _type, msg, dt, talker, IsSend])
db.commit()
return 1, gid, _type, msg, datetime.datetime.now(), talker, IsSend
def get_group_message(g_id):
sql = f'select * from group_message where g_id = %s order by gm_id'
cursor.execute(sql, [g_id])
result = cursor.fetchall()
return result
def avatar_md5(wxid):
m = hashlib.md5()
# 参数必须是byte类型否则报Unicode-objects must be encoded before hashing错误
m.update(bytes(wxid.encode('utf-8')))
return m.hexdigest()
def get_avator(wxid):
if wxid == None:
return
wxid = str(wxid)
avatar = avatar_md5(wxid)
avatar_path = r"./data/avatar/"
path = avatar_path + avatar[:2] + '/' + avatar[2:4]
for root, dirs, files in os.walk(path):
for file in files:
if avatar in file:
avatar = file
break
return path + '/' + avatar
def get_contacts(username):
sql = f'select * from contact_view_{username} '
cursor.execute(sql)
result = cursor.fetchall()
return result
def get_myinfo(username):
sql = 'select * from userinfo where username = %s'
cursor.execute(sql, [username])
result = cursor.fetchone()
return result
def update_userinfo(userinfo):
sql = '''
update userinfo
set
nickname=%s,
gender=%s,
city=%s,
province=%s,
tel=%s,
email=%s,
signsture=%s
where username=%s
'''
cursor.execute(sql, userinfo)
def get_nickname(username):
sql = 'select nickname from userinfo where username=%s'
cursor.execute(sql, [username])
result = cursor.fetchone()
return result[0]
def update_conRemark(username, contactId, new_conRemark):
sql = 'update contact set conRemark=%s where username=%s and contactId=%s'
cursor.execute(sql, [new_conRemark, username, contactId])
db.commit()
return True
def delete_contact(username, contactId):
sql = 'delete from contact where username=%s and contactId=%s'
cursor.execute(sql, [username, contactId])
db.commit()
return True
def delete_group(uid, gid):
sql = 'delete from group_users where gu_uid=%s and gu_gid=%s'
cursor.execute(sql, [uid, gid])
db.commit()
return True
def get_remark(username, talkerId):
sql = f'select conRemark from contact_view_{username} where contactId = %s'
cursor.execute(sql, [talkerId])
result = cursor.fetchone()
return result[0]
def mycopyfile(srcfile, dstpath):
# 复制函数
"""
复制文件
:param srcfile: 原路径
:param dstpath: 新路径
:return:
"""
# if 1:
try:
if not os.path.isfile(srcfile):
print("%s not exist!" % (srcfile))
return
else:
print(dstpath)
if os.path.isfile(dstpath):
os.remove(dstpath)
fpath, fname = os.path.split(srcfile) # 分离文件名和路径
dpath, dname = os.path.split(dstpath)
if not os.path.exists(dpath):
os.makedirs(dpath) # 创建路径
# dstpath = '/'.join(dstpath.split('/')[:-1])+'/'
# print(dpath,dname)
shutil.copy(srcfile, dpath) # 复制文件
os.rename(dpath + '/' + fname, dstpath)
# print ("copy %s -> %s"%(srcfile, dstpath + fname))
except:
print('文件已存在')
def get_message(username, talkerId):
sql = f'select * from msg_view_{username} where talkerId = %s order by msgId'
cursor.execute(sql, [talkerId])
result = cursor.fetchall()
return result
def create_group(g_name, g_admin, g_notice=None, g_intro=None):
g_id = random.randint(10000, 99999)
sql = '''insert into `group` (g_id,g_name,g_admin,g_notice,g_intro,g_time) values (%s, %s, %s, %s, %s, %s);'''
dt = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
param = [g_id, g_name, g_admin, g_notice, g_intro, dt]
print(param)
cursor.execute(sql, param)
sql = '''insert into `group_users` (gu_uid,gu_gid,gu_time,gu_nickname,gu_type) values (%s, %s, %s, %s, %s);'''
param = [g_admin, g_id, dt, None, 1]
cursor.execute(sql, param)
db.commit()
return g_id
def add_group(username, g_id, nickname):
group = search_group(g_id)
if not group:
return False
if not nickname:
nickname = None
sql = 'insert into group_users (gu_uid,gu_gid,gu_time,gu_nickname,gu_type) values (%s,%s,%s,%s,%s)'
dt = dt = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
cursor.execute(sql, [username, g_id, dt, nickname, 2])
db.commit()
return [g_id, dt, nickname, 2]
def search_group(gid):
sql = 'select * from `group` where g_id=%s'
cursor.execute(sql, [gid])
result = cursor.fetchone()
return result
def get_groups(username):
sql = f'select * from group_view_{username}'
cursor.execute(sql)
result = cursor.fetchall()
return result
def get_group_users(g_id):
db.commit()
sql = '''
select gu_uid,gu_gid,gu_time,gu_nickname,status
from group_users,userinfo
where gu_gid=%s and
gu_uid=userinfo.username
'''
cursor.execute(sql, [g_id])
db.commit()
result = cursor.fetchall()
return result
# send_msg(3, '你好', '123456')
if __name__ == '__main__':
# add_contact('2020303457', '周帅康')
# contacts = get_contacts('')
# print(contacts)
# messages = get_message('2020303457', '')
# print(messages)
# online('2020303457')
# status = check_online('2020303457')
# print('status:', status)
# offline('2020303457')
# status = check_online('2020303457')
# print('status:', status)
# print(get_remark('', 2020303457))
# print(get_groups('2020303457'))
# # print(create_group("DB实验", '2020303457', g_notice=str(12), g_intro="test"))
# print(get_groups(''))
# print(get_group_users(61067))
print(get_myinfo(''))