Compare commits

..

12 Commits

Author SHA1 Message Date
yeongpin
30418e36a5 Update version to 1.11.03 and document changes in CHANGELOG.md, including improvements to TempMailPlus email detection logic and fixes for Windows user directory path issues. 2025-05-06 13:33:40 +08:00
Pin Studios
baec0937c3 Merge pull request #832 from AmzGrainRain/main
修正 windows 环境下用户目录的获取方式
2025-05-02 12:13:57 +08:00
Pin Studios
bdbec76a7b Merge pull request #829 from cjahv/main
在 README.md 中新增 TempMailPlus 配置项说明
2025-05-02 12:13:03 +08:00
AmzGrainRain
3386d8e08e 修正 windows 环境下用户目录的获取方式 2025-05-01 14:37:36 +08:00
jahv
76179807bc 在README.md中新增TempMailPlus配置选项,包含启用状态、电子邮件地址和PIN码设置,以支持邮件验证功能的扩展。 2025-04-30 23:12:12 +08:00
Pin Studios
f8499708c9 Merge pull request #823 from cjahv/main
🚀 更新 TempMailPlus 的 Cursor 邮件识别逻辑
2025-04-30 17:10:20 +08:00
Pin Studios
4a459574ad Enhance TempMailPlus integration by adding translator support for internationalization, improving error messages, and updating the email tab interface documentation. Additionally, update localization files for multiple languages to include new translation keys related to email verification processes. 2025-04-30 17:09:53 +08:00
jahv
2d1604c646 增强邮件验证功能,新增发件人邮箱检查,确保发件人包含'cursor'字符串以提高邮件处理的准确性。 2025-04-30 07:56:28 +08:00
jahv
be950c510c 增强邮件检查功能,新增验证码缓存机制,优化获取验证码的方法,并更新相关文档注释。 2025-04-30 07:49:54 +08:00
jahv
e190a81ee4 优化邮件检查功能,简化逻辑,直接检查邮件列表中的第一个邮件是否为新邮件,并更新相关文档注释。 2025-04-30 07:41:12 +08:00
cjahv
fa74b17dce Merge branch 'yeongpin:main' into main 2025-04-29 10:17:23 +08:00
jahv
db490718c5 更新邮件检查功能,支持检查最近3分钟内的邮件,并更新错误处理信息。同时,添加了主程序入口以便于直接运行和测试TempMailPlusTab类。 2025-04-29 10:07:02 +08:00
26 changed files with 322 additions and 29 deletions

4
.env
View File

@@ -1,2 +1,2 @@
version=1.11.02
VERSION=1.11.02
version=1.11.03
VERSION=1.11.03

View File

@@ -1,5 +1,10 @@
# Change Log
## v1.11.03
1. Update: TempMailPlus Cursor Email Detection Logic | 更新 TempMailPlus Cursor 邮件识别逻辑
2. Fix: Windows User Directory Path | 修正 windows 环境下用户目录的获取方式
3. Fix: Some Issues | 修復一些問題
## v1.11.02
1. Fill: Missing Translationsar, zh-cn, zh-tw, vi, nl, de, fr, pt, ru, tr, bg, es, ja, it | 填補缺失的翻譯
2. Add: Japanese and Italian language support

View File

@@ -159,6 +159,14 @@ check_update = True
# Show Account Info | 顯示賬號信息
show_account_info = True
[TempMailPlus]
# Enable TempMailPlus | 啓用 TempMailPlus任何轉發到TempMailPlus的郵件都支持獲取驗證碼例如cloudflare郵件Catch-all
enabled = false
# TempMailPlus Email | TempMailPlus 電子郵件
email = xxxxx@mailto.plus
# TempMailPlus pin | TempMailPlus pin碼
epin =
[WindowsPaths]
storage_path = C:\Users\yeongpin\AppData\Roaming\Cursor\User\globalStorage\storage.json
sqlite_path = C:\Users\yeongpin\AppData\Roaming\Cursor\User\globalStorage\state.vscdb

View File

@@ -26,7 +26,14 @@ EMOJI = {
def get_user_documents_path():
"""Get user Documents folder path"""
if sys.platform == "win32":
return os.path.join(os.path.expanduser("~"), "Documents")
try:
import winreg
with winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders") as key:
documents_path, _ = winreg.QueryValueEx(key, "Personal")
return documents_path
except Exception as e:
# fallback
return os.path.join(os.path.expanduser("~"), "Documents")
elif sys.platform == "darwin":
return os.path.join(os.path.expanduser("~"), "Documents")
else: # Linux

View File

@@ -112,7 +112,7 @@ class CursorRegistration:
epin = config.get('TempMailPlus', 'epin')
if email and epin:
from email_tabs.tempmail_plus_tab import TempMailPlusTab
email_tab = TempMailPlusTab(email, epin)
email_tab = TempMailPlusTab(email, epin, self.translator)
print(f"{Fore.CYAN}{EMOJI['MAIL']} {self.translator.get('register.using_tempmail_plus')}{Style.RESET_ALL}")
# Use new_signup.py directly for registration

View File

@@ -1,7 +1,7 @@
from abc import ABC, abstractmethod
class EmailTabInterface(ABC):
"""Email tab interface for handling email verification"""
"""Interface for email tab implementations"""
@abstractmethod
def refresh_inbox(self) -> None:
@@ -10,10 +10,10 @@ class EmailTabInterface(ABC):
@abstractmethod
def check_for_cursor_email(self) -> bool:
"""Check if there is a verification email from Cursor
"""Check if there is a new email from Cursor
Returns:
bool: True if verification email exists, False otherwise
bool: True if new email found, False otherwise
"""
pass
@@ -22,6 +22,6 @@ class EmailTabInterface(ABC):
"""Get the verification code from the email
Returns:
str: The verification code if found, empty string otherwise
str: The verification code if available, empty string otherwise
"""
pass

View File

@@ -1,20 +1,23 @@
import requests
import re
import datetime
from typing import Optional
from .email_tab_interface import EmailTabInterface
class TempMailPlusTab(EmailTabInterface):
"""Implementation of EmailTabInterface for tempmail.plus"""
def __init__(self, email: str, epin: str):
def __init__(self, email: str, epin: str, translator=None):
"""Initialize TempMailPlusTab
Args:
email: The email address to check
epin: The epin token for authentication
translator: Optional translator for internationalization
"""
self.email = email
self.epin = epin
self.translator = translator
self.base_url = "https://tempmail.plus/api"
self.headers = {
'accept': 'application/json',
@@ -33,16 +36,17 @@ class TempMailPlusTab(EmailTabInterface):
}
self.cookies = {'email': email}
self._cached_mail_id = None # 缓存mail_id
self._cached_verification_code = None # 缓存验证码
def refresh_inbox(self) -> None:
"""Refresh the email inbox"""
pass
def check_for_cursor_email(self) -> bool:
"""Check if there is a verification email from Cursor
"""Check if there is a new email and immediately retrieve verification code
Returns:
bool: True if verification email exists, False otherwise
bool: True if new email found and verification code retrieved, False otherwise
"""
try:
params = {
@@ -59,28 +63,30 @@ class TempMailPlusTab(EmailTabInterface):
data = response.json()
if data.get('result') and data.get('mail_list'):
for mail in data['mail_list']:
if 'cursor.sh' in mail.get('from_mail', '') and mail.get('is_new') == True:
self._cached_mail_id = mail.get('mail_id') # 缓存mail_id
# 检查邮件列表中的第一个邮件是否为新邮件
if data['mail_list'][0].get('is_new') == True:
self._cached_mail_id = data['mail_list'][0].get('mail_id') # 缓存mail_id
# 立即获取验证码
verification_code = self._extract_verification_code()
if verification_code:
self._cached_verification_code = verification_code
return True
return False
except Exception as e:
print(f"检查Cursor邮件失败: {str(e)}")
print(f"{self.translator.get('tempmail.check_email_failed', error=str(e)) if self.translator else f'Check email failed: {str(e)}'}")
return False
def get_verification_code(self) -> str:
"""Get the verification code from the email
def _extract_verification_code(self) -> str:
"""Extract verification code from email content
Returns:
str: The verification code if found, empty string otherwise
"""
try:
# 如果没有缓存的mail_id先检查是否有新邮件
if not self._cached_mail_id:
if not self.check_for_cursor_email():
return ""
# 使用缓存的mail_id获取邮件内容
return ""
params = {
'email': self.email,
'epin': self.epin
@@ -97,6 +103,11 @@ class TempMailPlusTab(EmailTabInterface):
if not data.get('result'):
return ""
# 验证发件人邮箱是否包含cursor字符串
from_mail = data.get('from_mail', '')
if 'cursor' not in from_mail.lower():
return ""
# Extract verification code from text content using regex
text = data.get('text', '')
match = re.search(r'\n\n(\d{6})\n\n', text)
@@ -105,5 +116,58 @@ class TempMailPlusTab(EmailTabInterface):
return ""
except Exception as e:
print(f"获取验证码失败: {str(e)}")
return ""
print(f"{self.translator.get('tempmail.extract_code_failed', error=str(e)) if self.translator else f'Extract verification code failed: {str(e)}'}")
return ""
def get_verification_code(self) -> str:
"""Get the verification code from cache
Returns:
str: The cached verification code if available, empty string otherwise
"""
return self._cached_verification_code or ""
if __name__ == "__main__":
import os
import time
import sys
import configparser
from config import get_config
# 尝试导入 translator
try:
from main import Translator
translator = Translator()
except ImportError:
translator = None
config = get_config(translator)
try:
email = config.get('TempMailPlus', 'email')
epin = config.get('TempMailPlus', 'epin')
print(f"{translator.get('tempmail.configured_email', email=email) if translator else f'Configured email: {email}'}")
# 初始化TempMailPlusTab传递 translator
mail_tab = TempMailPlusTab(email, epin, translator)
# 检查是否有Cursor的邮件
print(f"{translator.get('tempmail.checking_email') if translator else 'Checking for Cursor verification email...'}")
if mail_tab.check_for_cursor_email():
print(f"{translator.get('tempmail.email_found') if translator else 'Found Cursor verification email'}")
# 获取验证码
verification_code = mail_tab.get_verification_code()
if verification_code:
print(f"{translator.get('tempmail.verification_code', code=verification_code) if translator else f'Verification code: {verification_code}'}")
else:
print(f"{translator.get('tempmail.no_code') if translator else 'Could not get verification code'}")
else:
print(f"{translator.get('tempmail.no_email') if translator else 'No Cursor verification email found'}")
except configparser.Error as e:
print(f"{translator.get('tempmail.config_error', error=str(e)) if translator else f'Config file error: {str(e)}'}")
except Exception as e:
print(f"{translator.get('tempmail.general_error', error=str(e)) if translator else f'An error occurred: {str(e)}'}")

View File

@@ -850,5 +850,17 @@
"updating_database": "تحديث قاعدة بيانات مصادقة المؤشر ...",
"title": "مصادقة المؤشر اليدوي",
"auth_update_failed": "فشل في تحديث معلومات المصادقة"
},
"tempmail": {
"config_error": "خطأ في ملف التكوين: {error}",
"no_email": "لم يتم العثور على بريد إلكتروني للتحقق من المؤشر",
"general_error": "حدث خطأ: {error}",
"checking_email": "التحقق من البريد الإلكتروني للتحقق من المؤشر ...",
"extract_code_failed": "فشل استخراج رمز التحقق: {error}",
"configured_email": "البريد الإلكتروني المكون: {البريد الإلكتروني}",
"check_email_failed": "فشل التحقق من البريد الإلكتروني: {error}",
"no_code": "لا يمكن الحصول على رمز التحقق",
"email_found": "تم العثور على البريد الإلكتروني للتحقق من المؤشر",
"verification_code": "رمز التحقق: {code}"
}
}

View File

@@ -863,5 +863,17 @@
"auth_update_failed": "Неуспешно актуализиране на информацията за удостоверяване",
"title": "Ръчно удостоверяване на курсора",
"updating_database": "Актуализиране на базата данни за удостоверяване на курсора ..."
},
"tempmail": {
"no_email": "Не е намерен имейл за проверка на курсора",
"config_error": "Грешка в конфигурацията на файла: {грешка}",
"general_error": "Възникна грешка: {грешка}",
"configured_email": "Конфигуриран имейл: {имейл}",
"extract_code_failed": "Кодът за проверка на екстракт не успя: {Грешка}",
"checking_email": "Проверка за имейл за проверка на курсора ...",
"no_code": "Не можа да получи код за проверка",
"email_found": "Намерен имейл за проверка на курсора",
"check_email_failed": "Проверете имейла не е успешен: {Грешка}",
"verification_code": "Код за проверка: {код}"
}
}

View File

@@ -862,5 +862,17 @@
"description": "Dieses Tool modifiziert die Datei workbench.desktop.main.js, um die Token -Grenze zu umgehen",
"press_enter": "Drücken Sie die Eingabetaste, um fortzufahren ...",
"title": "Bypass Token Limit Tool"
},
"tempmail": {
"no_email": "Keine Cursorüberprüfungs -E -Mail gefunden",
"general_error": "Es ist ein Fehler aufgetreten: {Fehler}",
"config_error": "Konfigurationsdateifehler: {Fehler}",
"checking_email": "Überprüfung nach Cursor -Überprüfungs -E -Mail ...",
"extract_code_failed": "Verifizierungscode extrahieren fehlgeschlagen: {Fehler}",
"configured_email": "Konfigurierte E -Mail: {E -Mail}",
"no_code": "Konnte keinen Bestätigungscode erhalten",
"check_email_failed": "Überprüfen Sie die E -Mail fehlgeschlagen: {Fehler}",
"email_found": "Gefundene Cursor -Überprüfungs -E -Mail gefunden",
"verification_code": "Überprüfungscode: {Code}"
}
}

View File

@@ -850,5 +850,17 @@
"auth_updated_successfully": "Authentication information updated successfully!",
"auth_update_failed": "Failed to update authentication information",
"error": "Error: {error}"
},
"tempmail": {
"check_email_failed": "Check email failed: {error}",
"extract_code_failed": "Extract verification code failed: {error}",
"configured_email": "Configured email: {email}",
"checking_email": "Checking for Cursor verification email...",
"email_found": "Found Cursor verification email",
"verification_code": "Verification code: {code}",
"no_code": "Could not get verification code",
"no_email": "No Cursor verification email found",
"config_error": "Config file error: {error}",
"general_error": "An error occurred: {error}"
}
}

View File

@@ -862,5 +862,17 @@
"description": "Esta herramienta modifica el archivo workbench.desktop.main.js para evitar el límite del token",
"press_enter": "Presione Entrar para continuar ...",
"title": "Herramienta de límite de token de derivación"
},
"tempmail": {
"general_error": "Se produjo un error: {error}",
"config_error": "Error de archivo de configuración: {error}",
"no_email": "No se encuentra el correo electrónico de verificación del cursor",
"checking_email": "Comprobación del correo electrónico de verificación del cursor ...",
"configured_email": "Correo electrónico configurado: {correo electrónico}",
"extract_code_failed": "Extraer el código de verificación fallido: {error}",
"no_code": "No pudo obtener el código de verificación",
"check_email_failed": "Verifique el correo electrónico fallido: {error}",
"email_found": "Correo electrónico de verificación del cursor encontrado",
"verification_code": "Código de verificación: {código}"
}
}

View File

@@ -862,5 +862,17 @@
"description": "Cet outil modifie le fichier workbench.desktop.main.js pour contourner la limite de jeton",
"press_enter": "Appuyez sur Entrée pour continuer ...",
"title": "Outil de limite de jeton de contournement"
},
"tempmail": {
"no_email": "Aucun e-mail de vérification du curseur trouvé",
"general_error": "Une erreur s'est produite: {erreur}",
"config_error": "Erreur de fichier de configuration: {erreur}",
"configured_email": "Email configuré: {e-mail}",
"extract_code_failed": "Extraire le code de vérification a échoué: {error}",
"checking_email": "Vérification du courrier électronique de vérification du curseur ...",
"email_found": "Email de vérification du curseur trouvé",
"no_code": "Impossible d'obtenir le code de vérification",
"check_email_failed": "Vérifier l'échec de l'e-mail: {Erreur}",
"verification_code": "Code de vérification: {code}"
}
}

View File

@@ -850,5 +850,17 @@
"description": "Questo strumento modifica il file workbench.desktop.main.js per bypassare il limite token",
"press_enter": "Premere Invio per continuare ...",
"title": "Strumento di limite di bypass token"
},
"tempmail": {
"config_error": "Errore del file di configurazione: {errore}",
"no_email": "Nessuna e -mail di verifica del cursore trovato",
"general_error": "Si è verificato un errore: {errore}",
"extract_code_failed": "Extract Verifica Codice non riuscito: {errore}",
"configured_email": "Email configurata: {email}",
"no_code": "Impossibile ottenere il codice di verifica",
"checking_email": "Verificare la verifica della verifica del cursore ...",
"check_email_failed": "Controlla l'e -mail non riuscita: {errore}",
"email_found": "Email di verifica del cursore trovato",
"verification_code": "Codice di verifica: {codice}"
}
}

View File

@@ -850,5 +850,17 @@
"title": "手動カーソル認証",
"updating_database": "カーソル認証データベースの更新...",
"auth_update_failed": "認証情報の更新に失敗しました"
},
"tempmail": {
"general_error": "エラーが発生しました:{エラー}",
"no_email": "カーソル検証メールは見つかりません",
"config_error": "構成ファイルエラー:{エラー}",
"checking_email": "カーソル検証メールの確認...",
"extract_code_failed": "検証コードが失敗した抽出:{エラー}",
"configured_email": "構成された電子メール:{電子メール}",
"email_found": "カーソル検証メールが見つかりました",
"no_code": "確認コードを取得できませんでした",
"check_email_failed": "電子メールの失敗を確認する:{エラー}",
"verification_code": "検証コード:{code}"
}
}

View File

@@ -862,5 +862,17 @@
"description": "Deze tool wijzigt het bestand Workbench.desktop.main.js om de tokenlimiet te omzeilen",
"press_enter": "Druk op Enter om door te gaan ...",
"title": "Omzeilen token limiet tool"
},
"tempmail": {
"no_email": "Geen cursorverificatie -e -mail gevonden",
"general_error": "Er is een fout opgetreden: {error}",
"config_error": "Config -bestandsfout: {error}",
"checking_email": "Controleren op cursorverificatie -e -mail ...",
"extract_code_failed": "Extract Verificatiecode mislukt: {error}",
"configured_email": "Geconfigureerd e -mail: {e -mail}",
"no_code": "Kon geen verificatiecode krijgen",
"email_found": "Cursor Verificatie -e -mail gevonden",
"check_email_failed": "Controleer e -mail mislukt: {error}",
"verification_code": "Verificatiecode: {code}"
}
}

View File

@@ -862,5 +862,17 @@
"description": "Esta ferramenta modifica o arquivo workbench.desktop.main.js para ignorar o limite do token",
"press_enter": "Pressione Enter para continuar ...",
"title": "Ipassue Token Limit Tool"
},
"tempmail": {
"config_error": "Erro de arquivo de configuração: {erro}",
"general_error": "Ocorreu um erro: {erro}",
"no_email": "Nenhum e -mail de verificação do cursor encontrado",
"extract_code_failed": "Código de verificação de extração falhou: {erro}",
"checking_email": "Verificando o e -mail de verificação do cursor ...",
"configured_email": "Email configurado: {email}",
"no_code": "Não foi possível obter o código de verificação",
"check_email_failed": "Verifique o e -mail falhado: {erro}",
"verification_code": "Código de verificação: {code}",
"email_found": "E -mail de verificação do cursor encontrado"
}
}

View File

@@ -862,5 +862,17 @@
"description": "Этот инструмент изменяет файл workbench.desktop.main.js, чтобы обойти предел токена",
"press_enter": "Нажмите Enter, чтобы продолжить ...",
"title": "Инструмент ограничения обхода токена"
},
"tempmail": {
"no_email": "Электронное письмо с проверкой курсора не найдено",
"config_error": "Ошибка файла конфигурации: {ошибка}",
"extract_code_failed": "Установка кода извлечения проверки: {ошибка}",
"general_error": "Произошла ошибка: {ошибка}",
"no_code": "Не удалось получить код проверки",
"checking_email": "Проверка на проверку курсора по электронной почте ...",
"configured_email": "Настройка электронной почты: {электронная почта}",
"check_email_failed": "Проверка по электронной почте не удастся: {ошибка}",
"verification_code": "Код проверки: {код}",
"email_found": "Найдено электронное письмо с проверкой курсора"
}
}

View File

@@ -862,5 +862,17 @@
"description": "Bu araç, jeton sınırını atlamak için workbench.desktop.main.js dosyasını değiştirir",
"press_enter": "Devam etmek için Enter tuşuna basın ...",
"title": "Baypas Token Limit Aracı"
},
"tempmail": {
"general_error": "Bir hata oluştu: {hata}",
"no_email": "İmleç doğrulama e -postası bulunamadı",
"config_error": "Yapılandırma dosya hatası: {error}",
"extract_code_failed": ıkarma Doğrulama Kodu Başarısız: {Hata}",
"configured_email": "Yapılandırılmış e -posta: {e -posta}",
"checking_email": "İmleç doğrulama e -postasını kontrol etmek ...",
"check_email_failed": "E -postanın başarısız olduğunu kontrol edin: {hata}",
"no_code": "Doğrulama kodu alamadı",
"email_found": "İmleç doğrulama e -postası bulundu",
"verification_code": "Doğrulama kodu: {kod}"
}
}

View File

@@ -863,5 +863,17 @@
"profile": "Hồ sơ {Number}",
"profile_list": "Có sẵn {trình duyệt} Hồ sơ:",
"invalid_selection": "Lựa chọn không hợp lệ. Hãy thử lại."
},
"tempmail": {
"config_error": "Lỗi tệp cấu hình: {error}",
"general_error": "Đã xảy ra lỗi: {lỗi}",
"no_email": "Không tìm thấy email xác minh con trỏ",
"checking_email": "Kiểm tra email xác minh con trỏ ...",
"configured_email": "Email được định cấu hình: {email}",
"extract_code_failed": "Trích xuất mã xác minh không thành công: {error}",
"no_code": "Không thể nhận mã xác minh",
"check_email_failed": "Kiểm tra email không thành công: {lỗi}",
"email_found": "Tìm thấy email xác minh con trỏ",
"verification_code": "Mã xác minh: {code}"
}
}

View File

@@ -854,5 +854,17 @@
"title": "手动Cursor身份验证",
"token_verified": "令牌成功验证了!",
"updating_database": "更新Cursor身份验证数据库..."
},
"tempmail": {
"general_error": "发生错误:{error}",
"no_email": "找不到Cursor验证电子邮件",
"configured_email": "配置的电子邮件:{email}",
"config_error": "配置文件错误:{error}",
"extract_code_failed": "提取验证代码失败:{error}",
"no_code": "无法获得验证代码",
"check_email_failed": "检查电子邮件失败:{error}",
"checking_email": "检查Cursor验证电子邮件...",
"email_found": "找到Cursor验证电子邮件",
"verification_code": "验证代码:{code}"
}
}

View File

@@ -869,5 +869,17 @@
"title": "手動Cursor身份驗證",
"updating_database": "更新Cursor身份驗證數據庫...",
"auth_update_failed": "無法更新身份驗證信息"
},
"tempmail": {
"general_error": "發生錯誤:{error}",
"config_error": "配置文件錯誤:{error}",
"no_email": "找不到Cursor驗證電子郵件",
"checking_email": "檢查Cursor驗證電子郵件...",
"extract_code_failed": "提取驗證代碼失敗:{error}",
"configured_email": "配置的電子郵件:{email}",
"no_code": "無法獲得驗證代碼",
"check_email_failed": "檢查電子郵件失敗:{error}",
"email_found": "找到Cursor驗證電子郵件",
"verification_code": "驗證代碼:{code}"
}
}

View File

@@ -116,7 +116,14 @@ def fill_signup_form(page, first_name, last_name, email, config, translator=None
def get_user_documents_path():
"""Get user Documents folder path"""
if sys.platform == "win32":
return os.path.join(os.path.expanduser("~"), "Documents")
try:
import winreg
with winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders") as key:
documents_path, _ = winreg.QueryValueEx(key, "Personal")
return documents_path
except Exception as e:
# fallback
return os.path.join(os.path.expanduser("~"), "Documents")
elif sys.platform == "darwin":
return os.path.join(os.path.expanduser("~"), "Documents")
else: # Linux

View File

@@ -33,7 +33,14 @@ EMOJI = {
def get_user_documents_path():
"""Get user Documents folder path"""
if sys.platform == "win32":
return os.path.join(os.path.expanduser("~"), "Documents")
try:
import winreg
with winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders") as key:
documents_path, _ = winreg.QueryValueEx(key, "Personal")
return documents_path
except Exception as e:
# fallback
return os.path.join(os.path.expanduser("~"), "Documents")
elif sys.platform == "darwin":
return os.path.join(os.path.expanduser("~"), "Documents")
else: # Linux

View File

@@ -32,7 +32,13 @@ EMOJI = {
def get_user_documents_path():
"""Get user Documents folder path"""
if sys.platform == "win32":
return os.path.join(os.path.expanduser("~"), "Documents")
try:
import winreg
with winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders") as key:
documents_path, _ = winreg.QueryValueEx(key, "Personal")
return documents_path
except Exception as e:
return os.path.join(os.path.expanduser("~"), "Documents")
elif sys.platform == "darwin":
return os.path.join(os.path.expanduser("~"), "Documents")
else: # Linux

View File

@@ -6,7 +6,16 @@ import random
def get_user_documents_path():
"""Get user documents path"""
if platform.system() == "Windows":
return os.path.expanduser("~\\Documents")
try:
import winreg
# 打开注册表
with winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders") as key:
# 获取 "Personal" 键的值,这指向用户的文档目录
documents_path, _ = winreg.QueryValueEx(key, "Personal")
return documents_path
except Exception as e:
# fallback
return os.path.expanduser("~\\Documents")
else:
return os.path.expanduser("~/Documents")