缘由

Docker hub提供V2版本接口后,使用了新的认证授权方式,需要通过OAuth的认证授权方式来调用其API。本文主要是演示获取某个镜像的tag的列表过程,其它接口调用方式类似
本例子使用了httpie工具,如果在mac下可以用过brew方式安装

brew install httpie

交互过程

先直接调用需要的资源

这里以查询nginx的tag列表为例

http https://registry.hub.docker.com/v2/library/nginx/tags/list

这个时候,因为没有获取到授权,所以服务会返回需要授权的相关信息

HTTP/1.1 401 Unauthorized
Content-Length: 156
Content-Type: application/json; charset=utf-8
Date: Wed, 05 Sep 2018 03:05:35 GMT
Docker-Distribution-Api-Version: registry/2.0
Strict-Transport-Security: max-age=31536000
Www-Authenticate: Bearer realm="https://auth.docker.io/token",service="registry.docker.io",scope="repository:library/nginx:pull"{"errors": [{"code": "UNAUTHORIZED","detail": [{"Action": "pull","Class": "","Name": "library/nginx","Type": "repository"}],"message": "authentication required"}]
}

注意"Www-Authenticate"这个http头,这个是我们需要进行认证授权的信息

  • Bearer realm: 是进行授权服务器的地址
  • service: 是试用的服务信息
  • scope: 是授权的范围

有了这些对应的信息,我们就可以调用授权服务来进行授权了

使用用户名密码授权

http -a <用户名>:<密码> https://auth.docker.io/token  service==registry.docker.io scope==repository:library/nginx:pull

如果认证通过,则会返回对应的授权信息

HTTP/1.1 200 OK
Content-Type: application/json
Date: Wed, 05 Sep 2018 03:08:20 GMT
Strict-Transport-Security: max-age=31536000
Transfer-Encoding: chunked{"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsIng1YyI6WyJNSUlDK2pDQ0FwK2dBd0lCQWdJQkFEQUtCZ2dxaGtqT1BRUURBakJHTVVRd1FnWURWUVFERXpzeVYwNVpPbFZMUzFJNlJFMUVVanBTU1U5Rk9reEhOa0U2UTFWWVZEcE5SbFZNT2tZelNFVTZOVkF5VlRwTFNqTkdPa05CTmxrNlNrbEVVVEFlRncweE9EQXlNVFF5TXpBMk5EZGFGdzB4T1RBeU1UUXlNekEyTkRkYU1FWXhSREJDQmdOVkJBTVRPMVpCUTFZNk5VNWFNenBNTkZSWk9sQlFTbGc2VWsxQlZEcEdWalpQT2xZMU1sTTZRa2szV2pwU1REVk9PbGhXVDBJNlFsTmFSanBHVTFRMk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBMGtyTmgyZWxESnVvYjVERWd5Wi9oZ3l1ZlpxNHo0OXdvNStGRnFRK3VPTGNCMDRyc3N4cnVNdm1aSzJZQ0RSRVRERU9xNW5keEVMMHNaTE51UXRMSlNRdFY1YUhlY2dQVFRkeVJHUTl2aURPWGlqNFBocE40R0N0eFV6YTNKWlNDZC9qbm1YbmtUeDViOElUWXBCZzg2TGNUdmMyRFVUV2tHNy91UThrVjVPNFFxNlZKY05TUWRId1B2Mmp4YWRZa3hBMnhaaWNvRFNFQlpjWGRneUFCRWI2YkRnUzV3QjdtYjRRVXBuM3FXRnRqdCttKzBsdDZOR3hvenNOSFJHd3EwakpqNWtZbWFnWHpEQm5NQ3l5eDFBWFpkMHBNaUlPSjhsaDhRQ09GMStsMkVuV1U1K0thaTZKYVNEOFZJc2VrRzB3YXd4T1dER3U0YzYreE1XYUx3SURBUUFCbzRHeU1JR3ZNQTRHQTFVZER3RUIvd1FFQXdJSGdEQVBCZ05WSFNVRUNEQUdCZ1JWSFNVQU1FUUdBMVVkRGdROUJEdFdRVU5XT2pWT1dqTTZURFJVV1RwUVVFcFlPbEpOUVZRNlJsWTJUenBXTlRKVE9rSkpOMW82VWt3MVRqcFlWazlDT2tKVFdrWTZSbE5VTmpCR0JnTlZIU01FUHpBOWdEc3lWMDVaT2xWTFMxSTZSRTFFVWpwU1NVOUZPa3hITmtFNlExVllWRHBOUmxWTU9rWXpTRVU2TlZBeVZUcExTak5HT2tOQk5sazZTa2xFVVRBS0JnZ3Foa2pPUFFRREFnTkpBREJHQWlFQWdZTWF3Si9uMXM0dDlva0VhRjh2aGVkeURzbERObWNyTHNRNldmWTFmRTRDSVFEbzNWazJXcndiSjNmU1dwZEVjT3hNazZ1ZEFwK2c1Nkd6TjlRSGFNeVZ1QT09Il19.eyJhY2Nlc3MiOlt7InR5cGUiOiJyZXBvc2l0b3J5IiwibmFtZSI6ImxpYnJhcnkvbmdpbngiLCJhY3Rpb25zIjpbInB1bGwiXX1dLCJhdWQiOiJyZWdpc3RyeS5kb2NrZXIuaW8iLCJleHAiOjE1MzYxMTcyMDAsImlhdCI6MTUzNjExNjkwMCwiaXNzIjoiYXV0aC5kb2NrZXIuaW8iLCJqdGkiOiJiek81UDd4VWZPdG1raXFfcUtvZCIsIm5iZiI6MTUzNjExNjYwMCwic3ViIjoiZDk0MTY0MzgtNzRjMC0xMWU0LWJlYTQtMDI0MmFjMTEwMDFiIn0.TSVfcHfpAe-HuzmJ1V-AixLSotEdtQU_zYgXfkomWVbPz8wZx_DtTZRUmMaW7X0J37MpQbrABCeRD-ZlY7TCa7IliGXZISWgB7mn89mENHWnEB-1FyyUqH5XS4kTtG7XEY-bx3nlxQybtqrYFhroVUsxuXzsrTax0OmdZH07Gyi3K3Diszipu4QejSpdN-pVjvS3jUCFyI-dW3IALKEompe4zAuZ0Aux-yuEz4TxJDOGFVYry4F0OgNiFtlLGsO6vPbFloMRPaU6e3YCTgVkRjQbugOjamsB_0URcwJpuZO4qDisV2_faCY72TG_P240mv0Ui4ywvHMcn5YWVIAABQ","expires_in": 300,"issued_at": "2018-09-05T03:08:20.971232202Z","token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsIng1YyI6WyJNSUlDK2pDQ0FwK2dBd0lCQWdJQkFEQUtCZ2dxaGtqT1BRUURBakJHTVVRd1FnWURWUVFERXpzeVYwNVpPbFZMUzFJNlJFMUVVanBTU1U5Rk9reEhOa0U2UTFWWVZEcE5SbFZNT2tZelNFVTZOVkF5VlRwTFNqTkdPa05CTmxrNlNrbEVVVEFlRncweE9EQXlNVFF5TXpBMk5EZGFGdzB4T1RBeU1UUXlNekEyTkRkYU1FWXhSREJDQmdOVkJBTVRPMVpCUTFZNk5VNWFNenBNTkZSWk9sQlFTbGc2VWsxQlZEcEdWalpQT2xZMU1sTTZRa2szV2pwU1REVk9PbGhXVDBJNlFsTmFSanBHVTFRMk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBMGtyTmgyZWxESnVvYjVERWd5Wi9oZ3l1ZlpxNHo0OXdvNStGRnFRK3VPTGNCMDRyc3N4cnVNdm1aSzJZQ0RSRVRERU9xNW5keEVMMHNaTE51UXRMSlNRdFY1YUhlY2dQVFRkeVJHUTl2aURPWGlqNFBocE40R0N0eFV6YTNKWlNDZC9qbm1YbmtUeDViOElUWXBCZzg2TGNUdmMyRFVUV2tHNy91UThrVjVPNFFxNlZKY05TUWRId1B2Mmp4YWRZa3hBMnhaaWNvRFNFQlpjWGRneUFCRWI2YkRnUzV3QjdtYjRRVXBuM3FXRnRqdCttKzBsdDZOR3hvenNOSFJHd3EwakpqNWtZbWFnWHpEQm5NQ3l5eDFBWFpkMHBNaUlPSjhsaDhRQ09GMStsMkVuV1U1K0thaTZKYVNEOFZJc2VrRzB3YXd4T1dER3U0YzYreE1XYUx3SURBUUFCbzRHeU1JR3ZNQTRHQTFVZER3RUIvd1FFQXdJSGdEQVBCZ05WSFNVRUNEQUdCZ1JWSFNVQU1FUUdBMVVkRGdROUJEdFdRVU5XT2pWT1dqTTZURFJVV1RwUVVFcFlPbEpOUVZRNlJsWTJUenBXTlRKVE9rSkpOMW82VWt3MVRqcFlWazlDT2tKVFdrWTZSbE5VTmpCR0JnTlZIU01FUHpBOWdEc3lWMDVaT2xWTFMxSTZSRTFFVWpwU1NVOUZPa3hITmtFNlExVllWRHBOUmxWTU9rWXpTRVU2TlZBeVZUcExTak5HT2tOQk5sazZTa2xFVVRBS0JnZ3Foa2pPUFFRREFnTkpBREJHQWlFQWdZTWF3Si9uMXM0dDlva0VhRjh2aGVkeURzbERObWNyTHNRNldmWTFmRTRDSVFEbzNWazJXcndiSjNmU1dwZEVjT3hNazZ1ZEFwK2c1Nkd6TjlRSGFNeVZ1QT09Il19.eyJhY2Nlc3MiOlt7InR5cGUiOiJyZXBvc2l0b3J5IiwibmFtZSI6ImxpYnJhcnkvbmdpbngiLCJhY3Rpb25zIjpbInB1bGwiXX1dLCJhdWQiOiJyZWdpc3RyeS5kb2NrZXIuaW8iLCJleHAiOjE1MzYxMTcyMDAsImlhdCI6MTUzNjExNjkwMCwiaXNzIjoiYXV0aC5kb2NrZXIuaW8iLCJqdGkiOiJiek81UDd4VWZPdG1raXFfcUtvZCIsIm5iZiI6MTUzNjExNjYwMCwic3ViIjoiZDk0MTY0MzgtNzRjMC0xMWU0LWJlYTQtMDI0MmFjMTEwMDFiIn0.TSVfcHfpAe-HuzmJ1V-AixLSotEdtQU_zYgXfkomWVbPz8wZx_DtTZRUmMaW7X0J37MpQbrABCeRD-ZlY7TCa7IliGXZISWgB7mn89mENHWnEB-1FyyUqH5XS4kTtG7XEY-bx3nlxQybtqrYFhroVUsxuXzsrTax0OmdZH07Gyi3K3Diszipu4QejSpdN-pVjvS3jUCFyI-dW3IALKEompe4zAuZ0Aux-yuEz4TxJDOGFVYry4F0OgNiFtlLGsO6vPbFloMRPaU6e3YCTgVkRjQbugOjamsB_0URcwJpuZO4qDisV2_faCY72TG_P240mv0Ui4ywvHMcn5YWVIAABQ"
}

这里access_token就是用来访问资源的授权token。授权的token的类型是Bearer
备注:docker hub不太遵守OAuth2的标准,所以这里返回值,也和OAuth不太相同

通过授权key再度访问资源

http https://registry.hub.docker.com/v2/library/nginx/tags/list 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsIng1YyI6WyJNSUlDK2pDQ0FwK2dBd0lCQWdJQkFEQUtCZ2dxaGtqT1BRUURBakJHTVVRd1FnWURWUVFERXpzeVYwNVpPbFZMUzFJNlJFMUVVanBTU1U5Rk9reEhOa0U2UTFWWVZEcE5SbFZNT2tZelNFVTZOVkF5VlRwTFNqTkdPa05CTmxrNlNrbEVVVEFlRncweE9EQXlNVFF5TXpBMk5EZGFGdzB4T1RBeU1UUXlNekEyTkRkYU1FWXhSREJDQmdOVkJBTVRPMVpCUTFZNk5VNWFNenBNTkZSWk9sQlFTbGc2VWsxQlZEcEdWalpQT2xZMU1sTTZRa2szV2pwU1REVk9PbGhXVDBJNlFsTmFSanBHVTFRMk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBMGtyTmgyZWxESnVvYjVERWd5Wi9oZ3l1ZlpxNHo0OXdvNStGRnFRK3VPTGNCMDRyc3N4cnVNdm1aSzJZQ0RSRVRERU9xNW5keEVMMHNaTE51UXRMSlNRdFY1YUhlY2dQVFRkeVJHUTl2aURPWGlqNFBocE40R0N0eFV6YTNKWlNDZC9qbm1YbmtUeDViOElUWXBCZzg2TGNUdmMyRFVUV2tHNy91UThrVjVPNFFxNlZKY05TUWRId1B2Mmp4YWRZa3hBMnhaaWNvRFNFQlpjWGRneUFCRWI2YkRnUzV3QjdtYjRRVXBuM3FXRnRqdCttKzBsdDZOR3hvenNOSFJHd3EwakpqNWtZbWFnWHpEQm5NQ3l5eDFBWFpkMHBNaUlPSjhsaDhRQ09GMStsMkVuV1U1K0thaTZKYVNEOFZJc2VrRzB3YXd4T1dER3U0YzYreE1XYUx3SURBUUFCbzRHeU1JR3ZNQTRHQTFVZER3RUIvd1FFQXdJSGdEQVBCZ05WSFNVRUNEQUdCZ1JWSFNVQU1FUUdBMVVkRGdROUJEdFdRVU5XT2pWT1dqTTZURFJVV1RwUVVFcFlPbEpOUVZRNlJsWTJUenBXTlRKVE9rSkpOMW82VWt3MVRqcFlWazlDT2tKVFdrWTZSbE5VTmpCR0JnTlZIU01FUHpBOWdEc3lWMDVaT2xWTFMxSTZSRTFFVWpwU1NVOUZPa3hITmtFNlExVllWRHBOUmxWTU9rWXpTRVU2TlZBeVZUcExTak5HT2tOQk5sazZTa2xFVVRBS0JnZ3Foa2pPUFFRREFnTkpBREJHQWlFQWdZTWF3Si9uMXM0dDlva0VhRjh2aGVkeURzbERObWNyTHNRNldmWTFmRTRDSVFEbzNWazJXcndiSjNmU1dwZEVjT3hNazZ1ZEFwK2c1Nkd6TjlRSGFNeVZ1QT09Il19.eyJhY2Nlc3MiOlt7InR5cGUiOiJyZXBvc2l0b3J5IiwibmFtZSI6ImxpYnJhcnkvbmdpbngiLCJhY3Rpb25zIjpbInB1bGwiXX1dLCJhdWQiOiJyZWdpc3RyeS5kb2NrZXIuaW8iLCJleHAiOjE1MzYxMTcyMDAsImlhdCI6MTUzNjExNjkwMCwiaXNzIjoiYXV0aC5kb2NrZXIuaW8iLCJqdGkiOiJiek81UDd4VWZPdG1raXFfcUtvZCIsIm5iZiI6MTUzNjExNjYwMCwic3ViIjoiZDk0MTY0MzgtNzRjMC0xMWU0LWJlYTQtMDI0MmFjMTEwMDFiIn0.TSVfcHfpAe-HuzmJ1V-AixLSotEdtQU_zYgXfkomWVbPz8wZx_DtTZRUmMaW7X0J37MpQbrABCeRD-ZlY7TCa7IliGXZISWgB7mn89mENHWnEB-1FyyUqH5XS4kTtG7XEY-bx3nlxQybtqrYFhroVUsxuXzsrTax0OmdZH07Gyi3K3Diszipu4QejSpdN-pVjvS3jUCFyI-dW3IALKEompe4zAuZ0Aux-yuEz4TxJDOGFVYry4F0OgNiFtlLGsO6vPbFloMRPaU6e3YCTgVkRjQbugOjamsB_0URcwJpuZO4qDisV2_faCY72TG_P240mv0Ui4ywvHMcn5YWVIAABQ'

这样就可以获得对应的资源信息了

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Wed, 05 Sep 2018 03:09:26 GMT
Docker-Distribution-Api-Version: registry/2.0
Strict-Transport-Security: max-age=31536000
Transfer-Encoding: chunked{"name": "library/nginx","tags": ["1-alpine-perl","1-alpine","1-perl","1.10-alpine","1.10.0-alpine","1.10.0","1.10.1-alpine","1.10.1","1.10.2-alpine","1.10.2","1.10.3-alpine","1.10.3","1.10","1.11-alpine","1.11.0-alpine","1.11.0","1.11.1-alpine","1.11.1","1.11.10-alpine","1.11.10","1.11.12-alpine","1.11.12","1.11.13-alpine","1.11.13","1.11.3-alpine","1.11.3","1.11.4-alpine","1.11.4","1.11.5-alpine","1.11.5","1.11.6-alpine","1.11.6","1.11.7-alpine","1.11.7","1.11.8-alpine","1.11.8","1.11.9-alpine","1.11.9","1.11","1.12-alpine-perl","1.12-alpine","1.12-perl","1.12.0-alpine-perl","1.12.0-alpine","1.12.0-perl","1.12.0","1.12.1-alpine-perl","1.12.1-alpine","1.12.1-perl","1.12.1","1.12.2-alpine-perl","1.12.2-alpine","1.12.2-perl","1.12.2","1.12","1.13-alpine-perl","1.13-alpine","1.13-perl","1.13.0-alpine-perl","1.13.0-alpine","1.13.0-perl","1.13.0","1.13.1-alpine-perl","1.13.1-alpine","1.13.1-perl","1.13.1","1.13.10-alpine-perl","1.13.10-alpine","1.13.10-perl","1.13.10","1.13.11-alpine-perl","1.13.11-alpine","1.13.11-perl","1.13.11","1.13.12-alpine-perl","1.13.12-alpine","1.13.12-perl","1.13.12","1.13.2-alpine-perl","1.13.2-alpine","1.13.2-perl","1.13.2","1.13.3-alpine-perl","1.13.3-alpine","1.13.3-perl","1.13.3","1.13.5-alpine-perl","1.13.5-alpine","1.13.5-perl","1.13.5","1.13.6-alpine-perl","1.13.6-alpine","1.13.6-perl","1.13.6","1.13.7-alpine-perl","1.13.7-alpine","1.13.7-perl","1.13.7","1.13.8-alpine-perl","1.13.8-alpine","1.13.8-perl","1.13.8","1.13.9-alpine-perl","1.13.9-alpine","1.13.9-perl","1.13.9","1.13","1.14-alpine-perl","1.14-alpine","1.14-perl","1.14.0-alpine-perl","1.14.0-alpine","1.14.0-perl","1.14.0","1.14","1.15-alpine-perl","1.15-alpine","1.15-perl","1.15.0-alpine-perl","1.15.0-alpine","1.15.0-perl","1.15.0","1.15.1-alpine-perl","1.15.1-alpine","1.15.1-perl","1.15.1","1.15.2-alpine-perl","1.15.2-alpine","1.15.2-perl","1.15.2","1.15.3-alpine-perl","1.15.3-alpine","1.15.3-perl","1.15.3","1.15","1.7.1","1.7.10","1.7.11","1.7.12","1.7.5","1.7.6","1.7.7","1.7.8","1.7.9","1.7","1.8-alpine","1.8.1-alpine","1.8.1","1.8","1.9-alpine","1.9.0","1.9.1","1.9.10","1.9.11","1.9.12","1.9.14-alpine","1.9.14","1.9.15-alpine","1.9.15","1.9.2","1.9.3","1.9.4","1.9.5","1.9.6","1.9.7","1.9.8","1.9.9","1.9","1","alpine-perl","alpine","latest","mainline-alpine-perl","mainline-alpine","mainline-perl","mainline","perl","stable-alpine-perl","stable-alpine","stable-perl","stable"]
}

访问阿里云镜像信息

使用相同的方式可以调用阿里云的镜像服务相关API

参考

  • OAuth2 RFC规范:https://tools.ietf.org/html/rfc6749
  • docker hub介绍文章<<如何获取自己名下的镜像所有列表>>:https://success.docker.com/article/how-do-i-authenticate-with-the-v2-api

通过OAuth方式与docker hub v2 API交互相关推荐

  1. docker registry http api v2(原创请注明出处)

    author: zqh date: 2016-5-24 docker registry v2版本的http api 一直没有找到合适的,自己通过阅读官方文档整理了一下. 概要 method path ...

  2. Docker仓库管理镜像 -- 公共仓库【Docker Hub】和私人仓库【Registry】和【harbor】

    镜像仓库管理 docker仓库,用来管理镜像.主要分为公共仓库和私人仓库.下面介绍了公共仓库Docker Hub.私人仓库Registry和harbor. DockerHUb仓库管理 什么是Docke ...

  3. Docker Hub的搭建、配置网络加速器、私有仓库的搭建以及私有仓库的认证与加密

    1.什么是仓库 Docker仓库是用来包含镜像的位置,Docker提供一个注册服务器(register)来保存这个仓库,每个仓库又可以包含多个具备不同tag的镜像. Docker运行中使用的默认仓库是 ...

  4. Docker(仓库)——Docker Hub 公共仓库+企业级私有仓库搭建流程

    目录 一.什么是仓库 二.安装配置Docker Hub 三.配置镜像加速器 四.Registry 工作原理 五.CONTENTS 六.搭建私有仓库 一.什么是仓库 什么是仓库? • Docker 仓库 ...

  5. 使用容器的正确方式,Docker在雪球的技术实践

    " 雪球目前拥有一千多个容器,项目数量大概有一百多个,规模并不是很大.但是得益于容器技术,雪球部署的效率非常高,雪球的开发人员只有几十个,但是每个月的发布次数高达两千多次. 2018 年 5 ...

  6. 终于把 7 年前的 Docker Hub 账号恢复了

    折腾 docker,向 Docker Hub 提交镜像的时候发现原来自己在 2014 年就已经注册过 Docker Hub 的账号了,而且在 https://hub.docker.com/u/shen ...

  7. x86 下制作 ARM Docker 镜像,Docker Hub、Travis 自动构建 qemu-user-static

    一般情况下,Docker 的镜像都是在一个已有的镜像内,一步步运行给定的命令,从而生成一个新的镜像.这样的步骤在大多数人使用的 x86 架构计算机上都不是问题,由于架构互相兼容,一台计算机上生成的镜像 ...

  8. 在Docker Hub上你可以很轻松下载到大量已经容器化的应用镜像,即拉即用——daocloud国内镜像加速...

    Docker之所以这么吸引人,除了它的新颖的技术外,围绕官方Registry(Docker Hub)的生态圈也是相当吸引人眼球的地方. 在Docker Hub上你可以很轻松下载到大量已经容器化的应用镜 ...

  9. 上传到docker hub_docker 创建image上传到 docker hub并下载

    docker容器跨系统的特性,这为我们快速的部署带了来方便.不管是导出也好,还是提交到docker hub都是不错的选择. 1,注册一个docker hub 登陆www.docker.com进行注册. ...

  10. ping 不通容器 宿主_使用容器的正确方式,Docker在雪球的技术实践

    " 雪球目前拥有一千多个容器,项目数量大概有一百多个,规模并不是很大.但是得益于容器技术,雪球部署的效率非常高,雪球的开发人员只有几十个,但是每个月的发布次数高达两千多次. 2018 年 5 ...

最新文章

  1. Python os.getcwd() 方法
  2. 多无人机对组网雷达的协同干扰问题 数学建模
  3. KDD 18 AAAI 19 | 异构信息网络表示学习论文解读
  4. 无人机飞控开发平台培训理论课程——MSP430最小系统
  5. 用jquery实现html5的placeholder功能
  6. Docker设置HTTP代理
  7. linux系统在虚拟机中迁移的技术难点
  8. PHP中stripslashes()函数的解释
  9. python学生管理系统用类写_python面向对象——学校学生教职工管理系统类的实例...
  10. Testin云測试破7000万次:崩溃成90%手游应用质量难题
  11. Green Deep Learning:NLP在大模型之外的另一种思路!
  12. canvas 文字垂直居中
  13. AWVS14.5最新版的安装与使用
  14. CodeBlocks下载与安装教程
  15. web端实现视频播放,视频地址切换,清晰度切换,断点续播
  16. led灯光衰怎么解决_LED路灯光衰问题解决方法
  17. Leetcode 2261. K Divisible Elements Subarrays
  18. 中央电大 c语言程序设计a 试题,中央电大2008年秋C语言程序设计A试题1
  19. aiml的中文适配aiml_cn
  20. Windows Server 2008 R2中关闭“IE增强的安全配置”

热门文章

  1. android自定义换行居中CenterTextView
  2. MySQL报错113_连接 MySQL 报错'NoneType' object has no attribute '__getitem__'
  3. python语言适用于哪些领域_Python用于哪些领域
  4. 第一周golang学习:--基本数据类型与string字符串类型之间的转换
  5. python下文件以及文件的常用操作-1
  6. 数字地球与计算机技术联系,数字地球与地球空间信息科学的关系
  7. [转]git使用指南系列
  8. 如何协助 MySQL 实现 Oracle 高级分析函数
  9. 如何删除Linux一个目录下部分类型之外的所有文件的三种方法
  10. ERP技术在财务信息化转型中应用探讨