Github Api调用

概述

v3版Api的文档链接

v3版Api的官方教程

基本访问路径

只是读取的话,完全不用任何授权,可以在命令行、Insomnia、网页等各种情况下直接输入链接访问任何人的所有公开信息.

个人主要信息:

https://api.github.com/users/用户名

得到的数据如下图:

基本路径1

个人所有repo

https://api.github.com/users/用户名/repos

会得到一个repo的JSON格式列表.

repo详细信息

https://api.github.com/repos/用户名/仓库名

获取某个repo的内容列表

https://api.github.com/repos/用户名/仓库名/contents

注意
只会返回根目录的内容.

获取repo中子目录的内容列表

https://api.github.com/repos/用户名/仓库名/contents/目录名

注意
一定要完全遵循原文件名的大小写,否则无法获得信息.如果是更深层的内容,则在链接列按照顺序逐级写上目录名称.

获取repo中某文件信息:

https://api.github.com/repos/用户名/仓库名/contents/文件路径

文件路径是文件的完整路径,区分大小写,只会返回文件基本信息.

获取某文件的原始内容(Raw)

  • 通过上面的文件信息中提取download_url这条链接,就能获取它的原始内容了.
  • 直接访问:https://raw.githubusercontent.com/用户名/仓库名/分支名/文件路径

repo中所有的commits列表

https://api.github.com/repos/用户名/仓库名/commits

某一条commit详情

https://api.github.com/repos/用户名/仓库名/commits/某一条commit的SHA

issues列表

https://api.github.com/repos/用户名/仓库名/issues

某条issue详情

https://api.github.com/repos/用户名/仓库名/issues/序号

issues都是以1,2,3这样的序列排号的.

某issue中的comments列表

https://api.github.com/repos/用户名/仓库名/issues/序号/comments

这个地方有坑,直接按上述那样写的话,最多拿到30条comments,需要先通过拿issue详情,得到comments的个数,然后加参数 ?page=1&per_page=100 循环拿Comments个数.

某comment详情

https://api.github.com/repos/用户名/仓库名/issues/comments/评论详情的ID

其中评论ID是从issues列表中获得的.

注意

访问的链接最后不能有/,如https://api.github.com/users/XiaLuoHun是可以访问到个人信息的,但是https://api.github.com/users/XiaLuoHun/就不行了,唯一不同是多了一个/.

Github的API访问链接是区分大小写的.

查询参数

如果在上面基本链接中加入查询条件,那么返回的数据就是filtered,过滤了的.比如要求让列表数据分页显示,或者只返回正在开放的issues.常用如下:

  • 分页功能.格式是?page=页数&per_page=每页包含数量.

    如:https://api.github.com/users/dnspy/repos?page=1&per_page=2

  • issues状态.格式是?state=状态. 状态:open、closed.

    如:https://api.github.com/repos/x64dbg/x64dbg/issues?state=open

权限认证

首先需要知道都是,到此为止之前所有的查询都是不需要任何权限的,给个地址就返回数据,全公开. 但是创建文件、更新、删除等就是必须用自己的账号"登录"才能实现的.所以为了下面的增删改做准备,需要先看一下权限问题.

Basic authentication

这种最简单,如果是用curl的话.

1
curl -u "用户名:密码" https://api.github.com

如果是用Insomnia等调试工具的话,直接在Auth选项栏里选Basic Auth,然后填上用户名密码即可.

OAuth2 token

token:

说白了就是第二个密码,你既可以不用到处泄露自己的用户名和密码,又可以专门给这个"第二密码"设置不同的权限,如有的只可读,有的还可以写等.除此之外,你还可以设置很多个token,也就是第三、第四、第五…密码.

设置token方法:

位于github个人账号设置->开发者设置->个人token.创建一个新token时,可以选择具体的权限,创建成功时一定要复制到本地保存,只会让你看见一次,如果忘记的话就需要重新生成(其实丢了也不算麻烦).

设置token

注意
token字符串不能存储在github的repo中,经过测试,一旦提交的文件中包含这个token字符串,那么github就会自动删除这个token.

用token通过权限认证:

  1. 作为url中的参数明文传输.
1
curl https://api.github.com/?access_token=OAUTH-TOKEN
  1. 作为header中的参数传输.
1
curl -H "Authorization: token OAUTH-TOKEN" https://api.github.com

如果不是用curl而是Insomnia测试的话,和上面basic auth是大同小异的,很容易操作就不复述了.

OAuth2 key/secret

这个是除了Personal Access Token之外的另一种好用的方法,即创建自己的OAuth app,然后得到一对client_id和client_secret.如下:

OAuthApps1

OAuthApps2

得到这两个值之后,直接在访问任何api的url连接后面显性加上这两个参数即可完成认证,如: https://api.github.com/users/YOUR-USERR-NAME?client_id=YOUR-CLIENT-ID&client_secret=YOUR-CLIENT-SECRET

注意
目前这种认证方式不支持查询以外的操作,也就是只能GET获取某些api信息,不能执行request里的任何put/PATCH/delete操作.

增改删contents

官方文档
注意
  • 必须添加权限验证(上面有写).
  • 数据传送格式选择json.
  • 文件内容必须是把内容转为Base64字符串再存到json变量中.
  • 文件路径中如果有不存在的文件夹,则会自动创建.

  • 传输方法:put
  • 访问路径:https://api.github.com/repos/用户名/仓库名/contents/文件路径
  • json格式:
1
2
3
4
{
  "message": "commit",
  "content": "VGVzdCBmaWxl"
}

示例:

创建文件

  • 传输方法:put

  • 访问路径:https://api.github.com/repos/用户名/仓库名/contents/文件路径

  • json格式:

1
2
3
4
5
{
  "message": "update file",
  "content": "dXBkYXRlIFRlc3QgZmlsZQ==",
  "sha": "84362ca046b156d71d84fa5356ae9afbcb282919"
}
注意
  • 必须指定该文件的sha码,相当于文件的ID.

  • 文件的sha码会随着文件内容变化而变化,所以必须每次都重新获取才行.

    如何获取的话,参考前面的 获取repo中某文件信息.

示例:

更新文件

  • 传输方法:delete
  • 访问路径:https://api.github.com/repos/用户名/仓库名/contents/文件路径
  • json格式:
1
2
3
4
{
  "message": "delete file",
  "sha": "115132afb3f1dfcfc0ce11263f944f2d8ac956f2"
}

示例:

删除文件

增改删issues

官方文档

和上面contents的增删改差不多,唯一不同的是,issues是不用把内容转为Base64码的.

  • 传输方法:post
  • 访问路径:https://api.github.com/repos/用户名/仓库名/issues
  • json格式:
1
2
3
4
{
  "title": "Creating issue",
  "body": "Posting a issue"
}
注意
issue的数据里面是可以加label,milestone和assignees的.但是milestone和assignees必须是与已有的名次完全对应才行,否则无法完成创建.

  • 传输方法:patch
  • 访问路径:https://api.github.com/repos/用户名/仓库名/issues/序号
  • json格式:
1
2
3
4
5
{
  "title": "Creating issue updated",
  "body": "Posting a issue\n\n Updated from insomnia.",
  "state": "open"
}
注意
如果json中加入空白的labels或assignees,如"labels": [],作用就是清空所有的标签和相关人.

锁住某条issue

不允许别人评论(自己可以).

锁住某条issue

  • 传输方法:put
  • 访问路径:https://api.github.com/repos/用户名/仓库名/issues/序号/lock
  • json格式:
1
2
3
4
{
  "locked": true,
  "active_lock_reason": "too heated"
}

解锁某条issue

  • 传输方法:delete
  • 访问路径:https://api.github.com/repos/用户名/仓库名/issues/序号/lock
  • 无json传输

增改删comments

  • 传输方法:post
  • 访问路径:https://api.github.com/repos/用户名/仓库名/issues/序号/comments
  • json格式:
1
2
3
{
  "body": "Create a comment"
}

示例:

comments增

  • 传输方法:patch
  • 访问路径:https://api.github.com/repos/用户名/仓库名/issues/comments/评论ID
  • json格式:
1
2
3
{
  "body": "Create a comment \n\n--Updated"
}
注意
地址中,issues后不用序号了,因为可以通过唯一的评论ID追查到.查看评论ID的方法,可参考上面的 某issue中的comments列表.

示例:

comments改

  • 传输方法:delete
  • 访问路径:https://api.github.com/repos/用户名/仓库名/issues/comments/评论ID
  • 无json传输

参考链接

一篇文章搞定Github API 调用 (v3)


相关内容

0%