Python使用Selenium库实现CSDN自动化发帖
虽然CSDN上有很多优秀的作品,但也不乏很多很水的文章,我也不知道这种有什么意义。不过发这么水的文章多没意思,让浏览器自动化发帖就行了。以下程序能够实现CSDN自动化发帖,同时附自动给关注的人的文章点赞的程序。因为也有很多作者之间互赞,但不看文章的质量,评论区也都是水军,不说该文章具体的问题,而只是泛泛的夸赞。
以下给出完整代码,需要自己调试。我就不详细介绍程序了,比较简单。主要难点是iframe和window不断切换,需要检查HTML源代码检查。
完整代码
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
import time
from selenium.webdriver.common.action_chains import ActionChains
# from selenium.webdriver.edge.options import Options
class Config:def __init__(self):# 账号self.username = ''# 密码self.password = ''def get(conf, driver, url):driver.maximize_window()driver.get(url)# 最多等待5秒使页面加载进来,隐式等待driver.implicitly_wait(5)WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//*[text()='登录']"))).click()WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it(0))# driver.switch_to.frame(0)WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//span[text()='密码登录']"))).click()username = driver.find_element(By.XPATH, "//input[@autocomplete='username']")username.send_keys(conf.username)# time.sleep(1)passwd = driver.find_element(By.XPATH, "//input[@autocomplete='current-password']")passwd.send_keys(conf.password)div = driver.find_element(By.CLASS_NAME,'inform-title')div.find_element(By.TAG_NAME, "i").click()driver.find_element(By.XPATH, "//*[text()='登录']").click()time.sleep(1)driver.switch_to.window(driver.window_handles[0])# time.sleep(1)WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(0))# driver.switch_to.frame(0)time.sleep(1)driver.find_element(By.CLASS_NAME, "btn-skip").click()# WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "btn-skip"))).click()driver.switch_to.window(driver.window_handles[0])# time.sleep(1)driver.find_element(By.CSS_SELECTOR, "a[href='https://mp.csdn.net']").click()WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "btn-close"))).click()driver.find_element(By.CSS_SELECTOR, "a.content").click()time.sleep(1)driver.find_element(By.XPATH, "//span[text()='创作助手']").click()time.sleep(1)driver.switch_to.frame(1)box = driver.find_element(By.CLASS_NAME, "i-ai-chat-welcome-questions")# print(list.get_attribute("outerHTML"))list = box.find_elements(By.TAG_NAME, "button")writetest(driver,list)# list = driver.find_elements(By.CLASS_NAME,"sub-people-list-box" )# print(len(list))# thumbs_up(driver,list)i = 0
def writetest(driver,list):global ili = list[i]i = i + 1title_tag = li.find_element(By.CSS_SELECTOR, "span.ivu-typography")title_text = title_tag.textli.click()WebDriverWait(driver,15).until(EC.presence_of_element_located((By.CSS_SELECTOR,"button.ivu-btn.ivu-btn-text.ivu-mr-32")))WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "svg[width='12'][height='12']"))).click()# text_1 = '"重新生成 "'# WebDriverWait(driver,20).until(EC.presence_of_element_located((By.XPATH,f"//span[text()='{text_1}']")))# text_2 = '"复制"'# WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,f"//p[text()='{text_2}']]"))).click()# driver.find_element(By.XPATH, "//img[@src='https://mp-blog.csdn.net/mp_blog/img/ceditlose.12eeb4a2.png']").click()driver.switch_to.window(driver.window_handles[0])driver.find_element(By.CSS_SELECTOR,"img.edit-title-close").click()title = driver.find_element(By.TAG_NAME,"textarea")title.send_keys(title_text)WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it(0))# driver.switch_to.frame(0)content = driver.find_element(By.TAG_NAME,"p")# content.click()content.send_keys(Keys.CONTROL, 'v')driver.switch_to.window(driver.window_handles[0])# box = driver.find_element(By.CSS_SELECTOR, "div.btn-box")# buttons = box.find_elements(By.TAG_NAME,"button")# buttons[1].click()driver.find_element(By.XPATH,"//span[text()=' 发布博客']").click()# for li in list:# li.find_element(By.CSS_SELECTOR, "span.ivu-typography")def thumbs_up(driver,list):i = 3n = 1j = 0for people in list:driver.switch_to.window(driver.window_handles[0])if i > 0:img = people.find_element(By.TAG_NAME, "img")img.click()time.sleep(2) # 等待页面加载if driver is None:print("Driver is None. Exiting.")driver.switch_to.window(driver.window_handles[n+j])n = n + 1time.sleep(2) # 等待页面加载try:article = driver.find_element(By.TAG_NAME, "article")article.find_element(By.TAG_NAME, "img").click()j = j + 1time.sleep(2)driver.switch_to.window(driver.window_handles[-1])# 找到要操作的元素element = driver.find_element(By.ID, "is-like-imgactive-new")tag = driver.find_element(By.ID, "blog-digg-num")# 初始显示状态print(f"初始 display 属性: {element.value_of_css_property('display')}")if element.value_of_css_property('display') == 'none':tag.click()# driver.execute_script("arguments[0].style.display = 'block';", element)# else:# driver.execute_script("arguments[0].style.display = 'none';", element)time.sleep(2)print(f" display 属性: {element.value_of_css_property('display')}")except:passi -= 1if __name__ == '__main__':conf = Config()url = 'https://blog.csdn.net/2301_80892630?type=sub&spm=1010.2135.3001.5348'driver = webdriver.Edge()get(conf, driver, url)time.sleep(10)driver.quit()
相关文章:
Python使用Selenium库实现CSDN自动化发帖
虽然CSDN上有很多优秀的作品,但也不乏很多很水的文章,我也不知道这种有什么意义。不过发这么水的文章多没意思,让浏览器自动化发帖就行了。以下程序能够实现CSDN自动化发帖,同时附自动给关注的人的文章点赞的程序。因为也有很多作…...
StringBulider和StringBuffer的底层源码剖析
要深入了解 StringBuffer 和 StringBuilder 的区别,从底层源码的角度来解析,包括它们的创建、扩容机制等,可以参考 JDK 1.8 的源码。 1. AbstractStringBuilder 类 StringBuffer 和 StringBuilder 都继承自 AbstractStringBuilder。…...
手机空号过滤接口-在线手机空号检测-手机空号过滤API
接口简介:在线检测手机号状态,与运营商平台联动大数据分析判断手机号状态。可划分出实号、空号、停机、流量卡、沉默号。 更新周期:两周 不支持号段:14、16、17、19号段 存在5%的误差,如需实时接口,可购买手…...
ubuntu 用ss-TPROXY实现透明代理,基于TPROXY的透明TCP/UDP代理,在 Linux 2.6.28 后进入官方内核。
TPROXY 是一个 Linux 内核模块,在 Linux 2.6.28 后进入官方内核。 1 安装 tproxy 相关依赖 参考ss-tproxy 的安装依赖。 bash ss-tproxy 使用了 bash 的一些语法特性,比如 shell 数组,因此必须用 bash 解释器执行。大多数发行版已经自带了…...
报错解决:opene3d draw_geometries(): incompatible function arguments.
1. 报错信息 o3d.visualization.draw_geometries(target_pcd) TypeError: draw_geometries(): incompatible function arguments. The following argument types are supported:1. (geometry_list: List[open3d.cpu.pybind.geometry.Geometry], window_name: str Open3D, wid…...

Clickhouse笔记(二) 集群搭建
0.集群规划 操作系统使用ubuntu2204server,8C8G100G。 节点分片部署192.168.50.5分片1副本1clickhouse-server/clickhouse-client/keeper192.168.50.6分片1副本2clickhouse-server/clickhouse-client/keeper192.168.60.7分片2副本1clickhouse-server/clickhouse-c…...

华为云购买弹性云服务器(教程)
配置弹性云服务器 基础配置 实例 操作系统...

Python异常检测- 单类支持向量机(One-Class SVM)
系列文章目录 Python异常检测- Isolation Forest(孤立森林) python异常检测 - 随机离群选择Stochastic Outlier Selection (SOS) python异常检测-局部异常因子(LOF)算法 Python异常检测- DBSCAN 文章目录 系列文章目录前言一、On…...

基于SpringBoot+Vue+uniapp微信小程序的婚庆摄影小程序的详细设计和实现(源码+lw+部署文档+讲解等)
项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…...

NGAC访问控制系列三:低代码产品NGAC运用与算法运用
目录 一、基于NGAC的低代码模型权限管理方案 二、多策略访问控制系统限制内部访问的线性时间算法 1、概述 2、权限控制图遍历算法 一、基于NGAC的低代码模型权限管理方案 NGAC在低代码平台的权限决策模型:功能权限数据权限 案例:对于七巧低代码开发平台&…...
Unity3D 面试题收录
Unity3D 客户端面试题收录(持续更新~) 面试题收录 本文收录一些对于 Unity3D 客户端可能遇到的面试题(持续更新~),答案仅出于个人理解,如有偏差,希望指正。 Unity3D MonoBehaviour 生命周期…...

Jrebel热部署不生效解决
打开setting找到build底下的complier勾选 build project automatically 设置自动构建项目 打开setting找到Advanced Setting勾选Complier中的第一项 Jrebel panel中勾选需要热部署的项目模块 项目配置信息:Edit Configuration中进行编辑,配置如下图…...

软件测试学习笔记丨Selenium键盘鼠标事件ActionChains
本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/22515 本文为霍格沃兹测试开发学社的学习经历分享,写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步~ 说明:本篇博客基于sel…...
CI/CD(持续集成与持续交付)流水线
集成 Jenkins、GitLab Webhook、Nexus 和 RabbitMQ 可以形成一个全面的 CI/CD(持续集成与持续交付)流水线,结合消息队列可以创建事件驱动的工作流。以下是配置这四个工具以实现一个基本的 CI/CD 流程的详细步骤。 前置条件 Jenkins、GitLab、…...
分布式光伏发电有什么优劣势
分布式光伏发电是指在离电力消费地点较近的地方,通过安装光伏发电系统来发电。这种系统通常用于屋顶、地面或其他建筑物上,相比于集中式光伏发电系统,它有一些独特的优势和劣势: 优势: 地理适应性: 分布式…...
Spring Boot框架中的IO
1. 文件资源的访问与管理 在 Spring Boot 中,资源文件的访问与管理是常见的操作需求,比如加载配置文件、读取静态文件或从外部文件系统读取文件。Spring 提供了多种方式来处理资源文件访问,包括通过 ResourceLoader、Value 注解以及 Applica…...

DBeaver连接Hive教程
hive shell:通过hive shell来操作hive,但是至多只能存在一个hive shell,启动第二个会被阻塞,也就是说hive shell不支持并发操作。 基于JDBC等协议:启动hiveserver2,通过jdbc协议可以访问hive,hi…...
Vue-Router源码实现详解
1.Hash模式 hash就是url中#后面的部分hash改变时,页面不会从新加载,会触发hashchange事件,去监听hash改变,而且也会被记录到浏览器历史记录中vue-router的hash模式,主要是通过hashchange事件,根据hash值找…...

程序员节日的日期是10月24日程序员日
程序员节日的日期是10月24日。 这一天被称为中国程序员日或1024程序员节,由博客园、CSDN等自发组织设立,旨在纪念程序员对科技世界的贡献。 程序员节日的由来和意义 1024程序员节的由来可以追溯到2010年,最初由网友提出设立一个…...
联邦学习中的数据异构性
在联邦学习(Federated Learning, FL)领域中, 异构数据(Heterogeneous Data) 是指不同客户端所持有的本地数据在特征分布、类别分布、数量等方面存在差异的数据。这种数据的异质性是联邦学习面临的一大挑战,…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...

Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...