最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python實(shí)現(xiàn)獲取本機(jī)當(dāng)前用戶登陸過的微信ID

 更新時(shí)間:2025年07月15日 10:33:21   作者:JHC000000  
這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)獲取本機(jī)當(dāng)前用戶登陸過的微信對(duì)應(yīng)的wxid,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下

實(shí)現(xiàn)思路

本文將實(shí)現(xiàn)一個(gè)跨平臺(tái)的微信用戶ID(wxid)獲取工具,

DeviceUtils類提供靜態(tài)方法能自動(dòng)識(shí)別Windows、Linux和MacOS系統(tǒng),從微信配置文件中提取已登錄的wxid

  • Windows平臺(tái)讀取config.data文件
  • Linux/MacOS檢查特定目錄下的登錄文件夾

CMDUtils類提供命令行執(zhí)行功能,支持阻塞/非阻塞執(zhí)行及實(shí)時(shí)輸出處理

實(shí)現(xiàn)代碼

import os
import platform
import re
from utils.utils_cmd import CMDUtils


class DeviceUtils:
    """
    設(shè)備工具類
    """

    @staticmethod
    def get_wechat_wxid(folder=None):
        """
        獲取設(shè)備上登陸的 微信 wxid
        :param folder:僅針對(duì)Windows平臺(tái)自定義數(shù)據(jù)存儲(chǔ)路徑生效
        :return:
        """
        wxids = []
        system = DeviceUtils().get_system()
        if system == "Windows":
            if not folder:
                file = os.path.join(
                    os.environ['USERPROFILE'],
                    'Documents',
                    'WeChat Files',
                    'All Users',
                    'config',
                    'config.data'
                )
            else:
                file = os.path.join(
                    folder,
                    'All Users',
                    'config',
                    'config.data'
                )
            with open(file, "rb") as f:
                data = f.read()
            data_matches = re.findall(r'(wxid_.*?)\\\\config', str(data))
            if len(data_matches) > 0:
                wxids.extend(data_matches)
        elif system == "Linux":
            user = CMDUtils.run_await_results(cmd=['whoami'])
            for folder in ('文檔', 'Documents'):
                file = f'/home/{user}/{folder}/xwechat_files/all_users/login'
                if os.path.exists(file):
                    file_list = os.listdir(file)
                    if len(file_list) > 0:
                        for filename in file_list:
                            if filename.startswith('wxid_'):
                                wxids.append(filename)
        elif system == "Darwin":
            user = CMDUtils.run_await_results(cmd=['whoami'])
            file = f"/Users/{user}//Library/Containers/com.tencent.xinWeChat/Data/Documents/xwechat_files/all_users/login"
            if os.path.exists(file):
                file_list = os.listdir(file)
                if len(file_list) > 0:
                    for filename in file_list:
                        if filename.startswith('wxid_'):
                            wxids.append(filename)

        msg = f"{system} 識(shí)別到微信{len(wxids)}個(gè)" if len(wxids) > 0 else f"{system} 未識(shí)別到微信"
        print(msg)
        return wxids

    @staticmethod
    def get_system():
        system = platform.system()
        if system in ('Windows', 'Linux', 'Darwin'):
            return system
        return "Unsupported OS"


if __name__ == '__main__':
    folder = input("input folder:")
    print(DeviceUtils.get_wechat_wxid(folder))

# !/usr/bin/python3
# -*- coding:utf-8 -*-
"""
@author: JHC000abc@gmail.com
@file: utils_cmd.py
@time: 2025/7/8 21:53 
@desc: 

"""
import subprocess
from typing import Union, List, Callable, Optional
import threading


class CMDUtils:
    """

    """

    @staticmethod
    def run_await_results(cmd: Union[str, List[str]],
                          timeout: Optional[int] = None) -> str:
        """
        阻塞執(zhí)行命令并返回結(jié)果(自動(dòng)剝離首尾空格)

        :param cmd: 命令(字符串或列表形式)
        :param timeout: 超時(shí)時(shí)間(秒)
        :return: 命令輸出(stdout 或 stderr)
        :raises: subprocess.CalledProcessError 當(dāng)命令返回非零狀態(tài)碼時(shí)
        """
        result = subprocess.run(
            cmd,
            capture_output=True,
            text=True,
            check=True,
            shell=isinstance(cmd, str),
            timeout=timeout
        )
        return result.stdout.strip()

    @staticmethod
    def run_background(cmd: Union[str, List[str]],
                       **kwargs) -> subprocess.Popen:
        """
        后臺(tái)非阻塞執(zhí)行命令

        :param cmd: 命令(字符串或列表形式)
        :param kwargs: 傳遞給 subprocess.Popen 的額外參數(shù)
        :return: Popen 對(duì)象(可通過 returncode 屬性檢查狀態(tài))
        """
        return subprocess.Popen(
            cmd,
            stdout=subprocess.DEVNULL,
            stderr=subprocess.DEVNULL,
            shell=isinstance(cmd, str),
            **kwargs
        )

    @staticmethod
    def run_realtime_output(cmd: Union[str, List[str]],
                            output_handler: Callable[[str], None] = print,
                            **kwargs) -> subprocess.Popen:
        """
        實(shí)時(shí)輸出命令執(zhí)行結(jié)果(非阻塞)

        :param cmd: 命令(字符串或列表形式)
        :param output_handler: 自定義輸出處理函數(shù)(默認(rèn)打印到控制臺(tái))
        :param kwargs: 傳遞給 subprocess.Popen 的額外參數(shù)
        :return: Popen 對(duì)象
        """

        def _enqueue_output(pipe, handler):
            for line in iter(pipe.readline, ''):
                handler(line.strip())
            pipe.close()

        proc = subprocess.Popen(
            cmd,
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT,
            text=True,
            shell=isinstance(cmd, str),
            **kwargs
        )

        # 啟動(dòng)獨(dú)立線程處理輸出
        threading.Thread(
            target=_enqueue_output,
            args=(proc.stdout, output_handler),
            daemon=True
        ).start()

        return proc

知識(shí)擴(kuò)展

Python實(shí)現(xiàn)微信導(dǎo)出群成員WXID

import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import threading
import requests
import json
import time
import base64
import io
try:
    from PIL import Image, ImageTk
    PIL_AVAILABLE = True
except ImportError:
    PIL_AVAILABLE = False
 
# 全局變量定義
token_id = None        # 接口Token
app_id = None          # 設(shè)備ID(appId)
logged_in = False      # 是否已登錄
account_nick = None    # 登錄賬戶昵稱(用于提示)
user_wxid = None       # 登錄賬戶的微信ID
 
# 初始化Tk窗口
root = tk.Tk()
root.title("Gewechat 工具")
root.geometry("800x600")
 
# 界面布局:登錄區(qū)、群列表區(qū)、批量加好友區(qū)、日志區(qū)
login_frame = ttk.Frame(root, padding=5)
group_frame = ttk.Frame(root, padding=5)
friend_frame = ttk.Frame(root, padding=5)
log_frame = ttk.Frame(root, padding=5)
 
login_frame.grid(row=0, column=0, sticky="NSW")
group_frame.grid(row=0, column=1, sticky="NS")
friend_frame.grid(row=0, column=2, sticky="NS")
log_frame.grid(row=1, column=0, columnspan=3, sticky="NSEW")
 
root.grid_columnconfigure(0, weight=1)
root.grid_columnconfigure(1, weight=1)
root.grid_columnconfigure(2, weight=1)
root.grid_rowconfigure(1, weight=1)
 
# 登錄區(qū)域
lbl_login_status = ttk.Label(login_frame, text="登錄狀態(tài):未登錄")
lbl_login_status.pack(pady=5)
qr_label = ttk.Label(login_frame, text="(請(qǐng)掃描二維碼登錄)", justify="center")
qr_label.pack()
 
# 群列表操作區(qū)域
group_buttons_frame = ttk.Frame(group_frame)
group_buttons_frame.pack(fill="x", pady=2)
btn_refresh_groups = ttk.Button(group_buttons_frame, text="獲取群列表")
btn_export_members = ttk.Button(group_buttons_frame, text="導(dǎo)出群成員")
btn_refresh_groups.pack(side="left", padx=2)
btn_export_members.pack(side="left", padx=2)
group_listbox = tk.Listbox(group_frame, height=15)
scrollbar_groups = ttk.Scrollbar(group_frame, orient="vertical", command=group_listbox.yview)
group_listbox.config(yscrollcommand=scrollbar_groups.set)
group_listbox.pack(side="left", fill="y", expand=True)
scrollbar_groups.pack(side="left", fill="y")
 
# 批量加好友區(qū)域
friend_label = ttk.Label(friend_frame, text="批量加好友(每行一個(gè)ID):")
friend_label.pack(anchor="w")
friend_text = tk.Text(friend_frame, width=30, height=10)
friend_text.pack(fill="both", expand=True)
btn_add_friends = ttk.Button(friend_frame, text="開始添加好友")
btn_add_friends.pack(pady=5)
 
# 日志輸出區(qū)域
log_label = ttk.Label(log_frame, text="日志輸出:")
log_label.pack(anchor="w")
log_text = tk.Text(log_frame, height=8)
log_text.pack(side="left", fill="both", expand=True)
log_scroll = ttk.Scrollbar(log_frame, orient="vertical", command=log_text.yview)
log_text.config(yscrollcommand=log_scroll.set, state="normal")
log_scroll.pack(side="right", fill="y")
 
def log_message(message: str):
    """在日志文本框追加消息(超過500字截?cái)啵?""
    truncated = message if len(message) <= 500 else message[:500] + "...(截?cái)?"
    def _append():
        log_text.insert(tk.END, truncated + "\n")
        log_text.see(tk.END)
    root.after(0, _append)
 
def save_credentials():
    """將當(dāng)前憑據(jù)保存到本地文件"""
    cred = {"appId": app_id, "tokenId": token_id}
    if user_wxid:
        cred["wxid"] = user_wxid
    try:
        with open("gewe_cred.json", "w", encoding="utf-8") as f:
            json.dump(cred, f, ensure_ascii=False, indent=4)
    except Exception as e:
        log_message(f"保存憑據(jù)失敗: {e}")
 
def load_credentials():
    """從本地文件加載上次保存的憑據(jù)"""
    global app_id, token_id
    try:
        with open("gewe_cred.json", "r", encoding="utf-8") as f:
            cred = json.load(f)
            app_id = cred.get("appId", "")
            token_id = cred.get("tokenId", "")
    except FileNotFoundError:
        app_id = ""
        token_id = ""
    except Exception as e:
        log_message(f"讀取憑據(jù)異常: {e}")
        app_id = ""
        token_id = ""
 
def http_post(endpoint: str, data: dict):
    """發(fā)送POST請(qǐng)求到Gewechat API并返回結(jié)果JSON(同時(shí)日志記錄請(qǐng)求和響應(yīng))"""
    url = base_url + endpoint
    try:
        payload_str = json.dumps(data, ensure_ascii=False)
    except Exception:
        payload_str = str(data)
    log_message(f"請(qǐng)求: POST {endpoint} {payload_str}")
    headers = {"Content-Type": "application/json"}
    if token_id:
        headers["X-GEWE-TOKEN"] = token_id
    try:
        resp = requests.post(url, json=data, headers=headers, timeout=10)
    except Exception as e:
        log_message(f"請(qǐng)求異常: {e}")
        return None
    resp_text = resp.text
    log_message(f"響應(yīng): {resp_text}")
    try:
        result = resp.json()
    except Exception:
        log_message("響應(yīng)非JSON格式或解析失敗")
        return None
    return result
 
def enable_ui_after_login():
    """登錄成功后,啟用各功能按鈕,并更新登錄狀態(tài)顯示"""
    btn_refresh_groups.config(state="normal")
    btn_export_members.config(state="normal")
    btn_add_friends.config(state="normal")
    status_text = "登錄成功"
    if account_nick:
        status_text = f"已登錄:{account_nick}"
    lbl_login_status.config(text=status_text)
    try:
        qr_label.config(image="", text="")  # 清除二維碼顯示
    except Exception:
        pass
 
def login_process():
    """登錄線程:檢查在線狀態(tài)或執(zhí)行掃碼登錄"""
    global logged_in, token_id, app_id, account_nick, user_wxid
    # 1. 嘗試使用已有token檢查是否在線
    if token_id:
        result = http_post("/login/checkOnline", {"appId": app_id})
        if result:
            ret = result.get("ret")
            data = result.get("data")
            if (ret == 200 or ret == 0) and data is True:
                # 當(dāng)前已在線
                logged_in = True
                log_message("當(dāng)前已在線,無需重復(fù)登錄")
                root.after(0, enable_ui_after_login)
                return
    # 2. 若不存在token或檢查結(jié)果離線,獲取新Token
    if not token_id or (result and result.get("ret") in [-1, 401, 404, 500] or result is None):
        log_message("獲取新的Token...")
        token_res = http_post("/tools/getTokenId", {})
        if token_res:
            if token_res.get("ret") in (200, 0):
                new_token = token_res.get("data") or token_res.get("token") or token_res.get("tokenId")
                if not new_token:
                    data_field = token_res.get("data")
                    if data_field and isinstance(data_field, dict):
                        new_token = data_field.get("token") or data_field.get("tokenId")
                if new_token:
                    token_id = new_token
                    log_message("Token獲取成功")
                else:
                    log_message("Token獲取失敗: 未返回token值")
            else:
                log_message(f"獲取Token失敗: {token_res.get('msg')}")
        else:
            log_message("獲取Token失敗: 無響應(yīng)")
        if not token_id:
            messagebox.showerror("登錄失敗", "無法獲取Token,登錄終止。")
            return
    # 3. 獲取登錄二維碼
    log_message("請(qǐng)求登錄二維碼...")
    req_app_id = app_id if app_id else ""
    payload = {"appId": req_app_id, "regionId": "320000"}
    qr_res = http_post("/login/getLoginQrCode", payload)
    if not qr_res or qr_res.get("ret") not in [200, 0]:
        log_message(f"獲取登錄二維碼失敗: {qr_res.get('msg') if qr_res else '無響應(yīng)'}")
        messagebox.showerror("登錄失敗", "獲取登錄二維碼失敗,請(qǐng)檢查服務(wù)器。")
        return
    qr_data = qr_res.get("data", {})
    new_app_id = qr_data.get("appId", "")
    if new_app_id:
        app_id = new_app_id
        log_message(f"使用設(shè)備ID: {app_id}")
    uuid = qr_data.get("uuid")
    if not uuid:
        qr_link = qr_data.get("qrData")
        if qr_link and "/x/" in qr_link:
            uuid = qr_link.split("/x/")[-1]
    qr_img_b64 = qr_data.get("qrImgBase64", "")
    if qr_img_b64:
        if qr_img_b64.startswith("data:image"):
            comma_index = qr_img_b64.find("base64,")
            if comma_index != -1:
                qr_img_b64 = qr_img_b64[comma_index+7:]
        try:
            img_data = base64.b64decode(qr_img_b64)
            if PIL_AVAILABLE:
                image = Image.open(io.BytesIO(img_data))
                tk_img = ImageTk.PhotoImage(image)
            else:
                tk_img = tk.PhotoImage(data=qr_img_b64)
            def show_qr():
                qr_label.config(image=tk_img)
                qr_label.image = tk_img
                lbl_login_status.config(text="請(qǐng)使用微信掃描二維碼登錄")
            root.after(0, show_qr)
        except Exception as e:
            log_message(f"二維碼顯示失敗: {e}")
    # 4. 輪詢檢查掃碼狀態(tài)
    log_message("等待掃碼確認(rèn)...")
    start_time = time.time()
    refresh_count = 0
    while not logged_in and refresh_count < 2:
        check_res = http_post("/login/checkLogin", {"appId": app_id, "uuid": uuid, "captchCode": ""})
        if check_res:
            ret = check_res.get("ret")
            data = check_res.get("data", {})
            if (ret == 200 or ret == 0) and data:
                status = data.get("status")
                if status == 0:
                    # 未掃碼
                    pass
                elif status == 1:
                    # 已掃碼,待確認(rèn)
                    nick = data.get("nickName")
                    if nick:
                        account_nick = nick
                        log_message(f"已掃碼,等待確認(rèn)登錄... (微信昵稱: {nick})")
                elif status == 2:
                    # 登錄成功
                    logged_in = True
                    login_info = data.get("loginInfo")
                    if login_info and isinstance(login_info, dict):
                        user_name = login_info.get("userName") or login_info.get("wxid")
                        if user_name:
                            log_message(f"登錄賬號(hào)ID: {user_name}")
                            user_wxid = user_name
                    if not account_nick:
                        account_nick = data.get("nickName") or (login_info.get("nickName") if login_info else None)
                    log_message("微信登錄成功")
                    break
            else:
                err_msg = check_res.get("msg") or (check_res.get("data", {}).get("msg") if isinstance(check_res.get("data"), dict) else "")
                log_message(f"登錄檢查失敗: {err_msg}")
        # 若超過約220秒未確認(rèn)且未登錄,嘗試刷新二維碼一次
        if time.time() - start_time > 220 and not logged_in and refresh_count < 1:
            log_message("二維碼已過期,正在獲取新的二維碼...")
            refresh_count += 1
            start_time = time.time()
            qr_res2 = http_post("/login/getLoginQrCode", {"appId": app_id, "regionId": "320000"})
            if qr_res2 and (qr_res2.get("ret") == 200 or qr_res2.get("ret") == 0):
                qr_data2 = qr_res2.get("data", {})
                uuid = qr_data2.get("uuid") or uuid
                qr_img_b64_new = qr_data2.get("qrImgBase64")
                if qr_img_b64_new:
                    if qr_img_b64_new.startswith("data:image"):
                        idx = qr_img_b64_new.find("base64,")
                        if idx != -1:
                            qr_img_b64_new = qr_img_b64_new[idx+7:]
                    try:
                        img_data = base64.b64decode(qr_img_b64_new)
                        if PIL_AVAILABLE:
                            image = Image.open(io.BytesIO(img_data))
                            tk_img2 = ImageTk.PhotoImage(image)
                        else:
                            tk_img2 = tk.PhotoImage(data=qr_img_b64_new)
                        def update_qr():
                            qr_label.config(image=tk_img2)
                            qr_label.image = tk_img2
                        root.after(0, update_qr)
                    except Exception as e:
                        log_message(f"新二維碼顯示失敗: {e}")
                log_message("請(qǐng)掃描新的二維碼")
            else:
                log_message("無法刷新二維碼,登錄失敗")
                break
        time.sleep(2)
    if not logged_in:
        log_message("登錄超時(shí)或失敗")
        messagebox.showwarning("登錄失敗", "二維碼超時(shí),請(qǐng)重新運(yùn)行程序重試。")
        return
    # 5. 登錄成功后,啟用功能并保存憑據(jù)
    root.after(0, enable_ui_after_login)
    save_credentials()
 
# 獲取群列表線程函數(shù)
def refresh_groups():
    global group_ids
    log_message("獲取通訊錄列表...")
    res = http_post("/contacts/fetchContactsList", {"appId": app_id})
    if not res or res.get("ret") not in [0, 200]:
        log_message("獲取通訊錄列表失敗")
        root.after(0, lambda: messagebox.showerror("錯(cuò)誤", "獲取群列表失敗"))
        return
    data = res.get("data", {})
    chatrooms = data.get("chatrooms", [])
    if not chatrooms:
        log_message("未獲取到任何群聊")
        root.after(0, lambda: messagebox.showinfo("結(jié)果", "通訊錄中沒有群聊"))
        return
    log_message(f"獲取到{len(chatrooms)}個(gè)群ID,正在獲取群名稱...")
    # 獲取群/好友簡(jiǎn)要信息以獲得群名稱
    info_res = http_post("/contacts/getContactInfo", {"appId": app_id, "userNames": chatrooms})
    group_name_list = []
    group_ids = []
    if info_res and (info_res.get("ret") == 0 or info_res.get("ret") == 200):
        info_data = info_res.get("data")
        if info_data:
            if isinstance(info_data, list):
                infos = info_data
            elif isinstance(info_data, dict) and info_data.get("contacts"):
                infos = info_data.get("contacts")
            elif isinstance(info_data, dict):
                infos = []
                for val in info_data.values():
                    if isinstance(val, dict):
                        infos.append(val)
            else:
                infos = []
            for info in infos:
                name = info.get("nickName") or info.get("userName")
                uid = info.get("userName") or info.get("wxid")
                if name:
                    group_name_list.append(name)
                    group_ids.append(uid)
    else:
        group_name_list = chatrooms
        group_ids = chatrooms
    def update_listbox():
        group_listbox.delete(0, tk.END)
        for name in group_name_list:
            group_listbox.insert(tk.END, name)
    root.after(0, update_listbox)
    log_message("群列表更新完成")
 
# 啟動(dòng)群成員導(dǎo)出線程(由按鈕觸發(fā))
def start_refresh_groups():
    threading.Thread(target=refresh_groups, daemon=True).start()
 
def start_export_members():
    # 主線程讀取選中項(xiàng)
    sel = group_listbox.curselection()
    if not sel:
        messagebox.showinfo("提示", "請(qǐng)先選擇一個(gè)群組")
        return
    index = sel[0]
    if index >= len(group_ids):
        messagebox.showerror("錯(cuò)誤", "群組選擇無效")
        return
    gid = group_ids[index]
    gname = group_listbox.get(index)
    def export_thread(group_id, group_name):
        log_message(f"正在導(dǎo)出群成員: {group_name} ({group_id})")
        res = http_post("/group/getChatroomMemberList", {"appId": app_id, "chatroomId": group_id})
        if not res or res.get("ret") not in [0, 200]:
            log_message("獲取群成員列表失敗")
            root.after(0, lambda: messagebox.showerror("錯(cuò)誤", f"獲取群成員失敗: {res.get('msg') if res else '無響應(yīng)'}"))
            return
        data = res.get("data", {})
        members = []
        if data:
            if "memberList" in data:
                members = data["memberList"]
            elif "members" in data and isinstance(data["members"], list) and data["members"] and isinstance(data["members"][0], dict):
                members = data["members"]
            elif isinstance(data, list):
                members = data
        if not members:
            log_message("群成員列表為空或解析失敗")
            root.after(0, lambda: messagebox.showinfo("提示", "未獲取到群成員信息"))
            return
        safe_name = "".join([c if c not in r'\/:*?"<>|' else "_" for c in group_name])
        if not safe_name:
            safe_name = group_id.replace("@chatroom", "")
        filename = f"{safe_name}_members.csv"
        try:
            with open(filename, "w", encoding="utf-8-sig") as f:
                f.write("微信ID,昵稱\n")
                for member in members:
                    wxid_val = member.get("wxid") or member.get("userName") or ""
                    nick_val = member.get("nickName") or ""
                    wxid_val = str(wxid_val).replace(",", " ")
                    nick_val = str(nick_val).replace(",", " ")
                    f.write(f"{wxid_val},{nick_val}\n")
            log_message(f"群成員已導(dǎo)出到文件: {filename}")
            root.after(0, lambda: messagebox.showinfo("導(dǎo)出完成", f"群成員列表已保存至 {filename}"))
        except Exception as e:
            log_message(f"導(dǎo)出文件寫入失敗: {e}")
            root.after(0, lambda: messagebox.showerror("錯(cuò)誤", f"導(dǎo)出文件失敗: {e}"))
    threading.Thread(target=export_thread, args=(gid, gname), daemon=True).start()
 
def start_add_friends():
    # 主線程獲取文本框內(nèi)容
    lines = friend_text.get("1.0", tk.END).strip().splitlines()
    ids_to_add = [line.strip() for line in lines if line.strip()]
    if not ids_to_add:
        messagebox.showinfo("提示", "請(qǐng)?jiān)谖谋究蛑休斎胍砑拥暮糜袸D,每行一個(gè)")
        return
    verify_message = "你好,我是通過群聊添加您為好友。"
    def add_thread(id_list):
        for wxid in id_list:
            log_message(f"搜索好友: {wxid}")
            search_res = http_post("/contacts/search", {"appId": app_id, "contactsInfo": wxid})
            if not search_res or search_res.get("ret") not in [0, 200]:
                log_message(f"搜索失敗: 無法找到 {wxid}")
                continue
            search_data = search_res.get("data", {})
            v3 = search_data.get("v3")
            v4 = search_data.get("v4")
            nick = search_data.get("nickName")
            if not v3 or not v4:
                log_message(f"無法添加 {wxid}: 未獲取到v3/v4")
                continue
            log_message(f"發(fā)送好友申請(qǐng)給 {wxid} (昵稱: {nick})")
            add_payload = {"appId": app_id, "v3": v3, "v4": v4, "scene": 3, "content": verify_message, "option": 2}
            add_res = http_post("/contacts/addContacts", add_payload)
            if add_res and (add_res.get("ret") == 0 or add_res.get("ret") == 200):
                log_message(f"已發(fā)送好友請(qǐng)求給 {wxid}")
            else:
                msg = add_res.get("msg") if add_res else "無響應(yīng)"
                log_message(f"添加好友失敗: {wxid} - {msg}")
        root.after(0, lambda: messagebox.showinfo("完成", "批量加好友操作完成,請(qǐng)查看日志獲取詳情。"))
    threading.Thread(target=add_thread, args=(ids_to_add,), daemon=True).start()
 
# 將按鈕點(diǎn)擊事件綁定到相應(yīng)線程啟動(dòng)函數(shù)
btn_refresh_groups.config(command=start_refresh_groups, state="disabled")
btn_export_members.config(command=start_export_members, state="disabled")
btn_add_friends.config(command=start_add_friends, state="disabled")
 
# 設(shè)置Gewechat服務(wù)的API地址(本地默認(rèn)端口2531)
base_url = "http://192.168.175.145:2531/v2/api"
group_ids = []  # 全局群ID列表(與列表框序號(hào)對(duì)應(yīng))
 
# 嘗試使用已保存的憑據(jù)自動(dòng)登錄,然后啟動(dòng)登錄線程
load_credentials()
threading.Thread(target=login_process, daemon=True).start()
root.mainloop()

到此這篇關(guān)于使用Python實(shí)現(xiàn)獲取本機(jī)當(dāng)前用戶登陸過的微信ID的文章就介紹到這了,更多相關(guān)Python獲取本機(jī)微信ID內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python實(shí)現(xiàn)LM算法的示例代碼

    Python實(shí)現(xiàn)LM算法的示例代碼

    L-M方法全稱Levenberg-Marquardt方法,是一種非線性最小二乘優(yōu)化算法,這篇文章整理了該算法的Python和C++實(shí)現(xiàn)方法,需要的可以參考一下
    2023-06-06
  • Python實(shí)現(xiàn)自定義讀寫分離代碼實(shí)例

    Python實(shí)現(xiàn)自定義讀寫分離代碼實(shí)例

    這篇文章主要介紹了Python實(shí)現(xiàn)自定義讀寫分離代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Python調(diào)用Deepseek API的四種常見錯(cuò)誤及解決方法

    Python調(diào)用Deepseek API的四種常見錯(cuò)誤及解決方法

    掌握Python調(diào)用Deepseek API的正確方法,避開常見錯(cuò)誤,本文提供完整示例代碼,解析認(rèn)證失敗、參數(shù)錯(cuò)誤等4大問題,適用于AI模型集成與自動(dòng)化場(chǎng)景,提升開發(fā)效率,附詳細(xì)排錯(cuò)指南,需要的朋友可以參考下
    2026-03-03
  • Pytorch訓(xùn)練網(wǎng)絡(luò)過程中l(wèi)oss突然變?yōu)?的解決方案

    Pytorch訓(xùn)練網(wǎng)絡(luò)過程中l(wèi)oss突然變?yōu)?的解決方案

    這篇文章主要介紹了Pytorch訓(xùn)練網(wǎng)絡(luò)過程中l(wèi)oss突然變?yōu)?的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • 使用Python FastAPI構(gòu)建Web服務(wù)的實(shí)現(xiàn)

    使用Python FastAPI構(gòu)建Web服務(wù)的實(shí)現(xiàn)

    這篇文章主要介紹了使用Python FastAPI構(gòu)建Web服務(wù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Python 爬蟲圖片簡(jiǎn)單實(shí)現(xiàn)

    Python 爬蟲圖片簡(jiǎn)單實(shí)現(xiàn)

    這篇文章主要介紹了Python 爬蟲圖片簡(jiǎn)單實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 詳解Python3 基本數(shù)據(jù)類型

    詳解Python3 基本數(shù)據(jù)類型

    這篇文章主要介紹了Python3 基本數(shù)據(jù)類型,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • MATLAB 如何求取離散點(diǎn)的曲率最大值

    MATLAB 如何求取離散點(diǎn)的曲率最大值

    這篇文章主要介紹了MATLAB 求取離散點(diǎn)的曲率最大值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 用Python代碼自動(dòng)生成文獻(xiàn)的IEEE引用格式的實(shí)現(xiàn)

    用Python代碼自動(dòng)生成文獻(xiàn)的IEEE引用格式的實(shí)現(xiàn)

    這篇文章主要介紹了用Python代碼自動(dòng)生成文獻(xiàn)的IEEE引用格式的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 在python中安裝basemap的教程

    在python中安裝basemap的教程

    這篇文章主要介紹了在python中安裝basemap的教程,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-09-09

最新評(píng)論

宣威市| 江北区| 林芝县| 县级市| 会泽县| 若尔盖县| 焉耆| 启东市| 永昌县| 台中市| 定州市| 诸暨市| 肇源县| 通城县| 铜陵市| 长岭县| 四会市| 信阳市| 来安县| 满洲里市| 渭源县| 洞口县| 霍州市| 平湖市| 甘肃省| 陕西省| 蓬溪县| 定安县| 德庆县| 房产| 呼图壁县| 察哈| 渭南市| 阳西县| 通化县| 余庆县| 筠连县| 广元市| 甘肃省| 白山市| 繁昌县|