丨涉及到的第三方库
PySide2(QT设计师)
selenium(自动化测试)
pyautogui(自动化测试)
pyperclip(复制粘贴)
requests(爬虫)
webbrowser(调起浏览器)
丨程序介绍
我有一个作品排行,经过几个人审核 ,并且有排名,我想把数据库的排名对接到本地的程序里面,然后还可以查看评审的建议。
通过建议和分数,我可以自己选,这个作品怎么样,给他发通知,优秀的再把这个作品连同建议发送给编程猫官方。
不管是精选作品还是潜力作品都可以调用接口发送信息给对方。这个是如何做到的呢?
丨程序思路
我想利用可视化界面展示排名和建议,并且提交表单的时候(也就是提交给编程猫官方),我想自动化操作,无需手动复制粘贴点击。
最后实现:管理员选择作品,查看建议,再确认作品归类,就完成。
最后测试:纯人工筛选和提交一个作品至少需要5分钟,但程序只需要1分钟。
效果如图所示:
大概就是这样,数据来源就是我们的服务器,前后端分离对接服务器的接口,从而完成程序。
丨程序流程
首先从Qt设计师设计好界面,然后再转换成Py文件,导入到主文件。
然后开始写代码,先获取排行,点击其中一个再获取委员建议,最后再执行提交操作。
也没有这么难。上面的提交表单纯自动操作,无人工干涉,大约1.2s完成操作。
丨程序代码
应部分代码私用,不开放,下方代码已隐藏,用 {接口隐藏} 字符代替。编创协API开放平台:https://api.bcmcreator.cn/
主程序.py
#coding:utf8
from PySide2.QtWidgets import *
from PySide2.QtCore import QStringListModel
from ui_workdata7 import Ui_MainWindow
import json,sys,webbrowser as wb,requests as rq,time,pyautogui,pyperclip
from selenium import webdriver
from selenium.webdriver import ChromeOptions
class Work(QMainWindow, Ui_MainWindow):
BASE_URL='https://api.bcmcreator.cn/'
FORM_URL='https://shimo.im/forms/gVcgVC9gPdHkYj3w/fill'
WORK_URL='https://shequ.codemao.cn/work/'
headers={'user-agant':'Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'}
def __init__(self):
super().__init__()
self.setupUi(self)
self.show()
self.getWork('{}user_base/user_workdata7.php'.format(self.BASE_URL))
self.getJsonWork()
self.setRowCount()
self.forDataTable()
#点击按钮,获取作品委员和大众评审信息
self.tableWidget.itemClicked.connect(self.chick)
#点击按钮,打开作品地址
self.pushButton_4.clicked.connect(self.openUrl)
#点击按钮,推送上首页给编程猫官方的通知
self.pushButton_3.clicked.connect(self.pushWorkSelected)
#点击按钮,本周潜力作品,继续加油的通知
self.pushButton_2.clicked.connect(self.pushWorkPotential)
#点击按钮,正式推送作品给编程猫官方
self.pushButton_5.clicked.connect(self.seleniumOpen)
def chick(self,item):
'''
获取作品委员数据,显示。
格外赋值作品ID
'''
if item.column()==0:
self.getWork('{}user_base/user_workintroduce.php?code={}'.format(self.BASE_URL,item.text()))
self.textEdit.setText(self.data)
self.id=self.tableWidget.item(item.row(),item.column()+1).text()
self.x=item.text()
def openUrl(self):
'''
使用系统浏览器打开指定作品
'''
wb.open('{}{}'.format(self.WORK_URL,self.id))
def pushWorkSelected(self):
'''
提交作品,本周精选,成功推送给编程猫官方
'''
self.getWork('{}{接口已隐藏}{}'.format(self.BASE_URL,self.x))
QMessageBox.information(self, "提醒", "提交成功!")
def pushWorkPotential(self):
'''
提交作品,本周潜力,还需加油
'''
self.getWork('{}{接口已隐藏}{}'.format(self.BASE_URL,self.x))
QMessageBox.information(self, "提醒", "提交成功!")
def getWork(self,url):
'''
Get网页数据,以文本形式传回
url:网页链接
'''
self.data=rq.get(url,headers=self.headers).text
def getJsonWork(self):
'''
文本转Json
'''
self.dataJson=json.loads(self.data)
def setRowCount(self):
'''
设置表格行数,根据Json长度设置
'''
self.tableWidget.setRowCount(len(self.dataJson))
def forDataTable(self):
'''
设置表格数据
'''
set=self.tableWidget.setItem
for i in range(len(self.dataJson)):
set(i,0,QTableWidgetItem(self.dataJson[i]['x']))
set(i,1,QTableWidgetItem(self.dataJson[i]['pd']))
set(i,2,QTableWidgetItem(self.dataJson[i]['id'].split('&')[1]))
set(i,3,QTableWidgetItem(self.dataJson[i]['js']))
set(i,4,QTableWidgetItem(self.dataJson[i]['pwname']+'/'+self.dataJson[i]['shr']))
set(i,5,QTableWidgetItem(self.dataJson[i]['fs']))
def seleniumOpen(self):
'''
传递作品给官方,自动化操作提交表单
'''
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
option.add_argument('lang=zh_CN.UTF-8')
option.add_argument('user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36"')
browser = webdriver.Chrome(options=option)
browser.get(self.FORM_URL)
# browser.maximize_window()
time.sleep(2)
pyautogui.click(300, 468)
pyperclip.copy(self.WORK_URL+self.id)
pyperclip.paste()
pyautogui.hotkey('ctrl','v')
pyautogui.click(300, 630)
pyautogui.click(300, 780)
pyautogui.click(300, 930)
browser.execute_script('window.scrollBy(0,500)')
pyautogui.click(300, 600)
pyautogui.click(300, 750)
pyperclip.copy(self.data)
pyperclip.paste()
pyautogui.hotkey('ctrl','v')
pyautogui.click(300, 830)
pyautogui.click(300, 750)
pyautogui.click(440, 950)
time.sleep(2)
#程序入口
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Work()
sys.exit(app.exec_())
ui_workdata7.py(由Qt设计师转换而来的界面)
# -*- coding: utf-8 -*-
################################################################################
## Form generated from reading UI file 'workdata7.ui'
##
## Created by: Qt User Interface Compiler version 5.15.2
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(1616, 641)
MainWindow.setMinimumSize(QSize(1616, 641))
MainWindow.setMaximumSize(QSize(1616, 641))
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.tableWidget = QTableWidget(self.centralwidget)
if (self.tableWidget.columnCount() < 6):
self.tableWidget.setColumnCount(6)
__qtablewidgetitem = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, __qtablewidgetitem)
__qtablewidgetitem1 = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, __qtablewidgetitem1)
__qtablewidgetitem2 = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(2, __qtablewidgetitem2)
__qtablewidgetitem3 = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(3, __qtablewidgetitem3)
__qtablewidgetitem4 = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(4, __qtablewidgetitem4)
__qtablewidgetitem5 = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(5, __qtablewidgetitem5)
self.tableWidget.setObjectName(u"tableWidget")
self.tableWidget.setGeometry(QRect(10, 10, 1211, 591))
self.tableWidget.horizontalHeader().setVisible(True)
self.tableWidget.horizontalHeader().setCascadingSectionResizes(False)
self.tableWidget.horizontalHeader().setDefaultSectionSize(198)
self.tableWidget.horizontalHeader().setHighlightSections(True)
self.groupBox = QGroupBox(self.centralwidget)
self.groupBox.setObjectName(u"groupBox")
self.groupBox.setGeometry(QRect(1230, 10, 371, 441))
self.textEdit = QTextEdit(self.groupBox)
self.textEdit.setObjectName(u"textEdit")
self.textEdit.setGeometry(QRect(10, 20, 351, 411))
self.textEdit.setReadOnly(True)
self.tabWidget = QTabWidget(self.centralwidget)
self.tabWidget.setObjectName(u"tabWidget")
self.tabWidget.setGeometry(QRect(1240, 460, 361, 111))
self.tab = QWidget()
self.tab.setObjectName(u"tab")
self.pushButton_4 = QPushButton(self.tab)
self.pushButton_4.setObjectName(u"pushButton_4")
self.pushButton_4.setGeometry(QRect(10, 20, 331, 41))
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QWidget()
self.tab_2.setObjectName(u"tab_2")
self.pushButton_2 = QPushButton(self.tab_2)
self.pushButton_2.setObjectName(u"pushButton_2")
self.pushButton_2.setGeometry(QRect(100, 20, 81, 41))
self.pushButton_3 = QPushButton(self.tab_2)
self.pushButton_3.setObjectName(u"pushButton_3")
self.pushButton_3.setGeometry(QRect(10, 20, 81, 41))
self.pushButton_5 = QPushButton(self.tab_2)
self.pushButton_5.setObjectName(u"pushButton_5")
self.pushButton_5.setGeometry(QRect(230, 20, 101, 41))
self.tabWidget.addTab(self.tab_2, "")
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QStatusBar(MainWindow)
self.statusbar.setObjectName(u"statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(0)
QMetaObject.connectSlotsByName(MainWindow)
# setupUi
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"\u63a8\u9996\u9875\u4f5c\u54c1\u6570\u636e\u64cd\u4f5c\u53f0", None))
___qtablewidgetitem = self.tableWidget.horizontalHeaderItem(0)
___qtablewidgetitem.setText(QCoreApplication.translate("MainWindow", u"\u8bc6\u522b\u7801", None));
___qtablewidgetitem1 = self.tableWidget.horizontalHeaderItem(1)
___qtablewidgetitem1.setText(QCoreApplication.translate("MainWindow", u"\u4f5c\u54c1ID", None));
___qtablewidgetitem2 = self.tableWidget.horizontalHeaderItem(2)
___qtablewidgetitem2.setText(QCoreApplication.translate("MainWindow", u"\u4f5c\u54c1\u6635\u79f0", None));
___qtablewidgetitem3 = self.tableWidget.horizontalHeaderItem(3)
___qtablewidgetitem3.setText(QCoreApplication.translate("MainWindow", u"\u4f5c\u8005", None));
___qtablewidgetitem4 = self.tableWidget.horizontalHeaderItem(4)
___qtablewidgetitem4.setText(QCoreApplication.translate("MainWindow", u"\u521d\u5ba1\u4eba/\u590d\u5ba1\u4eba", None));
___qtablewidgetitem5 = self.tableWidget.horizontalHeaderItem(5)
___qtablewidgetitem5.setText(QCoreApplication.translate("MainWindow", u"\u4f5c\u54c1\u5206\u6570", None));
self.groupBox.setTitle(QCoreApplication.translate("MainWindow", u"\u59d4\u5458\u4f1a\u59d4\u5458\u5efa\u8bae\u548c\u5927\u4f17\u8bc4\u5ba1\u5efa\u8bae\u5c55\u793a", None))
self.textEdit.setPlaceholderText(QCoreApplication.translate("MainWindow", u"\u8bf7\u5148\u8f93\u5165\u8bc6\u522b\u7801\uff0c\u70b9\u51fb\u786e\u8ba4\u540e\uff0c\u624d\u4f1a\u663e\u793a\u59d4\u5458\u548c\u5927\u4f17\u8bc4\u5ba1\u5efa\u8bae....", None))
self.pushButton_4.setText(QCoreApplication.translate("MainWindow", u"\u6253\u5f00\u4f5c\u54c1", None))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QCoreApplication.translate("MainWindow", u"\u4f5c\u54c1\u64cd\u4f5c", None))
self.pushButton_2.setText(QCoreApplication.translate("MainWindow", u"\u6f5c\u529b", None))
self.pushButton_3.setText(QCoreApplication.translate("MainWindow", u"\u7cbe\u9009", None))
self.pushButton_5.setText(QCoreApplication.translate("MainWindow", u"\u6253\u5f00\u63a8\u9001", None))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QCoreApplication.translate("MainWindow", u"\u63a8\u9001", None))
# retranslateUi
丨写道最后
程序经过仅供学习,请勿滥用和商业用途。
同时希望各位大神能给我的程序提出优化建议,谢谢!~