The Python Challenge 0~2

The Python Challenge 0-2

第0关

这里写图片描述

看到一幅图,上面是 238 ,通过Python计算 238 238=274877906944 ,将结果替换页面url的0并回车,进入下一关。

这里写图片描述

第1关

这里写图片描述

看到一幅图,上面是字符的移位,图片下方给出一段字符:

g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr’q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.

可知每个字符位移两次,把上面那些提示用这个方法的处理,告诉我们用同样的方法处理url,得到ocr;进入下一关。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
'''
BY:jixiangrurui
DATE:2015.08.26
Python:3.4.3
Nothing Replaces Hard Work
'''
import string

text = '''
g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.
'''
text_1 = 'map'

def mytraslate(text):   
    '''( str ) -> str

    Return the string consist of the new ASCII char,new ASCII = old ASCII + 2。
    >>> text = 'copyright'
    >>> mytraslate(text)
    'eqratkijv'
    '''

    out = ""
    for each in text:
        if ord(each) >= ord('a') and ord(each) <= ord('z'):
            out += chr(((ord(each) - ord('a') + 2) % 26) + ord('a'))
        else:
            out += each
    return out

# 标准解决方式
def std_solution(text):
    '''( str ) -> str
    Return the string consist of the new ASCII char,new ASCII = old ASCII + 2。
    >>> text = 'copyright'
    >>> mytraslate(text)
    'eqratkijv'
    '''

    table = str.maketrans(
            string.ascii_lowercase,
            string.ascii_lowercase[2:] + string.ascii_lowercase[:2])

    out = text.translate(table)
    return out


if __name__ == '__main__':

    print(std_solution(text_1))
    print(mytraslate(text_1))

学习:
1. str.maketrans()函数和str.translate()函数

intab = "aeiou"
outtab = "12345"
tran = str.maketrans(intab, outtab)
strs = "this is string example....wow!!!";
print(strs.translate(tran));
  1. ord(char):返回一个字符的ascii码值
  2. 导入string模块,string.ascii_lowercase 可得到所有小写英文字母字符串,同样string.ascii_uppercase可得到所有大写英文字母字符串,string.ascii_letters 可得所有英文字母字符串包括小写和大写。

第2关

这里写图片描述

根据提示:识别出字符串,它们可能在书里面,也可能在源码里面。因此需要查看此时的页面HTML源代码,仔细寻找会发现一堆混乱的字符。并提示寻找稀有字符。
把得到的稀有字符更换url进入下一关。

#! /usr/bin/env python
# -*- coding:utf-8 -*-
'''
BY:jixiangrurui
DATE:2015.08.26
Python:3.4.3
Nothing Replaces Hard Work
'''
import string

def mysolution(filename):
    '''( str of filename ) -> str

    Return the set of char in string.ascii_letters

    >>> mysolution("E:\\python_practice\\trunk\\Python Chanlenge\\Python Challenge _02.txt")
    'equality'

    '''

    out = ""
    lib = string.ascii_letters   
    f = open(filename,"r")
    line = f.readline()
    while line != "":
        for each in line:
            if each in lib:
                out += each
        # print(line,end="")
        line = f.readline()

    return out

def mysolution_1(filename):
    ''' ( str of filename ) -> str
    Return the set of char in string.ascii_letters

    >>> mysolution_1("E:\\python_practice\\trunk\\Python Chanlenge\\Python Challenge _02.txt")
    equality

    '''

    text = open(filename).read()
    s = filter(lambda x: x in string.ascii_letters, text) #  从text中挑选出属于英文字母的字符
    while 1:
        try:
            print(s.__next__(),end = "")
        except StopIteration:
            break;

# 标准解决方式:
def std_solution(filename):
    ''' ( str of filename ) -> str
    1、读取文本内容;
    2、定义一个字典,里面存储每个字符以及对应出现的频数;
    3、计算出字符平均稀有情况(所有字符数量/字符数量);
    4、循环输出稀有性低于平均水平的的字符。

    >>> std_solution("E:\\python_practice\\trunk\\Python Chanlenge\\Python Challenge _02.txt")
    equality

    '''

    s = "".join([line.rstrip() for line in open(filename)])  # 列表包含 --> 读取文件的内容   
    occ = {}   # 定义一个字典,里面存储每个字符以及对应出现的频数;
    for c in s:
        occ[c] = occ.get(c,0) + 1  # 相同的字符,字典值加1 
    avgOC = len(s) // len(occ)  # 计算出字符平均稀有情况(所有字符数量/字符数量);
    print(''.join([c for c in s if occ[c] < avgOC]))  # 循环输出稀有性低于平均水平的的字符。


if __name__ == "__main__":

    print(mysolution("E:\\python_practice\\trunk\\Python Chanlenge\\Python Challenge _02.txt"))
    mysolution_1("E:\\python_practice\\trunk\\Python Chanlenge\\Python Challenge _02.txt")
    std_solution("E:\\python_practice\\trunk\\Python Chanlenge\\Python Challenge _02.txt")

学习:
1. 列表推导运算符,并创建一个新的列表。列表推到的运算符:

[ expression for item1 in iterable1 if condition1
             for item2 in iterable2 if condition2
             for item3 in iterable3 if condition3
             ...
             for itemN in iterableN if conditionN ]

2.filter()函数生成一个迭代器。
3.文件的读取操作。

Python3 中使用 ACME 协议实现 DNS 验证的步骤如下: 1. 安装 `acme` 和 `requests` 模块: ```bash pip install acme requests ``` 2. 导入相关模块: ```python import os import json import requests from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives.asymmetric import rsa from acme import client from acme import messages from acme.client import ClientV2 from acme.errors import AcmeError from acme.jose import jwk from acme.jose import jose_base64url_decode ``` 3. 设置 ACME 服务器的 URL 和 API 密钥: ```python ACME_SERVER = 'https://acme-v02.api.letsencrypt.org/directory' API_KEY = '<your_api_key>' ``` 4. 生成 ACME 账户的 RSA 密钥: ```python private_key = rsa.generate_private_key( public_exponent=65537, key_size=2048, backend=default_backend(), ) ``` 5. 创建 ACME 客户端实例: ```python directory_url = ACME_SERVER client = ClientV2(directory_url, key=private_key) ``` 6. 注册 ACME 账户: ```python email = '<your_email_address>' registration = client.new_account( messages.NewRegistration.from_data(email=email), accept_terms_of_service=True, ) ``` 7. 创建需要验证的域名列表: ```python domain_list = ['example.com', 'www.example.com'] ``` 8. 对每个域名创建 ACME 订单: ```python order_list = [] for domain in domain_list: identifier = messages.Identifier( typ=messages.IDENTIFIER_FQDN, value=domain) order = client.new_order(identifier) order_list.append(order) ``` 9. 针对每个域名,获取 ACME 服务器返回的 DNS 验证信息: ```python for order in order_list: authorizations = client.fetch_authorizations(order) for authz in authorizations: if authz.body.identifier.typ == messages.IDENTIFIER_FQDN: domain = authz.body.identifier.value dns_challenge = None for i in authz.body.challenges: if isinstance(i.chall, messages.DNS01): dns_challenge = i break if dns_challenge is None: raise ValueError("No DNS challenge found for domain") token = jose_base64url_decode(dns_challenge.chall.token) key = jwk.JWK.load(private_key.public_key()) thumbprint = key.thumbprint() dns_value = thumbprint + '.' + token.decode() dns_record_name = '_acme-challenge.' + domain dns_record_value = dns_value.decode() print(f"Please add the following DNS record to your domain:") print(f"- Name:\t{dns_record_name}") print(f"- Type:\tTXT") print(f"- Value:\t{dns_record_value}") ``` 10. 在 DNS 解析器中添加 TXT 记录,等待 DNS 记录生效: ```bash _acme-challenge.example.com. 3600 IN TXT "thumbprint.token" _acme-challenge.www.example.com. 3600 IN TXT "thumbprint.token" ``` 11. 等待 DNS 记录生效后,调用 `answer_challenge` 方法完成 DNS 验证: ```python for order in order_list: authorizations = client.fetch_authorizations(order) for authz in authorizations: if authz.body.identifier.typ == messages.IDENTIFIER_FQDN: domain = authz.body.identifier.value dns_challenge = None for i in authz.body.challenges: if isinstance(i.chall, messages.DNS01): dns_challenge = i break if dns_challenge is None: raise ValueError("No DNS challenge found for domain") response, validation = client.answer_challenge(dns_challenge, "dns-01") print(f"Domain {domain} validated!") ``` 12. 如果验证成功,ACME 服务器将会返回证书签名请求(CSR)和证书链: ```python for order in order_list: certificate_request, final_order = client.finalize_order( order, csr_pem=None) certificate_url = final_order.body.certificate certificate_pem = client.fetch_certificate(certificate_url).body ``` 13. 将证书和私钥保存到文件中: ```python with open('cert.pem', 'wb') as f: f.write(certificate_pem) with open('key.pem', 'wb') as f: f.write(private_key.private_bytes( encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.TraditionalOpenSSL, encryption_algorithm=serialization.NoEncryption(), )) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值