wshuo 发表于 2021-11-3 04:12

typora使用CSDN图床

### 前言

[软件下载地址](https://wshuo.lanzoui.com/i7yWVw2w7jc)

typora 是一款好用的 markdown 文档编辑器。

我之前研究过CSDN上传图片的接口,前几天发现了**Typora** 这个好用的软件,可以自定义图床,因为我很多文章图片资源用的都是CSDN,那么我就可以采用CSDN作为图床,直接就实现拖拽图片上传的CSDN。

### 需要的环境

python3

requests

requests-toolbelt

### 代码

```python
import os
import sys

os.chdir(os.path.dirname(os.path.realpath(sys.executable))) #这是打包版本的代码

import requests
import re
from threading import Thread
import time
import requests
import http.cookiejar as cookielib
import psutil
import os
from requests_toolbelt import MultipartEncoder

requests.packages.urllib3.disable_warnings()

def is_login():
    session = requests.session()
    try:
      session.cookies = cookielib.LWPCookieJar(filename='.cookie/csdn.txt')
      session.cookies.load()

      url = 'https://me.csdn.net/api/user/show'
      response = session.post(url)
      if response.json()['message'] == "成功":
            return True
      else:
            return False
    except Exception as e:
      return False

def login():
    session = requests.session()
    session.cookies = cookielib.LWPCookieJar(filename='.cookie/csdn.txt')
    response = session.get('https://open.weixin.qq.com/connect/qrconnect?appid=wx0ae11b6a28b4b9fc&scope=snsapi_login&redirect_uri=https%3A%2F%2Fpassport.csdn.net%2Fv1%2Fregister%2FpcAuthCallBack%3FpcAuthType%3Dweixin&state=csdn&login_type=jssdk&self_redirect=default&style=white&href=https://csdnimg.cn/release/passport/history/css/replace-wx-style.css',verify=False)
    uuid = re.findall('<img class="qrcode lightBorder" src="(.*?)" />',response.text)
    img_url = 'https://open.weixin.qq.com' + uuid
    imgData = session.get(img_url).content
    with open("qrcode.jpg","wb") as f:
      f.write(imgData)
    os.popen("qrcode.jpg")

    uuid = uuid.split('/')[-1]
    url = 'https://long.open.weixin.qq.com/connect/l/qrconnect?uuid='+uuid
    while True:
      response = session.get(url,verify=False)
      code = re.findall("window.wx_code='(.*?)'",response.text)
      if code != ['']:
            for proc in psutil.process_iter():# 遍历当前process
                try:
                  if proc.name() == "dllhost.exe":
                        proc.kill()# 关闭该process
                except Exception as e:
                  pass
            break
      time.sleep(1)


    url = 'https://passport.csdn.net/v1/register/pcAuthCallBack?pcAuthType=weixin&code=%s&state=csdn' % code
    session.get(url)
    session.cookies.save()

def updatePicture(picList):
    for pic in picList:
      session = requests.session()
      session.cookies = cookielib.LWPCookieJar(filename='.cookie/csdn.txt')
      session.cookies.load()
      fields = {
      'file':(os.path.basename(pic),open(pic,'rb'),"image/jpeg"),
      }
      m = MultipartEncoder(fields, boundary='------WebKitFormBoundarynTBa3OWoSMrcVf0F')
      headers = {
            'content-Type': m.content_type,
      }
      url = 'https://blog-console-api.csdn.net/v1/upload/img?shuiyin=2'
      res = session.post(url, headers=headers, data=m,verify=False)
      print(res.json()["data"]["url"])


if __name__ == '__main__':
    if not os.path.exists(".cookie"):
      os.mkdir(".cookie")
    if not os.path.exists(os.path.join(".cookie","csdn.txt")):
      with open(os.path.join(".cookie","csdn.txt"),"w") as f:
            f.write("")

    if not is_login():
      login()
    updatePicture(sys.argv)
```

### 说明

```python
os.chdir(os.path.dirname(os.path.realpath(sys.executable)))
```

这句是为了获取打包后的真实exe所在路径(因为否则会获取到临时路径,而cookie也会存到临时路径里导致每次都要登录),如果是单独脚本运行可以将其改为:

```python
os.chdir(os.path.dirname(os.path.abspath(__file__)))
```

### 脚本运行配置

!(https://img-blog.csdnimg.cn/20211103035631586.png?)

D:\\Python36\\python.exe D:\\software\\Typora\\upload.py

### exe运行配置

!(https://img-blog.csdnimg.cn/20211103035409800.png?)

D:\software\Typora\upload.exe

### 其它

正常来说第一次登录是需要微信扫码登录的,登录成功会自动保存cookie, 并且关闭二维码显示,如果没有关闭说明你显示图片的进程不是"dllhost.exe",可以自己修改一下,我是win7的系统,命令行调用图片就是这个进程。

另外我发现一个typora 的问题,不知道是不是bug,每次会将启动位置作为当前环境变量,这也是我为什么写成绝对路径的原因,因为你不能保证markdown文件在哪个路径,解决办法就是写成绝对路径。

美柚明治 发表于 2022-1-18 22:35

楼主你好,你这个想法很棒,但是貌似程序执行不了。我自己查看了一下,貌似接口都发生了改变。时间21年1月18日

lingyinGR 发表于 2021-11-3 05:58

太顶了,完全看不懂

柒呀柒 发表于 2021-11-3 08:16

先mark了! 谢谢楼主

WoShiXXX 发表于 2021-11-3 08:17

requests貌似import了两次?

52896009 发表于 2021-11-3 08:51




太顶了,完全看不懂

songxp03 发表于 2021-11-3 08:55

CSDN那个尿性,迟早限流

smilencetion 发表于 2021-11-3 09:11

typora并没有开源

chentest 发表于 2021-11-3 09:20

学习一下

知心 发表于 2021-11-3 09:22

smilencetion 发表于 2021-11-3 09:11
typora并没有开源

不开源不影响使用啊

你是我的人 发表于 2021-11-3 09:26

好东西啊,感谢感谢
页: [1] 2
查看完整版本: typora使用CSDN图床