天天看點

Markdown批量釋出到Github

  • 簡書天然支援Markdown格式, 而Github倉庫中的README.md也天然支援Markdown格式
  • 簡書背景支援一鍵下載下傳所有寫過的Markdown的文章, Github提供了腳本建立倉庫的Api
  • 我們從簡書背景擷取所有寫過的Markdown文章, 然後運作一個腳本, Github将會建立一個倉庫, 作為我們部落格的新位址

運作效果:

本地目錄

GitHub新倉庫

github新倉庫

新倉庫細節

腳本的說明:

  • 倉庫的英文名,是怎麼來的?

    倉庫的英文名由原markdown的檔案名通過google翻譯而來

  • 如何認證github使用者名和密碼?

    使用者名和密碼被分離到了單獨的配置檔案中, 填寫配置檔案即可

  • 程式如何擷取本地markdown文檔的位置?

    程式會通過遞歸方法, 将腳本所在的同級目錄和子目錄下所有的以

    .md

    結尾的所有檔案讀取出來, 這些.md結尾的文檔都會被建立為Github倉庫
  • 簡書允許這種行為麼?

    簡書并不反對這種行為, 我寫過一篇手動遷移簡書markdown的細則:

    簡書文章釋出到GitHub , 簡叔打賞了我10顆糖,至今難忘...
  • 為什麼寫這個腳本 ?

    關于

    , 裡面詳細介紹了手動遷移的整個過程, 後來有讀者評論:

    評論

    為了回應讀者的熱情, 我完成了這個腳本

  • 腳本适用于所有本地markdown文檔一鍵釋出到github麼?
  • 是的, 這裡用簡書做例子, 隻是因為簡書打包下載下傳的文檔包,很适合做說明, 任何本地的md文檔,隻要在腳本的同級目錄或者子目錄, 都可以一鍵遷移到GitHub

    - 腳本依賴的環境:

    安裝了git, 安裝了curl, 安裝了python3, 在GitHub中添加了公鑰

從簡書打包擷取markdown:

擷取Markdown

運作腳本之前需要在GitHub添加公鑰

  • 在本地生成一對秘鑰(以Ubuntu為例), 進入到.ssh目錄下
cd ~/.ssh/
           
  • 生成一對秘鑰
ssh-keygen -t rsa -C "[email protected]"
           
  • 為秘鑰起個名字(可直接回車跳過)
秘鑰起個名字
  • 将公鑰内容添加到github(實作免密向遠端倉庫送出代碼)
複制公鑰(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
    # 擷取倉庫到同級目錄下
    # [email protected]:zhaoolee/ChatRoom.git
    GetRepCommand = 'git clone [email protected]:' +  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