Files
ai_wht_B/清空用户微信绑定.py

302 lines
8.6 KiB
Python
Raw Permalink Normal View History

2026-01-06 14:18:39 +08:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
清空用户微信绑定脚本
用于将ai_users表中指定用户的wechat_openid字段清空
"""
import sys
from database_config import db_manager
def clear_wechat_binding(user_identifier):
"""
清空用户的微信绑定
Args:
user_identifier: 用户标识可以是用户ID用户名或手机号
Returns:
bool: 操作是否成功
"""
conn = None
cursor = None
try:
conn = db_manager.get_connection()
cursor = conn.cursor()
# 首先查询用户信息
query_sql = """
SELECT id, username, real_name, phone, wechat_openid
FROM ai_users
WHERE id = %s OR username = %s OR phone = %s
"""
cursor.execute(query_sql, (user_identifier, user_identifier, user_identifier))
user = cursor.fetchone()
if not user:
print(f"❌ 未找到用户: {user_identifier}")
return False
# 从字典中获取值
user_id = user['id']
username = user['username']
real_name = user['real_name']
phone = user['phone']
wechat_openid = user['wechat_openid']
# 显示用户信息
print("\n" + "="*60)
print("📋 找到用户信息:")
print("="*60)
print(f" 用户ID: {user_id}")
print(f" 用户名: {username}")
print(f" 真实姓名: {real_name or '未设置'}")
print(f" 手机号: {phone or '未设置'}")
print(f" 微信OpenID: {wechat_openid or '未绑定'}")
print("="*60)
# 如果已经没有绑定,直接返回
if not wechat_openid:
print("\n✅ 该用户未绑定微信,无需清空")
return True
# 确认操作
confirm = input(f"\n⚠️ 确认要清空用户 [{username}] 的微信绑定吗?(yes/no): ")
if confirm.lower() not in ['yes', 'y', '']:
print("\n❌ 操作已取消")
return False
# 清空微信绑定
update_sql = """
UPDATE ai_users
SET wechat_openid = NULL,
updated_at = NOW()
WHERE id = %s
"""
cursor.execute(update_sql, (user_id,))
conn.commit()
print("\n" + "="*60)
print("✅ 微信绑定已成功清空!")
print("="*60)
print(f" 用户ID: {user_id}")
print(f" 用户名: {username}")
print(f" 操作: wechat_openid 已设置为 NULL")
print("="*60)
return True
except Exception as e:
if conn:
conn.rollback()
print(f"\n❌ 操作失败: {e}")
import traceback
traceback.print_exc()
return False
finally:
if cursor:
cursor.close()
if conn:
conn.close()
def clear_wechat_binding_batch(user_identifiers):
"""
批量清空多个用户的微信绑定
Args:
user_identifiers: 用户标识列表
Returns:
tuple: (成功数量, 失败数量)
"""
success_count = 0
fail_count = 0
print("\n" + ""*60)
print(f"🔄 开始批量清空微信绑定 - 共 {len(user_identifiers)} 个用户")
print(""*60)
for identifier in user_identifiers:
print(f"\n处理用户: {identifier}")
if clear_wechat_binding_silent(identifier):
success_count += 1
else:
fail_count += 1
print("\n" + ""*60)
print("📊 批量操作完成")
print(""*60)
print(f" ✅ 成功: {success_count}")
print(f" ❌ 失败: {fail_count}")
print(""*60)
return success_count, fail_count
def clear_wechat_binding_silent(user_identifier):
"""
静默模式清空用户的微信绑定无需确认
Args:
user_identifier: 用户标识
Returns:
bool: 操作是否成功
"""
conn = None
cursor = None
try:
conn = db_manager.get_connection()
cursor = conn.cursor()
# 查询用户
query_sql = """
SELECT id, username, wechat_openid
FROM ai_users
WHERE id = %s OR username = %s OR phone = %s
"""
cursor.execute(query_sql, (user_identifier, user_identifier, user_identifier))
user = cursor.fetchone()
if not user:
print(f" ❌ 未找到用户")
return False
# 从字典中获取值
user_id = user['id']
username = user['username']
wechat_openid = user['wechat_openid']
if not wechat_openid:
print(f" 用户 [{username}] 未绑定微信")
return True
# 清空微信绑定
update_sql = """
UPDATE ai_users
SET wechat_openid = NULL,
updated_at = NOW()
WHERE id = %s
"""
cursor.execute(update_sql, (user_id,))
conn.commit()
print(f" ✅ 用户 [{username}] 微信绑定已清空")
return True
except Exception as e:
if conn:
conn.rollback()
print(f" ❌ 操作失败: {e}")
return False
finally:
if cursor:
cursor.close()
if conn:
conn.close()
def list_users_with_wechat():
"""
列出所有已绑定微信的用户
"""
conn = None
cursor = None
try:
conn = db_manager.get_connection()
cursor = conn.cursor()
query_sql = """
SELECT id, username, real_name, phone, enterprise_name, wechat_openid
FROM ai_users
WHERE wechat_openid IS NOT NULL AND wechat_openid != ''
ORDER BY id
"""
cursor.execute(query_sql)
users = cursor.fetchall()
if not users:
print("\n📋 没有已绑定微信的用户")
return
print("\n" + "="*80)
print(f"📋 已绑定微信的用户列表 - 共 {len(users)}")
print("="*80)
print(f"{'ID':<6} {'用户名':<15} {'真实姓名':<12} {'手机号':<15} {'企业':<20} OpenID")
print("-"*80)
for user in users:
user_id = user['id']
username = user['username']
real_name = user['real_name']
phone = user['phone']
enterprise_name = user['enterprise_name']
openid = user['wechat_openid']
openid_display = openid[:20] + '...' if openid and len(openid) > 20 else (openid or '')
print(f"{user_id:<6} {username:<15} {real_name or '未设置':<12} {phone or '未设置':<15} {(enterprise_name[:18] if enterprise_name else ''):<20} {openid_display}")
print("="*80)
except Exception as e:
print(f"\n❌ 查询失败: {e}")
finally:
if cursor:
cursor.close()
if conn:
conn.close()
def main():
"""主函数"""
if len(sys.argv) < 2:
print("\n" + "="*60)
print("📖 使用说明:")
print("="*60)
print("1. 清空单个用户的微信绑定:")
print(" python 清空用户微信绑定.py <用户ID|用户名|手机号>")
print("\n2. 批量清空多个用户的微信绑定:")
print(" python 清空用户微信绑定.py <用户1> <用户2> <用户3> ...")
print("\n3. 列出所有已绑定微信的用户:")
print(" python 清空用户微信绑定.py --list")
print("="*60)
print("\n示例:")
print(" python 清空用户微信绑定.py 1")
print(" python 清空用户微信绑定.py user001")
print(" python 清空用户微信绑定.py 13800000001")
print(" python 清空用户微信绑定.py 1 2 3")
print(" python 清空用户微信绑定.py --list")
print("="*60)
return
# 列出已绑定用户
if sys.argv[1] == '--list':
list_users_with_wechat()
return
# 单个用户
if len(sys.argv) == 2:
clear_wechat_binding(sys.argv[1])
# 批量用户
else:
clear_wechat_binding_batch(sys.argv[1:])
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
print("\n\n❌ 操作被用户中断")
sys.exit(1)
except Exception as e:
print(f"\n❌ 程序异常: {e}")
import traceback
traceback.print_exc()
sys.exit(1)