selenium网页自动登录、打卡(二)

2023-05-16

文章目录

  • 前言
  • 一、Python+Selenium
  • 二、通信环境(服务器、客户端)
    • 1. selenium借助cookie网页登录csdn
    • 2.私信发送消息流程
    • 3.将新增的逻辑融入原本的程序


前言

前面做了一个自动打卡的小程序,基本可以实现上班签到,下班签退的任务,但还是有一些限制的,比如程序需要时时刻刻的运行在电脑上(可以在下班的时候将程序跑起来,但是电脑不能关机),这个问题对我来说其实还好,因为我下班本来就不关电脑。

另外一个比较重要的限制就是,很多时候由于网络等等莫名其妙的问题,很容易导致程序终止,总不能把每一行代码都try一下吧,如果程序崩了,打卡失败,而睡梦中的我完全不知情,等到早上慢慢悠悠的过来之后,发现超时了,到时候就很尴尬了。

于是,我继续用selenium做了一个打卡之后,将打卡结果通过服务器发送给手机端,这样我就能提前知道打卡的结果,如果程序崩了,那就做好早睡早起的准备。

思路有了,服务器到哪里去搞?原本的想法是通过python调用微信QQ之类的,但是公司主机权限的问题,程序是跑在Ubuntu虚拟机里面的,搞起来很麻烦。思前想后,既然还是selenium,既然还是网页端,那干脆蹭一蹭CSDN的服务器吧,嘿嘿嘿。


一、Python+Selenium

具体的环境配置可以参考之前的文章。

二、通信环境(服务器、客户端)

手机上的客户端,下载CSDN客户端,登录马甲小号,作为接收信息的载体,早上起来看看私信的消息,就知道有没有打卡成功了。这波啊,这波是给CSDN客户端做宣传。。。

网页端,还是之前的流程,只不过在打卡成功或者失败之后,继续通过selenium登录CSDN账号,通过私信将打卡结果发送给马甲小号。

程序的具体流程如下:

1. selenium借助cookie网页登录csdn

因为网页登录csdn的时候,需要扫码啊,账号啊之类的,十分麻烦,还容易出错,所以就借助cookie的方式来登录,首先是手动登录,然后通过代码获取cookie,保存至本地文件,下次登录的时候直接读取本地文件的cookie信息。

获取cookie代码如下:

import time
import json
from selenium import webdriver
#手动获取cookies
driver = webdriver.Firefox()
url = 'https://blog.csdn.net/qq_34935373/article/details/121680879?spm=1001.2014.3001.5502'
driver.get(url)
a = input("input:")
#获取cookie
cookies = driver.get_cookies()
#cookie保存到cookies.txt文件
f1 = open("cookies.txt","w")
f1.write(json.dumps(cookies))
f1.close
print(cookies)
print(type(cookies))

首先运行程序,代码会自动打开csdn网站的登录页面,此时程序会卡在input输入这里,你只需要扫码登录之后,刷新一下,保证账号已经登录成功了,然后在中断中输入一个字符并enter(让程序执行到input之后),程序就会自动将cookie保存到本地文件了,注意使用的时候,cookie和代码程序放在同一个目录里面。

2.私信发送消息流程

  • 打开特定的网页(要和获取cookie的网址保持一致,避免域信息发生改变)
  • 读取本地cookie,刷新一下,使得cookie生效
  • 模拟点击私信
  • 模拟发送打卡信息给马甲小号
  • 完成任务,关闭浏览器

代码如下:

# 要先获取cookie,我已经获取过了,注意在哪个网址获取的cookie,就只能在哪个网站用
print("将打卡结果通过服务器发送至手机。。。")
# 登录CSDN
options2 = webdriver.FirefoxOptions()
options2.add_argument("--headless") 
options2.add_argument("--disable-gpu")
profile = webdriver.FirefoxProfile()
browser2 = webdriver.Firefox(options=options2,firefox_profile=profile)
# browser2 = webdriver.Firefox()
csdn = LoginUrl(browser2, 'https://blog.csdn.net/qq_34935373/article/details/121680879?spm=1001.2014.3001.5502', u" ", u" ")
csdn.openwebsite()
#从cookies.txt文件读取cookies
f2 = open("cookies.txt")
cookies = json.loads(f2.read())
#使用cookies登录
for cook in cookies:
	browser2.add_cookie(cook)
#刷新页面
print("刷新页面通过cookie登陆。。。")
browser2.refresh()
time.sleep(3)
# 点击私信
csdn.clicksubmit("xpath", "/html/body/div[3]/div[1]/aside/div[1]/div[6]/div[1]/a")
time.sleep(1)

print("发送内容:")
# 切换到子标签页
current_windows = browser2.window_handles
browser2.switch_to_window(current_windows[1])
if(flag):
	print("    "+ strs+" clock in Success!" + " by chuanshuai!")
	csdn.inputvalue("id", "messageText", strs+" clock in Success!" + " by chuanshuai!")
else:
	print("    "+ strs+" clock in Fail!" + " by chuanshuai!")
	csdn.inputvalue("id", "messageText", strs+" clock in Fail!" + " by chuanshuai!")
csdn.Enter_strings("id", "messageText")
time.sleep(3)
print("-------------------------------")
# close只关闭了原本的页面
browser2.quit()
time.sleep(30)

上述程序有两处需要注意,第一处是option选项,通过这个参数让Firefox绕过window.navigator.webdriver控件检测,加上这个参数之后,程序调用浏览器,就不会弹出浏览器的界面 ,相对来说动静小一点,不会出现人不在电脑在动的情况吓到同事,不过在锁屏界面下没啥差别。

第二处则是切换到子标签页,csdn网页点击私信的时候,会重新弹出一个子标签页,此时xpath定位元素还是在第一个打开的标签页上查找,所有要有个切换的过程。

3.将新增的逻辑融入原本的程序

融入的逻辑很简单,基本上就是打卡程序之后,加上上面这些,在加个标志位。全体程序如下(cookie部分需要手动操作一次):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# v1_0_0 by chuanshuai date: 2021.12.01 16:00

import time
from time import strftime
import datetime
from selenium import webdriver
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 import ActionChains
import json
# import pyautogui
from selenium.webdriver.common.keys import Keys  

class LoginUrl(object):
	#初始化类的属性
	def __init__(self, driver, url, username, password):
		self.__driver = driver
		self.__url = url
		self.__username = username
		self.__password = password
	#打开网页的方法
	def openwebsite(self):
		self.__driver.maximize_window()
		self.__driver.get(self.__url)
	#输入网页账号
	def inputusername(self, find_element_method, element):
		if(find_element_method == "id"):		
			WebDriverWait(self.__driver, 10).until(EC.presence_of_element_located((By.ID, element)))#等待10s,每500ms查询一次,直到元素加载完毕或超过10s结束
			usrName = self.__driver.find_element_by_id(element)
		elif(find_element_method == "name"):
			WebDriverWait(self.__driver, 10).until(EC.presence_of_element_located((By.NAME, element)))
			usrName = self.__driver.find_element_by_name(element)
		elif(find_element_method == "xpath"):
			WebDriverWait(self.__driver, 10).until(EC.presence_of_element_located((By.XPATH, element)))
			usrName = self.__driver.find_element_by_xpath(element)
		else:
			print("find element error!")
		usrName.send_keys(self.__username)
	#输入网页密码
	def inputpassword(self, find_element_method, element):
		if(find_element_method == "id"):
			WebDriverWait(self.__driver, 10).until(EC.presence_of_element_located((By.ID, element)))
			passWrd = self.__driver.find_element_by_id(element)
		elif(find_element_method == "name"):
			WebDriverWait(self.__driver, 10).until(EC.presence_of_element_located((By.NAME, element)))
			passWrd = self.__driver.find_element_by_name(element)
		elif(find_element_method == "xpath"):
			WebDriverWait(self.__driver, 10).until(EC.presence_of_element_located((By.XPATH, element)))
			passWrd = self.__driver.find_element_by_xpath(element)
		else:
			print("find element error!")
		passWrd.send_keys(self.__password)
	#输入内容和字符
	def inputvalue(self, find_element_method, element, strings):
		if(find_element_method == "id"):
			WebDriverWait(self.__driver, 10).until(EC.presence_of_element_located((By.ID, element)))
			value = self.__driver.find_element_by_id(element)
		elif(find_element_method == "name"):
			WebDriverWait(self.__driver, 10).until(EC.presence_of_element_located((By.NAME, element)))
			value = self.__driver.find_element_by_name(element)
		elif(find_element_method == "xpath"):
			WebDriverWait(self.__driver, 10).until(EC.presence_of_element_located((By.XPATH, element)))
			value = self.__driver.find_element_by_xpath(element)
		else:
			print("find element error!")
		value.send_keys(strings)
	#点击登陆
	def clicksubmit(self, find_element_method, element):
		if(find_element_method == "id"):
			WebDriverWait(self.__driver, 5).until(EC.presence_of_element_located((By.ID, element)))
			self.__driver.find_element_by_id(element).click()
		elif(find_element_method == "name"):
			WebDriverWait(self.__driver, 5).until(EC.presence_of_element_located((By.NAME, element)))
			self.__driver.find_element_by_name(element).click()
		elif(find_element_method == "xpath"):
			WebDriverWait(self.__driver, 5).until(EC.presence_of_element_located((By.XPATH, element)))
			self.__driver.find_element_by_xpath(element).click()
		else:
			print( "find element error!")
	#点击打卡
	def test(self, find_element_method, element):
		ActionChains(self.__driver).move_to_element(self.__driver.find_element_by_xpath(element)).perform()
		self.__driver.find_element_by_xpath(element).click()

	# 输入字符串并enter出去
	def Enter_strings(self, find_element_method, element):
		ActionChains(self.__driver).move_to_element(self.__driver.find_element_by_id(element)).send_keys(Keys.ENTER).perform()

	# 获取CSDN的cookie
	def Get_cookie(self):
		# 等待手动登录csdn,用一个input等候
		input("input:")
		#获取cookie
		cookies = self.__driver.get_cookies()
		#cookie保存到cookies.txt文件
		f1 = open("cookies.txt","w")
		f1.write(json.dumps(cookies))
		f1.close
		print(type(cookies))	


def main():
	print("程序已经运行...")

	while(True):
		# 定义一个标志位,标志打卡是否成功
		flag = False

		# 计算几天的年月日,然后换算成周几,其中周六是5,周日是6,周一是0
		today = datetime.date(int(strftime('%Y',time.localtime(time.time()))),int(strftime('%m',time.localtime(time.time()))),int(strftime('%d',time.localtime(time.time()))))
		if(today.weekday()!=5 and today.weekday()!=6):
			if(
				# must
				strftime('%H:%M',time.localtime(time.time())) == "08:40" or 
				strftime('%H:%M',time.localtime(time.time())) == "18:40" or
				# need
				strftime('%H:%M',time.localtime(time.time())) == "19:50" or
				strftime('%H:%M',time.localtime(time.time())) == "21:00" or
				# test 
				strftime('%H:%M',time.localtime(time.time())) == "12:36" 
			  ):
				
				# Firefox绕过window.navigator.webdriver控件检测
				options1 = webdriver.FirefoxOptions()
				options1.add_argument("--headless") 
				options1.add_argument("--disable-gpu")
				profile = webdriver.FirefoxProfile()
				browser1 = webdriver.Firefox(options=options1,firefox_profile=profile)
				# browser1 = webdriver.Firefox()
				#登录
				xxx = LoginUrl(browser1, "your.html", u"your name", u"your password")
				xxx.openwebsite()
				# 输入账号
				xxx.inputusername("id", "loginid")
				# 输入密码
				xxx.inputpassword("id", "userpassword")
				# 点击登录
				xxx.clicksubmit("xpath", "//button[@id='submit']") 
				time.sleep(5)
				try:
					xxx.test("xpath","//button/span")
				except:
					print("-------------------------------")	
					print("已经打过卡了,只要重新更新时间即可...")
					try:
						xxx.test("xpath", "//a[@class='resign']")		# 有的时候浏览器会有特殊的页面,这句可能定位不到,从而报错
					except:
						print("遇到奇葩情况,打卡失败,等待下次重新打卡")
						flag = False
					else: 
						print("偷懒成功!")
						flag = True
				else:
					print("-------------------------------")
					print("偷懒成功!")
					flag = True
				
				# 定义一个字符串变量,作为发给csdn的数据
				strs = strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
				print("当前时间:"+ strs)
				print("今天是周"+str(today.weekday()+1))
				browser1.quit()
				
				# 要先获取cookie,我已经获取过了,注意在哪个网址获取的cookie,就只能在哪个网站用
				print("将打卡结果通过服务器发送至手机。。。")

				# 登录CSDN
				options2 = webdriver.FirefoxOptions()
				options2.add_argument("--headless") 
				options2.add_argument("--disable-gpu")
				profile = webdriver.FirefoxProfile()
				browser2 = webdriver.Firefox(options=options2,firefox_profile=profile)
				# browser2 = webdriver.Firefox()
				csdn = LoginUrl(browser2, 'https://blog.csdn.net/qq_34935373/article/details/121680879?spm=1001.2014.3001.5502', u" ", u" ")
				csdn.openwebsite()
				#从cookies.txt文件读取cookies
				f2 = open("cookies.txt")
				cookies = json.loads(f2.read())
				#使用cookies登录
				for cook in cookies:
					browser2.add_cookie(cook)
				#刷新页面
				print("刷新页面通过cookie登陆。。。")
				browser2.refresh()
				time.sleep(3)
				# 点击私信
				csdn.clicksubmit("xpath", "/html/body/div[3]/div[1]/aside/div[1]/div[6]/div[1]/a")
				time.sleep(1)
				print("发送内容:")
				# 切换到子标签页
				current_windows = browser2.window_handles
				browser2.switch_to_window(current_windows[1])
				if(flag):
					print("    "+ strs+" clock in Success!" + " by chuanshuai!")
					csdn.inputvalue("id", "messageText", strs+" clock in Success!" + " by chuanshuai!")
				else:
					print("    "+ strs+" clock in Fail!" + " by chuanshuai!")
					csdn.inputvalue("id", "messageText", strs+" clock in Fail!" + " by chuanshuai!")
				csdn.Enter_strings("id", "messageText")
				time.sleep(3)
				print("-------------------------------")
				# close只关闭了原本的页面
				browser2.quit()
				time.sleep(30)
				
			# 如果没到时间,休眠半分钟	
			else:
				time.sleep(30)
		else:
			# 更新weekday
			print("-------------------------------")
			today = datetime.date(int(strftime('%Y',time.localtime(time.time()))),int(strftime('%m',time.localtime(time.time()))),int(strftime('%d',time.localtime(time.time()))))
			print("当前时间:"+ strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
			print("今天是周"+str(today.weekday()+1))
			print("-------------------------------")
			time.sleep(60*60*24)


if __name__ == "__main__":
	main()

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

selenium网页自动登录、打卡(二) 的相关文章

  • docker常用命令

    1 配置docker阿里云镜像 1 打开daemon json文件 xff08 若没有此文件 xff0c 则创建 etc docker daemon json xff09 xff1a vi etc docker daemon json 2
  • 网络调试助手UDP广播问题

    用直接广播地址 xff08 192 168 xxx 255 端口 xff09 可以进行广播 xff1b 用受限广播地址 xff08 255 255 255 255 端口 xff09 显示没有指定有效的远程主机端口 xff0c 搞了好久发现是
  • “平衡小车之家”家的STM32F103最小系统源代码分享

    在网上寻找了好久 xff0c 因为他家的开发板自带有mpu6050模块 故想测试其精准度以及z轴漂移程度 发现也有很大的漂移 代码如下 main c部分 xff1a span class token macro property span
  • 使用PMW3901和VL53L1X 实现室内定点悬停

    使用PMW3901和VL53L1X 实现室内定点悬停 使用PMW3901 光流传感器进行水平方向定位Pixhawk连接PMW3901传感器PX4源代码加入PMW3901驱动后重新编译QGroundControl中的配置 使用气压计和VL53
  • 使用 QGroundControl 地面站更新 PixHawk飞控的Bootloader

    安装最新版本的PX4固件 启动QGroundControl并且使用USB连接到Pixhawk飞控 选择 Q icon gt Vehicle Setup gt Firmware sidebar 打开固件设置 安装最新版本的PX4固件 更新Bo
  • 自制DIY 机器狗 完全教程 - MIT猎豹Cheetah

    自制DIY 机器狗 完全教程 MIT猎豹Cheetah 背景结构设计模块化关节电机性能考虑关节结构 四足平台设计腿部设计身体设计脚部设计 硬件设计关节驱动器通信总线板供电系统 控制系统人工智能 背景 3年前 xff0c MIT开源了世界上跑
  • centos安装wxWidgets,erlang,RabbitMq

    centos安装wxWidgets erlang RabbitMq 默认已经安装了java环境 而安装RabbitMq需要安装erlang xff0c 安装erlang又需要安装wxWidgets 安装wxWidgets 更新系统 yum
  • 2.rabbitmq概述和helloworld

    rabbitmq概述 rabbitmq中的几个概念 BROKER 接收和分发消息的应用 xff0c RabbitMQ Server 就是 Message Broker Virtual Host 出于多租户和安全因素设计的 xff0c 把 A
  • 3.rabbitmq轮询和不公平分发

    rabbitmq轮询和不公平分发 rabbitmq轮询分发 rabbitmq默认是使用轮询来分发消息的 测试代码如下所示 生产者代码 span class token comment 生产者 task rabbitmq 轮询演示 span
  • 4.rabbitmq消息应答

    rabbitmq消息应答 概述 消息应答就是消费者在收到消息的时候 xff0c 在它接收到消息并处理完毕之后 xff0c 告诉rabbitmq它已经处理完了 xff0c rabbitmq可以删除这个消息了 消息应答的方式 channel b
  • 5.rabbitmq持久化

    rabbitmq持久化 队列的持久化 队列的持久化需要我们在声明的时候指定其持久化 使用durable 61 true来持久化队列 span class token comment 队列的持久化 span span class token
  • 关于双控阵列的实现原理的讨论

    xfeff xfeff http bbs chinaunix net forum viewthread tid 4140392 html 对于一个支持FC SAN的双控存储阵列 xff0c 对外号称active active xff0c 实
  • 6.rabbitmq中exchange的几种形式

    rabbitmq中exchange的几种形式 RabbitMQ 消息传递模型的核心思想是 生产者生产的消息从不会直接发送到队列 实际上 xff0c 通常生产 者甚至都不知道这些消息传递传递到了哪些队列中 相反 xff0c 生产者只能将消息发
  • 7.rabbitmq死信和死信队列

    rabbitmq死信和死信队列 概述 先从概念解释上搞清楚这个定义 xff0c 死信 xff0c 顾名思义就是无法被消费的消息 xff0c 字面意思可以这样理 解 xff0c 一般来说 xff0c producer 将消息投递到 broke
  • 8.rabbitmq发布确认

    rabbitmq发布确认 生产者将信道设置成 confirm 模式 xff0c 一旦信道进入 confirm 模式 xff0c 所有在该信道上面发布的 消息都将会被指派一个唯一的 ID 从 1 开始 xff0c 一旦消息被投递到所有匹配的队
  • 9.延迟队列

    延迟队列 延迟队列的概念 延时队列 队列内部是有序的 xff0c 最重要的特性就体现在它的延时属性上 xff0c 延时队列中的元素是希望 在指定时间到了以后或之前取出和处理 xff0c 简单来说 xff0c 延时队列就是用来存放需要在指定时
  • 10.回退消息

    rabbitmq回退消息 mandatory参数 在仅开启了生产者确认机制的情况下 xff0c 交换机接收到消息后 xff0c 会直接给消息生产者发送确认消息 xff0c 如果发现该消息不可路由 xff0c 那么消息会被直接丢弃 xff0c
  • 11.备份交换机

    备份交换机 概念 当交换机收到一条不可路由消息时 xff0c 将会把这条消息转发到备份交换机中 xff0c 由备份交换机来进行转发和处理 xff0c 通常备份交换机的类型为fanout xff0c 这样就能把所有消息都投递到与其绑定的队列中
  • 12.优先级队列和惰性队列

    优先级队列 如何添加优先级 选择Maximum priority xff0c 指定优先级的数值 xff0c 设定范围为0 255 xff0c 如果值为10 xff0c 那么就是0 10 xff0c 最大不能超过255 代码形式 span c
  • 13.rabbitmq集群搭建

    rabbitmq集群搭建和镜像队列 集群搭建 准备三台服务器 172 16 140 133 Jan172 16 140 132 Feb172 16 140 133 Mar 修改3台机器的hosts文件 span class token fu

随机推荐

  • 14.haproxy+keepalived负载均衡和高可用

    haproxy 43 keepalived负载均衡和高可用 概述 多个rabbitmq服务形成集群 xff0c 由haproxy来做负载均衡 xff0c haproxy会暴露出来一个端口 xff0c 客户端可以通过haproxy所在的服务器
  • 15.federation

    federation和shovel federation exchange 问题的由来 xff1a 城市A有rabbitmqA xff0c 城市B有rabbitmqB xff0c 当城市B的应用要发消息到exchangeA的时候 xff0c
  • vue瀑布流插件vue-waterfall-easy 2.x

    不知道大家都是怎么用瀑布流的 xff0c 一开始尝试用flex布局失败 xff0c 后面找到了这个组件 xff0c 还是挺好用的 xff0c 记录一下 首先是用npm安装npm install vue waterfall easy save
  • 1.JUL

    JUL JUL全称Java util Logging是java原生的日志框架 xff0c 使用时不需要另外引用第三方类库 xff0c 相对其他日志框架使用方便 xff0c 学习简单 xff0c 能够在小型应用中灵活使用 架构介绍 Logge
  • Log4j2

    Log4j2 目前市面上最主流的日志门面就是SLF4J xff0c 虽然Log4j2也是日志门面 xff0c 因为它的日志实现功能非常强 大 xff0c 性能优越 所以大家一般还是将Log4j2看作是日志的实现 xff0c Slf4j 43
  • LOG4J

    LOG4J Log4j是Apache下的一款开源的日志框架 xff0c 通过在项目中使用 Log4J xff0c 我们可以控制日志信息输出到控 制台 文件 甚至是数据库中 我们可以控制每一条日志的输出格式 xff0c 通过定义日志的输出级别
  • Slf4j(门面)

    Slf4j 简单日志门面 Simple Logging Facade For Java SLF4J主要是为了给Java日志访问提供一套标准 规范 的API框架 xff0c 其主要意义在于提供接口 xff0c 具体的实现可以交由其他日志框架
  • Logback

    Logback Logback是由log4j创始人设计的另一个开源日志组件 xff0c 性能比log4j要好 官方网站 https logback qos ch index html Logback主要分为三个模块 logback core
  • 嵌入式-C语言常见面试/笔试题

    1 关键字类型题 常见的关键字有 sizeof static const volatile 1 sizeof xff1a 通常与strlen做比较不同 例1 xff1a char str 61 Hello char p 61 str int
  • node.js的http模块输出request参数

    xff08 只作为本人自己记录所用 xff0c 参考需谨慎 xff09 ServerResponse 服务响应 domain null 域名 events finish Function resOnFinish 项目 eventsCount
  • ATI F/T Gamma sensor( 力和力矩传感器 ) 开箱测评 + 使用说明

    型号和序列号等参数如下 xff1a Description Six Axis Force Torque Sensor Manufacturer ATI Industrial Automation Serial Number FT29352
  • 阿克曼转向原理解析

    汽车的转向过程就是阿克曼转向 其也是移动机器人的一种运动模式之一 阿克曼基本原理 xff1a 汽车在行驶过程中 xff08 直线和转弯时候 xff09 xff0c 每个车轮的运动估计必须符合他的自然运动轨迹 xff0c 从而保证轮胎与地面始
  • 通过ROS控制真实机械臂(18) --- 构建 octocmap 用于碰撞检测和避障

    师兄和同门在做SLAM的时候 xff0c 经常会用到的 octomap xff0c 也就是八叉树地图 octomap相比于点云地图来说大大减小了地图的存储空间 既然octomap可以用于导航和避障 xff0c 那么自然也可以导入moveit
  • 【实用版】卡尔曼滤波及其扩展方法的区别与定位系统中的应用

    卡尔曼滤波及其扩展方法的区别与定位系统中的应用 卡尔曼滤波卡尔曼滤波的扩展EKFSPKFEnKF 定位系统中的应用 源自于学校课题 xff0c 主要用卡尔曼滤波KF及其扩展方法 xff08 包括扩展卡尔曼滤波EKF Sigma点卡尔曼滤波S
  • CP2102 USB to UART Bridge Controller 驱动安装(windows or Ubuntu)

    CP2102是一款USB转TTL电平的USB转串口芯片 xff0c 使用时发现诸多小网站上的驱动不是病毒就是安装后无效 xff0c 经同事推荐去官网下载后成功连接 官网地址 xff1a https www silabs com produc
  • 解决罗技GHUB 安装 一直初始化 下载不了问题

    罗技的GHUB在安装时一直处于初始化状态 xff0c 可以通过修改时间解决 原地址 罗技 GHub 解决初始化无法安装教程 侵删
  • 基于Cartographer的建图与导航

    一 RoboSense 16线雷达驱动安装 2 二 Cartographer的安装 2 三 配置文件结构说明 4 四 配置文件详解 4 2D lua文件的配置 5 2D launch文件的配置 6 2D pure location lua文
  • Ubuntu18.04安装autoware.ai

    前言 Autoware AI是世界上第一个用于自动驾驶技术的 All in One 开源软件 xff0c 关于它的介绍就不再赘述了 xff0c 感兴趣的可以去看一下知乎文章 xff0c 这里主要说明一下autoware ai的安装配置 之前
  • Baxter工作站建立及简单使用

    1 硬件 1个 Baxter Research Robot1台PC机或笔记本 xff0c 安装好Ubuntu系统 xff08 推荐Ubuntu16 04安装ROS kinetic xff09 1个无线路由器 xff08 千兆网口 xff09
  • selenium网页自动登录、打卡(二)

    文章目录 前言一 Python 43 Selenium二 通信环境 xff08 服务器 客户端 xff09 1 selenium借助cookie网页登录csdn2 私信发送消息流程3 将新增的逻辑融入原本的程序 前言 前面做了一个自动打卡的