import
os
import
time
import
json
import
winreg
import
configparser
from
watchdog.observers
import
Observer
from
watchdog.events
import
FileSystemEventHandler
from
PyQt5.QtWidgets
import
QApplication, QWidget, QVBoxLayout, QTextEdit, QPushButton,QSystemTrayIcon,QMenu,QAction,qApp
from
PyQt5.QtCore
import
Qt
from
PyQt5.QtGui
import
QIcon
import
sys
class
FileEventHandler(FileSystemEventHandler):
def
__init__(
self
, text_edit):
super
().__init__()
self
.text_edit
=
text_edit
def
on_moved(
self
, event):
if
event.is_directory:
return
time.sleep(
0.1
)
file_path
=
event.dest_path
print
(file_path)
if
file_path
in
processed_files
and
processed_files[file_path]:
return
os.chmod(file_path,
0o777
)
print
(
'解除新增文件只读状态:'
, file_path)
self
.text_edit.append(
'解除新增文件只读状态:'
+
str
(file_path))
self
.text_edit.setReadOnly(
True
)
try
:
with
open
(json_path,
'w'
) as f:
json.dump(processed_files, f)
except
Exception as e:
window.text_edit.append(
"写入失败:"
+
str
(e))
class
App(QWidget):
APP_PATH
=
os.path.abspath(sys.argv[
0
])
DIR_PATH
=
os.path.dirname(APP_PATH)
def
__init__(
self
):
super
().__init__()
self
.text_edit
=
QTextEdit()
self
.text_edit.setReadOnly(
True
)
self
.initUI()
self
.tray
=
Tray(
self
)
def
initUI(
self
):
self
.setWindowTitle(
'微信监控并解除只读'
)
self
.setGeometry(
100
,
100
,
700
,
500
)
self
.setWindowIcon(QIcon(DIR_PATH
+
'\ico.png'
))
vbox
=
QVBoxLayout()
vbox.addWidget(
self
.text_edit)
self
.button
=
QPushButton(
'设置开机自启'
)
self
.button.clicked.connect(
self
.toggle_startup)
vbox.addWidget(
self
.button)
clear_button
=
QPushButton(
'清空文本框'
)
clear_button.clicked.connect(
self
.clear_text_edit)
vbox.addWidget(clear_button)
self
.setLayout(vbox)
if
config.getboolean(
'AUTO_STARTUP'
,
'enabled'
):
self
.set_startup_enabled()
self
.button.setText(
'取消开机自启'
)
else
:
self
.set_startup_disabled()
self
.button.setText(
'设置开机自启'
)
def
toggle_startup(
self
):
if
config.getboolean(
'AUTO_STARTUP'
,
'enabled'
):
self
.set_startup_disabled()
config.
set
(
'AUTO_STARTUP'
,
'enabled'
,
'false'
)
self
.button.setText(
'设置开机自启'
)
else
:
self
.set_startup_enabled()
config.
set
(
'AUTO_STARTUP'
,
'enabled'
,
'true'
)
self
.button.setText(
'取消开机自启'
)
with
open
(config_path,
'w'
) as f:
config.write(f)
def
set_startup_enabled(
self
):
key
=
winreg.OpenKey(winreg.HKEY_CURRENT_USER,
"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
,
0
, winreg.KEY_ALL_ACCESS)
winreg.SetValueEx(key,
"ChatGPT"
,
0
, winreg.REG_SZ, APP_PATH)
winreg.CloseKey(key)
self
.text_edit.append(
'已设置开机自启'
)
def
set_startup_disabled(
self
):
key_path
=
r
"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
with winreg.OpenKey(winreg.HKEY_CURRENT_USER, key_path,
0
, winreg.KEY_ALL_ACCESS) as key:
try
:
winreg.DeleteValue(key,
"ChatGPT"
)
self
.text_edit.append(
'已取消开机自启'
)
except
FileNotFoundError:
self
.text_edit.append(
'未设置开机自启,不需取消'
)
def
clear_text_edit(
self
):
self
.text_edit.clear()
def
closeEvent(
self
, event):
event.ignore()
self
.hide()
self
.tray.show()
def
showEvent(
self
, event):
self
.text_edit.setFocus()
def
mouseDoubleClickEvent(
self
, event):
self
.show()
def
show(
self
):
super
().show()
class
Tray(QSystemTrayIcon):
def
__init__(
self
, app):
super
().__init__(app)
self
.app
=
app
self
.setIcon(QIcon(
'ico.png'
))
self
.setVisible(
True
)
menu
=
QMenu()
show_action
=
QAction(
'显示'
,
self
)
show_action.triggered.connect(
self
.show_app)
menu.addAction(show_action)
exit_action
=
QAction(
'退出'
,
self
)
exit_action.triggered.connect(qApp.quit)
menu.addAction(exit_action)
self
.setContextMenu(menu)
def
mouseDoubleClickEvent(
self
, event):
if
self
.app.isHidden():
self
.app.show()
else
:
self
.app.hide()
def
show_app(
self
):
self
.app.show()
self
.app.setWindowState(Qt.WindowActive)
def
hide_app(
self
):
self
.app.hide()
if
__name__
=
=
'__main__'
:
APP_PATH
=
os.path.abspath(sys.argv[
0
])
DIR_PATH
=
os.path.dirname(APP_PATH)
config
=
configparser.ConfigParser()
config_path
=
DIR_PATH
+
'\config.ini'
config.read(config_path)
app
=
QApplication([])
window
=
App()
documents_folder_key_path
=
r
"Software\Tencent\WeChat"
with winreg.OpenKey(winreg.HKEY_CURRENT_USER, documents_folder_key_path) as key:
user_documents_path, _
=
winreg.QueryValueEx(key,
"FileSavePath"
)
if
user_documents_path
=
=
"MyDocument:"
:
documents_folder_key_path
=
r
"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
with winreg.OpenKey(winreg.HKEY_CURRENT_USER, documents_folder_key_path) as key:
user_documents_path, _
=
winreg.QueryValueEx(key,
"Personal"
)
user_documents_path
=
user_documents_path
+
"\WeChat Files"
window.text_edit.append(
"微信保存文件夹位置:"
+
user_documents_path)
parent_folder
=
user_documents_path
target_folders
=
[]
for
dirpath, dirnames, filenames
in
os.walk(parent_folder):
for
dirname
in
dirnames:
if
dirname.startswith(
'wxid'
)
or
dirname.startswith(
'notsolo'
)
or
dirname.startswith(
'chu352150070'
):
target_folder
=
os.path.join(dirpath, dirname,
'FileStorage\File'
)
if
os.path.exists(target_folder):
target_folders.append(target_folder)
window.text_edit.append(
"目标文件夹列表:"
+
str
(target_folders))
processed_files
=
{}
json_path
=
DIR_PATH
+
'\processed_files.json'
if
os.path.exists(json_path):
with
open
(json_path,
'r'
) as f:
processed_files
=
json.load(f)
for
target_folder
in
target_folders:
for
dirpath, dirnames, filenames
in
os.walk(target_folder):
for
filename
in
filenames:
file_path
=
os.path.join(dirpath, filename)
if
file_path
in
processed_files
and
processed_files[file_path]:
continue
os.chmod(file_path,
0o777
)
processed_files[file_path]
=
True
window.text_edit.append(
"解除只读状态:"
+
str
(file_path))
try
:
with
open
(json_path,
'w'
) as f:
json.dump(processed_files, f)
except
Exception as e:
window.text_edit.append(
"写入失败:"
+
str
(e))
window.text_edit.append(
"开始监听文件..."
)
window.text_edit.setReadOnly(
True
)
processed_files
=
{}
event_handler
=
FileEventHandler(window.text_edit)
observer
=
Observer()
for
target_folder
in
target_folders:
observer.schedule(event_handler, path
=
target_folder, recursive
=
True
)
observer.start()
window.show()
app.exec_()
observer.stop()
observer.join()
qApp.quit()