开源一个个人博客后台

自己想搞个个人博客,用GitHub Pages来做,但不怎么会HTML和JS,CSS一点儿也不会,只能通过本地的博客后台来实现发博客。

开源一下,底下是代码

代码

  1 import requests
  2 import tkinter as tk
  3 import time
  4 from tkinter import ttk  # Normal Tkinter.* widgets are not themed!
  5 from ttkthemes import ThemedTk
  6 import markdown
  7 
  8 # 读取文件
  9 def open_file(file_path):
 10     with open(file_path, 'wb+') as f:
 11         return f.read()
 12 
 13 def writeToken():
 14     token=token_enter.get()
 15     user=user_enter.get()
 16     email=email_enter.get()
 17     with open("./settings/token.set",'w') as f:
 18         f.write(token)
 19     with open("./settings/user.set",'w') as f:
 20         f.write(user)
 21     with open("./settings/email.set",'w') as f:
 22         f.write(email)
 23     token_win.destroy()
 24 
 25 #读取设置
 26 with open("./settings/token.set",'r') as f:
 27     token=f.read()
 28 with open("./settings/user.set",'r') as f:
 29     user=f.read()
 30 with open("./settings/email.set",'r') as f:
 31     email=f.read()
 32 with open("./settings/post_formwork.set",'r') as f:
 33     post_formwork=f.read()
 34 
 35 
 36 def post(content,name):
 37     global user
 38     upload_file(content,name+".html",user,user+".github.io","post/")
 39 
 40 def md_post(content,name,title):
 41     html_cont=markdown.Markdown(content)
 42     html=post_formwork.format(title=title,name=name,content=content)
 43     post(html,name)
 44 
 45 # 将文件转换为base64编码,上传文件必须将文件以base64格式上传
 46 def file_base64(data):
 47     data_b64 = base64.b64encode(data).decode('utf-8')
 48     return data_b64
 49 
 50 
 51 # 上传文件
 52 def upload_file(file_data,file_name,user,repo,path=""):
 53     global token,email
 54     url = "https://api.github.com/repos/"+user+"/"+repo+"/contents/"+path+file_name  # 用户名、库名、路径
 55     headers = {"Authorization": "token " + token}
 56     content = file_base64(file_data)
 57     data = {
 58         "message": "message",
 59         "committer": {
 60             "name": user,
 61             "email": email
 62         },
 63         "content": file_data
 64     }
 65     data = json.dumps(data)
 66     req = requests.put(url=url, data=data, headers=headers)
 67     req.encoding = "utf-8"
 68     re_data = json.loads(req.text)
 69     print(re_data)
 70     print(re_data['content']['sha'])
 71     print("https://cdn.jsdelivr.net/gh/[user]/[repo]/[path]"+file_name)
 72 
 73 def md():
 74     md_win=tk.Tk()
 75     md_win.title('MarkDown编辑器')
 76     tk.Label(md_win,text='博客名称').pack()
 77     name_enter=ttk.Entry(md_win)
 78     name_enter.pack(fill=tk.X)
 79     tk.Label(md_win,text='博客标题').pack()
 80     title_enter=ttk.Entry(md_win)
 81     title_enter.pack(fill=tk.X)
 82     tk.Label(md_win,text='博客内容').pack()
 83     scroll = tk.Scrollbar(md_win)
 84     md_enter=tk.Text(md_win)
 85     # 将滚动条填充
 86     scroll.pack(side=tk.RIGHT,fill=tk.BOTH) # side是滚动条放置的位置,上下左右。fill是将滚动条沿着y轴填充
 87     md_enter.pack(fill=tk.Y) # 将文本框填充进窗口
 88     # 将滚动条与文本框关联
 89     scroll.config(command=md_enter.yview) # 将文本框关联到滚动条上,滚动条滑动,文本框跟随滑动
 90     md_enter.config(yscrollcommand=scroll.set) # 将滚动条关联到文本框
 91     post_btn=ttk.Button(md_win,text='发布',command=lambda:md_post(md_enter.get(),name_enter.get(),title_enter.get())).pack(side=tk.BOTTOM,fill=tk.X)
 92     md_win.mainloop()
 93 
 94 s_win=tk.Tk()
 95 s_win.title('One Blogger')
 96 
 97 screenWidth = s_win.winfo_screenwidth()  # 获取显示区域的宽度
 98 screenHeight = s_win.winfo_screenheight()  # 获取显示区域的高度
 99 width = 300  # 设定窗口宽度
100 height = 165  # 设定窗口高度
101 left = (screenWidth - width) / 2
102 top = (screenHeight - height) / 2
103 s_win.geometry("%dx%d+%d+%d" % (width, height, left, top))
104 s_win.resizable(0,0)
105 s_win.overrideredirect(1)
106 
107 titleA=tk.Label(s_win,text='One Blogger',font=('幼圆',25))
108 titleA.pack(pady=20)
109 
110 titleB=tk.Label(s_win,text='博客后台',font=('幼圆',15))
111 titleB.pack(pady=10)
112 
113 s_win.update()
114 
115 time.sleep(2)
116 s_win.destroy()
117 
118 if token=='' or user=='' or email=='':
119     token_win=tk.Tk()
120     token_win.geometry('300x500')
121     token_win.title('One Blogger')
122     token_win.resizable(0,0)
123     s = ttk.Style()
124     print(s.theme_names()) #ttk所有主题风格[windows Python 3.8.3 tk 8.6.9]
125     #output:('winnative','clam','alt','default','classic','vista','xpnative')
126     s.theme_use('vista')
127     tk.Label(token_win,text='输入一些必需的信息以继续',font=('幼圆',15)).pack(pady=20)
128     tk.Label(token_win,text='GitHub Token',font=('幼圆',10)).pack(pady=10)
129     token_enter=ttk.Entry(token_win)
130     token_enter.pack(padx=30,fill=tk.X)
131     tk.Label(token_win,text='GitHub用户名',font=('幼圆',10)).pack(pady=10)
132     user_enter=ttk.Entry(token_win)
133     user_enter.pack(padx=30,fill=tk.X)
134     tk.Label(token_win,text='GitHub账户邮箱',font=('幼圆',10)).pack(pady=10)
135     email_enter=ttk.Entry(token_win)
136     email_enter.pack(padx=30,fill=tk.X)
137     ttk.Button(token_win,text='继续',command=writeToken).pack(pady=20)
138     token_win.mainloop()
139 
140 
141 win=tk.Tk()
142 win.geometry('800x450')
143 win.title('One Blogger')
144 
145 s = ttk.Style()
146 print(s.theme_names()) #ttk所有主题风格[windows Python 3.8.3 tk 8.6.9]
147 #output:('winnative','clam','alt','default','classic','vista','xpnative')
148 s.theme_use('clam')
149 
150 ttk.Button(win,text="MarkDown编辑器",command=md).pack()
151 
152 win.mainloop()

GitHub Pages的存储库里应该放什么?

必需

一个主页 /index.html
一个文件夹,用于存放你发的博客 /post/

 

 

 

可选

错误页面,例如404.html

其他你想要添加的页面,但记得留下入口!

其他你想要添加的任何东西,例如CSS和JS代码

本地的后台路径内应该放什么?

后台程序,代码已公开

settings文件夹,用于存放设置,里面必须有以下文件:

  • email.set,用于存放你的GitHub账户邮箱,不用手动更改除非是已经填写,需要第二次更改。
  • post_formwork.set,用于存放你的博客页面模板,需要手动更改,更改后不会影响以前的内容。以下是几个参数:{title}博客标题,{name}博客名称(页面名称),{content}博客内容(HTML),就算你不想改你至少得有这些东西吧:
    1 <html>
    2 <head>
    3 </head>
    4 <body>
    5 <h1>{title}</h1>
    6 {content}
    7 </body>
    8 </html>
  • token.set,用于存放你的GitHub Token,不用手动更改,除非是已经填写,需要第二次更改,若为空则无法调用API(反正你每次启动是它都会检测,如果为空就会让你填写而不会进入主页面)。
  • user.set,用于存放你的GitHub用户名,不用手动更改,除非是已经填写,需要第二次更改。

后期计划更新

可视化设置界面

主题设置

界面细节优化

增加init.py初始化程序,并在主界面增加入口(有可能是增加一个函数,视情况而定)

注意

我因为没有腾出存储库,所有还没测试,欢迎大家把测试结果、报错和BUG发到评论区,我如果看见了就会改良。

待存储库腾出来以后,我会用最简陋的网站来测试(HTML自学的,CSS不会,在网上用工具生成的,能力限制,只能用最简陋的了)。

求助

上面说了,我制作网站的能力不行,所以我希望有人能给我提供一个能使用这个博客后台的个人博客网站(或者模板),请提供链接,谢谢!

上一篇:Git内部原理之深入解析环境变量


下一篇:Elasticsearch 7.x配置用户名密码访问 开启x-pack验证