亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > 用python寫個博客遷移工具

用python寫個博客遷移工具

熱門標簽:原裝電話機器人 平頂山外呼系統免費 在哪里辦理400電話號碼 400電話申請服務商選什么 清遠360地圖標注方法 西藏智能外呼系統五星服務 工廠智能電話機器人 江蘇客服外呼系統廠家 千陽自動外呼系統

前言

最近不少寫博客的朋友跟我反饋博客園的一些文章下架了,這讓我聯想到去年簡書一樣,我之前寫的博客都被下架不可見了。

我最開始接觸的博客網址是 csdn、思否、簡書還有博客園等,但是后期發現,單論博客的生態感覺做的越來越不行,干貨雖然很多,但是垃圾、標題黨很嚴重,我自己也有一些博文被莫名的搬走直接標為原創。

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

綜上我從去年入駐掘金,并以掘金作為博客的主平臺。個人感覺掘金團隊對個人原創的保護是非常好的,同時也在不斷的聽取用戶的建議而去改進。有問題與建議能隨時與掘金的同學討論、溝通,非常方便。

掘金的成長

最開始的時候,掘金也是面試、標題黨滿天飛,但是掘金的運營大佬逐步整頓起來之后,文章的質量有了顯著的提高,并且也不斷推出有利于新手作者、高質量博文的各種活動,鼓勵新人創作、老人分享。

同樣在我入駐掘金之后,作為一個長期用戶,新人作者,也是見證了這段時間以來掘金為了社區活躍,博客質量而做的種種努力。

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

掘金在使用的時候,一直有種特殊的感覺,是一種很純粹的 coding 情懷。并不僅僅只是一個單純的博客平臺,而是一直致力于社區共建、開源項目、掘金翻譯計劃等等的建設,為技術社區打造一片純粹干凈的后花園。

搬家命令行工具

那么作為程序員,手動搬文章顯然是略 low 的

所以寫了一個簡單的 python 腳本,有興趣的同學可以使用它將 cnblogs 上面已有或者創作中的草稿轉移到掘金來。

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

環境配置

腳本跑起來需要 python3 環境,所以先安裝一下 python 環境

請在 cookie.json 中補充博客園與掘金的 cookie

使用 python3 main.py -h 查看使用說明

作為程序員應該都了解 cookie 是啥,也知道從哪里撈出來吧

使用方法

還是上個獲取 cookie 的圖吧,哈哈

請先在 cookie.json 中替換 cookie_cnblogs 與 cookie_juejin 為自己在對應站點上的 cookie

請自行替換user_name與blog_id
// 下載單篇文章到默認目錄'./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_blogs

main.py

新建 main.py 文件,將下述 python 代碼復制進去

# coding=utf-8
import requests
import os
import argparse
import sys
import json
from lxml import etree
from urllib.parse import urlparse
import logging
reload(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='個人主頁地址')
 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 += 1

def 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)
  return


if __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()
 pass

cookie.json

本地新建 cookie.json 文件,與 main.py 同級

{
 "cookie_cnblogs": "請替換為博客園cookie",
 "cookie_juejin": "請替換為掘金cookie"
}

github 地址

最后附上 github 地址,里面除了 demo 的 源碼之外也有錄制好的一個視頻,有興趣的同學可以下載使用或者研究研究,腳本有問題或者寫的不好改進的地方也可以互相探討下。有意見也可以隨時留言反饋

以上就是用python寫個博客遷移工具的詳細內容,更多關于python 博客遷移的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • 使用python和Django完成博客數據庫的遷移方法
  • Python依賴包遷移到斷網環境操作
  • 如何把外網python虛擬環境遷移到內網
  • 如何將你的應用遷移到Python3的三個步驟
  • 詳解Python3遷移接口變化采坑記
  • python 動態遷移solr數據過程解析
  • python django生成遷移文件的實例
  • Python依賴包整體遷移方法詳解
  • pycharm使用正則表達式批量添加print括號完美從python2遷移到python3
  • python虛擬環境遷移方法
  • python實現數據庫跨服務器遷移

標簽:股票 安慶 西安 錦州 隨州 白城 日照 天水

巨人網絡通訊聲明:本文標題《用python寫個博客遷移工具》,本文關鍵詞  用,python,寫個,博客,遷移,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《用python寫個博客遷移工具》相關的同類信息!
  • 本頁收集關于用python寫個博客遷移工具的相關信息資訊供網民參考!
  • 推薦文章
    四虎影视久久| 色综合久久天天综线观看| 色综合久久天天综合绕观看| 欧美一级视频高清片| 国产韩国精品一区二区三区| 九九精品在线| 国产成人精品综合久久久| 欧美大片aaaa一级毛片| 国产a视频精品免费观看| 国产网站在线| 精品国产一区二区三区久| 精品视频在线看| 久久精品欧美一区二区| 欧美大片aaaa一级毛片| 99久久视频| 国产不卡福利| 日韩男人天堂| 九九久久99综合一区二区| 国产成人女人在线视频观看| 日韩在线观看免费完整版视频| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 日韩专区在线播放| 久久久久久久男人的天堂| 黄视频网站免费看| 欧美激情一区二区三区在线| 亚洲wwwwww| 久久精品店| 国产成人啪精品| 久久99中文字幕久久| 亚洲天堂免费| 精品视频在线观看免费| 中文字幕一区二区三区精彩视频| 久久精品大片| 日韩在线观看网站| 成人免费网站久久久| 欧美激情一区二区三区在线播放 | 亚洲精品永久一区| 九九久久99综合一区二区| 天天色成人网| 亚洲第一色在线| 香蕉视频亚洲一级| 免费的黄视频| 国产91丝袜在线播放0| 欧美a级大片| 成人免费一级纶理片| 精品国产香蕉伊思人在线又爽又黄| 欧美18性精品| 久久国产精品永久免费网站| 亚洲 激情| 欧美大片一区| 91麻豆爱豆果冻天美星空| 四虎久久精品国产| 亚欧成人乱码一区二区| 精品在线观看国产| 四虎影视久久| 九九精品在线| 亚洲第一色在线| 亚洲女人国产香蕉久久精品| 午夜激情视频在线播放| 精品视频一区二区| 中文字幕一区二区三区精彩视频| 尤物视频网站在线| 99色视频| 黄视频网站免费| 国产美女在线一区二区三区| 日韩av成人| 999精品视频在线| 国产a视频精品免费观看| 久久国产精品永久免费网站| 亚欧成人乱码一区二区| 午夜在线影院| 国产视频一区二区在线播放| 黄视频网站免费| | 国产精品自拍在线观看| 国产麻豆精品高清在线播放| 99久久精品国产高清一区二区| 美女被草网站| 黄视频网站在线看| 久久成人亚洲| 国产国语对白一级毛片| 国产麻豆精品免费视频| 青青青草视频在线观看| 欧美大片一区| 九九精品在线| 成人免费观看男女羞羞视频| 国产精品免费久久| 日韩专区亚洲综合久久| 国产麻豆精品高清在线播放| 在线观看成人网 | 在线观看成人网 | 欧美激情一区二区三区视频高清 | 久久福利影视| 国产91精品一区二区| 精品视频在线观看免费| 国产一区二区精品久久91| 日日夜人人澡人人澡人人看免| 久久精品大片| 国产不卡在线观看视频| 久久99这里只有精品国产| 久草免费在线观看| 成人免费网站久久久| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 99久久精品国产高清一区二区| 成人免费网站久久久| 久久精品免视看国产成人2021| 欧美国产日韩一区二区三区| 欧美激情一区二区三区在线| 91麻豆精品国产片在线观看| 四虎影视久久| 国产成人精品影视| 欧美a级大片| 尤物视频网站在线| 久久国产精品自线拍免费| 韩国三级一区| 黄色免费三级| 九九精品在线| 91麻豆爱豆果冻天美星空| a级毛片免费观看网站| 你懂的日韩| 免费毛片基地| 亚洲第一页乱| 四虎论坛| 亚洲女人国产香蕉久久精品| 黄色福利| 欧美激情一区二区三区视频 | 麻豆系列 在线视频| 午夜在线亚洲| 国产不卡高清在线观看视频 | 国产视频一区二区在线观看| 国产91精品一区二区| 久久99这里只有精品国产| 欧美一区二区三区在线观看| 日本在线播放一区| 国产激情一区二区三区| 免费国产在线视频| 韩国三级香港三级日本三级| 日韩av片免费播放| 国产麻豆精品免费视频| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 欧美日本免费| 免费国产在线观看| 黄色免费三级| 一级女人毛片人一女人| 韩国毛片免费| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 精品久久久久久中文| 日韩专区亚洲综合久久| 精品国产亚一区二区三区| 欧美大片一区| 国产91精品系列在线观看| 中文字幕一区二区三区精彩视频| 欧美日本二区| 欧美1区2区3区| 国产精品免费久久| 国产网站免费视频| 久久99这里只有精品国产| 黄色福利| 欧美另类videosbestsex久久| 国产视频一区二区在线观看| 国产成人精品影视| 欧美激情一区二区三区视频 | 天天做日日爱夜夜爽| 香蕉视频亚洲一级| 九九精品在线| 精品国产亚洲一区二区三区| 99热精品在线| 亚洲天堂免费| 中文字幕一区二区三区精彩视频| 国产一区二区精品| 四虎影视久久| 99色视频| 欧美日本免费| 国产韩国精品一区二区三区| 日本特黄特色aaa大片免费| 日韩中文字幕一区二区不卡| 日韩一级黄色| 久久国产影视免费精品| 91麻豆爱豆果冻天美星空| 日本特黄特黄aaaaa大片| 成人免费高清视频| 国产综合91天堂亚洲国产| 免费的黄视频| 国产成人女人在线视频观看| 日韩欧美一及在线播放| 欧美大片一区| 欧美1区2区3区| 国产伦理精品| 国产麻豆精品免费视频| 成人免费一级纶理片| 99热精品在线| 四虎久久精品国产| 麻豆污视频| 日韩在线观看网站| 九九九网站| 日韩在线观看网站| 欧美国产日韩精品| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 免费的黄视频| 黄色福利|