mirror of
https://github.com/LC044/WeChatMsg
synced 2025-02-23 19:52:18 +08:00
405 lines
11 KiB
Python
405 lines
11 KiB
Python
|
# -*- 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(''))
|