Windows下自動雲備份思源筆記到Gitee

2022-10-30 21:01:08

前言

思源筆記是一款本地筆記為主的軟體,其目前提供了148元/year的付費同步功能,但對於21世紀中國難民而言還是太貴啦。

條件允許的同學還是使用官方的同步,支援下作者。

所以,就在思考有沒有白嫖的一種方法,能同步且不要付費呢。

網上有些使用雲盤自動同步,但可能導致資料丟失。

這裡提供方法:

筆記通過小軟體的方式進行自動同步到git。

這個[siyuansyntogit]小軟體基於python開發,我只在win10上進行過測試,下方有原始碼及exe提供,諸君自取。

https://gitee.com/kingstacker/siyuansyntogit

筆者對python語言並不熟悉,這是第一個demo,當前對於我已然夠用,當然你可以自行進行更改。

軟體及環境:

win10、思源筆記v2.4.7、siyuansyntogit、git、gitee網站

流程

(1)軟體支援功能:

>目錄正確性判斷

>網路連線線判斷,開啟軟體後,檢測到電腦聯網後會自動拉取遠端檔案同步

>檢測思源筆記開關狀態

>思源筆記軟體關閉則自動提交git同步

>小軟體執行後預設最小化 視窗執行

(2)確保你使用過Git,Git使用不再此文說明。軟體放置路徑跟思源筆記的data路徑在同一層級。git工程也在這一層級。

.gitignore檔案內容參考:避免其他資料夾同步,這裡只會同步data資料夾。思源筆記的筆記內容是存放在data資料夾中的。

conf/
history/
temp/
*exe

(3)確保已經進行了初次git提交,確保環境一切正常。enjoy it。

(4)你也可以把小軟體開機自啟:

參考:https://zhuanlan.zhihu.com/p/446167633

(4.1)建立小軟體的快捷方式。

(4.2)快捷方式拖入:win+R開啟開啟對話方塊輸入shell:startup,進入啟動資料夾

(5)小軟體執行介面圖示:小軟體開啟預設最小化執行。


檢測到思源筆記軟體關閉,則自動提交同步。

這裡使用gitee作為遠端倉庫,可以看到版本已經提交。

(6)原始碼參考:你可以進行任意更改,希望我的工作對你有所幫助。

import os
import sys
import ctypes
import time
import psutil
from subprocess import call

home_dir = os.getcwd()               #獲得當前路徑

choice_list = ['上傳','下載']

def git_update():
    os.chdir(home_dir)
    git_add_cmd    = "git add ."
    git_commit_cmd = "git commit -m {}".format(gitdate)
    git_push_cmd   = "git push origin master"
    call(
       git_add_cmd + "&&" +
       git_commit_cmd + "&&" +
       git_push_cmd,
       shell=True
    )

def git_get():
    os.chdir(home_dir)
    git_pull_cmd = "git pull origin master"
    call(
        git_pull_cmd,
        shell=True
    )

def is_process_running(process_name):
    pl = psutil.pids()
    for pid in pl:
        if psutil.Process(pid).name() == process_name:
            return True
    else:
        return False




if __name__ == "__main__":

    ctypes.windll.user32.ShowWindow(ctypes.windll.kernel32.GetConsoleWindow(), 6)
    print("---------------------------------------------------")
    print("歡迎使用 SiYuan Auto Backup,poweredBy kingstacker!")
    print("---------------------------------------------------")
    print("程式當前執行路徑:")
    print(home_dir)
    time.sleep(0.5)
    print("----------------")
    print("檢查程式執行路徑是否正確中...")
    dir_status = int(os.path.exists(home_dir+'\data'))
    if dir_status == 1:
        print("程式執行路徑正確.")
        pass
    else:
        print("未發現當前路徑存在data資料夾,請確認!")
        os.system("pause")
        sys.exit()
    eth_exit_code = 1
    print("----------------")
    print('檢查網路連線狀態中,請等待...')
    status_befor = 0;
    auto_pull_status = 0;
    while True:
        if eth_exit_code == 1:
            # eth_exit_code = int(os.system('ping www.baidu.com > /dev/null'))
            eth_exit_code = int(os.system('ping www.baidu.com'))
        else:
            pass
        if eth_exit_code == 1:
            print('沒聯網,確認你的網路連線狀態.')
        time.sleep(2)
        while True:
            gitdate = time.strftime("%Y-%m-%d/%H-%M-%S/%A", time.localtime())
            if eth_exit_code:
                break
            if auto_pull_status == 0:
                print("----------------")
                print("拉取遠端檔案中...")
                git_get()
                print("拉取遠端檔案完成!")
                print("----------------")
            time.sleep(2)

            try:
                siyuan_program_status = int(is_process_running("SiYuan.exe"))  # 檢視思源軟體是否開啟
            except:
                pass
            else:
                pass
            if status_befor == 0 and siyuan_program_status == 1:
                print("----------------")
                print("發現思源軟體已開啟,等待軟體關閉...")
            if status_befor == 1 and siyuan_program_status == 0:
                print("----------------")
                print("發現思源軟體已關閉,備份筆記到雲端中...")
                print("請等待...")
                print("拉取遠端檔案更新確認中...")
                git_get()
                print("正在提交筆記...")
                git_update()
                print("提交備份已完成!")
                print("當前備份時間點:",gitdate)
                print("----------------")
            status_befor = int(siyuan_program_status)
            auto_pull_status = 1;

以上。