匿名口令分享文本,文件,像拿快递一样取文件
文件快递柜是一个开源项目,开源地址
预览
暗黑模式
寄件
主要特色
部署方式
一、Docker一键部署
1.6版本AMD
1
docker run -d --restart= always -p 12345:12345 -v /opt/FileCodeBox/:/app/data --name filecodebox lanol/filecodebox:latest
1.6版本ARM
1
docker run -d --restart= always -p 12345:12345 -v /opt/FileCodeBox/:/app/data --name filecodebox lanol/filecodebox:arm
1.6版本注意
这一版改变比较大,如果出现问题可以尝试清空/opt/FileCodeBox目录,有问题欢迎反馈留言
注意,如果是第一次安装,请查看docker日志获取初始密码和后台地址,参考指令
后台本地文件列表,需要将服务器文件移动至目录/opt/FileCodeBox/data/locals,这样就可以显示了。
1
docker logs filecodebox
更新方式
1
2
3
4
5
6
// 更新
docker pull lanol/filecodebox:beta
// 停止容器并删除
docker stop filecodebox && docker rm filecodebox
// 重新运行容器
docker run -d --restart= always -p 12345:12345 -v /opt/FileCodeBox/:/app/data --name filecodebox lanol/filecodebox:latest
2.0版本,开发中(AMD & ARM)
默认信息:
后端地址:/#/admin
后台密码:FileCodeBox2023
一键安装
1
docker run -d --restart= always -p 12345:12345 -v /opt/FileCodeBox/:/app/data --name filecodebox lanol/filecodebox:beta
一键更新
1
docker pull lanol/filecodebox:beta && docker stop filecodebox && docker rm filecodebox && docker run -d --restart= always -p 12345:12345 -v /opt/FileCodeBox/:/app/data --name filecodebox lanol/filecodebox:beta
二、宝塔部署
环境准备
1. 安装Python项目管理器
❗️❗️❗️ 注意:必须安装2.0版本,否则必失败
2. 安装Python3.9.10
点击设置->版本管理->Python版本->3.9.10[未安装]->安装版本
安装完成
3. 下载源码
GitHub地址:https://github.com/vastsa/FileCodeBox
选最新的版本就行
复制链接地址
回到宝塔,新建一个空白目录FileCodeBox
进入目录,粘贴远程下载源码
解压
4. 添加项目
打开Python项目管理器->添加项目
启动成功
5. 查看系统日志,获取初始化信息
根据信息进入后台
6、宝塔反向代理
域名解析到ip之后,直接新增静态空网站
先申请ssl证书,因为反代之后就无法申请了,需关闭反代
添加反向代理
7、配置修改
如果有端口冲突,请找到根目录下的 /data/.env
如果需要修改配置,可以将该文件放在/opt/FileCodeBox/
目录下,并命名为.env
,然后重启容器即可。 如果不是Docker,则需要在项目同目录下新建一个data
文件夹,然后在创建.env
文件
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
# 端口
PORT = 12345
# Sqlite数据库文件
DATABASE_URL = sqlite+aiosqlite:///database.db
# 静态文件夹
DATA_ROOT = ./static
# 静态文件夹URL
STATIC_URL = /static
# 开启上传
ENABLE_UPLOAD = True
# 错误次数
ERROR_COUNT = 5
# 错误限制分钟数
ERROR_MINUTE = 10
# 上传次数
UPLOAD_COUNT = 60
# 上传限制分钟数
UPLOAD_MINUTE = 1
# 删除过期文件的间隔(分钟)
DELETE_EXPIRE_FILES_INTERVAL = 10
# 管理地址
ADMIN_ADDRESS = admin
# 管理密码
ADMIN_PASSWORD = admin
# 文件大小限制,默认10MB
FILE_SIZE_LIMIT = 10
# 网站标题
TITLE = 文件快递柜
# 网站描述
DESCRIPTION = FileCodeBox,文件快递柜,口令传送箱,匿名口令分享文本,文件,图片,视频,音频,压缩包等文件
# 网站关键词
KEYWORDS = FileCodeBox,文件快递柜,口令传送箱,匿名口令分享文本,文件,图片,视频,音频,压缩包等文件
# 存储引擎
STORAGE_ENGINE = filesystem
# 如果使用阿里云OSS服务的话需要额外创建如下参数:
# 阿里云账号AccessKey
KeyId = 阿里云账号AccessKey
# 阿里云账号AccessKeySecret
KeySecret = 阿里云账号AccessKeySecret
# 阿里云OSS Bucket的地域节点
OSS_ENDPOINT = 阿里云OSS Bucket的地域节点
# 阿里云OSS Bucket的BucketName
BUCKET_NAME = 阿里云OSS Bucket的BucketName
S3协议的对象存储配置
❗️❗️❗️ 注意:必须配置SSL证书,否则无法下载
有关V2.0bata版,作者几乎没有任何说明,也没有相关的教程,也没有说bata版是什么意思,甚至都不在GitHub的releases列表,但是bata版支持S3协议的对象存储以及onedrive
雨云
ROS是支持S3协议的对象存储,目前(2023年10月18日)正在免费公测
注意:API端点前要加“ https://
,末尾不能加“ /
” ,配置完成后需要重启FileCode项目
OneDrive作为存储的配置方法
仅支持工作或学校账户,并且需要有管理员权限以授权API
1. 需要配置的参数
1
2
3
4
5
file_storage = onedrive
onedrive_domain = XXXXXX
onedrive_client_id = XXXXXX-XXXXXX-XXXXXX-XXXXXX
onedrive_username = XXXXXX@XXXXXX
onedrive_password = XXXXXX
onedrive_username
和onedrive_password
是你的账户名(邮箱)和密码,另外两个参数需要在微软Azure门户
中注册应用后获取。
2. 应用注册
登录https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBlade
,鼠标置于右上角账号处,浮窗将显示的域
即为onedrive_domain
的值。
点击左上角的+新注册
,输入名称,
受支持的帐户类型:选择任何组织目录(任何 Azure AD 目录 - 多租户)中的帐户和个人 Microsoft 帐户(例如,Skype、Xbox)
重定向 URI (可选):选择Web
,并输入http://localhost
完成注册后进入概述页面,在概要中找到应用程序(客户端)ID
,即为onedrive_client_id
的值。
此时还需要配置允许公共客户端流和API权限
在左侧选择身份验证
,找到允许的客户端流
,选择是
,并点击保存
。
在左侧选择API权限
,点击+添加权限
,选择Microsoft Graph
->委托的权限
,并勾选下述权限:openid、Files中所有权限、User.Read,如下图所示。最后点击下方的添加权限
。
最后点击授予管理员同意
,并点击是
,最终状态变为已授予
。
3. 使用下述代码测试是否配置成功
安装依赖:pip install Office365-REST-Python-Client
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# common.py
import msal
domain = 'XXXXXX'
client_id = 'XXXXXX'
username = 'XXXXXX'
password = 'XXXXXX'
def acquire_token_pwd ():
authority_url = f 'https://login.microsoftonline.com/ { domain } '
app = msal . PublicClientApplication (
authority = authority_url ,
client_id = client_id
)
result = app . acquire_token_by_username_password (
username = username ,
password = password ,
scopes = [ 'https://graph.microsoft.com/.default' ]
)
return result
测试登录,如果成功打印出账户名,说明配置成功。
1
2
3
4
5
6
7
8
9
from common import acquire_token_pwd
from office365.graph_client import GraphClient
try :
client = GraphClient ( acquire_token_pwd )
me = client . me . get () . execute_query ()
print ( me . user_principal_name )
except Exception as e :
print ( e )
测试文件上传
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import os
from office365.graph_client import GraphClient
from common import acquire_token_pwd
remote_path = 'tmp'
local_path = '.tmp/1689843925000.png'
def convert_link_to_download_link ( link ):
import re
p1 = re . search ( r 'https:\/\/(.+)\.sharepoint\.com' , link ) . group ( 1 )
p2 = re . search ( r 'personal\/(.+)\/' , link ) . group ( 1 )
p3 = re . search ( rf ' { p2 } \/(.+)' , link ) . group ( 1 )
return f 'https:// { p1 } .sharepoint.com/personal/ { p2 } /_layouts/52/download.aspx?share= { p3 } '
client = GraphClient ( acquire_token_pwd )
folder = client . me . drive . root . get_by_path ( remote_path )
# 1. upload
file = folder . upload_file ( local_path ) . execute_query ()
print ( f 'File { file . web_url } has been uploaded' )
# 2. create sharing link
remote_file = folder . get_by_path ( os . path . basename ( local_path ))
permission = remote_file . create_link ( "view" , "anonymous" ) . execute_query ()
print ( f "sharing link: { convert_link_to_download_link ( permission . link . webUrl ) } " )
测试文件下载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import os
from office365.graph_client import GraphClient
from common import acquire_token_pwd
remote_path = 'tmp/1689843925000.png'
local_path = '.tmp'
if not os . path . exists ( local_path ):
os . makedirs ( local_path )
client = GraphClient ( acquire_token_pwd )
remote_file = client . me . drive . root . get_by_path ( remote_path ) . get () . execute_query ()
with open ( os . path . join ( local_path , os . path . basename ( remote_path )), 'wb' ) as local_file :
remote_file . download ( local_file ) . execute_query ()
print ( f ' { remote_file . name } has been downloaded into { local_file . name } ' )
测试删除文件
1
2
3
4
5
6
7
8
from office365.graph_client import GraphClient
from common import acquire_token_pwd
remote_path = 'tmp/1689843925000.png'
client = GraphClient ( acquire_token_pwd )
file = client . me . drive . root . get_by_path ( remote_path )
file . delete_object () . execute_query ()