首页 >>  正文

python完成后如何保存

来源:baiyundou.net   日期:2024-09-21

作者:拉德布鲁赫信徒

1 引言

首先声明一下使用场景,本文适用拥有动态公网ip的朋友,如果没有的话,那么这篇文章并不适合你,可以参照前面一篇中frp的内容进行食用。

本文已经考虑到大家在使用上的障碍,为了保障体验的一致,最后后附上源码,基本只需要按照本文的流程一步步设置下去,就可以实现对应的功能。

  • 为什需要需要ddns?


因为我们在使用nas或者服务器部署的docker应用的时候,难免会涉及到公网的问题。如果没有公网的话,那么你只可以在你的局域网内访问你的应用的,而这又极大地限制了使用场景。但是现在家用宽带极少会提供公网IP,即便是提供了,所给的也是动态的公网ip,通常会在几天之内变动一次,或者是每次断电后变动一次。这种情形下,采用IP+端口形式的访问就会失效。为了应对这种情况,有很多解决方案,而DDNS方案,就是采用了将ip与域名紧紧绑定在一起,每次公网变动的时候就将变动后的ip绑定到域名上,这样不管ip如何变化,都可以通过域名+端口的形式进行绑定。

  • 为什么不采用软路由或者其他路由上的ddns,或者站内有人写过的docker方式部署的ddns?

第一,软路由或者其他路由器部署ddns,具有不特定性,会因为不同路由器的设置方式不同而产生不同,而且相对来说可能对小白不是很友好,也不具有可复制性;第二,使用docker方式部署的ddns,在笔者自己动手试验后,并没有成功,可能是笔者自己的原因,但是为了保障结果的可复制性,还是最终决定给大家介绍这种稍显原始的方式。

  • 为什么使用阿里云而不是dnspot或者其他的域名服务商?

一方面,笔者自己的云服务器以及其他服务基本采用的都是阿里的方案,便于统一的维护,因此域名解析服务还是采用的阿里的;另一方面,由于腾讯对于英雄联盟皮肤的定价问题,除了微信这种不得不使用的软件,基本上能不用腾讯就不用腾讯的,这是个人偏好问题。最后,还不是因为其他的没有去研究过,我不会嘛。

  • 为什么使用chronos?

因为chronos是一个可视化的界面来运行python,操作上面足够简便。当然,如果有一定linux和docker基础的,也可以通过直接使用docker部署py脚本加crontab定时运行的方式来实现功能。但是,考虑到读者的水平不一,本文尽量以一种大家能够看的懂最简便的方式来实现功能,保持可复制性。

2 准备工作

一条具有公网IP的宽带,一般只有电信和联通可以提供,具体的还得去问一下当地的服务商,其次就是需要一个域名,一个很便宜的就行了,基本上十块钱左右一年的有一大把。

除了域名之外,还需要知道的就是阿里云的accessID与access sercet,具体可以参考站内这篇文章。

如果想在基本功能之上,加上一个变动ip即通知到你的微信,那么还需要的就是企业微信的AgentId、Secret、CompanyId三个参数,参照笔者之前这篇文章进行获取。

3 chronos的安装

这里还是需要重申一下,需要一台支持docker的设备,可以是捡垃圾来的设备,也可以是nas。但是,为了维持可复制性,还是推荐x86架构的设备,因为笔者在自己刷了armbian的玩客云上面试过,确实无法部署成功,不知道S905芯片的设备或者rk3399的设备是否可以支持,值友们如果有试过的可以告知一声。

此处默认已经安装好了docker,输入以下代码:

docker run -p 5000:5000 -v /mnt/docker/chronos:/chronos simsemand/chronos

待运行成功且没有报错,输入ip:5000即可进入头图中的页面,这样就代表部署成功了。

4 python部分的实现

这里想说明一下的是,这里想通过功能分解的方式进行展示。有些功能并不是必要,如微信推送公网ip的变动。这一部分如果不需要,那么就可以删掉对应的部分。作者最后准备给上两个版本的代码,供大家下载使用。

4.1 公网IP的获取

import os

ipv4=os.popen("curl ifconfig.me").read()

4.2 推送消息到微信

设置方面还是参照笔者之前的那篇文章,以下仅贴出代码。需要替换的部分就是你自己的AgentId、Secret、CompanyId。这一部分内容来源于网上,由于已经有现成的轮子,就不再重复造轮子了。

    def send2wechat(self,message):

        AgentId = ''

        Secret = ''

        CompanyId = ''

        # 通行密钥

        ACCESS_TOKEN = None

        # 如果本地保存的有通行密钥且时间不超过两小时,就用本地的通行密钥

        if os.path.exists('ACCESS_TOKEN.txt'):

            txt_last_edit_time = os.stat('ACCESS_TOKEN.txt').st_mtime

            now_time = time.time()

            if now_time - txt_last_edit_time < 7200:  # 官方说通行密钥2小时刷新

                with open('ACCESS_TOKEN.txt', 'r') as f:

                    ACCESS_TOKEN = f.read()

                    # print(ACCESS_TOKEN)

        # 如果不存在本地通行密钥,通过企业ID和应用Secret获取

        if not ACCESS_TOKEN:

            r = requests.post(

                f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CompanyId}&corpsecret={Secret}').json()

            ACCESS_TOKEN = r["access_token"]

            # print(ACCESS_TOKEN)

            # 保存通行密钥到本地ACCESS_TOKEN.txt

            with open('ACCESS_TOKEN.txt', 'w', encoding='utf-8') as f:

                f.write(ACCESS_TOKEN)

        # 要发送的信息格式

        data = {

            "touser": "@all",

            "msgtype": "text",

            "agentid": f"{AgentId}",

            "text": {"content": f"{message}"}

        }

        # 字典转成json,不然会报错

        data = json.dumps(data)

        # 发送消息

        r = requests.post(

            f'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={ACCESS_TOKEN}', data=data)

        # print(r.json())

4.3 汇总

关于域名解析部分的代码也是来源自网络,经笔者修改后如下所示。

需要注意的是,需要填入的是access_key_id、access_key_secret、domain 、name_ipv4,前两个即所获得的阿里云密钥,domian是你的域名,而name_ipv4则建议填入www,之后你的访问形式即www.abc.abc(即你的域名):端口号。

import json,requests,re,os

from urllib.request import urlopen

from aliyunsdkcore.client import AcsClient

from aliyunsdkalidns.request.v20150109.DescribeSubDomainRecordsRequest import DescribeSubDomainRecordsRequest

class Dnscontroller:

    # 阿里云个人中心获取Access_Key_Id和Access_Key_Secret

    access_key_id = ""

    access_key_secret = ""

    # 填写你的主域名

    domain = ""

    # 要进行ipv4 ddns解析的子域名(主机记录)

    name_ipv4 = ""

    # 解析记录类型,一般为A记录

    record_type = "A"

    # 区域

    region = "cn-hangzhou"

    def __init__(self):

        self.client = AcsClient(

            self.access_key_id,

            self.access_key_secret,

            self.region

        )

    def send2wechat(self,message):

        AgentId = ''

        Secret = ''

        CompanyId = ''

        # 通行密钥

        ACCESS_TOKEN = None

        # 如果本地保存的有通行密钥且时间不超过两小时,就用本地的通行密钥

        if os.path.exists('ACCESS_TOKEN.txt'):

            txt_last_edit_time = os.stat('ACCESS_TOKEN.txt').st_mtime

            now_time = time.time()

            if now_time - txt_last_edit_time < 7200:  # 官方说通行密钥2小时刷新

                with open('ACCESS_TOKEN.txt', 'r') as f:

                    ACCESS_TOKEN = f.read()

                    # print(ACCESS_TOKEN)

        # 如果不存在本地通行密钥,通过企业ID和应用Secret获取

        if not ACCESS_TOKEN:

            r = requests.post(

                f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CompanyId}&corpsecret={Secret}').json()

            ACCESS_TOKEN = r["access_token"]

            # print(ACCESS_TOKEN)

            # 保存通行密钥到本地ACCESS_TOKEN.txt

            with open('ACCESS_TOKEN.txt', 'w', encoding='utf-8') as f:

                f.write(ACCESS_TOKEN)

        # 要发送的信息格式

        data = {

            "touser": "@all",

            "msgtype": "text",

            "agentid": f"{AgentId}",

            "text": {"content": f"{message}"}

        }

        # 字典转成json,不然会报错

        data = json.dumps(data)

        # 发送消息

        r = requests.post(

            f'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={ACCESS_TOKEN}', data=data)

        # print(r.json())

    # 添加新的域名解析记录

    def add(self, DomainName, RR, Type, Value):

        from aliyunsdkalidns.request.v20150109.AddDomainRecordRequest import AddDomainRecordRequest

        request = AddDomainRecordRequest()

        request.set_accept_format('json')

        request.set_DomainName(DomainName)

        request.set_RR(RR)

        request.set_Type(Type)

        request.set_Value(Value)

        response = self.client.do_action_with_exception(request)

    # 修改域名解析记录

    def update(self, RecordId, RR, Type, Value):

        from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest

        request = UpdateDomainRecordRequest()

        request.set_accept_format('json')

        request.set_RecordId(RecordId)

        request.set_RR(RR)

        request.set_Type(Type)

        request.set_Value(Value)

        response = self.client.do_action_with_exception(request)

    # 获取公网IP并进行修改

    def Get_IPv4(self):

        request = DescribeSubDomainRecordsRequest()

        request.set_accept_format('json')

        request.set_DomainName(self.domain)

        request.set_SubDomain(self.name_ipv4 + '.' + self.domain)

        response = self.client.do_action_with_exception(request)  # 获取域名解析记录列表

        domain_list = json.loads(response)  # 将返回的JSON数据转化为Python能识别的

        # 获取IP

        ipv4=os.popen("curl ifconfig.me").read()

        if domain_list['TotalCount'] == 0:

            self.add(self.domain, self.name_ipv4, self.record_type, ipv4)

            print("新建域名解析成功")

        elif domain_list['TotalCount'] == 1:

            if domain_list['DomainRecords']['Record'][0]['Value'].strip() != ipv4.strip():

                self.send2wechat('IP地址发生变更,现在的IP为{}'.format(ipv4))

                self.update(domain_list['DomainRecords']['Record'][0]['RecordId'], self.name_ipv4, self.record_type,

                            ipv4)

                print("修改域名解析成功")

            else:

                print("IPv4地址没变")


        elif domain_list['TotalCount'] > 1:

            # 删除所有解析过的记录,并重新添加新的解析记录

            from aliyunsdkalidns.request.v20150109.DeleteSubDomainRecordsRequest import DeleteSubDomainRecordsRequest

            request = DeleteSubDomainRecordsRequest()

            request.set_accept_format('json')

            request.set_DomainName(self.domain)

            request.set_RR(self.name_ipv4)

            response = self.client.do_action_with_exception(request)

            self.add(self.domain, self.name_ipv4, self.record_type, ipv4)

            print("修改域名解析成功")

if __name__ == "__main__":

    Dnscontroller().Get_IPv4()

关于代码部分,本文代码填入对应信息之后保存即可

5 chronos的设置

完成了上面的步骤之后,后面就到了chronos的设置部分了

新建脚本


填入需要的依赖:

aliyun-python-sdk-core==2.13.36

aliyun-python-sdk-domain==3.14.7

aliyun-python-sdk-alidns==2.6.32

requests==2.25.1

点击保存,然后点击安装依赖

粘贴修改后的脚本,然后保存,运行:

在这个下面会显示运行结果,可以点开查看一下是否运行成功

设置间隔运行

这个根据自己的需要来进行,笔者填入的是每隔一分钟检查一遍公网ip是否发生变动

最后,点击enable和execute,就可以不用管它了,你的服务器就会勤勤恳恳的每分钟给你检查一次,如果有变动的话就会自行更改。

6 总结

本文到此结束,希望大家使用愉快!后面可能主要精力想更新一点obsidian的内容,还希望大家多多支持哇。如果有什么想看的docker应用或者想实现的功能,也可以留言告知,能力范围内的一定安排!


","force_purephv":"0","gnid":"9240aa597807e3606","img_data":[{"flag":2,"img":[{"desc":"","height":"283","title":"","url":"https://p0.ssl.img.360kuai.com/t01ce4775afef9e40dd.jpg","width":"600"},{"desc":"","height":"283","title":"","url":"https://p0.ssl.img.360kuai.com/t011937f481cb7d09a0.jpg","width":"600"},{"desc":"","height":"283","title":"","url":"https://p0.ssl.img.360kuai.com/t01972f77975734e37c.jpg","width":"600"},{"desc":"","height":"283","title":"","url":"https://p0.ssl.img.360kuai.com/t01a046473af0df2c74.jpg","width":"600"}]}],"original":0,"pat":"art_src_1,fts0,sts0","powerby":"cache","pub_time":1665223743000,"pure":"","rawurl":"http://zm.news.so.com/27ccb057420274189097b85a8f515f8c","redirect":0,"rptid":"0af11b2b472cadf4","s":"t","src":"什么值得买","tag":[],"title":"捡垃圾之后怎么玩? 篇二:如何借助Docker和python实现DDNS

项浦相4828python如何重新执行脚本? -
师洁璐19321813962 ______ 执行python脚本只需要对python文件做如下操作即可:在python文件里第一行加上#! /usr/bin/python,即你的python解释器所在的目录.另外还有一种写法是#! /usr/bin/env python 编辑完成python脚本文件后为它加上可执行权限.例如你的python脚本文件叫做runit.py,那么就在shell中输入如下命令:chmod +x runit.py 之后直接在shell中输入./runit.py就可以执行你的python程序了.当然这是在Linux下的操作,如果想在windows下直接执行Python程序,就需要使用py2exe工具将python源程序编译成exe文件了.

项浦相4828python2.7安装完成怎么使用 -
师洁璐19321813962 ______ 可以直接输入命令python,启动,直接输入代码,这样的方法适用于非常短的代码.也可以写好代码之后保存为.py结尾的,然后python 加上文件名,执行

项浦相4828安装了python后怎么安装pip -
师洁璐19321813962 ______ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 1.安装了python2.7之后的版本 貌似已经自动集成了pip 在环境变量中添加python ,script路径,例如:C:\Python27;C:\Python27\Scripts; 2.如果没有集成 可以下载get-pip.py 运行安装 安装pip 安装和...

项浦相4828如何在Windows下编写在后台一直运行的Python程序 -
师洁璐19321813962 ______ 使用python自带的GUI就可以实现,python自带TK,使用tk的mainloop就会让python程序一直运行,只要让GUI窗口一直不显示就是一直在后动员运行了.代码示意如下:from tkinter import * root = Tk() root.withdraw() # 隐藏窗口 root.mainloop() # 消息循环 把代码以pyw扩展名保存,执行一下,就会让程序一直在后台执行,可以通过任务管理器结束,如下:

项浦相4828在windows 下安装python后怎么安装pygame? -
师洁璐19321813962 ______ 可以通过pip包管理器来安装Python包,但是pygame包包含C语言代码,需要进行编译.最简单的方式是,在网上下载已经编译好的安装包.具体步骤如下: 1. 到http://www.lfd.uci.edu/~gohlke/pythonlibs/#pygame下载pygame的安装包,注意选择合适的版本,比如适合Python3.4的版本文件名中包含cp34,适合64位操作系统的版本,文件名中包含amd64; 2. 选择开始>运行,输入cmd打开命令提示符,在命令提示符中输入: pip install 下载pygame安装包的完整路径 3. 打开Python,输入import pygame,如果没有报错则说明安装成功.

项浦相4828如何在windows上安装jira - python -
师洁璐19321813962 ______ 下载好了python安装包后双击python安装包,选择install just for me,点击下一步.选择python安装的路径一般都安装在c盘,点击next下一步.选择python索要安装的文件 默认全部安装,点击next.稍等一小会儿会就会安装成功.然后点击finsh安装完成.右键我的电脑 选择属性.选择高级系统配置,点击高级.点击环境变量,选择path路径.然后双击 把刚刚安装python时选择的路径放在path路径里面 注意最后面的分好要填写.然后在cmd命令行下键入 python -V 就能得到python的版本信息了 安装完成.

项浦相4828如何将一整个python工程打包 -
师洁璐19321813962 ______ 按照习惯,我们使用pip来安装模块.我们一直以来强调,要用最偷懒的方法.写代码的人尤其如此.人生苦短,你要偷懒~ 2Python | 如何用pip安装模块和包 2 虽然部分第三方模块有独立的exe安装包,不过使用pip安装的另一个好处是,pip会自...

项浦相4828python的pip怎么安装和使用啊 -
师洁璐19321813962 ______ ez_install.py,搜索并下在这个文件,在命令行中执行python ez_install.py,安装完成后,默认保存在C:\Python27\Scripts(假设你的python是安装在C盘),将以上路径配置到环境变量path中,完成后再在cmd命令行中执行:easy_install pip,就直接安装上包管理工具pip了

项浦相4828python中如何让一个新建线程执行完后返回当前主线程 -
师洁璐19321813962 ______ 传一个对象参数进新建线程,新建线程执行完之后把当前主线程写入进对象,其他线程直接使用传进去的对象就能得到了(新线程执行完之后)

项浦相4828如何通过命令行 安装python -
师洁璐19321813962 ______ 1 如果是在windows上 请下载PYTHON2.6的安装程序,然后直接运行 即可安装完成.2 安装完成后需要到系统的环境变量处设置PYTHON的环境变量具体设置方法如图3 在命令行键入 python 遍可以进入PYTHON的交互编程界面.如果需要在LINUX上安装 以CENTOS 为例:1,用ROOT方式登陆到系统 输入 yum install python即可完成安装.2 运行 SHELL 输入 PYTHON 即可运行.3 执行 在shell 中输入 python any.py 即可

(编辑:自媒体)
关于我们 | 客户服务 | 服务条款 | 联系我们 | 免责声明 | 网站地图 @ 白云都 2024