前言
既然写了G站,那我再写一个G2站的吧,gitlab的issue导出。
- 支持comments
- 支持labels
核心的方法是用gitlab 提供的api接口来获取issue和notes里的markdown字符串。
G2 api:https://docs.gitlab.com/ce/api/
小可爱们【转载请注明出处】谢谢。
1 获取token 获取 project id
首先要获取token,获取地址: https://gitlab.com/profile/personal_access_tokens
![](https://i-blog.csdnimg.cn/blog_migrate/a3c60b9a499d1647436effa18bcbc845.png)
记得勾选 api哈。
接着获取 project id
![](https://i-blog.csdnimg.cn/blog_migrate/acec3665000462b2af3759f65bc1deac.png)
2 使用代码下载issue
换上自己的 project_id、token、out_dir ,然后就可以愉快地用shell下载了。
脚本是这样子的:
python3 issue_to_markdown.py -p project_id -t token -o out_dir
也可以在 issue_to_markdown.py
的49行,写上 project_id、token、out_dir的值,就不需要给参数了。
代码文件: issue_to_markdown.py
from tqdm import tqdm
import os
import argparse
import codecs
import json
import re
import requests
requests.session().keep_alive = False # 及时释放
def get_info(api_url, token):
headers = {'Private-Token': "%s" % token}
r = requests.get(
api_url, headers=headers)
ret = json.loads(r.text)
if r.status_code > 300:
print('error %s', r.text)
return False
return ret
def to_markdown(page, mk_note):
mk = '# ' + page['title'] + '\n'
mk += "created_at: "+page['created_at']+"\n"
mk += "updated_at: "+page['updated_at']+"\n"
labels = "label: "
for idx, item in enumerate(page['labels']):
if (idx+1) == len(page['labels']):
labels += item+'\n'
else:
labels += item+','
mk += labels+'\n'
mk += page['description']+'\n'
mk += mk_note
return mk
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-p', '--id', help="gitlab project id")
parser.add_argument('-t', '--token', help="gitlab personal access token")
parser.add_argument('-o', '--dir', help="out put dir")
args = parser.parse_args()
# args.id = ?
# args.token = ""
# args.dir = "out"
if not os.path.exists(args.dir):
os.makedirs(args.dir)
base = "https://gitlab.com/api/v4"
# 当然你也可以自建gitlab
issue_url = base+"/projects/%d/issues?per_page=%d"
# gitlab默认服务器端每次只返回20条数据给客户端,可以用设置page和per_page参数的值,指定服务器端返回的数据个数。
note_url = base+"/projects/%d/issues/%d/notes?sort=asc"
# 包含了所有的issue both open and closed
ret = get_info(issue_url % (args.id, 100), args.token)
for page in tqdm(ret):
if page['state'] == 'opened': # 去掉关闭的issue
_pid = page['project_id']
_iid = page['iid']
mk_note = "" # 获取评价
if page['user_notes_count'] > 0:
notes = get_info(note_url % (_pid, _iid), args.token)
for note in notes:
if not note['system']: # 过滤系统的notes
mk_note += note['body']+'\n'
mk = to_markdown(page, mk_note)
# save
filename = page['created_at'].split('T')[0]+','+page['title']+'.md'
filename = re.sub(r'[/:*?"<>|]', " ", filename) # check filename
filename = os.path.join(args.dir, filename)
with codecs.open(filename, 'w', 'utf-8') as file:
file.write(mk)
3 用issue写作
记得用 ##
作为小节标题哈,在导出的文档里主次清晰,不乱的。
![](https://i-blog.csdnimg.cn/blog_migrate/b54e3b740b2ba5448949d921ca507989.png)
4 结果
下面是导出数据的结果,md文件的标题是 时间+issue title.md
。
![](https://i-blog.csdnimg.cn/blog_migrate/eeb62ed40b6f64614ece8c4c2c253c26.png)
再会!!!
笔者还写了,Github 导出 issue:https://blog.csdn.net/github_25176023/article/details/105725979
还写了,Gitee 导出 issue:
https://blog.csdn.net/github_25176023/article/details/105739634
小可爱们,点赞收藏分享走一波?