殺 博客首页:knighthood2001
欢迎点赞评论️
❤️ 热爱python,期待与大家一同进步成长!!❤️
马上端午了,提前祝大家端午快乐!!!啥烦恼事都鷺鷺鷺
对于一个加入了45个社区的我来说,将文章手动同步至所有社区,这是多么枯燥且繁琐的事呀。
因此:✍️✍️本期笔者又给大家带来了非常使用的python代码:文章同步csdn社区自动化。
目录
一、模块准备
二、具体步骤
2.1定位同步到社区按钮
2.2获取社区列表
2.3遍历每个社区
2.4计算运行时间
2.5全部代码展示
三、总结
一、模块准备
import uiautomation as auto
import time
还是使用uiautomation进行自动化操作,对其不太熟悉的可以看看笔者之前写的文章。
二、具体步骤
实现过程:运行代码后,首先我们手动切换到内容管理页面,接下来代码就会自动将你新发的文章进行同步社区了。最终显示社区数和代码运行时间。
这里我采用time.sleep(2),给足你充足时间进行网页的切换。
start_time = time.time()
print('开始时间:{}'.format(start_time))
开始时间,方便计算代码运行时间。
auto.SetGlobalSearchTimeout(3)
接下来我将全局搜索时间设置为3秒(默认为10秒)。
2.1定位同步到社区按钮
content = auto.DocumentControl(Name="内容管理-CSDN创作中心", Classname="Chrome_RenderWidgetHostHWND")
# 点击同步至社区
tongbu = content.EditControl(Name="同步至社区")
if tongbu.Exists():
tongbu.Click()
使用以上代码默认查找的是最新文章发布的同步到社区按钮。
2.2获取社区列表
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)
print(a)
print('社区数:', len(a))
以上代码实现获取社区名称,并将其添加至列表中,方便知道社区总数以及后续的遍历操作。
结果如下:
yes = content.TextControl(Name='确认') tongbu.Click() s = 0
这里的yes是确认将文章同步到社区的确认按钮
tongbu.Click()是收起下拉框,因为在后续遍历过程中,先进行点击同步到社区按钮操作,所有这里进行点击是保持后续一致性。
s代表的是滚轮的滚动次数。刚开始进行同步时不需要滚动,所有为0,但是后续需要进行滚动,而且每次同步社区都是从头开始的(滚动条始终在最上面),笔者进行手动同步时,对于后面的社区需要进行滚动然后找到相应的社区,再进行同步。而设立s的目的是为了记录上一次滚动的次数,在这次查找社区时滚动到相应位置,
2.3遍历每个社区
for i in a:
# 先点一次同步,跳出框
if tongbu.Exists():
tongbu.Click()
specific_community = content.TextControl(Name='{}'.format(i))
# print(specific_community.Name)
if s == 0:
if not specific_community.Exists():
s += 2
else:
specific_community.Click()
if not yes.Exists():
s += 2
if s > 0:
content.GetLastChildControl().GetFirstChildControl().MoveCursorToMyCenter()
auto.WheelDown(wheelTimes=s, waitTime=0.01)
# 如果社区没显示出来,则滚动
if not specific_community.Exists():
# 鼠标放置中心
content.GetLastChildControl().GetFirstChildControl().MoveCursorToMyCenter()
# print("滚动")
auto.WheelDown(waitTime=0.01)
s += 2
time.sleep(0.5)
specific_community.Click(5, 5)
# 有社区,但是只显示一点
else:
specific_community.Click(5, 5)
if not yes.Exists():
content.GetLastChildControl().GetFirstChildControl().MoveCursorToMyCenter()
auto.WheelDown(waitTime=0.01)
s += 2
time.sleep(0.5)
specific_community.Click(5, 5)
yes = content.TextControl(Name='确认')
if yes.Exists():
yes.Click()
print(a.index(i) + 1, i, ' 已同步')
else:
yes = content.TextControl(Name='确认')
if yes.Exists():
yes.Click()
print(a.index(i) + 1, i, ' 已同步')
specific_community.Click(5, 5)
yes = content.TextControl(Name='确认')
if yes.Exists():
yes.Click()
print(specific_community.Name)
print(a.index(i)+1, i, ' 已同步')
这里讲一下大致思路:首先点击同步到社区按钮,然后定位具体社区。
接下来分很多种情况讨论:如果s=0,且具体社区存在,则点击具体社区,若点击具体社区后没有出现yes按钮,说明需要滑动滚轮;若具体社区不存在,也说明滚轮需要下滑。
当s>0的时候,说明每次点击同步社区的时候,具体社区需要经过先滚动滚轮,查找相应社区,在进行后续操作。当然,要滚动滚轮,首先鼠标得在该区域内,因此
content.GetLastChildControl().GetFirstChildControl().MoveCursorToMyCenter()
我使用该函数将鼠标移至该区域中心,
auto.WheelDown(wheelTimes=s, waitTime=0.01)
将wheelTimes=s,这样就实现了后面的社区先滚动鼠标到能显示具体社区的功能。
接下来和之前一样,需要判断多种条件,首先,如果具体社区没有显示,说明滚轮还要下滑;如果具体社区有显示,但是只显示一点,则要判断点击其是不是会跳出同步具体社区的框,如果没有,说明是无效点击,滚轮要下滑,要是都能实现的话,直接点击具体社区,然后点击确认即可。
specific_community.Click(5, 5)
yes = content.TextControl(Name='确认')
if yes.Exists():
yes.Click()
print(specific_community.Name)
print(a.index(i)+1, i, ' 已同步')
这块是由于有些判断语句后没有实现点击与确认按钮的点击,因此在最后总的添加这段代码。
2.4计算运行时间
end_time = time.time()
sum_time = end_time - start_time
print("""运行时间:{}s""".format(sum_time))
在for循环结束后,即可进行计算运行时间。
2.5全部代码展示
# -*- coding: utf-8-*-
import uiautomation as auto
import time
import subprocess
# subprocess.Popen('C:Program FilesGoogleChromeApplicationchrome.exe')
time.sleep(2)
start_time = time.time()
print('开始时间:{}'.format(start_time))
auto.SetGlobalSearchTimeout(3)
content = auto.DocumentControl(Name="内容管理-CSDN创作中心", Classname="Chrome_RenderWidgetHostHWND")
# 点击同步至社区
tongbu = content.EditControl(Name="同步至社区")
if tongbu.Exists():
tongbu.Click()
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)
print(a)
print('社区数:', len(a))
yes = content.TextControl(Name='确认')
tongbu.Click()
s = 0
for i in a:
# 先点一次同步,跳出框
if tongbu.Exists():
tongbu.Click()
specific_community = content.TextControl(Name='{}'.format(i))
# print(specific_community.Name)
if s == 0:
if not specific_community.Exists():
s += 2
else:
specific_community.Click()
if not yes.Exists():
s += 2
if s > 0:
content.GetLastChildControl().GetFirstChildControl().MoveCursorToMyCenter()
auto.WheelDown(wheelTimes=s, waitTime=0.01)
# 如果社区没显示出来,则滚动
if not specific_community.Exists():
# 鼠标放置中心
content.GetLastChildControl().GetFirstChildControl().MoveCursorToMyCenter()
# print("滚动")
auto.WheelDown(waitTime=0.01)
s += 2
time.sleep(0.5)
specific_community.Click(5, 5)
# 有社区,但是只显示一点
else:
specific_community.Click(5, 5)
if not yes.Exists():
content.GetLastChildControl().GetFirstChildControl().MoveCursorToMyCenter()
auto.WheelDown(waitTime=0.01)
s += 2
time.sleep(0.5)
specific_community.Click(5, 5)
yes = content.TextControl(Name='确认')
if yes.Exists():
yes.Click()
print(a.index(i) + 1, i, ' 已同步')
else:
yes = content.TextControl(Name='确认')
if yes.Exists():
yes.Click()
print(a.index(i) + 1, i, ' 已同步')
specific_community.Click(5, 5)
yes = content.TextControl(Name='确认')
if yes.Exists():
yes.Click()
print(specific_community.Name)
print(a.index(i)+1, i, ' 已同步')
end_time = time.time()
sum_time = end_time - start_time
print("""运行时间:{}s""".format(sum_time))
三、总结
①该代码存在很多可以优化的空间,现在可以实现文章同步csdn社区自动化。不过运行时间有点长,同步到45个社区,花了大概10分钟,其中主要是因为if语句判断需要花费较长时间。
②在写该代码的时候,判断啥时候该滚动滚轮,啥时候不用滚动滚轮是个难题,笔者采用过许多方法,比如判断要点击的具体社区的所在位置的最下面比大的区域还要下面,还使用过判断右边滚动条是否到底,这些都没尝试成功,大家可以自己去试试,说不定就成功了。
③上述代码,如有错误或者不合理之处,请批评指正!!!!



