尚未完成全部功能
发出代码来共同学习。
计划完成 python 版后,再写一个 golang 版。
class AllBlogsManager:
jianshu = Jianshu(JIANSHU_COOKIES)
cnblogs = CnblogsMetaWeblog()
db = DataBase()
def __init__(self):
self.sync_categories()
def new_category(self, category_name: str):
# 简书能创建重名的分类,所以需要先在数据库中做本地判断
if self.db.category_exists(category_name):
logger.fatal("分类名 %s 已经存在了,不可重复创建相同分类名" % category_name)
sys.exit(1)
jianshu_category_id = self.jianshu.new_category(category_name)
cnblogs_category_id = self.cnblogs.new_category(category_name)
self.db.insert_category(category_name, jianshu_category_id,
cnblogs_category_id)
logger.info(f"已创建新的分类:{category_name}")
def update_category(self, category_id: Union[str, int],
category_name: str):
pass
def delete_category(self, ategory_name: str):
# 博客园没有提供删除分类的 api
# self.jianshu.delete_category()
pass
def new_post(self, category: str, title: str, content: str, md5: str):
ids = self.db.select_category(category)
if not ids:
logger.fatal("没有此分类:%s" % category)
sys.exit(1)
logger.info("正在上传 “%s” ..." % title)
jianshu_id = self.jianshu.new_post(ids[1], title, content)
post = create_post(title, content, category)
cnblogs_id = self.cnblogs.new_post(post)
self.db.insert_post(title, md5, int(jianshu_id), int(cnblogs_id),
ids[0])
logger.info("已上传 “%s.md” 到所有博客:[]" % title)
def update_post(self):
pass
def delete_post(self):
pass
def sync_categories(self):
# TODO: 改为异步或多线程
while True:
jcs = self.jianshu.get_categories()
ccs = self.cnblogs.get_categories()
jcs_set = {i["name"] for i in jcs}
ccs_set = {i["name"] for i in ccs}
if jcs_set - ccs_set:
for c in (jcs_set - ccs_set):
self.cnblogs.new_category(c)
logger.info(f"已向博客园添加缺失的分类:{jcs_set - ccs_set}")
elif ccs_set - jcs_set:
for c in (ccs_set - jcs_set):
self.jianshu.new_category(c)
logger.info(f"已向简书添加缺失的分类:{ccs_set - jcs_set}")
else:
logger.info("已同步所有分类")
break
jcs = {i["name"]: i["id"] for i in jcs}
ccs = {i["name"]: i["id"] for i in ccs}
for k, v in jcs.items():
self.db.insert_category(k, v, ccs[k])
def _build_parser():
parser = argparse.ArgumentParser(description=('博园管理器'))
parser.add_argument("-n",
"--new-post",
nargs=2,
metavar=("CATEGORY", "MARKDOWN_FILE_PATH"),
help="要上传的 markdown 文件的分类和路径")
parser.add_argument("-d",
"--delete",
metavar="POST_ID",
help="要删除的文章 id",
type=int)
return parser
def main():
parser = _build_parser()
args = parser.parse_args()
manager = AllBlogsManager()
if args.new_post:
category, file_path = args.new_post
title, content = read_post_from_file(file_path)
md5 = get_md5_of_file(file_path)
manager.new_post(category, title, content, md5)
return
if args.delete:
print(args.delete)
return
使用:
python main.py -n Go 测试上传新博文.md
2021-04-10 09:33:31,489 - root - INFO - 已同步所有分类
2021-04-10 09:33:31,489 - root - WARNING - 重复的分类:系统
2021-04-10 09:33:31,489 - root - WARNING - 重复的分类:爬虫
2021-04-10 09:33:31,489 - root - WARNING - 重复的分类:博客园个性化
2021-04-10 09:33:31,490 - root - WARNING - 重复的分类:通用
2021-04-10 09:33:31,490 - root - WARNING - 重复的分类:windows
2021-04-10 09:33:31,490 - root - WARNING - 重复的分类:Go
2021-04-10 09:33:31,490 - root - WARNING - 重复的分类:黑苹果
2021-04-10 09:33:31,490 - root - WARNING - 重复的分类:数据库
2021-04-10 09:33:31,490 - root - WARNING - 重复的分类:Python
2021-04-10 09:33:31,490 - root - WARNING - 重复的分类:Flask
2021-04-10 09:33:31,490 - root - WARNING - 重复的分类:Django
2021-04-10 09:33:31,490 - root - WARNING - 重复的分类:Scrapy
2021-04-10 09:33:31,490 - root - WARNING - 重复的分类:Linux/Mac
2021-04-10 09:33:35,039 - root - INFO - 已上传 “测试上传新博文.md” 到所有博客
所有博文以标题做为主键保存在sqlite数据库中,以 md5 作为更新的标识,所有 md5 变化的 markdown 文件将自动更新到所有博客(虽然现在只写了博客园和简书)。
数据库保存的数据形式: