目录
运行代码前须知:
前言
技能Get1
代码主体部分
写在最后
运行代码前须知:
1.本次更新的代码是实现C站内容管理整页文章(20篇文章)同步到所有社区,因此需要自己先Ctrl+滚轮实现25%放缩,使得页面能将20篇文章显示出来。
2.代码运行开始的2秒需要将内容管理页面处于置顶。
前言
首先笔者尝试点击本页面所有”同步至社区“按钮,发现可行,因此可以结合上一篇的内容,实现对同一页面的文章实现同步至所有社区。
import uiautomation as auto
import time
# TODO
"""TODO首先程序提供2秒钟,需要你将页面显示在CSDN的内容管理页面
https://mp.csdn.net/mp_blog/manage/article"""
time.sleep(2)
"""时间开始记录以及运行时间记录,最后运行时间显示单位为秒"""
start_time = time.time()
print('开始时间:{}'.format(start_time))
# 将全局超时设置为3秒
auto.SetGlobalSearchTimeout(3)
content = auto.DocumentControl(Name="内容管理-CSDN创作中心", Classname="Chrome_RenderWidgetHostHWND")
# main = content.GroupControl(LocalizedControlType="主要")
# 这个for循环是用来看这一页界面的同步至社区按钮个数
for i in range(1, 21):
tongbu_button = content.EditControl(Name="同步至社区", foundIndex=i)
if tongbu_button.Exists(searchIntervalSeconds=0.1):
tongbu_button.Click(waitTime=0.1)
tongbu_button.Click(waitTime=0.1)
else:
break
end_time = time.time()
sum_time = end_time - start_time
print("""运行时间:{}s""".format(sum_time))
# 运行时间:46.16595697402954s
# 运行时间:31.70241189002991s
为了速度加快些,在一些函数中的关于等待时间、运行时间进行了更改,能提高速度。
技能Get1
class Control():
ValidKeys = set(['ControlType', 'ClassName', 'AutomationId', 'Name', 'SubName', 'RegexName', 'Depth', 'Compare'])
def __init__(self, searchFromControl: 'Control' = None, searchDepth: int = 0xFFFFFFFF, searchInterval: float = SEARCH_INTERVAL, foundIndex: int = 1, element=None, **searchProperties):
"""
searchFromControl: `Control` or its subclass, if it is None, search from root control(Desktop).
searchDepth: int, max search depth from searchFromControl.
foundIndex: int, starts with 1, >= 1.
searchInterval: float, wait searchInterval after every search in self.Refind and self.Exists, the global timeout is TIME_OUT_SECOND.
element: `ctypes.POINTER(IUIAutomationElement)`, internal use only.
类Control()中的foundIndex参数填的是控件索引,对于有多个同类控件时,使用该索引可以准确定位需要的控件。
代码主体部分
本次更新代码主要是结合文章开头点击20个同步至社区按钮,然后嵌套之前写的(详见前文)Uiautomation实现同步CSDN文章至社区(2023.08.01更新)https://blog.csdn.net/knighthood2001/article/details/132034741 主要变化就是多了个for循环。
import uiautomation as auto
import time
# TODO
"""TODO首先程序提供2秒钟,需要你将页面显示在CSDN的内容管理页面
https://mp.csdn.net/mp_blog/manage/article"""
time.sleep(2)
"""时间开始记录以及运行时间记录,最后运行时间显示单位为秒"""
start_time = time.time()
print('开始时间:{}'.format(start_time))
# 将全局超时设置为3秒
auto.SetGlobalSearchTimeout(3)
content = auto.DocumentControl(Name="内容管理-CSDN创作中心", Classname="Chrome_RenderWidgetHostHWND")
# main = content.GroupControl(LocalizedControlType="主要")
tongbu = content.EditControl(Name="同步至社区")
"""下面两个tongbu.Click()之间的内容是用来确定社区名称,社区数量"""
# 同步至社区按钮若存在则点击
if tongbu.Exists():
tongbu.Click()
# last_group中存放的就是对应社区的列表
last_group = content.GetLastChildControl()
non_name_list = last_group.ListControl()
specific_list = non_name_list.GetChildren()
a = []
for i in specific_list:
a.append(i.GetChildren()[0].Name)
# 列表a是社区列表
print(a)
# 社区的个数
b = len(a)
print('社区数:', len(a))
# 将点出来的同步至社区关闭,方便后续循环操作
tongbu.Click()
# 这个for循环是用来看这一页界面的同步至社区按钮个数
for k in range(1, 21):
tongbu_button = content.EditControl(Name="同步至社区", foundIndex=k)
if tongbu_button.Exists(searchIntervalSeconds=0.1):
# tongbu_button.Click(waitTime=0.1)
# tongbu_button.Click(waitTime=0.1)
# yes控件是点击具体社区是,弹出的确认同步的“确认”按钮
yes = content.TextControl(Name='确认')
"""这里i和j的功能是用来进行大小循环的,大循环用来表示需要同步到哪个社区,小循环用来控制键盘热键Down的按动次数"""
for i in range(1, b+1):
# 点击同步到社区按钮
if tongbu_button.Exists(searchIntervalSeconds=0.1):
tongbu_button.Click()
# 让其按 下键 到对应的社区,然后回车
for j in range(0, i):
auto.SendKey(auto.Keys.VK_DOWN)
auto.SendKey(auto.Keys.VK_ENTER)
yes = content.TextControl(Name='确认')
# 由于跳出"确认此文章同步至xxx社区么?"时,通过热键Enter不能实现确定功能,因此需要鼠标点击。
if yes.Exists():
yes.Click()
print("已同步至{}社区".format(a[i-1]))
else:
break
end_time = time.time()
sum_time = end_time - start_time
print("""运行时间:{}s""".format(sum_time))
写在最后
1、对于需要将全部文章同步到社区时,只需要每次更换页面,重新运行代码。
2、后续代码会进行优化:①添加滚动,使得无需缩放至25% ②下箭头处优化,缩短时间。