本文目标:通过脚本上传图片到B站,并获得外链,以作为图床使用。 要求:
在kde桌面环境中对图片文件支持右键上传并返回链接到剪贴板,并显示系统通知。
在typora中支持从剪贴板粘贴进编辑器自动使用图床
一、获取并修改脚本 某群友阿雅 已经为我们提供了功能完善的bilibili-picpool 脚本,该脚本实现了基本的在终端选择通过图片路径将图片上传到bilibili并输出对应的长、短链接的功能,并且实现了网页端图床的功能。我们只需将其克隆下来稍作修改即可。
1 git clong https://github.com/Brx86/bilibili-picpool.git
配置config.py 首先登录Bilibili,查看Cookie,找到bili_jct
和SESSDATA
(必要参数)并填入config.py
的对应位置
我们找到其中的uplouder.py
,将其复制并重命名为uploader-url.py
并修改为如下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 import os, requestsfrom config import cookiesdef image_upload (file_path, arg ): api_url = "https://api.vc.bilibili.com/api/v1/drawImage/upload" with open(file_path, "rb" ) as f: img_file = f.read() files = {"file_up" : (file_path, img_file)} data = { "biz" : "draw" , "category" : "daily" , } headers = { "Origin" : "https://t.bilibili.com" , "Referer" : "https://t.bilibili.com/" , "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0" , } r = requests.post( api_url, files=files, data=data, headers=headers, cookies=cookies, timeout=300 , ) img_url = r.json()["data" ]["image_url" ] if arg == 0 : short_url = b23_link(img_url) print(f"{short_url} " ) return {"url" : img_url, "short_url" : short_url} elif arg == 1 : return img_url elif arg == 2 : short_url = b23_link(img_url) return short_urldef b23_link (url ): api_url = "https://api.bilibili.com/x/share/click" data = { "build" : 10000 , "buvid" : "archlinux" , "platform" : "archlinux" , "share_channel" : "COPY" , "share_id" : "public.webview.0.0.pv" , "share_mode" : 1 , "oid" : url, } r = requests.post(api_url, data=data) return r.json()["data" ]["content" ]if __name__ == "__main__" : if len(os.sys.argv) == 2 : file_name = os.sys.argv[1 ] file_path = os.path.abspath(file_name) os.system('notify-send -u normal "上传成功" -u low "文件正在上传请稍候片刻" -i markdown-editor-zzy-ac -a bilibili-picpool' ) else : print("格式有误!上传示例图片example.png..." ) file_path = os.path.join(os.sys.path[0 ], "example.png" ) image_upload(file_path, 0 )
二、实现要求1:kde右键上传 首先看效果:
创建.desktop文件 1 2 mkdir -p $HOME /.local /share/kservices5/ touch $HOME /.local /share/kservices5/picuploader.desktop
填上这段内容 1 2 3 4 5 6 7 8 9 10 11 12 13 [Desktop Entry] Actions=bilibili-picpool; MimeType=image/jpeg;image/png;image/gif; Type=Service X-KDE-Priority=TopLevel X-KDE-ServiceTypes=KonqPopupMenu/Plugin Icon=markdown-editor-zzy-ac [Desktop Action bilibili-picpool] Name=Upload with bilibili-picpool Name[zh_CN]=使用bilibili-picpool上传 Icon=markdown-editor-zzy-ac Exec=cd /path/to/bilibili-picpool;python3 uploader-url.py %F | scopy
注: 这里的 scopy 是竹林子 创建的脚本,用以同时满足x11和wayland下的使用,如果你仅使用x11的话直接改成xclip -selection clipboard
即可。
MimeType指的是文件类型。在这份desktop中,我仅指定了png和jpg文件在右键时会弹出picuploader的上传菜单,如果你需要更多文件类型的MimeType,你可以参考下gwenview的desktop都写了哪些文件类型。
MimeType=inode/directory;image/avif;image/gif;image/jpeg;image/png;image/bmp;image/x-eps;image/x-icns;image/x-ico;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/x-xpixmap;image/tiff;image/x-psd;image/x-webp;image/webp;image/x-tga;application/x-krita;image/x-kde-raw;image/x-canon-cr2;image/x-canon-crw;image/x-kodak-dcr;image/x-adobe-dng;image/x-kodak-k25;image/x-kodak-kdc;image/x-minolta-mrw;image/x-nikon-nef;image/x-olympus-orf;image/x-pentax-pef;image/x-fuji-raf;image/x-panasonic-rw;image/x-sony-sr2;image/x-sony-srf;image/x-sigma-x3f;image/x-sony-arw;image/x-panasonic-rw2;
安装所需组件 通知提示 弹出系统提示的功能依赖于libnotify
1 sudo pacman -S libnotify --needed
复制到粘贴板 复制到粘贴版的功能在X11下依赖于xclip
而wayland下则 依赖于wl-clipboard
因此我在此同时安装这两个工具并采用了上文所述的由竹林撰写的脚本
1 sudo pacman -S xclip wl-clipboard --needed
该脚本用于判断当前桌面环境使用X11还是wayland并自动选择对应的工具:
1 2 3 4 5 6 7 8 9 10 11 /usr/bin/scopy ---#!/bin/bash if [ "$XDG_SESSION_TYPE " = "wayland" ]; then wl-copyelif [ "$XDG_SESSION_TYPE " = "x11" ]; then xclip -selection clipboardelse echo "ERROR! You are using $XDG_SESSION_TYPE " fi
为/usr/bin/scopy
授予运行权限
1 sudo chmod 755 /usr/bin/scopy
启用该动作菜单
三、实现要求2:在typora中支持从剪贴板粘贴进编辑器自动使用图床 先看效果:
具体操作: 如下图,在Typora的偏好设置
→图象
→上传服务设定
里: 上传服务选Custom Command
,自定义命令请填入:
1 cd /path/to/bilibili-picpool;python3 uploader-url.py
其中/path/to/bilibili-picpool
是脚本所在路径,如果你的路径不是这个,请修改成你自己的路径(即刚刚clone的仓库的为位置)。
绕过B站防盗链 由于某些缘故,B站的的外链做了防盗链的措施,如果直接引用到自己网站上面就会出现无法成功加载的现象。
B站的防盗链,利用的是HTTP的Referer属性做判断。如果Referer是他白名单之外的网站,就会返回403。
这时候我们只需要在想办法在页面的<head>
标签下添加一行
1 <meta name ="referrer" content ="no-referrer" >
就可以绕过B站的防盗链措施了。
最终结果
至此我们就实现了最开始的设想——
可以右键上传图片到图床并获得链接到剪贴板
可以在typora中复制图片自动上传图床并填入markdown文件。