showDoc 自动创建文档分析
ShowDoc就是一个非常适合IT团队的在线文档分享工具。https://www.showdoc.cc/
为了记录或者自动化的将一些文稿 统一记录在showdoc,一个一个复制粘贴太麻烦了,于是就有了下面这份代码
以下代码可以通过 读取文件名和文件内容 当作参数传入 然后自动上传至showdoc 的指定目录下 (可以根据需要进行修改),同时获取文档对应访问的 url 保存本地文件。
前面一部分是对 showdoc 的接口分析。 同时也使用了 https://www.showdoc.cc/page/741656402509783 showdoc 自己提供的接口 但是showdoc的接口有局限
后半部分才是 python 代码
image/webp,image/apng,image/*,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Connection: keep-alive Host: z11.cnzz.com Sec-Fetch-Dest: image Sec-Fetch-Mode: no-cors Sec-Fetch-Site: cross-site User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safar # 登陆 https://www.showdoc.cc/server/index.php?s=api/user/login?username=***&password=*** username password 1、 # 获取列表 https://www.showdoc.cc/server/index.php?s=/api/item/myList 添加head Cookie: PHPSESSID=vtc7sb1b9o46da0t2i4tqt8dd9; UM_distinctid=17177e7a889201-0a244e1f9bbf56-396d7507-384000-17177e7a88afcc; cookie_token=******************; think_language=zh-CN; CNZZDATA1259614235=1538324188-1586853504-https%253A%252F%252Fwww.baidu.com%252F%7C1586858909 返回 { "error_code": 0, "data": [ { "item_id": "7221167581802294", "uid": "214595", "item_name": "API文档示例", "item_domain": "", "item_type": "1", "last_update_time": "0", "item_description": "API文档示例", "is_del": "0", "creator": 1 }, { "item_id": "7424650551951107", "uid": "214595", "item_name": "百乐斗 ", "item_domain": "bailedou", "item_type": "1", "last_update_time": "15864312590", "item_description": "百乐 ", "is_del": "0", "creator": 1 } ] } 2、添加项目 /* 富华爱发了 fuhualkjad */ https://www.showdoc.cc/server/index.php?s=/api/item/add item_type=1&item_name=%E5%AF%8C%E15%8D%8E%E91%BA%B1B%E5%B0%86&item_description=%E5%AF%8C%E5%8D%8E%E9%BA%BB%E5%B0%86&item_domain=fuhua&password= 3、 更新项目 https://www.showdoc.cc/server/index.php?s=/api/item/update 返回: {"error_code":0,"data":1} 3、添加页面 id=1259614235&r=&lg=zh-cn&ntime=15868158909&cnzz_eid=15138324188-1586853504-https%3A%2F%2Fwww.baidu.com%2F&showp=2560x1440&p=https%3A%2F%2Fwww.showdoc.cc%2Fitem%2Fsetting%2F765452293022659&t=ShowDoc&umuuid=17177e7a889201-0a244e1f9bbf56-396d7507-384000-17177e7a88afcc&h=1&rnd=502287534 4、生成 api key 和 token https://www.showdoc.cc/server/index.php?s=/api/item/getKey?id=765451293022659 {"error_code":0,"data":{"id":"173679","item_id":"7654521293022659","api_key":"******************","api_token":"******************","addtime":"1586865022","last_check_time":"0"}} 5、 创建 单独的页面地址 https://www.showdoc.cc/server/index.php?s=/api/page/createSinglePage? page_id=4093572772585676&isCreateSiglePage=true 带Cookie 返回 {"error_code":0,"data":{"unique_key":"**************","page_id":4093157273725852676}}
genShowDocUrls.py
#-*- coding:utf-8 -*- #usr/bin/python import io import sys import getopt reload(sys) sys.setdefaultencoding( "utf-8" ) import requests import urllib import json import time import pypinyin import os.path Domain = 'https://www.showdoc.cc/' def login_session(username, password): session = requests.Session() UserAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36' session.headers.update({'User-Agent': UserAgent}) data = { "username" : username, "password" : password, } res = session.post(Domain + 'server/index.php?s=api/user/login', data=data) if res.text.find(u'错误') != -1: return None return session GetListUrl='server/index.php?s=/api/item/myList' def getList(session): ListAccept= "application/json, text/plain, */*" session.headers.update({'Accept': Accept}) res_itemlist = session.get(Domain + GetListUrl) result = json.loads(res_itemlist.text) for item in result["data"]: print item["item_id"], item["item_name"] def addItem(session, item_name, item_enname): AddItemUrl='server/index.php?s=/api/item/add' encode_item_name=urllib.quote_plus(item_name) data = { 'item_type': 1, 'item_name': encode_item_name, 'item_description': encode_item_name, 'item_domain': item_enname, # 'password': md5(password).hexdigest().upper() } res = session.post(Domain + AddItemUrl, data=data) result = json.loads(res.text) if result["error_code"] != 0: return False return True def updateItem(session, item_name, item_enname, item_id): AddItemUrl='server/index.php?s=/api/item/add' encode_item_name=urllib.quote_plus(item_name) data = { 'item_type': 1, 'item_name': encode_item_name, 'item_description': encode_item_name, 'item_domain': item_enname, # 'password': md5(password).hexdigest().upper() } res = session.post(Domain + AddItemUrl, data=data) result = json.loads(res.text) if result["error_code"] != 0: return False return True def getItemId(session, item_domain): res = session.get(Domain + GetListUrl) result = json.loads(res.text) if result["error_code"] == 0: itemid="" itemcompare_data = item_domain.strip().decode('utf-8') for item in result["data"]: # print # item.strip().decode('utf-8') # print item["item_id"], item["item_name"], ItemName if item["item_domain"].strip().decode('utf-8') == itemcompare_data: itemid = item["item_id"] print "find item[item_id] = " + item["item_id"] return itemid return "" # api_key 是 string api_key,认证凭证。登录showdoc,进入具体项目后,点击右上角的”项目设置”-“开放API”便可看到 # api_token 是 string 同上 # cat_name 否 string 可选参数。当页面文档处于目录下时,请传递目录名。当目录名不存在时,showdoc会自动创建此目录。需要创建多层目录的时候请用斜杆隔开,例如 “一层/二层/三层” # page_title 是 string 页面标题。请保证其唯一。(或者,当页面处于目录下时,请保证页面标题在该目录下唯一)。当页面标题不存在时,showdoc将会创建此页面。当页面标题存在时,将用page_content更新其内容 # page_content 是 string 页面内容,可传递markdown格式的文本或者html源码 # s_number 否 number 可选,页面序号。默认是99。数字越小,该页面越靠前 def createPage(session, api_key, api_token, title, content, index, cat_name=None): # https://www.showdoc.cc/server/api/item/updateByApi CreatePageUrl= 'server/api/item/updateByApi' data = { 'api_key': api_key, 'api_token': api_token, 'page_title': title, 'page_content': content, 's_number': index } if cat_name != None: data["cat_name"] = cat_name createpage_ret = session.post(Domain + CreatePageUrl, data=data) createpage_retj = json.loads(createpage_ret.text) if createpage_retj["error_code"] == 0: return createpage_retj["data"]["page_id"]; else: return "" def createSinglePageUrl(session, page_id): GetSinglePageUrl='/server/index.php?s=/api/page/createSinglePage' data = { 'page_id': page_id, 'isCreateSiglePage':"true" } createpage_ret = session.post(Domain + GetSinglePageUrl, data=data) createpage_retj = json.loads(createpage_ret.text) if createpage_retj["error_code"] == 0: return createpage_retj["data"]["unique_key"]; else: return "" def getApiKey(session, item_id): GetKeyUrl='server/index.php?s=/api/item/getKey' # GetSinglePageUrl='/server/index.php?s=/api/page/createSinglePage' data = { 'item_id': item_id, } getkey_ret = session.post(Domain + GetKeyUrl, data=data) print getkey_ret.text getkey_retj = json.loads(getkey_ret.text) if getkey_retj["error_code"] == 0: return getkey_ret.text; else: print "get getApiKey failed!!!" return "" def getAppUrls(Username, Password, ItemName, ItemEnName, PageSupportName, PageContents, TestDocuments, TestDocumentsContent): session = login_session(Username,Password) if session == None: print("getAppUrls Login Failed! " + Username) return False # 获取列表。如果有 就获取id 如果没有 就创建 然后重新获取ID ret = addItem(session, ItemName, ItemEnName) if ret: print("createItem Failed! " + ItemName) return False else: print("createItem Succeed! " + ItemName) ItemId = getItemId(session, ItemEnName) if len(ItemId) == 0: print("Need ItemId!!!") return False else: print "ItemId = "+ ItemId privacy_url_en = "" privacy_url = "" support_url = "" api_result_str = getApiKey(ItemId) if len(api_result_str) != 0: api_result = json.loads(api_result_str) api_key = api_result["data"]["api_key"] api_token = api_result["data"]["api_token"] pageid = createPage(api_key, api_token, TestDocuments, TestDocumentsContent, 1) if len(pageid) == 0: print "创建测试文档失败!" else: privacy_key = createSinglePageUrl(pageid) privacy_url = "https://www.showdoc.cc/p/" + privacy_key en_pageid = createPage(api_key, api_token, TestDocumentsEn, TestDocumentsContentEn, 2) if len(en_pageid) == 0: print "创建测试文档英文版失败!" else: privacy_key_en = createSinglePageUrl(en_pageid) privacy_url_en = "https://www.showdoc.cc/p/" + privacy_key_en support_pageid = createPage(api_key, api_token, PageSupportName, PageContents, 3) if len(support_pageid) == 0: print "创建页面内容失败!" else: support_key = createSinglePageUrl(support_pageid) support_url = "https://www.showdoc.cc/p/" + support_key with io.open(ItemName + ".txt","w",encoding='utf-8') as f: f.write("测试文档网址: " + unicode(privacy_url) + "\n") f.write("页面内容网址: " + unicode(support_url) + "\n") f.write("测试文档英文: " + unicode(privacy_url_en) + "\n") return True else: print "Get API Failed!" return False def getAppUrlsInAProj(Username, Password, ProjectName, ProjectEnName, DateDirName, ItemName, PageSupportName, PageContents, TestDocuments, TestDocumentsContent, TestDocumentsEn, TestDocumentsContentEn): session = login_session(Username,Password) if session == None: print("getAppUrlsInAProj Login Failed! " + Username) return False # 获取列表。如果有 就获取id 如果没有 就创建 然后重新获取ID ItemId = getItemId(session, ProjectEnName) if len(ItemId) == 0: ret = addItem(session, ProjectName, ProjectEnName) if not ret: print("createItem Failed! " + ItemName) return False else: print("createItem Succeed! " + ItemName) ItemId = getItemId(session, ProjectEnName) if len(ItemId) == 0: print("Need ItemId!!!") return False else: print "ItemId = "+ ItemId privacy_url_en = "" privacy_url = "" support_url = "" api_result_str = getApiKey(session, ItemId) if len(api_result_str) != 0: api_result = json.loads(api_result_str) api_key = api_result["data"]["api_key"] api_token = api_result["data"]["api_token"] pageid = createPage(session, api_key, api_token, TestDocuments, TestDocumentsContent, 1, DateDirName +"/" + ItemName + "/") if len(pageid) == 0: print "创建测试文档失败!" else: privacy_key = createSinglePageUrl(session, pageid) privacy_url = "https://www.showdoc.cc/p/" + privacy_key en_pageid = createPage(session, api_key, api_token, TestDocumentsEn, TestDocumentsContentEn, 2, DateDirName +"/" + ItemName + "/") if len(en_pageid) == 0: print "创建测试文档英文版失败!" else: privacy_key_en = createSinglePageUrl(session, en_pageid) privacy_url_en = "https://www.showdoc.cc/p/" + privacy_key_en support_pageid = createPage(session, api_key, api_token, PageSupportName, PageContents, 3, DateDirName +"/" + ItemName + "/") if len(support_pageid) == 0: print "创建页面内容失败!" else: support_key = createSinglePageUrl(session, support_pageid) support_url = "https://www.showdoc.cc/p/" + support_key return [privacy_url, privacy_url_en, support_url] else: print "Get API Failed!" return False TestDocuments = "测试文档" TestDocumentsContent = ''' 测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档 测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档测试文档 ''' TestDocumentsEn = "Test Documents" TestDocumentsContentEn = ''' Test DocumentsTest DocumentsTest DocumentsTest DocumentsTest DocumentsTest DocumentsTest DocumentsTest DocumentsTest DocumentsTest DocumentsTest DocumentsTest DocumentsTest DocumentsTest DocumentsTest Documents Test DocumentsTest DocumentsTest DocumentsTest Documents Test DocumentsTest DocumentsTest DocumentsTest DocumentsTest DocumentsTest DocumentsTest Documents Test DocumentsTest DocumentsTest DocumentsTest DocumentsTest Documents ''' ProjectName=u"项目支持资料" ProjectEnName = "xiangmuzhichiziliao" Username = "*********" Password = "*********" def genDocuments(name, fpath): if (len(name) == 0): print("genDocuments Failed! Need Item name. " + ItemName) sys.exit(2) if (len(fpath) == 0): print("genDocuments Failed! Need fpath name. " + ItemName) sys.exit(2) ItemName = "" ItemEnName = "" PageContents = "" if fpath[-1] == "/": fpath=fpath[0:-1] with io.open(os.path.join(fpath, "描述.txt"),"r",encoding='utf-8') as f: PageContents = f.read() # print PageContents f.close() ItemName = name PageSupportName = ItemName + "页面内容" ItemEnName = pinyin(unicode(ItemName)) DateDirName = str(time.strftime('%Y%m%d',time.localtime(time.time()))) arr = getAppUrlsInAProj(Username, Password, ProjectName, ProjectEnName, DateDirName, ItemName, PageSupportName, PageContents, TestDocuments, TestDocumentsContent, TestDocumentsEn, TestDocumentsContentEn) if not arr: arr = [] with io.open(os.path.join(os.path.dirname(fpath), ItemName + ".txt") ,"w",encoding='utf-8') as f: if len(arr) > 0: f.write("测试文档1: " + unicode(arr[0]) + "\n") if len(arr) > 1: f.write("测试文档2: " + unicode(arr[1]) + "\n") if len(arr) > 2: f.write("测试文档3: " + unicode(arr[2]) + "\n") print("genDocuments Succeed! Item name. " + ItemName) from pypinyin import pinyin def main(argv): ItemName = "" ItemPath = "" try: opts, args = getopt.getopt(argv,"hi:p:",["ifile=","ofile="]) except getopt.GetoptError: print 'genDocuments.py -ipath <PageContentsFile> -iname <ProjectName>' sys.exit(2) for opt, arg in opts: if opt == '-h': print 'genDocuments.py --ipath <PageContentsFile> --iname <ProjectName>' sys.exit() elif opt in ("-p", "--ipath"): ItemPath = arg elif opt in ("-i", "--iname"): ItemName = arg genDocuments(ItemName, ItemPath) if __name__=='__main__': #ItemName = "阿里觉得浪费1234" #ItemEnName = pinyin(ItemName) #PageSupportName = ItemName + "" #PageContents = "发啦快就收到了饭卡结束两地分居阿里觉得失联飞机卡里的世界" #getAppUrls(Username, Password, ItemName, ItemEnName, PageSupportName, PageContents, TestDocuments, TestDocumentsContent)
main(sys.argv[1:])
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现