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 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"
}

总结:
这不是一篇独立的文章, 如果你想了解更多, 可以参考我以前写过相关的两篇:

这个脚本已经可以用了,但还不完美, 欢迎在文章底部或Github仓库https://github.com/zhaoolee/MarkDonw2GitHub 提出改进建议

为便于管理, 相关资源整合到一张独立的帖子,链接如下:
http://www.jianshu.com/p/4f28e1ae08b1

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容