Markdown批量发布到Github
- 简书天然支持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 Translatordef 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_filesdef getRepName(zhCnName):translator = Translator()enName = translator.translate(zhCnName, dest='en').textenNameList = 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:passrep_name = ''for index in indexList:rep_name += enStrList[index]# 如果翻译的仓库名长度大于100,则截断if len(rep_name) > 100:rep_name = rep_name[0:101]return rep_namedef 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 += lineinfo = json.loads(jsonStr)RepName = getRepName(whole_path_file[1][:-3])info['GitHubRepositoryName'] = RepNamereturn info# 在github创建远程仓库
def CreateRepository(info):GitHubUserName = info['GitHubUserName']GitHubPassWord = info['GitHubPassWord']GitHubRepositoryName = info['GitHubRepositoryName']# 这里有详细的参数说明: https://developer.github.com/v3/repos/#createnew_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 Trueelse:return Falsedef 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.gitGetRepCommand = '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.mdReplaceMdFileCommand = '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_fileall_whole_rep_info.append(whole_rep_info)return all_whole_rep_infodef 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"
}
总结:
这不是一篇独立的文章, 如果你想了解更多, 可以参考我以前写过相关的两篇:
- 手动迁移markdonw文档,简书文章发布到GitHub
- 将附带静态资源的markdown文档, 一键迁移到GitHub, Github变身网络硬盘
这个脚本已经可以用了,但还不完美, 欢迎在文章底部或Github仓库https://github.com/zhaoolee/MarkDonw2GitHub 提出改进建议
为便于管理, 相关资源整合到一张独立的帖子,链接如下:
http://www.jianshu.com/p/4f28e1ae08b1
Markdown批量发布到Github相关推荐
- 新版markdown功能发布!支持github flavored markdown!
让大家久等了!新版markdown功能一直拖到今天才发布,很是愧疚...但不管怎么样,总算发布了! 今年1月份发布第一版markdown功能之后,很多园友反馈说做得很烂,我们综合大家的反馈之后发现不仅 ...
- 使用DocFx生成文档网站并将其发布到GitHub Pages
目录 介绍 DocFx安装 Visual Studio中的测试解决方案 使用docfx init设置DocFx 手动设置DocFx docfx.json配置文件的剖析 元数据部分 构建部分 docs文 ...
- Omi × 云开发『半天』搞定小程序 『markdown 内容发布系统』
原创:腾讯Omi团队 想要开发小程序,但是......没有后端!没有运维!没有 DBA!没有域名!没有证书!没有钱!没有时间!没有精力!怎么办??? 没有关系,小程序•云开发带你飞,会 javascr ...
- GitBook生成电子书并发布到GitHub Pages
看英文书,总得留下点什么,索性就机翻一下吧.之前想在GitHub的Pages上做连载,但是Pages的页面之间跳转不方便,所以转而寻求GitBook. 没有VPN,GitBook无法登录,所以在线版是 ...
- 关于laravel发布到github'丢失'vendor目录或其他文件的解决
知道没人喜欢啰嗦,直接上解决方案再说说我的'遭遇': 解决vendor缺失的问题: 从github上clone代码后,切换到项目根目录,在powershell中运行composer install,这 ...
- 小红书批量发布帖子笔记软件怎么用
小红书批量发布帖子笔记软件怎么用 小红书批量发布帖子笔记软件怎么用
- Lazada新手批量发布产品快速铺货详细教程:
C# Opencart 开发 东南亚是有很大的人口红利的区域和GDP增长潜力.作为东南亚地区最大的在线购物网站之一,Lazada无疑是一个掘金地.3月19日平台再次获得阿里巴巴20亿美元战略投资(阿里 ...
- 抖音视频批量发布方法
短视频领域是近几年崛起的新领域,许多小伙伴也是打算进军到短视频领域.但是对于视频和文章还是有区别的,那么如何才能做到视频和文章一样批量发布呢?这里就给大家分享一个经验技巧. 工具/原料 联想Think ...
- 好看视频上传软件批量发布视频讲解
好看视频上传软件批量发布视频讲解 短视频具有哪些优势呢.短视频这么火极客思维小编粗略总结如下为什么短视频那么火形式互动短视频在形式上的互动性更强通常内容以故事为中心这类平台有完整且的编排和加工剪辑对每 ...
最新文章
- 集成学习Bagging和Boosting算法总结
- java se用哪个eclipse_【JAVA SE基础篇】5.eclipse的使用和运行
- UA MATH566 一个例子:什么是隐状态
- Python——有关transpose的多维转置的难点
- 运算符--位移运算符和一些其他运算符
- mysql group by_技术分享 | 回顾 MySQL 的 MTS
- Vue-Treeselect 的下拉菜单不出Table的框
- shell中的文本处理(grep、sed、awk命令)
- 新生赛3 1003 字符串最小表示法题目
- C#多线程池演示例程--下载图片
- oracle 改redo表空间,Oracle临时表空间查看、添加临时表空间数据文件、修改默认临时表空间 方法!...
- 列存储中常用的数据压缩算法
- 什么是运放的虚短和虚断
- 感谢有你,一路同行,历史文章汇总,涉及STM32、模块使用、传感器、物联网、鸿蒙、仿真和综合实例等嵌入式的方方面面,欢迎关注。
- 100流明相当于多少w_lx和瓦数换算(1lx等于多少w)
- iptables限速 iptables限制流量
- PDF编辑时怎样给PDF文件添加页码
- 202011 网络是通的,数据发不过去(接受不到)
- getCause()、e.getMessage()产生的结果
- 《精通python设计模式》读书笔记之——结构型设计模式
热门文章
- Kotlin 与 Java有什么区别(最全最新的)
- linux 内核中断与时钟的冲突 问题 del_timer,Linux内核开发之中断与时钟(三)
- bs架构 mysql_基于BS架构OA办公系统的设计(PHP,MySQL)(三人组)(含录像)
- java getbasicremote_Vue+Java 通过websocket实现服务器与客户端双向通信操作
- 企业服务与发展联盟即将正式成立
- CSS如何实现内凹角效果 By 大漠
- 第14件事 分析竞争对手的方法
- 微信中H5同层Video播放器接入教程
- eclipse替换空格和注释
- 专 linux命令之set x详解