用python输出10以内的奇数
作者:拉德布鲁赫信徒
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应用或者想实现的功能,也可以留言告知,能力范围内的一定安排!
闵詹豪4850一个python的程序问题代码:bob = {'name':'Bob Smith','age':42,'pay':30000,'job':'dev'}sue = {'name':'Sue Jones','age':45,'pay':40000,'job':'hdw'}tom = {'name':'... -
邓兔蚁18115309039 ______[答案] 在unix/linux操作系统的世界里,一切都是文件,包括stdin/stdout/stderr.你可以先设想在loadDbase里没有import sys,sys.stdin=dbfile这两句,那么loadDbase就是从终端(命令行/控制台)输入数据; 在给出这两句之后,应用就...
闵詹豪4850如何在python中表达三角函数,比如sin(x),tan(x), -
邓兔蚁18115309039 ______[答案] import math x=2 math.sin(x) math.tan(x)
闵詹豪4850怎么在python中定义指数函数像2的X次方 def zhishu(x):return(?)请告诉我怎么描述x个2相乘 -
邓兔蚁18115309039 ______[答案] 您可以直接调用 import math math.pow( 2,x ) 或者 import math def zhishu(x): return math.pow(2,x)
闵詹豪4850关于python中list的加和我想把list1=[1,2,3]和list2 = [4,5,6]中每个元素相加,得到list3为[5,7,9],如果直接list1+list2会得到[1,2,3,4,5,6],应该如何操作? -
邓兔蚁18115309039 ______[答案] [x+y for x, y in zip(list1, list2)]
闵詹豪4850Python计算一篇英文文章每个字母出现频率 -
邓兔蚁18115309039 ______[答案] # coding=utf-8 from collections import Counter s = "absdflsjflkdsjflkfjwelkrklewrmlkewmfslkdfjsdljflsdflkewnjklhflkjdsfdsf" print dict(Counter(s)) # {'a': 1, 'b': 1, 'e': 4, 'd': 7, 'f': 11, 'h': 1, 'k': 9, 'j': 7, 'm': 2, 'l': 12, 'n': 1, 's': 8, 'r': 2, 'w': 4}如果解决了您的问题请采...
闵詹豪4850python 新手求助 最大值问题定义一个求两个数中最大值的函数,利用这个函数: 两个数求大,三个数求大,四个数求大.(用max函数) -
邓兔蚁18115309039 ______[答案] >>> def max(a,b): return a if a>=b else b >>> a,b,c,d=14,9,2,6 >>> max(a,b) 14 >>> max(a,max(b,c)) 14 >>> max(max(a,b),max(c,d)) 14祝你成功!
闵詹豪4850python练习题1.The input is the numerator and denominator of the fraction.Somesample outputs of running the program are given below:Inpu t the numerator ... -
邓兔蚁18115309039 ______[答案] def gcd(x, y): s = (x > y) and y or x while (x % s or y % s): s -= 1 return s def testfunc(n, d): g = gcd(n, d) n, d = n / g, d / g if n < d: return n, d if n % d: return n / d, n % d, d else: return n / d, def formater(*nums): fmt = ["%d", "%d/%d", "%d %d/%d"] ...
闵詹豪4850关于Python 字典里的value问题是有{'a':[1,2,3,4],'b':[11,22,33]}, 即a中有4个值, b中有3个值要弄成{'a': [1,1,1,2,2,2,3,3,3,4,4,4], 'b':[11,11,11,11,22,22,22,22,... -
邓兔蚁18115309039 ______[答案] #先求最小公倍数,再整形 dic = {'sports' :{'s.basketball':['a', 'b', 'c', 'd'], 's.football':['aa', 'bb', 'cc', 'dd'] }, 'music':{'m.juzz':['e', 'f', 'g'], 'm.pop':['ee', 'ff', 'gg']}} def gcd(a, b): if b == 0: return a else: return gcd(b, a % b) def lcm(a, b): return a * b / gcd(a, b) myLcm = ...
闵詹豪4850请问python中的class如何写出来,比如class c :'fields:a,b' 如果想写一个a=5,b=4的c该怎么写.小弟实在愚钝 -
邓兔蚁18115309039 ______[答案] class c: def __init__(self): self.a = 5 self.b=4
闵詹豪4850怎么用python做一个输出10个文字排列的文本文件 -
邓兔蚁18115309039 ______ #coding =utf-8 reader = open('test.txt').readlines() n=0 for len in reader: writer=open(str(reader.index(len)+1)+'.txt','w') if (len.find('\n')>0): for n in range(0,10): writer.write(len[:-1]+reader[n]) else: for n in range(0,10): writer.write(len+reader[n]) writer.close() 这个基本能满足你要的功能,你把输入和输出的文件名改一下就行了