CSDN的文章转化为Hexo的markdown格式

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/madonghyu/article/details/83958956

开发环境

  • python3.7

引用的包

import json
import math
import urllib.request

实现思路

通过浏览器开发模式发现,CSDN的进入编辑器之后会通过链接
https://mp.csdn.net/mdeditor/getArticle?id=xxxx 请求到文章的markdown格式,从这里入手就可以直接得到想要的markdown文本。

而访问这个链接则需要登录CSDN之后获取的cookie,可以直接在链接的header查看得到。通过控制变量的方法可以发现,实际上只需要三个cookie就可以得到所需要操作的url的权限,这三个cookie分别是UserName,UserToken和UserInfo

关于文章列表的获取,通过观察网络请求发现一个可以返回文章的id,创建日期等信息的json格式数据的链接
https://blog.csdn.net/madonghyu/phoenix/article/list/1

转换为Hexo格式实现

# 装载cookie
opener = urllib.request.build_opener()
opener.addheaders = [('Cookie', '')]
urllib.request.install_opener(opener)
html = urllib.request.urlopen('https://mp.csdn.net/mdeditor/getArticle?id=xxxx')).read()
j = json.loads(html)
if not j['status']:
    print('cookie过期')
    print(j)
    return
title = j['data']['title']
markdowncontent = j['data']['markdowncontent']
categories = j['data']['categories']
c_list = categories.split(',')
c_str = ""
# 添加分类
for i in c_list:
    c_str += "  - [{0}]\n".format(i)
tags = j['data']['tags']
# 得到Hexo的所需的markdown格式
string = "---\ntitle: {0}\nid: {4}\ndate: {3}\ntags: [{1}]\ncategories:\n{2}\n\n---\n\n<!--more-->\n\n\n\n".format(title, tags,                                                                            c_str,  dic[                                                                                                        'data'],dic['id'])
result = string + markdowncontent
file = open(self.output + '{0}.md'.format(title), 'w')
file.write(result)
file.close()
print(self.output + '{0}.md'.format(title) + '添加成功!')

博主用的hexo-next主题由于不支持特殊字符URL转码,所以标题如果带特殊字符会无法访问,这里建议可以在title字段后面添加一个id字段,存放文章的id,并且修改hexo的_config.yml里面的permalink为permalink: :year/:month/:day/:id/

新版的CSDN博客编辑器的markdown语法为CommonMark spec,暂时没发现使用CSDN的格式之后hexo显示异常的问题

获得文章列表的实现

    i = 1
    page_num = -1
    # 获得的数据列表
    lists = []
    # 循环遍历
    while True:
        response = json.loads(urllib.request.urlopen(self.article_list_url + str(i)).read())
        if response['status'] is 1:
            if page_num == -1:
                # 得到遍历的次数
                page_num = math.ceil(response['data']['total'] / 20)
            # 得到文章列表
            article_list = response['data']['article_list']
            for data in article_list:
                # 得到文章的id和创建日期
                lists.append({'id': data['ArticleId'], 'data': data['PostTime']})
        if i > page_num:
            break
        i = i + 1

具体代码的GitHub地址


展开阅读全文

没有更多推荐了,返回首页