简书天然支持 Markdown 格式, 而 Github 仓库中的 README.md 也天然支持 Markdown 格式
简书后台支持一键下载所有写过的 Markdown 的文章, Github 提供了脚本创建仓库的 Api
我们从简书后台获取所有写过的 Markdown 文章, 然后运行一个脚本, Github 将会新建一个仓库, 作为我们博客的新地址
运行效果:
本地目录
本地目录
GitHub 新仓库
github 新仓库
新仓库细节
脚本的说明:
仓库的英文名, 是怎么来的?
仓库的英文名由原 markdown 的文件名通过 google 翻译而来
如何认证 github 用户名和密码?
用户名和密码被分离到了单独的配置文件中, 填写配置文件即可
程序如何获取本地 markdown 文档的位置?
程序会通过递归方法, 将脚本所在的同级目录和子目录下所有的以. md 结尾的所有文件读取出来, 这些. md 结尾的文档都会被建立为 Github 仓库
简书允许这种行为么?
简书并不反对这种行为, 我写过一篇手动迁移简书 markdown 的细则: 简书文章发布到 GitHub, 简叔打赏了我 10 颗糖, 至今难忘...
为什么写这个脚本 ?
关于简书文章发布到 GitHub, 里面详细介绍了手动迁移的整个过程, 后来有读者评论:
评论
为了回应读者的热情, 我完成了这个脚本
脚本适用于所有本地 markdown 文档一键发布到 github 么?
是的, 这里用简书做例子, 只是因为简书打包下载的文档包, 很适合做说明, 任何本地的 md 文档, 只要在脚本的同级目录或者子目录, 都可以一键迁移到 GitHub
- 脚本依赖的环境:
安装了 git, 安装了 curl, 安装了 python3, 在 GitHub 中添加了公钥
从简书打包获取 markdown:
获取 Markdown
运行脚本之前需要在 GitHub 添加公钥
在本地生成一对秘钥(以 Ubuntu 为例), 进入到. ssh 目录下
cd ~/.ssh/
生成一对秘钥
ssh-keygen -t rsa -C "lijianzhao1208@gmail.com"
为秘钥起个名字(可直接回车跳过)
秘钥起个名字
将公钥内容添加到 github(实现免密向远程仓库提交代码)
复制公钥 (github.pub) 内容
复制公钥 (github.pub) 内容
登录 github, 并粘贴公钥内容
github 主页
添加容器
添加公钥
添加完成
源码
主逻辑脚本
- import os
- import json
- import re
- from googletrans import Translator
- def getAllMd (file_dir):
- # 获取当前目录下所有的 CSS 文件路径
- all_whole_path_files = []
- for root, dirs, files in os.walk(file_dir):
- for file in files:
- try:
- if file[-3:] == ".md":
- file_info = [root+'/', file]
- all_whole_path_files.append(file_info)
- except Exception as e:
- print(e)
- print(all_whole_path_files)
- return all_whole_path_files
- def getRepName(zhCnName):
- translator = Translator()
- enName = translator.translate(zhCnName, dest='en').text
- enNameList = enName.split(' ')
- enName = ''
- for en in enNameList:
- if re.match('[a-zA-Z]+' ,en):
- en = en.capitalize()
- enName += en
- # 将当前获得的字符串拆分
- enStrList = [e for e in enName]
- # 符合要求的列表索引
- indexList = []
- for index, enStr in enumerate(enStrList):
- if re.match('[a-zA-Z]' ,enStr):
- indexList.append(index)
- else:
- pass
- rep_name = ''
- for index in indexList:
- rep_name += enStrList[index]
- # 如果翻译的仓库名长度大于 100, 则截断
- if len(rep_name)> 100:
- rep_name = rep_name[0:101]
- return rep_name
- def getInfo(whole_path_file):
- info = {}
- with open("./inputInfo.txt", 'r') as f:
- jsonStr = ''
- lines = f.readlines()
- # 过滤注释, 生成 json 格式
- for line in lines:
- if '#' not in line:
- jsonStr += line
- info = json.loads(jsonStr)
- RepName = getRepName(whole_path_file[1][:-3])
- info['GitHubRepositoryName'] = RepName
- return info
- # 在 github 创建远程仓库
- def CreateRepository(info):
- GitHubUserName = info['GitHubUserName']
- GitHubPassWord = info['GitHubPassWord']
- GitHubRepositoryName = info['GitHubRepositoryName']
- # 这里有详细的参数说明: https://developer.github.com/v3/repos/#create
- new_command = 'curl -i -u' + '\'' +GitHubUserName + ':' + GitHubPassWord + '\'' +'-d' + '\''+ '{"name":' + '\"'+GitHubRepositoryName +'\"'+ ',' + '"auto_init": '+'true, '+'"private":' + 'false,' + '"gitignore_template": '+'"nanoc"}' + '\'' + 'https://api.github.com/user/repos'
- result = os.popen(new_command).readlines()
- if ('HTTP/1.1 201 Created\n' in result):
- print("创建成功")
- return True
- else:
- return False
- def GetRepository(info):
- GetAllRepCommand = 'curl -i -u' + '\'' + info['GitHubUserName'] + ':' + info['GitHubPassWord'] +'\'' + 'https://api.github.com/user/repos'
- print(GetAllRepCommand)
- result = os.popen(GetAllRepCommand).readlines()
- keyWord = info['GitHubUserName']+'/'+info['GitHubRepositoryName']
- # 判断仓库是否创建成功
- if not (keyWord in str(result)):
- return
- # 获取仓库到同级目录下
- # git@github.com:zhaoolee/ChatRoom.git
- GetRepCommand = 'git clone git@github.com:' + keyWord + '.git'
- # 将仓库获取到本地
- result = os.popen(GetRepCommand).readlines()
- # 将资源文件放入仓库
- def FillRepository(info):
- AllFileName = os.listdir('./')
- PreReadMeFile = info['file_info'][0] + info['file_info'][1]
- # 将 md 文件替换原有的 README.md
- ReplaceMdFileCommand = 'cp ./' + PreReadMeFile + './'+ info['GitHubRepositoryName'] + '/README.md'
- print("==>", ReplaceMdFileCommand, "<==")
- result = os.popen(ReplaceMdFileCommand).readlines()
- # 将文件提交到仓库
- def PushRepository(info):
- inputRepository = 'cd' + info['GitHubRepositoryName']
- addCommand = 'git add .'
- result = os.popen(inputRepository+'\n'+addCommand).readlines()
- commitCommand = 'git commit -m" 完成项目的初始化 "'result = os.popen(inputRepository+'\n'+commitCommand).readlines()
- pushCommand = 'git push'
- result = os.popen(inputRepository+'\n'+pushCommand).readlines()
- print("完成")
- # 获取新建仓库所需的完整信息
- def GetAllWholeRepInfo(all_whole_path_files):
- # 包含所有仓库信息
- all_whole_rep_info = []
- for whole_path_file in all_whole_path_files:
- # 包含新建仓库所需的完整信息
- whole_rep_info = getInfo(whole_path_file)
- whole_rep_info['file_info'] = whole_path_file
- all_whole_rep_info.append(whole_rep_info)
- return all_whole_rep_info
- def main():
- all_whole_path_files = getAllMd('./')
- all_whole_rep_info = GetAllWholeRepInfo(all_whole_path_files)
- # 依次创建仓库
- for info in all_whole_rep_info:
- CreateRepository(info)
- GetRepository(info)
- FillRepository(info)
- PushRepository(info)
- if __name__ == '__main__':
- main()
配置脚本
- {
- # 用户名
- "GitHubUserName": "zhaoolee",
- # 用户密码
- "GitHubPassWord": "github"
- }
总结:
来源: http://www.jianshu.com/p/e64a0c3d783c