之前出于一些原因想远程控制一台电脑办公,使用cpolar内网穿透获得公网ip,然后使用邮件传输。但cpolar免费用户公网ip是变化的,所以就想使用web自动化获取一下。

Cpolar

在win10专业版系统中,自带有微软远程桌面可以使用,但在没有进行配置的情况下,只能在局域网中使用。因此,我们可以通过cpolar内网穿透来映射远程桌面3389端口,使用所生成的公网TCP端口地址,实现在外随时随地远程桌面控制家里/公司的电脑。

cpolar官网:https://www.cpolar.com/

  • 注册与安装

cpolar免费注册用户可以提供1个在线cpolar进程,4个隧道/cpoloar进程,40个连接数/分钟。官网注册后直接安装,进行登录。

  • 创建与启动远程桌面隧道

cpolar安装成功后会默认安装两个样例隧道,没有的话可以在仪表盘界面的隧道管理创建一个远程桌面隧道。


在浏览器上访问127.0.0.1:9200,邮箱密码登录cpolar webui管理界面,点击启动来开启隧道。

  • 获取远程桌面公网ip

隧道启动成功后,点击左侧仪表盘状态中的在线隧道列表,可以看到远程桌面隧道已经有生成了相应的公网地址。

如果想省事可以在cpolar购买一个会员,公网链接tcp是固定的,但免费账号每天tcp都会变化,所以需要每天更新一遍。

我这边因为不想花钱所以就想用web自动化来获取。

Web自动化Selenium

Spider.py文件使用python的web自动化库selenium,获取网页数据。

from selenium import webdriverfrom lxml import etreeimport timefrom selenium.common import exceptionsfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.remote.webelement import WebElementclass Spider:def log(self, content):now_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())print(f'{now_time}: {content}')def getip(self, url):driver = webdriver.Chrome()# url = 'http://localhost:9200/#/status/online/'driver.get(url)html = etree.HTML(driver.page_source)print(html)content = WebElement'''这里由于每次打开网页需要登录,所以设置一个登录过程。网站默认会在密码栏输入123456,所以我就把密码设置成了123456,就省了输入的功夫了如果不想用默认密码,就用clear删掉,然后输入密码'''try:# 你的邮箱driver.find_element(By.XPATH, '//*[@placeholder="Email"]').send_keys('123456@126.com')# driver.find_element_by_xpath('//*[@placeholder="Password"]').clear()# 你的密码# driver.find_element_by_xpath('//*[@placeholder="Password"]').send_keys('123456')driver.find_element(By.XPATH, '//*[@type="button"]').click()time.sleep(3)# 这里获取公网ip的位置content = driver.find_element(By.XPATH, '/html/body/div/div/div[2]/section/div/div/div[3]/table/tbody/tr[2]/td[3]/div')# print(content.text)self.log("公网ip为"+content.text)except BaseException as e1:print(e1)self.log("无法获取ip,BaseException错误")except exceptions as e2:print(e2)self.log("无法获取ip,SELENIUM错误")return content.text

除了需要修改自己的账号密码外,需要自己在cpolar仪表盘按F12找一下公网ip对应的网格。

然后右键一下右边网格对应的位置,选择full xpath替换掉就可以了。

邮件自动化

获取到公网ip后就可以使用邮件协议,通过python给邮箱发邮件了。
这里我用的是SMTP协议,可以在自己要用的邮箱设置中找一下。
具体的操作可以看一下教程:https://www.runoob.com/python/python-email.html

SMTP.py文件需要设置自己的邮箱和协议密码。

import timeimport yagmailclass Mail:"""邮件相关类"""def log(self, content):now_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())print(f'{now_time}: {content}')def sendmail(self, msg, title, receivers):"""发送邮件Arguments:msg {str} -- 邮件正文title {str} -- 邮件标题receivers {list} -- 邮件接收者,数组"""now_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())# 邮件设置,输入你的邮箱和协议密码,我这里用的126邮箱yag = yagmail.SMTP(host='smtp.126.com', user='123456@126.com',password='password', smtp_ssl=True)try:yag.send(receivers, title, msg+"\n"+(f'{now_time}'))self.log("邮件发送成功")except BaseException as e:print(e)self.log("Error: 无法发送邮件")

然后就可以使用邮件发送公网ip了。注意需要导入前面两个py文件。

import datetimeimport timeimport requestsfrom SMTP import Mailfrom Spider import Spiderwhile True:response = requests.get('http://localhost:9200/#/status/online')url = 'http://localhost:9200/#/status/online/'# 获取公网ipOpenIP = Spider().getip(url)# 每天5,12点发送# if time.strftime("%H", time.localtime()) == ("5" or '10' or "23"):if datetime.datetime.now().hour == 5 or datetime.datetime.now().hour == 12 or datetime.datetime.now().hour == 20:Mail().sendmail(OpenIP, '公网ip', ['123456@126.com', '654321@126.com'])# 根据状态码判断网站是否正常if response.status_code != 200:Mail().sendmail(OpenIP+"\n"+"Cpolar崩溃了", 'Cpolar崩溃', ['123456@126.com'])# time.sleep(600)# 等待10分钟time.sleep(3300)# 等待55分钟

最后在邮件中得到的公网ip就可以实现远程桌面了。

点击连接,输入被控端电脑的账号及密码,就可远程桌面登录了。


最后为了数据安全,可以在用户中新建一个远程桌面用户组,给予部分权限。

ps:是真的折腾