本篇文章将讲述如何使用Python调用华为云API刷新CDN缓存,免去登录后台步骤的同时也能更方便的与其他业务进行结合。该API也支持使用Java、Go、C#、JavaScript、PHP、C++、C、Android、curl调用。(毕竟本质上就是HTTP请求)

为了能够正常运行,需要准备以下内容:

  1. Python环境(官网下载
  2. requests(pip install requests

我们首先要为API网关创建一个访问密钥,登录华为云控制台,鼠标放在右上角用户名的地方,在弹出的窗口中点击“我的凭证”,如图:

图示,点击“我的凭证”

在弹出页面中点击访问密钥,新增一个访问密钥,具体操作流程如图所示:

操作流程图示

创建成功后点击“立即下载”

会自动下载一个csv文件,里面有用户名(User Name)、访问密钥ID(Access Key Id)和访问密钥(Secret Access Key),我们需要将访问密钥ID和访问密钥加入到环境变量中。下面记录两种系统(Windows、Linux)的具体操作步骤。

Windows:

  1. Win + I组合键打开系统设置,点击系统 – 系统信息 – 高级设置 – 环境变量,在系统变量处点击新建,一共需要新建两组,内容如下:
第一组:
变量名:HUAWEICLOUD_SDK_AK
变量值:刚刚下载的访问密钥文件中的Access Key Id的值

第二组:
变量名:HUAWEICLOUD_SDK_SK
变量值:刚刚下载的访问密钥文件中的Secret Access Key的值
  1. 然后依次点击确定保存。

Linux:

  1. 在终端输入nano ~/.bashrc,加入以下内容:
export HUAWEICLOUD_SDK_AK="刚刚下载的访问密钥文件中的Access Key Id的值" 
export HUAWEICLOUD_SDK_SK="刚刚下载的访问密钥文件中的Secret Access Key的值" 
  1. 保存退出,执行source ~/.bashrc使修改生效。

然后我们需要准备一份SDK,到华为云文档中的API网关 APIG章节下载一份Python的SDK

点击“下载SDK”

下载完成后解压,使用代码编辑器打开,如图,我们主要修改main.py中的13 – 16行,并导入一个json模块

代码图示

在第5行添加:

import json

将14行的地址修改为:

https://cdn.myhuaweicloud.com/v1.0/cdn/content/refresh-tasks

注:地址可在华为云文档创建刷新缓存任务章节的在线调试中找到

URL位置图示

删除16行的"body"和15行末尾的,;并添加以下内容:

r.body = json.dumps({
    "refresh_task": {
        "type": "directory",
        "mode": "all",
        "zh_url_encode": False,
        "urls": [
            "要刷新的URL"
        ]
    }
}).encode('utf-8')  # 编码为字节

参数解读:

  1. type: 刷新的类型,其值可以为file:文件,或directory:目录,默认为file
  2. mode: 目录刷新方式,all:刷新目录下全部资源;detect_modify_refresh:刷新目录下已变更的资源,默认值为all
  3. zh_url_encode: 是否对url中的中文字符进行编码后刷新,false代表不开启,true代表开启,开启后仅刷新转码后的URL。
  4. urls: 需要刷新的URL必须带有“http://”“https://”,多个URL用逗号分隔("url1", "url2"),单个url的长度限制为4096字符,单次最多输入1000个url,如果输入的是目录,支持100个目录刷新。
    如果您需要刷新的URL中有中文,请同时刷新中文URL(输入中文URL且不开启zh_url_encode)和转码后的URL(输入中文URL且开启zh_url_encode)。
    如果您的URL中带有空格,请自行转码后输入,且不要开启URL Encode。

修改后的代码如下:

# coding=utf-8
import os
import requests
from apig_sdk import signer
import json  # 添加json

if __name__ == '__main__':
    sig = signer.Signer()
    # 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
    # 本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。
    sig.Key = os.getenv('HUAWEICLOUD_SDK_AK')
    sig.Secret = os.getenv('HUAWEICLOUD_SDK_SK')

    r = signer.HttpRequest("POST",
                           "https://cdn.myhuaweicloud.com/v1.0/cdn/content/refresh-tasks",
                           {"x-stage": "RELEASE"})
    
    r.body = json.dumps({
        "refresh_task": {
            "type": "directory",
            "mode": "all",
            "zh_url_encode": False,
            "urls": [
                ""  # 请替换为实际的URL
            ]
        }
    }).encode('utf-8')  # 编码为字节

    sig.Sign(r)
    print(r.headers["X-Sdk-Date"])
    print(r.headers["Authorization"])
    resp = requests.request(r.method, r.scheme + "://" + r.host + r.uri, headers=r.headers, data=r.body)
    print(resp.status_code, resp.reason)
    print(resp.content)

我们可以执行以下看看效果:

图示,可以看到已经刷新成功
说点什么
你是我一生只会遇见一次的惊喜...
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...