利用简书图片上传功能搭建快速免费的图床

之前在用 hexo搭建博客的时候一直想弄个图床,在网上搜了许多方法都觉得不好。

后来发现简书的写文章页面可以上传图片,于是萌生了利用简书的图片上传功能来搭建一个图床的想法。

下面是具体实现,详细的可以看代码实现,整体不是很难只要拿到 cookie然后上传图片即可。

关键代码:

cookie:简书登录之后的 cookie filepath:要上传图片的绝对路径,同目录下可直接使用名字 filename:要上传图片的名字(随意取)

def uploadImage(cookie, filepath, filename):
    upload_url = 'https://upload.qiniup.com/'
    token_url = 'https://www.jianshu.com/upload_images/token.json?filename={}'.format(filename)
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36',
        'Cookie': cookie,
    }

    response = requests.get(token_url, headers=headers)
    response.encoding = response.apparent_encoding
    token_and_key = json.loads(response.text)

    with open(filepath, 'rb') as file:
        files = {
            'file': (filename, file),
            'token': (None, token_and_key['token']),
            'key': (None, token_and_key['key']),
        }
        response = requests.post(upload_url, headers=headers, files=files)
        response.encoding = response.apparent_encoding
        return json.loads(response.text)['url']

PyQt4封装后的代码:

与脚本同目录下创建一个名为 config的文件(没有后缀名),用文本编辑器打开(别用记事本,如果用记事本打开并保存过请删除重建),将简书登录后的 cookie直接粘贴进去(不需要多余的字符,只要 cookie就行) 代码附上:

#-*- coding: utf-8 -*
__author__ = 'geebos'
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import requests
import json
import sys


class UploadBox(QDialog):
    def __init__(self):
        QDialog.__init__(self)

        layout = QVBoxLayout()

        self.data = {}
        self.cookie  = self.getCookie().strip()

        self.location_lable = QLabel("图片位置:")
        self.url_lable = QLabel("图片链接:")
        self.show_path = QLineEdit()
        self.show_result = QTextBrowser()
        self.select_button = QPushButton("选择图片")
        self.comfir_button = QPushButton("确认上传")

        layout.addWidget(self.location_lable)
        layout.addWidget(self.show_path)
        layout.addWidget(self.url_lable)
        layout.addWidget(self.show_result)
        layout.addWidget(self.select_button)
        layout.addWidget(self.comfir_button)

        self.setWindowTitle("图片上传")
        self.setLayout(layout)

        self.select_button.clicked.connect(self.selectFile)
        self.comfir_button.clicked.connect(self.uploadImage)

    def getCookie(self):
        try:
            with open('config', 'r') as f:
                return f.readline()
        except Exception:
            QMessageBox.warning(self, "提示", "配置文件 config出错")

    def selectFile(self):
        filepath = QFileDialog.getOpenFileName(self, caption="选择图片", directory='.', filter="ALL FILES (*.*)")
        self.show_path.setText(filepath)
        self.data['filepath'] = filepath

    def uploadImage(self):
        if 'filepath' in self.data:
            filepath = self.data['filepath']
            filename = filepath.split('/')[-1]
            print(filename)
        else:
            return

        upload_url = 'https://upload.qiniup.com/'
        token_url = 'https://www.jianshu.com/upload_images/token.json?filename={}'.format(filename)
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36',
            'Cookie': self.cookie,
        }

        response = requests.get(token_url, headers=headers)
        response.encoding = response.apparent_encoding
        token_and_key = json.loads(response.text)

        if 'token' not in token_and_key:
            self.show_result.clear()
            QMessageBox.warning(self, "提示", "格式错误,请选择图片")
            return

        with open(filepath, 'rb') as file:
            files = {
                'file': (filename, file), 'token': (None, token_and_key['token']), 'key': (None, token_and_key['key']),
            }
            response = requests.post(upload_url, headers=headers, files=files)
            response.encoding = response.apparent_encoding
            result = json.loads(response.text)

            if 'url' in result:
                self.show_result.clear()
                self.show_result.append(result['url'])
            else:
                self.show_result.clear()
                QMessageBox.Information(self, "提示", "上传失败,请检查 cookie是否有效")


app = QApplication(sys.argv)
dialog = UploadBox()
dialog.show()
app.exec_()

pyinstaller生成的可执行文件:

使用方法同脚本: https://pan.baidu.com/s/1qFdVcttwZdRS97jFgXpKTA

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏偏前端工程师的驿站

ObjectDataSource与GridView配合使用经验总结系列二:分页

  令我使用ObjectDataSource配合GridView显示数据的最重要的原因之一就是ObjectDataSource的分页功能,其实GridView本...

1928
来自专栏专注研发

PageHelper分页插件及通用分页js

物理分页依赖的是某一物理实体,这个物理实体就是数据库,比如MySQL数据库提供了limit关键字,程序员只需要编写带有limit关键字的SQL语句,数据库返回的...

4561
来自专栏架构师之路

一张图看懂单机部署+集群部署+热备部署与磁盘阵列(RAID)

一张图看懂单机部署+集群部署+热备部署与磁盘阵列(RAID) ? 单机部署 集群部署 热备部署 单机部署(stand-alone):只有一个饮水机提供服务,服...

3395
来自专栏cs

python下载小说

2774
来自专栏Danny的专栏

jsp实现分页显示记录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

2.3K3
来自专栏Hadoop实操

如何在HP dl380 Gen9服务器上安装Redhat 7.2并配置软RAID

在《如何为服务器硬盘配置RAID或JBOD模式》一文中提到,单张RAID卡无法同时启用RAID模式和JBOD模式,即无法混合管理,如果RAID卡为所有硬盘配置了...

1.6K3
来自专栏北京马哥教育

编译安装httpd-2.4.9及新特性详解

前言 前面我们讲解了httpd在CentOS6上(httpd-2.2)的相关功能配置,而 CentOS7上采用了httpd-2.4的版本,那么httpd-2...

3855
来自专栏WindCoder

自用插件整理之表格bootstrap-table

本插件基于bootstrap,网上各种例子也比较多,本文就不详细列api一类的了,只将自己常用的记录一下。多数代码中存在的注释,就不再重写。

1.1K1
来自专栏计算机编程

SNS项目笔记<四>--RXjs简要用法

在命令行输入ionic g provider youProviderName 在创建好后,系统会自动导入从@angular/http里导入Http这个类,方便后...

1444
来自专栏编程之旅

Python——爬虫入门 Urllib库的进阶

上一篇文章我们简单讲解了Urllib库的基础用法,包括如何获取请求之后的页面响应,如何使用POST请求上传数据,今天我们就来讲讲Urllib库的几个进阶用法。

933

扫码关注云+社区

领取腾讯云代金券