日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

用python寫(xiě)個(gè)博客遷移工具

瀏覽:127日期:2022-06-24 10:25:47
前言

最近不少寫(xiě)博客的朋友跟我反饋博客園的一些文章下架了,這讓我聯(lián)想到去年簡(jiǎn)書(shū)一樣,我之前寫(xiě)的博客都被下架不可見(jiàn)了。

我最開(kāi)始接觸的博客網(wǎng)址是 csdn、思否、簡(jiǎn)書(shū)還有博客園等,但是后期發(fā)現(xiàn),單論博客的生態(tài)感覺(jué)做的越來(lái)越不行,干貨雖然很多,但是垃圾、標(biāo)題黨很嚴(yán)重,我自己也有一些博文被莫名的搬走直接標(biāo)為原創(chuàng)。

雖然搜問(wèn)題在上面還是能搜到很多解決方案,但寫(xiě)作的欲望降低了很多。

綜上我從去年入駐掘金,并以掘金作為博客的主平臺(tái)。個(gè)人感覺(jué)掘金團(tuán)隊(duì)對(duì)個(gè)人原創(chuàng)的保護(hù)是非常好的,同時(shí)也在不斷的聽(tīng)取用戶的建議而去改進(jìn)。有問(wèn)題與建議能隨時(shí)與掘金的同學(xué)討論、溝通,非常方便。

掘金的成長(zhǎng)

最開(kāi)始的時(shí)候,掘金也是面試、標(biāo)題黨滿天飛,但是掘金的運(yùn)營(yíng)大佬逐步整頓起來(lái)之后,文章的質(zhì)量有了顯著的提高,并且也不斷推出有利于新手作者、高質(zhì)量博文的各種活動(dòng),鼓勵(lì)新人創(chuàng)作、老人分享。

同樣在我入駐掘金之后,作為一個(gè)長(zhǎng)期用戶,新人作者,也是見(jiàn)證了這段時(shí)間以來(lái)掘金為了社區(qū)活躍,博客質(zhì)量而做的種種努力。

而最開(kāi)始使用掘金的 markdown,能吐槽的地方還是很多,但掘金的研發(fā)也非常給力,吸納了用戶的建議后,最新升級(jí)的 markdown 編輯器也是廣受好評(píng),使用過(guò)你就知道真相定律是什么了。

掘金在使用的時(shí)候,一直有種特殊的感覺(jué),是一種很純粹的 coding 情懷。并不僅僅只是一個(gè)單純的博客平臺(tái),而是一直致力于社區(qū)共建、開(kāi)源項(xiàng)目、掘金翻譯計(jì)劃等等的建設(shè),為技術(shù)社區(qū)打造一片純粹干凈的后花園。

搬家命令行工具

那么作為程序員,手動(dòng)搬文章顯然是略 low 的

所以寫(xiě)了一個(gè)簡(jiǎn)單的 python 腳本,有興趣的同學(xué)可以使用它將 cnblogs 上面已有或者創(chuàng)作中的草稿轉(zhuǎn)移到掘金來(lái)。

如果有興趣可以試試改造的更完美點(diǎn),但不建議泄露自己的隱私信息

環(huán)境配置

腳本跑起來(lái)需要 python3 環(huán)境,所以先安裝一下 python 環(huán)境

請(qǐng)?jiān)?cookie.json 中補(bǔ)充博客園與掘金的 cookie

使用 python3 main.py -h 查看使用說(shuō)明

作為程序員應(yīng)該都了解 cookie 是啥,也知道從哪里撈出來(lái)吧

使用方法

用python寫(xiě)個(gè)博客遷移工具

還是上個(gè)獲取 cookie 的圖吧,哈哈

請(qǐng)先在 cookie.json 中替換 cookie_cnblogs 與 cookie_juejin 為自己在對(duì)應(yīng)站點(diǎn)上的 cookie

請(qǐng)自行替換user_name與blog_id// 下載單篇文章到默認(rèn)目錄’./cnblogs’ 并輸出日志到’./log’python3 main.py -m download -a https://www.cnblogs.com/{{user_name}}/p/{{blog_id}}.html --enable_log // 下載用戶所有文章到目錄’/Users/cnblogs_t’python3 main.py -m download -u https://www.cnblogs.com/{{username}} -p /Users/cnblogs_t// 上傳單篇文章到掘金草稿箱python3 main.py -m upload -f ./cnblogs/{{blog_id}}.html// 上傳’./test_blogs’下所有的html文件到掘金草稿箱python3 main.py -m upload -d ./test_blogsmain.py

新建 main.py 文件,將下述 python 代碼復(fù)制進(jìn)去

# coding=utf-8import requestsimport osimport argparseimport sysimport jsonfrom lxml import etreefrom urllib.parse import urlparseimport loggingreload(sys)sys.setdefaultencoding(’utf-8’)parser = argparse.ArgumentParser()args_dict = {}list_url_tpl = ’https://www.cnblogs.com/%s/default.html?page=%d’draft_url = ’https://api.juejin.cn/content_api/v1/article_draft/create_offline’jj_draft_url_tpl = ’https://juejin.cn/editor/drafts/%s’cnblog_headers = {}log_path = ’./log’def myget(d, k, v): if d.get(k) is None: return v return d.get(k)def init_parser(): parser.description = ’blog move for cnblogs’ parser.add_argument(’-m’, ’--method’, type=str, dest=’method’, help=’使用方式: download下載 upload上傳到草稿箱’, choices=[’upload’, ’download’]) parser.add_argument(’-p’, ’--path’, type=str, dest=’path’, help=’博客html下載的路徑’) parser.add_argument(’-d’, ’--dir’, type=str, dest=’rec_dir’, help=’制定要上傳的博客所在文件夾’) parser.add_argument(’-f’, ’--file’, type=str, dest=’file’, help=’指定上傳的博客html’) parser.add_argument(’-u’, ’--url’, type=str, dest=’url’, help=’個(gè)人主頁(yè)地址’) parser.add_argument(’-a’, ’--article’, type=str, dest=’article_url’, help=’單篇文章地址’) parser.add_argument(’--enable_log’, dest=’enable_log’, help=’是否輸出日志到./log’, action=’store_true’) parser.set_defaults(enable_log=False)def init_log(): root_logger = logging.getLogger() log_formatter = logging.Formatter(’%(asctime)s [%(levelname)s] %(pathname)s:%(lineno)s %(message)s’) console_handler = logging.StreamHandler(sys.stdout) console_handler.setFormatter(log_formatter) root_logger.addHandler(console_handler) if myget(args_dict, ’enable_log’, False): if not os.path.exists(log_path): os.mkdir(log_path) file_handler = logging.FileHandler(’./log/debug.log’) file_handler.setFormatter(log_formatter) root_logger.addHandler(file_handler) root_logger.setLevel(logging.INFO) def download(): cookies = json.load(open(’cookie.json’)) headers = {’cookie’: cookies.get(’cookie_cnblogs’, ’’)} dir_path = myget(args_dict, ’path’, ’./cnblogs’) if dir_path[len(dir_path)-1] == ’/’: dir_path = dir_path[:len(dir_path)-1] if not os.path.exists(dir_path): os.mkdir(dir_path) article_url = myget(args_dict, ’article_url’, ’-1’) if article_url != ’-1’: logging.info(’article_url=%s’, article_url) try: resp = requests.get(article_url, headers=headers) if resp.status_code != 200: logging.error(’fail to get blog ’%s’, resp=%s’, article_url, resp) return tmp_list = article_url.split(’/’) blog_id_str = tmp_list[len(tmp_list)-1] with open(dir_path+’/’+blog_id_str, ’w’) as f: f.write(resp.text) logging.info(’get blog ’%s’ success.’, article_url) except Exception as e: logging.error(’exception raised, fail to get blog ’%s’, exception=%s.’, list_url, e) finally: return raw_url = args_dict.get(’url’) rurl = urlparse(raw_url) username = (rurl.path.split('/', 1))[1] page_no = 1 while True: list_url = list_url_tpl%(username, page_no) logging.info(’list_url = %s’, list_url) try: resp = requests.get(list_url, headers=headers) if resp.status_code != 200: break except Exception as e: logging.error(’exception raised, fail to get list ’%s’, exception=%s.’, list_url, e) return html = etree.HTML(resp.text) blog_list = html.xpath(’//div[@class=’postTitle’]/a/@href’) if len(blog_list) == 0: break for blog_url in blog_list: tmp_list = blog_url.split(’/’) blog_id_str = tmp_list[len(tmp_list)-1] blog_resp = requests.get(blog_url, headers=headers) if resp.status_code != 200: logging.error(’fail to get blog ’%s’, resp=%s, skip.’, blog_url, resp) continue with open(dir_path+’/’+blog_id_str, ’w’) as f: f.write(blog_resp.text) logging.info(’get blog ’%s’ success.’, blog_url) page_no += 1def upload_request(headers, content, filename): body = { 'edit_type': 0, 'origin_type': 2, 'content': content } data = json.dumps(body) try: resp = requests.post(draft_url, data=data, headers=headers) if resp.status_code != 200: logging.error(’fail to upload blog, filename=%s, resp=%s’, filename, resp) return ret = resp.json() draft_id = ret.get(’data’, {}).get(’draft_id’, ’-1’) logging.info(’upload success, filename=%s, jj_draft_id=%s, jj_draft_url=%s’, filename, draft_id, jj_draft_url_tpl%draft_id) except Exception as e: logging.error(’exception raised, fail to upload blog, filename=%s, exception=%s’, filename, e) return def upload(): cookies = json.load(open(’cookie.json’)) headers = { ’cookie’: cookies.get(’cookie_juejin’, ’’), ’content-type’: ’application/json’ } filename = myget(args_dict, ’file’, ’-1’) if filename != ’-1’: logging.info(’upload_filename=%s’, filename) try: with open(filename, ’r’) as f: content = f.read() upload_request(headers, content, filename) return except Exception as e: logging.error(’exception raised, exception=%s’, e) rec_dir = myget(args_dict, ’rec_dir’, ’-1’) if rec_dir != ’-1’: logging.info(’upload_dir=%s’, filename) try: g = os.walk(rec_dir) for path, dir_list, file_list in g: for filename in file_list: if filename.endswith(’.html’): filename = os.path.join(path, filename) with open(filename, ’r’) as f: content = f.read() upload_request(headers, content, filename) except Exception as e: logging.error(’exception raised, exception=%s’, e) returnif __name__ == ’__main__’: init_parser() args = parser.parse_args() args_dict = args.__dict__ init_log() empty_flag = True for k, v in args_dict.items(): if k != ’enable_log’ and v is not None: empty_flag = False if empty_flag: parser.print_help() exit(0) if args_dict.get(’method’) == ’upload’: upload() else: download() passcookie.json

本地新建 cookie.json 文件,與 main.py 同級(jí)

{ 'cookie_cnblogs': '請(qǐng)?zhí)鎿Q為博客園cookie', 'cookie_juejin': '請(qǐng)?zhí)鎿Q為掘金cookie'}github 地址

最后附上 github 地址,里面除了 demo 的 源碼之外也有錄制好的一個(gè)視頻,有興趣的同學(xué)可以下載使用或者研究研究,腳本有問(wèn)題或者寫(xiě)的不好改進(jìn)的地方也可以互相探討下。有意見(jiàn)也可以隨時(shí)留言反饋

以上就是用python寫(xiě)個(gè)博客遷移工具的詳細(xì)內(nèi)容,更多關(guān)于python 博客遷移的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日韩亚洲一区二区三区在线 | 性色一区二区| 亚洲v在线看| 日韩毛片视频| 国产999精品在线观看| 国产福利资源一区| 中文字幕一区二区三区四区久久 | 久久久久国产一区二区| 日韩中文在线电影| 视频福利一区| 亚洲天堂久久| 伊人成人网在线看| 日韩精品一二三区| 亚洲理论在线| 日本aⅴ免费视频一区二区三区| 日韩av三区| 欧美国产另类| 四季av一区二区凹凸精品| 日韩av自拍| 欧美日韩一二三四| 91精品成人| 免费在线观看视频一区| 日韩三级一区| 久久不卡国产精品一区二区| 国产一区二区三区四区大秀| 中文一区一区三区高中清不卡免费| 亚洲精品.com| 樱桃成人精品视频在线播放| 亚洲我射av| 国产麻豆一区| 在线天堂资源www在线污| 亚洲一本视频| 日韩国产在线不卡视频| 国产精品美女午夜爽爽| 高清久久一区| 久久精品动漫| 视频一区二区欧美| 国产欧美日韩精品一区二区免费| 高清日韩欧美| 久久国产66| 国产精品毛片视频| 色在线视频观看| 宅男噜噜噜66国产日韩在线观看| 日韩激情av在线| 不卡一二三区| 男女性色大片免费观看一区二区 | 一区二区精品| 蜜桃久久久久| 午夜av一区| 亚洲bt欧美bt精品777| 久久精品一区二区三区中文字幕| 久久久久免费av| 日本午夜精品久久久久| 综合日韩av| 亚洲精品日本| 日韩一区三区| 欧美日韩18| 婷婷丁香综合| 91午夜精品| 欧美成人高清| 国产精品超碰| 九九综合在线| 久久超级碰碰| 日韩精品一二三四| 欧美国产专区| 免费日韩精品中文字幕视频在线| 久久免费福利| 亚洲一区二区小说| 精品无人区麻豆乱码久久久 | 999精品在线| 青草久久视频| 欧美日韩国产在线观看网站 | 国产精品九九| 免费欧美在线视频| 日韩电影免费在线观看| 欧美在线看片| 亚洲国产成人精品女人| 国精品产品一区| 色8久久久久| 亚洲无线一线二线三线区别av| 国产精品一区二区三区美女| 亚洲激情另类| av在线最新| 国产精品对白| 亚洲精品激情| 欧美成人日韩| 国产成人精品免费视| 日韩福利在线观看| 中文一区二区| 激情欧美丁香| 人在线成免费视频| 日韩精品亚洲一区二区三区免费| 欧美午夜不卡影院在线观看完整版免费| 久久精品国产99国产| 亚洲精品无播放器在线播放| 91精品国产乱码久久久久久久| 国产精品久久久久77777丨| 蜜桃一区二区三区在线| 香蕉成人av| 精品一区二区三区中文字幕视频| 日本麻豆一区二区三区视频| 欧美日韩国产高清| 今天的高清视频免费播放成人| 福利精品一区| 麻豆精品视频在线观看视频| 91午夜精品| 美国三级日本三级久久99| 精品在线播放| 极品日韩av| 国产精品99一区二区| 日韩免费福利视频| 首页国产精品| 成人精品国产亚洲| 精品成人18| 久久中文字幕一区二区| 国产亚洲久久| 日韩和欧美一区二区三区| 日韩一区精品视频| 快she精品国产999| 国产精品免费看| 免费国产自久久久久三四区久久| 国产成人精品999在线观看| 精品国产一区二区三区性色av| 国产精品啊v在线| 国产精品一级| 久久精品一区二区三区中文字幕| 欧美a一区二区| 精品国产黄a∨片高清在线| 精品日韩一区| 国产精品成人a在线观看| 水蜜桃精品av一区二区| 国产黄大片在线观看| 日韩欧美不卡| 亚洲先锋成人| 蜜臀精品久久久久久蜜臀| 日韩三级视频| 青青伊人久久| 国产精品15p| 精品72久久久久中文字幕| 国产黄大片在线观看| 亚洲91久久| 国产精品嫩草99av在线| 亚洲欧美日本国产| 国产欧美日韩一区二区三区在线| 嫩草伊人久久精品少妇av杨幂| 久久亚洲国产精品尤物| 国产一区二区三区不卡av| 电影亚洲精品噜噜在线观看 | 91精品观看| 亚洲欧美日韩国产综合精品二区| 亚洲精一区二区三区| 国产另类在线| а√天堂8资源中文在线| 欧美日韩激情在线一区二区三区| 综合干狼人综合首页| 久久av中文| 91精品啪在线观看国产18| 蜜桃久久久久久| 国产精品成人自拍| 天堂√中文最新版在线| 好吊日精品视频| 日韩高清电影一区| 国产一区二区视频在线看| 欧美日韩国产免费观看视频| 亚洲欧美久久| 欧美一级二级视频| 亚洲三级欧美| 美国欧美日韩国产在线播放| 国产欧美视频在线| 久久亚洲在线| 91成人精品在线| 色婷婷狠狠五月综合天色拍| 91精品国产一区二区在线观看| 国产日产一区| 午夜在线播放视频欧美| 日韩亚洲精品在线| 91亚洲无吗| 亚洲va在线| 欧美一级久久| 美女久久久精品| 999精品色在线播放| 日韩高清不卡在线| 日韩精品午夜| 欧美日韩夜夜| 精品欧美激情在线观看| 久久激情五月婷婷| 亚洲成人va| 日韩激情av在线| 成人久久一区| 日本午夜精品久久久久| 国产麻豆久久| 国产情侣久久| 欧美女激情福利| 久久不见久久见免费视频7| 欧美精品羞羞答答| 国产精品白丝av嫩草影院| 不卡一区综合视频| 美女国产精品久久久| 蜜桃一区二区三区在线观看| 国产美女高潮在线|