自己想搞个个人博客,用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不会,在网上用工具生成的,能力限制,只能用最简陋的了)。
求助
上面说了,我制作网站的能力不行,所以我希望有人能给我提供一个能使用这个博客后台的个人博客网站(或者模板),请提供链接,谢谢!