通过API访问阿里云效Codeup代码库,检查某个文件是否存在更新并下载的方法,顺带介绍一下阿里云OpenAPI

需求

家里有个NAS,每日定时执行脚本。
脚本在其他电脑上编写,并用git进行版本管理,git托管为Codeup(阿里云效)上创建的私有代码库。

现在需求是,每次执行前,从Codeup上检查脚本是否更新,如有更新则下载。

解决方法想到两种:

  1. NAS上安装git,然后每次执行脚本前,先git同步到最新
  2. 检查这个脚本在Codeup上最后一次的更新时间,如果有更新则下载。

方法1由于脚本是和其他很多东西保存在一起,git没办法从私有库单抓一个文件更新。
所以开始研究方法2

一开始的思路的是直接selenium+requests的方法,selenium实现网页模拟登陆,提取cookies,然后requests回到我熟悉的网页操作上来,结果模拟到登录环节发现有滑动验证,也不是不能做,只是这个时候我突然发现了Codeup有API!

我汗(lll¬ω¬) ,有API还折腾啥,直接上API吧。

实现

这里说一下,目前阿里云OpenAPI正在新旧版迭代更新期间,有些地方的链接是失效的或注释缺失,我也是找了一会儿才找对地方,并且把参数凑齐。

首先是Codeup的API页面
https://next.api.aliyun.com/api/codeup/2020-04-14/GetFileBlobs?sdkStyle=old&params={}

要实现上述功能涉及到两个API接口

  1. 查询代码库提交列表:检查文件更新
  2. 查询文件内容:下载文件内容

在这里插入图片描述
先安装SDK依赖
在这里插入图片描述
然后点击获取AK https://usercenter.console.aliyun.com/#/manage/ak,生成accessKeyId、accessSecret参数
在这里插入图片描述
然后开始找对应的API,首先是看官网文档,新版目前文档暂时还是缺失参数注释的。
在这里插入图片描述
没办法,回到Codeup页面,直接F12,看了几条GET,POST记录,大概弄懂了并找出了这些参数值,这里教你在一个页面内找出上述参数。
在这里插入图片描述
参数填好,点击发起调用,查看返回结果
在这里插入图片描述
确认成功,即可返回SDK示例页面,将自动生成的代码复制出来
在这里插入图片描述
通过前面提到这两个API接口,就可以实现通过API检查Codeup云端文件更新状态并下载的功能了。

最终代码:

#!/usr/bin/env python
#coding=utf-8

from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
import json
import datetime,time
import os

accessKeyId = ""
accessSecret = ""
ProjectId = 
OrganizationId = ""
Ref = ""
FilePath = ""
LocalPath = "本地文件位置"

# 创建AcsClient实例
client = AcsClient(accessKeyId, accessSecret, 'cn-hangzhou')

# 获取文件提交更新记录(以下大段内容来自于API生成)
request = CommonRequest()
request.set_accept_format('json')
request.set_method('GET')
request.set_protocol_type('https') # https | http
request.set_domain('codeup.cn-hangzhou.aliyuncs.com')
request.set_version('2020-04-14')
request.set_content('''{}'''.encode('utf-8'))
request.add_header('Content-Type', 'application/json')
request.add_query_param('OrganizationId', OrganizationId)
request.add_query_param('RefName', Ref)
request.set_uri_pattern(f'/api/v4/projects/{ProjectId}/repository/commits')
request.add_query_param('Path', FilePath)
response = client.do_action_with_exception(request)

# 取出最后更新时间,和本地文件更新时间对比
j = json.loads(str(response, encoding = 'utf-8'))
committed_date = j['Result'][0]['CommittedDate']
fileDatetimeCodeup = datetime.datetime.strptime(committed_date,'%Y-%m-%dT%H:%M:%S%z').replace(tzinfo=None)
fileDatetimeLocal = datetime.datetime.fromtimestamp(os.path.getmtime(LocalPath))
if fileDatetimeCodeup > fileDatetimeLocal:

    # 需要从云端下载更新(以下大段内容来自于API生成)
    request = CommonRequest()
    request.set_accept_format('json')
    request.set_method('GET')
    request.set_protocol_type('https') # https | http
    request.set_domain('codeup.cn-hangzhou.aliyuncs.com')
    request.set_version('2020-04-14')
    request.set_content('''{}'''.encode('utf-8'))
    request.add_query_param('OrganizationId', OrganizationId)
    request.add_query_param('FilePath', FilePath)
    request.add_query_param('Ref', Ref)
    request.add_header('Content-Type', 'application/json')
    request.set_uri_pattern(f'/api/v4/projects/{ProjectId}/repository/blobs')
    response = client.do_action_with_exception(request)
    
    # 保存文件
    j = json.loads(str(response, encoding = 'utf-8'))
    with open(LocalPath,'w',encoding='utf-8') as f:
        f.write(j['Result']['Content'])

额外补充:

虽然用来下载脚本没问题。但是官网这个utf-8转码很奇怪,
所以我将FilePath换了一个图片的地址,再试果然出问题了,获取到的图片打不开了。

查看获取到的Content,发现返回内容是被utf-8格式文本形式读取过的。

结果就跟用文本编辑器打开图片再保存一样,直接乱码了。至于图片或非utf-8格式应该怎么读,官网文档没写,暂时我也不清楚应该如何调整参数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值