From 92b3e30e63273df39d7dbf370e9e40ff72ddd324 Mon Sep 17 00:00:00 2001 From: Holaplace <45121260+Holaplace@users.noreply.github.com> Date: Mon, 9 Sep 2019 14:54:19 +0800 Subject: [PATCH] uodate to alpha version --- linkSHUPath.py | 4 +- linkSHU.py => linkSHU_(alpha).py | 279 ++++++++++--------- shuClient.py => linkUI.py | 444 +++++++++++++++++-------------- netName.py | 15 +- pic2Py.py | 20 ++ requirements.txt | 11 + ruijie.py | 73 +++-- timg_png.py | 2 +- wifiConnect.py | 54 ++++ wireConnect.py | 9 +- 10 files changed, 530 insertions(+), 381 deletions(-) rename linkSHU.py => linkSHU_(alpha).py (73%) rename shuClient.py => linkUI.py (64%) create mode 100644 pic2Py.py create mode 100644 requirements.txt create mode 100644 wifiConnect.py diff --git a/linkSHUPath.py b/linkSHUPath.py index 7ff2f42..7a295fd 100644 --- a/linkSHUPath.py +++ b/linkSHUPath.py @@ -1,8 +1,8 @@ -from os import getenv, makedirs +from os import path, makedirs def shuPath(): - rootPath = getenv('SYSTEMROOT') + rootPath = path.expanduser('~') try: makedirs(rootPath + r'\linkSHU') addrSHU = rootPath + r'\linkSHU' diff --git a/linkSHU.py b/linkSHU_(alpha).py similarity index 73% rename from linkSHU.py rename to linkSHU_(alpha).py index 4cc10b6..367b77b 100644 --- a/linkSHU.py +++ b/linkSHU_(alpha).py @@ -1,125 +1,154 @@ -# -*- coding: utf-8 -*- - -import sys, \ - os -if hasattr(sys, 'frozen'): - os.environ['PATH'] = sys._MEIPASS + ";" + os.environ['PATH'] - -from sys import argv, exit -from shuClient import Ui_MainWindow -from wireConnect import wire_connect_status -from ruijie import shuConnect -from PyQt5.QtWidgets import QMainWindow, QApplication -from PyQt5.QtCore import QSettings, Qt, QTimer -from PyQt5.QtGui import QIcon -from logo_png import img as logo -import base64 -from linkSHUPath import shuPath - - -linkpath = shuPath() - -tmp = open(linkpath + r'\logo.png', 'wb') -tmp.write(base64.b64decode(logo)) -tmp.close() - - -class shuUi(QMainWindow, Ui_MainWindow): - def __init__(self, parent=None): - super(shuUi, self).__init__(parent) - self.setupUi(self) - - self.setWindowTitle('linkSHU') - self.setWindowIcon(QIcon(linkpath + r'\logo.png')) - - self.resize(391, 282) - self.setFixedSize(self.width(), self.height()) - self.setWindowFlags(Qt.WindowCloseButtonHint) - - self.input_user.setPlaceholderText("请输入用户名") - self.input_passwd.setPlaceholderText("请输入密码") - self.updateLabel.setText("关于 & 更新") - self.updateLabel.setOpenExternalLinks(True) - - self.init_login_info() - self.wireButton.clicked.connect(self.on_pushButton_enter_clicked) - - # 自动登录 - self.timer0 = QTimer(self) - self.timer0.timeout.connect(self.goto_autologin) - self.timer0.setSingleShot(True) - self.timer0.start(1000) - - # 保存登录信息 - def save_login_info(self): - settings = QSettings(linkpath + r"\config.ini", QSettings.IniFormat) - settings.setValue("account", self.input_user.text()) - settings.setValue("password", self.input_passwd.text()) - settings.setValue("remeberpassword", self.passwdCB.isChecked()) - settings.setValue("autologin", self.auto_login.isChecked()) - - # 初始化登录信息 - def init_login_info(self): - settings = QSettings(linkpath + r"\config.ini", QSettings.IniFormat) - the_account =settings.value("account") - the_password = settings.value("password") - the_remeberpassword = settings.value("remeberpassword") - the_autologin = settings.value("autologin") - - self.input_user.setText(the_account) - # 记住密码判断 - if the_remeberpassword == "true" or the_remeberpassword is True: - self.passwdCB.setChecked(True) - self.input_passwd.setText(the_password) - - # 自动登录判断 - if the_autologin == "true" or the_autologin is True: - self.auto_login.setChecked(True) - - # 自动登录 - def goto_autologin(self): - if self.auto_login.isChecked() is True: - self.on_pushButton_enter_clicked() - - def on_pushButton_enter_clicked(self): - # 账号密码NULL判断 - if self.input_user.text() == "" or self.input_passwd.text() == "": - return - - self.auto_login.stateChanged.connect(self.cancel_autologin) - - # 保存登录信息 - self.save_login_info() - - self.wireConnect() - - def cancel_autologin(self): - if not self.auto_login.isChecked(): - settings = QSettings(linkpath + r"\config.ini", QSettings.IniFormat) - settings.setValue("autologin", False) - - def wireConnect(self): - # 账号密码NULL判断 - if self.input_user.text() == "" or self.input_passwd.text() == "": - return - - user = int(self.input_user.text()) - passwd = str(self.input_passwd.text()) - s = wire_connect_status(user, passwd) - self.status.setText(s) - - def stopConnect(self): - shu = shuConnect() - s = shu.logOut() - self.status.setText(s) - - -if __name__ == "__main__": - app = QApplication(argv) - ui = shuUi() - - ui.wireButton.clicked.connect(ui.wireConnect) - ui.logout.clicked.connect(ui.stopConnect) - - ui.show() - exit(app.exec_()) +# -*- coding: utf-8 -*- + +import sys, \ + os +if hasattr(sys, 'frozen'): + os.environ['PATH'] = sys._MEIPASS + ";" + os.environ['PATH'] + +from sys import argv, exit +from linkUI import Ui_MainWindow +from wireConnect import wire_connect_status +from wifiConnect import wifi_connect_status +from ruijie import shuConnect +from PyQt5.QtWidgets import QMainWindow, QApplication +from PyQt5.QtCore import QSettings, Qt, QTimer +from PyQt5.QtGui import QIcon +from logo_png import img as logo +from base64 import b64decode +from linkSHUPath import shuPath + + +linkpath = shuPath() + +sss = os.path.exists(linkpath + r'\logo.png') +if not sss: + tmp = open(linkpath + r'\logo.png', 'wb') + tmp.write(b64decode(logo)) + tmp.close() +else: + pass + + +class shuUi(QMainWindow, Ui_MainWindow): + def __init__(self, parent=None): + super(shuUi, self).__init__(parent) + self.setupUi(self) + + self.setWindowTitle('linkSHU (alpha)') + self.setWindowIcon(QIcon(linkpath + r'\logo.png')) + + self.setFixedSize(self.width(), self.height()) + self.setWindowFlags(Qt.WindowCloseButtonHint) + + self.input_user.setPlaceholderText("请输入用户名") + self.input_passwd.setPlaceholderText("请输入密码") + self.updateLabel.setText("关于 & 更新") + self.updateLabel.setOpenExternalLinks(True) + + self.init_login_info() + self.login.clicked.connect(self.on_pushButton_enter_clicked) + + # 自动登录 + self.timer0 = QTimer(self) + self.timer0.timeout.connect(self.goto_autologin) + self.timer0.setSingleShot(True) + self.timer0.start(1000) + + # 保存登录信息 + def save_login_info(self): + settings = QSettings(linkpath + r"\config.ini", QSettings.IniFormat) + settings.setValue("account", self.input_user.text()) + settings.setValue("password", self.input_passwd.text()) + settings.setValue("remeberpassword", self.passwdCB.isChecked()) + settings.setValue("autologin", self.auto_login.isChecked()) + settings.setValue("loginStyle", self.comboBox.currentIndex()) + + # 初始化登录信息 + def init_login_info(self): + settings = QSettings(linkpath + r"\config.ini", QSettings.IniFormat) + the_account =settings.value("account") + the_password = settings.value("password") + the_remeberpassword = settings.value("remeberpassword") + the_autologin = settings.value("autologin") + the_loginStyle = int(settings.value("loginStyle")) + + self.input_user.setText(the_account) + # 记住密码判断 + if the_remeberpassword == "true" or the_remeberpassword is True: + self.passwdCB.setChecked(True) + self.input_passwd.setText(the_password) + + # 自动登录判断 + if the_autologin == "true" or the_autologin is True: + self.auto_login.setChecked(True) + + # 登录方式判断 + if the_autologin is not int(0): + self.comboBox.setCurrentIndex(the_loginStyle) + + # 自动登录 + def goto_autologin(self): + if self.auto_login.isChecked() is True: + self.on_pushButton_enter_clicked() + + def on_pushButton_enter_clicked(self): + # 账号密码NULL判断 + if self.input_user.text() == "" or self.input_passwd.text() == "": + return + + self.auto_login.stateChanged.connect(self.cancel_autologin) + + # 保存登录信息 + self.save_login_info() + self.connectStyle() + + def cancel_autologin(self): + if not self.auto_login.isChecked(): + settings = QSettings(linkpath + r"\config.ini", QSettings.IniFormat) + settings.setValue("autologin", False) + + def connectStyle(self): + try: + if self.comboBox.currentIndex() is int(1): + self.wireConnect() + elif self.comboBox.currentIndex() is int(2): + self.wifiConnect() + except Exception as e: + self.status.setText(e) + + def wireConnect(self): + # 账号密码NULL判断 + if self.input_user.text() == "" or self.input_passwd.text() == "": + return + + user = int(self.input_user.text()) + passwd = str(self.input_passwd.text()) + s = wire_connect_status(user, passwd) + self.status.setText(s) + + def wifiConnect(self): + # 账号密码NULL判断 + if self.input_user.text() == "" or self.input_passwd.text() == "": + return + + user = int(self.input_user.text()) + passwd = str(self.input_passwd.text()) + + s = wifi_connect_status(user, passwd) + self.status.setText(s) + + def stopConnect(self): + shu = shuConnect() + s = shu.logOut() + self.status.setText(s) + + +if __name__ == "__main__": + app = QApplication(argv) + ui = shuUi() + + ui.login.clicked.connect(ui.connectStyle) + ui.logout.clicked.connect(ui.stopConnect) + + ui.show() + exit(app.exec_()) diff --git a/shuClient.py b/linkUI.py similarity index 64% rename from shuClient.py rename to linkUI.py index 3196e20..2928487 100644 --- a/shuClient.py +++ b/linkUI.py @@ -1,205 +1,239 @@ -# -*- coding: utf-8 -*- -import sys, os -if hasattr(sys, 'frozen'): - os.environ['PATH'] = sys._MEIPASS + ";" + os.environ['PATH'] - -from PyQt5.QtWidgets import QWidget, QLabel, QHBoxLayout, QGroupBox, QGridLayout, QLineEdit, QPushButton, QTextBrowser, QCheckBox -from PyQt5.QtGui import QFont, QPixmap, QPalette, QColor, QCursor, QBrush -from PyQt5.QtCore import QRect, Qt, QMetaObject, QCoreApplication -import base64 -from timg_png import img as timg -from linkSHUPath import shuPath - - -linkpath = shuPath() - - -tmp = open(linkpath + r'\timg.png', 'wb') -tmp.write(base64.b64decode(timg)) -tmp.close() - - -class Ui_MainWindow(object): - def setupUi(self, MainWindow): - MainWindow.setObjectName("MainWindow") - MainWindow.resize(391, 282) - font = QFont() - font.setPointSize(11) - MainWindow.setFont(font) - self.centralwidget = QWidget(MainWindow) - self.centralwidget.setObjectName("centralwidget") - self.groupBox = QGroupBox(self.centralwidget) - self.groupBox.setGeometry(QRect(10, 70, 231, 171)) - self.groupBox.setTitle("") - self.groupBox.setObjectName("groupBox") - self.gridLayoutWidget = QWidget(self.groupBox) - self.gridLayoutWidget.setGeometry(QRect(9, 10, 213, 91)) - self.gridLayoutWidget.setObjectName("gridLayoutWidget") - self.gridLayout = QGridLayout(self.gridLayoutWidget) - self.gridLayout.setContentsMargins(0, 0, 0, 0) - self.gridLayout.setObjectName("gridLayout") - self.user = QLabel(self.gridLayoutWidget) - font = QFont() - font.setFamily("微软雅黑") - font.setPointSize(11) - self.user.setFont(font) - self.user.setAlignment(Qt.AlignCenter) - self.user.setObjectName("user") - self.gridLayout.addWidget(self.user, 0, 0, 1, 1) - self.passwd = QLabel(self.gridLayoutWidget) - font = QFont() - font.setFamily("微软雅黑") - font.setPointSize(11) - self.passwd.setFont(font) - self.passwd.setAlignment(Qt.AlignCenter) - self.passwd.setObjectName("passwd") - self.gridLayout.addWidget(self.passwd, 1, 0, 1, 1) - self.input_user = QLineEdit(self.gridLayoutWidget) - font = QFont() - font.setFamily("微软雅黑") - font.setPointSize(11) - self.input_user.setFont(font) - self.input_user.setText("") - self.input_user.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignVCenter) - self.input_user.setObjectName("input_user") - self.gridLayout.addWidget(self.input_user, 0, 1, 1, 1) - self.input_passwd = QLineEdit(self.gridLayoutWidget) - font = QFont() - font.setFamily("微软雅黑") - font.setPointSize(11) - self.input_passwd.setFont(font) - self.input_passwd.setFocusPolicy(Qt.StrongFocus) - self.input_passwd.setContextMenuPolicy(Qt.DefaultContextMenu) - self.input_passwd.setText("") - self.input_passwd.setEchoMode(QLineEdit.Password) - self.input_passwd.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignVCenter) - self.input_passwd.setObjectName("input_passwd") - self.gridLayout.addWidget(self.input_passwd, 1, 1, 1, 1) - self.horizontalLayoutWidget = QWidget(self.groupBox) - self.horizontalLayoutWidget.setGeometry(QRect(10, 102, 211, 26)) - self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget") - self.horizontalLayout_7 = QHBoxLayout(self.horizontalLayoutWidget) - self.horizontalLayout_7.setContentsMargins(0, 0, 0, 0) - self.horizontalLayout_7.setObjectName("horizontalLayout_7") - self.passwdCB = QCheckBox(self.horizontalLayoutWidget) - font = QFont() - font.setFamily("微软雅黑") - font.setPointSize(11) - self.passwdCB.setFont(font) - self.passwdCB.setObjectName("passwdCB") - self.horizontalLayout_7.addWidget(self.passwdCB) - self.auto_login = QCheckBox(self.horizontalLayoutWidget) - font = QFont() - font.setFamily("微软雅黑") - font.setPointSize(11) - self.auto_login.setFont(font) - self.auto_login.setObjectName("auto_login") - self.horizontalLayout_7.addWidget(self.auto_login) - self.horizontalLayoutWidget_3 = QWidget(self.groupBox) - self.horizontalLayoutWidget_3.setGeometry(QRect(10, 130, 211, 31)) - self.horizontalLayoutWidget_3.setObjectName("horizontalLayoutWidget_3") - self.horizontalLayout_2 = QHBoxLayout(self.horizontalLayoutWidget_3) - self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) - self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.wireButton = QPushButton(self.horizontalLayoutWidget_3) - font = QFont() - font.setFamily("微软雅黑") - self.wireButton.setFont(font) - self.wireButton.setObjectName("wireButton") - self.horizontalLayout_2.addWidget(self.wireButton) - self.groupBox_2 = QGroupBox(self.centralwidget) - self.groupBox_2.setGeometry(QRect(240, 70, 141, 171)) - self.groupBox_2.setTitle("") - self.groupBox_2.setObjectName("groupBox_2") - self.status_lable = QLabel(self.groupBox_2) - self.status_lable.setGeometry(QRect(30, 10, 71, 20)) - font = QFont() - font.setFamily("微软雅黑") - font.setPointSize(11) - self.status_lable.setFont(font) - self.status_lable.setAlignment(Qt.AlignCenter) - self.status_lable.setObjectName("status_lable") - self.status = QTextBrowser(self.groupBox_2) - self.status.setGeometry(QRect(10, 40, 121, 81)) - font = QFont() - font.setFamily("微软雅黑") - font.setPointSize(7) - self.status.setFont(font) - self.status.setObjectName("status") - self.logout = QPushButton(self.groupBox_2) - self.logout.setGeometry(QRect(10, 130, 121, 28)) - font = QFont() - font.setFamily("微软雅黑") - self.logout.setFont(font) - self.logout.setObjectName("logout") - self.groupBox_3 = QGroupBox(self.centralwidget) - self.groupBox_3.setGeometry(QRect(10, 240, 371, 31)) - self.groupBox_3.setTitle("") - self.groupBox_3.setObjectName("groupBox_3") - self.horizontalLayoutWidget_2 = QWidget(self.groupBox_3) - self.horizontalLayoutWidget_2.setGeometry(QRect(0, 0, 371, 31)) - self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2") - self.horizontalLayout_8 = QHBoxLayout(self.horizontalLayoutWidget_2) - self.horizontalLayout_8.setContentsMargins(0, 0, 0, 0) - self.horizontalLayout_8.setObjectName("horizontalLayout_8") - self.updateLabel = QLabel(self.horizontalLayoutWidget_2) - font = QFont() - font.setFamily("微软雅黑") - font.setPointSize(10) - self.updateLabel.setFont(font) - self.updateLabel.setCursor(QCursor(Qt.PointingHandCursor)) - self.updateLabel.setToolTip("") - self.updateLabel.setAlignment(Qt.AlignCenter) - self.updateLabel.setObjectName("updateLabel") - self.horizontalLayout_8.addWidget(self.updateLabel) - self.groupBox_4 = QGroupBox(self.centralwidget) - self.groupBox_4.setGeometry(QRect(10, 10, 371, 61)) - self.groupBox_4.setTitle("") - self.groupBox_4.setObjectName("groupBox_4") - self.layoutWidget = QWidget(self.groupBox_4) - self.layoutWidget.setGeometry(QRect(80, 10, 181, 43)) - self.layoutWidget.setObjectName("layoutWidget") - self.horizontalLayout = QHBoxLayout(self.layoutWidget) - self.horizontalLayout.setContentsMargins(0, 0, 0, 0) - self.horizontalLayout.setObjectName("horizontalLayout") - self.logo = QLabel(self.layoutWidget) - self.logo.setText("") - self.logo.setPixmap(QPixmap(linkpath + r'\timg.png')) - self.logo.setObjectName("logo") - self.horizontalLayout.addWidget(self.logo) - self.text = QLabel(self.layoutWidget) - palette = QPalette() - brush = QBrush(QColor(0, 85, 255)) - brush.setStyle(Qt.SolidPattern) - palette.setBrush(QPalette.Active, QPalette.Text, brush) - brush = QBrush(QColor(0, 85, 255)) - brush.setStyle(Qt.SolidPattern) - palette.setBrush(QPalette.Inactive, QPalette.Text, brush) - brush = QBrush(QColor(120, 120, 120)) - brush.setStyle(Qt.SolidPattern) - palette.setBrush(QPalette.Disabled, QPalette.Text, brush) - self.text.setPalette(palette) - font = QFont() - font.setFamily("微软雅黑") - font.setPointSize(14) - self.text.setFont(font) - self.text.setAlignment(Qt.AlignCenter) - self.text.setObjectName("text") - self.horizontalLayout.addWidget(self.text) - MainWindow.setCentralWidget(self.centralwidget) - - self.retranslateUi(MainWindow) - QMetaObject.connectSlotsByName(MainWindow) - - def retranslateUi(self, MainWindow): - _translate = QCoreApplication.translate - MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) - self.user.setText(_translate("MainWindow", "用户名")) - self.passwd.setText(_translate("MainWindow", "密 码")) - self.passwdCB.setText(_translate("MainWindow", "记住密码")) - self.auto_login.setText(_translate("MainWindow", "自动登录")) - self.wireButton.setText(_translate("MainWindow", "有线连接")) - self.status_lable.setText(_translate("MainWindow", "连接状态")) - self.logout.setText(_translate("MainWindow", "下线")) - self.updateLabel.setText(_translate("MainWindow", "关于 & 更新")) - self.text.setText(_translate("MainWindow", "校 园 网")) +# -*- coding: utf-8 -*- +import sys, \ + os +if hasattr(sys, 'frozen'): + os.environ['PATH'] = sys._MEIPASS + ";" + os.environ['PATH'] + +from PyQt5.QtWidgets import QWidget, QLabel, QHBoxLayout, QGroupBox, QGridLayout, QLineEdit, QPushButton, QTextBrowser, QCheckBox, QComboBox, QVBoxLayout +from PyQt5.QtGui import QFont, QPixmap, QPalette, QColor, QCursor, QBrush +from PyQt5.QtCore import QRect, Qt, QMetaObject, QCoreApplication + +from linkSHUPath import shuPath +from timg_png import img as timg +import base64 + + +linkpath = shuPath() + +sss = os.path.exists(linkpath + r'\timg.png') +if not sss: + tmp = open(linkpath + r'\timg.png', 'wb') + tmp.write(base64.b64decode(timg)) + tmp.close() +else: + pass + + +class Ui_MainWindow(object): + def setupUi(self, MainWindow): + MainWindow.setObjectName("MainWindow") + MainWindow.resize(433, 291) + font = QFont() + font.setPointSize(11) + MainWindow.setFont(font) + self.centralwidget = QWidget(MainWindow) + self.centralwidget.setObjectName("centralwidget") + self.groupBox = QGroupBox(self.centralwidget) + self.groupBox.setGeometry(QRect(10, 70, 231, 131)) + self.groupBox.setTitle("") + self.groupBox.setObjectName("groupBox") + self.gridLayoutWidget = QWidget(self.groupBox) + self.gridLayoutWidget.setGeometry(QRect(9, 10, 213, 91)) + self.gridLayoutWidget.setObjectName("gridLayoutWidget") + self.gridLayout = QGridLayout(self.gridLayoutWidget) + self.gridLayout.setContentsMargins(0, 0, 0, 0) + self.gridLayout.setObjectName("gridLayout") + self.input_user = QLineEdit(self.gridLayoutWidget) + font = QFont() + font.setFamily("微软雅黑") + font.setPointSize(11) + self.input_user.setFont(font) + self.input_user.setText("") + self.input_user.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignVCenter) + self.input_user.setObjectName("input_user") + self.gridLayout.addWidget(self.input_user, 0, 1, 1, 1) + self.user = QLabel(self.gridLayoutWidget) + font = QFont() + font.setFamily("微软雅黑") + font.setPointSize(11) + self.user.setFont(font) + self.user.setAlignment(Qt.AlignCenter) + self.user.setObjectName("user") + self.gridLayout.addWidget(self.user, 0, 0, 1, 1) + self.input_passwd = QLineEdit(self.gridLayoutWidget) + font = QFont() + font.setFamily("微软雅黑") + font.setPointSize(11) + self.input_passwd.setFont(font) + self.input_passwd.setFocusPolicy(Qt.StrongFocus) + self.input_passwd.setContextMenuPolicy(Qt.DefaultContextMenu) + self.input_passwd.setText("") + self.input_passwd.setEchoMode(QLineEdit.Password) + self.input_passwd.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignVCenter) + self.input_passwd.setObjectName("input_passwd") + self.gridLayout.addWidget(self.input_passwd, 1, 1, 1, 1) + self.passwd = QLabel(self.gridLayoutWidget) + font = QFont() + font.setFamily("微软雅黑") + font.setPointSize(11) + self.passwd.setFont(font) + self.passwd.setAlignment(Qt.AlignCenter) + self.passwd.setObjectName("passwd") + self.gridLayout.addWidget(self.passwd, 1, 0, 1, 1) + self.horizontalLayoutWidget = QWidget(self.groupBox) + self.horizontalLayoutWidget.setGeometry(QRect(10, 102, 211, 26)) + self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget") + self.horizontalLayout_7 = QHBoxLayout(self.horizontalLayoutWidget) + self.horizontalLayout_7.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout_7.setObjectName("horizontalLayout_7") + self.passwdCB = QCheckBox(self.horizontalLayoutWidget) + font = QFont() + font.setFamily("微软雅黑") + font.setPointSize(11) + self.passwdCB.setFont(font) + self.passwdCB.setObjectName("passwdCB") + self.horizontalLayout_7.addWidget(self.passwdCB) + self.auto_login = QCheckBox(self.horizontalLayoutWidget) + font = QFont() + font.setFamily("微软雅黑") + font.setPointSize(11) + self.auto_login.setFont(font) + self.auto_login.setObjectName("auto_login") + self.horizontalLayout_7.addWidget(self.auto_login) + self.groupBox_2 = QGroupBox(self.centralwidget) + self.groupBox_2.setGeometry(QRect(240, 70, 181, 131)) + self.groupBox_2.setTitle("") + self.groupBox_2.setObjectName("groupBox_2") + self.verticalLayoutWidget = QWidget(self.groupBox_2) + self.verticalLayoutWidget.setGeometry(QRect(10, 10, 161, 111)) + self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") + self.verticalLayout = QVBoxLayout(self.verticalLayoutWidget) + self.verticalLayout.setContentsMargins(0, 0, 0, 0) + self.verticalLayout.setObjectName("verticalLayout") + self.status_lable = QLabel(self.verticalLayoutWidget) + font = QFont() + font.setFamily("微软雅黑") + font.setPointSize(11) + self.status_lable.setFont(font) + self.status_lable.setAlignment(Qt.AlignCenter) + self.status_lable.setObjectName("status_lable") + self.verticalLayout.addWidget(self.status_lable) + self.status = QTextBrowser(self.verticalLayoutWidget) + font = QFont() + font.setFamily("微软雅黑") + font.setPointSize(9) + self.status.setFont(font) + self.status.setObjectName("status") + self.verticalLayout.addWidget(self.status) + self.groupBox_3 = QGroupBox(self.centralwidget) + self.groupBox_3.setGeometry(QRect(10, 250, 411, 31)) + self.groupBox_3.setTitle("") + self.groupBox_3.setObjectName("groupBox_3") + self.updateLabel = QLabel(self.groupBox_3) + self.updateLabel.setGeometry(QRect(150, 0, 111, 31)) + font = QFont() + font.setFamily("微软雅黑") + font.setPointSize(10) + self.updateLabel.setFont(font) + self.updateLabel.setCursor(QCursor(Qt.PointingHandCursor)) + self.updateLabel.setToolTip("") + self.updateLabel.setAlignment(Qt.AlignCenter) + self.updateLabel.setObjectName("updateLabel") + self.groupBox_4 = QGroupBox(self.centralwidget) + self.groupBox_4.setGeometry(QRect(10, 0, 411, 71)) + self.groupBox_4.setTitle("") + self.groupBox_4.setObjectName("groupBox_4") + self.logo = QLabel(self.groupBox_4) + self.logo.setGeometry(QRect(80, 10, 250, 51)) + self.logo.setText("") + self.logo.setPixmap(QPixmap(linkpath + r'\timg.png')) + self.logo.setObjectName("logo") + self.text = QLabel(self.groupBox_4) + self.text.setGeometry(QRect(180, 10, 122, 49)) + palette = QPalette() + brush = QBrush(QColor(0, 85, 255)) + brush.setStyle(Qt.SolidPattern) + palette.setBrush(QPalette.Active, QPalette.Text, brush) + brush = QBrush(QColor(0, 85, 255, 128)) + brush.setStyle(Qt.NoBrush) + palette.setBrush(QPalette.Active, QPalette.PlaceholderText, brush) + brush = QBrush(QColor(0, 85, 255)) + brush.setStyle(Qt.SolidPattern) + palette.setBrush(QPalette.Inactive, QPalette.Text, brush) + brush = QBrush(QColor(0, 85, 255, 128)) + brush.setStyle(Qt.NoBrush) + palette.setBrush(QPalette.Inactive, QPalette.PlaceholderText, brush) + brush = QBrush(QColor(120, 120, 120)) + brush.setStyle(Qt.SolidPattern) + palette.setBrush(QPalette.Disabled, QPalette.Text, brush) + brush = QBrush(QColor(0, 85, 255, 128)) + brush.setStyle(Qt.NoBrush) + palette.setBrush(QPalette.Disabled, QPalette.PlaceholderText, brush) + self.text.setPalette(palette) + font = QFont() + font.setFamily("微软雅黑") + font.setPointSize(14) + self.text.setFont(font) + self.text.setAlignment(Qt.AlignCenter) + self.text.setObjectName("text") + self.groupBox_5 = QGroupBox(self.centralwidget) + self.groupBox_5.setGeometry(QRect(240, 200, 181, 51)) + self.groupBox_5.setTitle("") + self.groupBox_5.setObjectName("groupBox_5") + self.login = QPushButton(self.groupBox_5) + self.login.setGeometry(QRect(10, 10, 91, 28)) + font = QFont() + font.setFamily("微软雅黑") + self.login.setFont(font) + self.login.setObjectName("login") + self.logout = QPushButton(self.groupBox_5) + self.logout.setGeometry(QRect(110, 10, 61, 28)) + font = QFont() + font.setFamily("微软雅黑") + self.logout.setFont(font) + self.logout.setObjectName("logout") + self.groupBox_6 = QGroupBox(self.centralwidget) + self.groupBox_6.setGeometry(QRect(10, 200, 231, 51)) + self.groupBox_6.setTitle("") + self.groupBox_6.setObjectName("groupBox_6") + self.linkStyle = QLabel(self.groupBox_6) + self.linkStyle.setGeometry(QRect(10, 0, 71, 41)) + font = QFont() + font.setFamily("微软雅黑") + font.setPointSize(11) + self.linkStyle.setFont(font) + self.linkStyle.setCursor(QCursor(Qt.ArrowCursor)) + self.linkStyle.setToolTip("") + self.linkStyle.setAlignment(Qt.AlignCenter) + self.linkStyle.setObjectName("linkStyle") + self.comboBox = QComboBox(self.groupBox_6) + self.comboBox.setGeometry(QRect(80, 10, 131, 26)) + font = QFont() + font.setFamily("微软雅黑") + self.comboBox.setFont(font) + self.comboBox.setLayoutDirection(Qt.LeftToRight) + self.comboBox.setObjectName("comboBox") + self.comboBox.addItem("") + self.comboBox.addItem("") + self.comboBox.addItem("") + MainWindow.setCentralWidget(self.centralwidget) + + self.retranslateUi(MainWindow) + QMetaObject.connectSlotsByName(MainWindow) + + def retranslateUi(self, MainWindow): + _translate = QCoreApplication.translate + MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) + self.user.setText(_translate("MainWindow", "用户名")) + self.passwd.setText(_translate("MainWindow", "密 码")) + self.passwdCB.setText(_translate("MainWindow", "记住密码")) + self.auto_login.setText(_translate("MainWindow", "自动登录")) + self.status_lable.setText(_translate("MainWindow", "连接状态")) + self.updateLabel.setText(_translate("MainWindow", "关于 & 更新")) + self.text.setText(_translate("MainWindow", "校 园 网")) + self.login.setText(_translate("MainWindow", "连接 LogIn")) + self.logout.setText(_translate("MainWindow", "下线")) + self.linkStyle.setText(_translate("MainWindow", "连接方式")) + self.comboBox.setItemText(0, _translate("MainWindow", " 请选择")) + self.comboBox.setItemText(1, _translate("MainWindow", " 有线连接")) + self.comboBox.setItemText(2, _translate("MainWindow", " WIFI连接")) diff --git a/netName.py b/netName.py index 4ee9b4f..ffa87e2 100644 --- a/netName.py +++ b/netName.py @@ -1,9 +1,16 @@ from psutil import net_if_addrs -def netHi(): - s = net_if_addrs() - for key in s.keys(): +def netHiWifi(): + for key in net_if_addrs().keys(): + if 'WLAN' in key: + s = key + return s + + +def netHiWire(): + for key in net_if_addrs().keys(): if '以太' in key: s = key - return s + return s + diff --git a/pic2Py.py b/pic2Py.py new file mode 100644 index 0000000..6b764a9 --- /dev/null +++ b/pic2Py.py @@ -0,0 +1,20 @@ +import base64 + + +def pic2py(picture_name): + + open_pic = open("%s" % picture_name, 'rb') + b64str = base64.b64encode(open_pic.read()) + open_pic.close() + # 注意这边b64str一定要加上.decode() + write_data = 'img = "%s"' % b64str.decode() + f = open('%s.py' % picture_name.replace('.', '_'), 'w+') + f.write(write_data) + f.close() + + +if __name__ == '__main__': + pics = ["timg.png"] + for i in pics: + pic2py(i) + print("ok") diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..dc7a18a --- /dev/null +++ b/requirements.txt @@ -0,0 +1,11 @@ +# pip install -r requirements.txt +# pyinstaller -F -w -i logo.ico linkSHU_(alpha).py + +requests +pyqt5 +pywifi +pyinstaller +comtypes +IPy +psutil +PyQt5-stubs \ No newline at end of file diff --git a/ruijie.py b/ruijie.py index 5401d19..53ed9a6 100644 --- a/ruijie.py +++ b/ruijie.py @@ -1,18 +1,17 @@ # -*- coding: utf-8 -*- from requests import get, post -from time import strftime from json import dump, load from linkSHUPath import shuPath linkpath = shuPath() + class shuConnect: def __init__(self, user=0, passwd='shu'): self.user = user self.passwd = passwd - self.ssid = 'Shu(ForAll)' def check_connect(self): r = get("http://10.10.9.9:8080") @@ -22,25 +21,29 @@ def check_connect(self): return False def catch_data(self): - r = get("http://123.123.123.123/") - query_string = r.text - st = query_string.find("index.jsp?") + 10 - end = query_string.find("'") - query_string = query_string[st:end] - - data = {"userId": self.user, - "password": self.passwd, - "passwordEncrypt": "false", - "queryString": query_string, - "service": "", - "operatorPwd": "", - "operatorUserId": "", - "validcode": ""} - - with open(linkpath + r'\catch_data.json', 'w') as data_file: - dump(data, data_file) - - return data + try: + r = get("http://123.123.123.123/") + query_string = r.text + st = query_string.find("index.jsp?") + 10 + end = query_string.find("'") + query_string = query_string[st:end] + + data = {"userId": self.user, + "password": self.passwd, + "passwordEncrypt": "false", + "queryString": query_string, + "service": "", + "operatorPwd": "", + "operatorUserId": "", + "validcode": ""} + + with open(linkpath + r'\catch_data.json', 'w') as data_file: + dump(data, data_file) + + return data + except: + s = '频繁登录下线操作,可能该无线网卡MAC地址已被锐捷封禁. \n\n 补救方法:点击下方“关于&更新”' + return s def connect(self): r = post("http://10.10.9.9:8080/eportal/InterFace.do?method=login", data=self.catch_data()) @@ -53,27 +56,21 @@ def connect(self): return False, resp["message"] def start_connect(self): - t = strftime("%Y-%m-%d %H:%M:%S") + status = self.check_connect() + if status: + s = '已认证 & 用户已在线 \n' - try: - status = self.check_connect() - if status: - s = '已认证 & 用户已在线 \n' +t + else: + r, msg = self.connect() + if r: + s = '认证成功 & 用户上线\n' else: - r, msg = self.connect() - if r: - s = '认证成功 & 用户上线\n' + t - - else: - s = '认证失败\n' + t + msg + s = '认证失败\n' + msg - return s - except: - return + return s def logOut(self): - t = strftime("%Y-%m-%d %H:%M:%S") try: with open(linkpath + r'\catch_data.json', 'r') as data_file: logoutData = load(data_file) @@ -82,8 +79,8 @@ def logOut(self): r.encoding = "utf-8" resp = r.json() - s = resp["message"] + '\n' + t + s = resp["message"] + '\n' return s except IOError: - s = '提示:首次使用,打开浏览器,地址栏转到 \nhttp://10.10.9.9:8080 \n进行网络下线' + s = '提示:首次使用,请打开浏览器转到 http://10.10.9.9:8080 网络认证下线后,再使用客户端登录' return s diff --git a/timg_png.py b/timg_png.py index 23367aa..3c9ccf9 100644 --- a/timg_png.py +++ b/timg_png.py @@ -1 +1 @@ -img = "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" \ No newline at end of file +img = "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" \ No newline at end of file diff --git a/wifiConnect.py b/wifiConnect.py new file mode 100644 index 0000000..68b9178 --- /dev/null +++ b/wifiConnect.py @@ -0,0 +1,54 @@ +from pywifi import PyWiFi, Profile +from time import sleep +from ruijie import shuConnect +from psutil import net_if_stats +from netName import netHiWifi, netHiWire + + +nameHiwire = netHiWire() +nameHiwifi = netHiWifi() + + +def wifi_connect_status(user, passwd): + if not net_if_stats()[nameHiwifi].isup: # wifi未连接到Shu(ForAll) 或未打开WiFi开关 + s = connect_wifi(user, passwd) + return s + + else: # wifi已连接到internet + try: # wifi已连接到 Shu(ForAll) + s0 = "Shu(ForAll) 连接成功\n" + shu = shuConnect(user, passwd) + s = s0 + shu.start_connect() + return s + except: # wifi未连接到 Shu(ForAll),重连... + s = connect_wifi(user, passwd) + return s + + +def connect_wifi(user, passwd): + if net_if_stats()[nameHiwire].isup: + s = '无线连接前,请先断开网线\n' + return s + else: + try: + wifi = PyWiFi() # 创建一个wifi对象 + iface = wifi.interfaces()[0] # 取第一个无限网卡 + + iface.disconnect() # 断开网卡连接 + profile = Profile() # 配置文件 + profile.ssid = "Shu(ForAll)" # wifi名称 + + iface.remove_all_network_profiles() # 删除其他配置文件 + tmp_profile = iface.add_network_profile(profile) # 加载配置文件 + + iface.connect(tmp_profile) # 连接 + sleep(0.5) # 不延时,wifi反应不过来 + + s0 = "Shu(ForAll) 连接成功\n" + shu = shuConnect(user, passwd) + s = s0 + shu.start_connect() + + except: + s = "无线网卡未打开,请打开 WLAN 开关\n" + + return s diff --git a/wireConnect.py b/wireConnect.py index 24851f0..b47c20c 100644 --- a/wireConnect.py +++ b/wireConnect.py @@ -1,15 +1,12 @@ from ruijie import shuConnect -from time import strftime from psutil import net_if_addrs, net_if_stats from IPy import IP from eduIP import eduIPlist -from netName import netHi +from netName import netHiWire def wire_connect_status(user, passwd): - t = strftime("%Y-%m-%d %H:%M:%S") - - nameHi = netHi() + nameHi = netHiWire() if net_if_stats()[nameHi].isup: @@ -26,5 +23,5 @@ def wire_connect_status(user, passwd): except: pass else: - s = '请检查网线是否插入 或 是否已连接到 SHU有线\n' + t + s = '请检查网线是否插入 或 是否已连接到 SHU有线\n' return s