SomeBottle's Onedrive Folder Index transplanted from Heymind.
最近发现Heymind写的Cloudflare Worker版的oneindex很好用,遂移植了一个php版本.(2.0进行了大更新)
原Heymind的Cloudflare Workers版OnedriveIndex使用MIT协议.
这只是通过调用api实现的onedrive文件列表程序,并不提供任何账号相关的内容。如果有条件,请花钱支持一下巨硬微软。
- 自动更新token(除非非常非常久没访问)
- 可以进行转发下载(过服务器流量的那种[建议是国外服务器],但能快很多)
- 简单配置后可以搭配世纪互联版Onedrive
- 鼠标悬停预览
- 使用github-markdown-css进行markdown的渲染
- 使用Prism.js来渲染简单的代码高亮
- 支持站点非根目录
- autoCache文件缓存
- 支持缩略图获取
- 支持密码保护目录以及目录下面的文件
- 没有文件上传功能
- 支持的格式预览:
ogg
,mp3
,wav
,m4a
,mp4
,webm
,jpg
,jpeg
,png
,gif
,webp
,md
,markdown
,txt
,docx
,pptx
,xlsx
,doc
,ppt
,xls
,js
,html
,json
,css
- 支持无目录模式
- 支持以纯json格式返回
- autoCache 文件缓存
- 支持根目录文件列表
- 文件简单预览
- 文件复杂预览
- 模板系统
- 翻页支持
-
准备一个网站服务器,把仓库中odproxy.php , index.php , template.html丢进去
-
按照Beetcb的方式获取refresh_token
-
在index.php设置相关参数
-
设置伪静态(重定向规则):(可选)
if (!-f $request_filename){
set $rule_0 1$rule_0;
}
if (!-d $request_filename){
set $rule_0 2$rule_0;
}
if ($rule_0 = "21"){
rewrite ^/(.*)$ /?/$1 last;
}
如果是非根目录,要在重定向规则上作相应调整。
对于图片文件,可以直接获取不同尺寸的缩略图。 比如:https://xxx/pics/loli.png?thumbnail=medium
最常用值有small
,medium
,large
在你需要展示说明文件的目录下放入readme.md文件,会自动进行解析并展示在该目录的文件列表下.
在你配置的地方下创建密码配置文件,如图:
一行表示一个目录保护规则,格式是/目录路径 32位md5加密后的密码
注意的是目录路径末尾不需要/
。
比如我要保护/Video/*
下的内容,密码md5是e10adc3949ba59abbe56e057f20f883e,则规则写为
/Video e10adc3949ba59abbe56e057f20f883e
PS:这个规则可以保护目录及目录下的所有子目录和文件,利用了目录对比。因为获取密码有了额外的资源消耗,你可以在配置里关掉密码保护功能。
这是自OdIndex2.0之后有的模板文件。
-
形如
{{xxx}}
的是模板提取符:
{{Body}}{{BodyEnd}}
之间是OdIndex主体模板
{{PathSingle}}{{PathSingleEnd}}
之间是目录定位链接单体模板
{{ItemSingle}}{{ItemSingleEnd}}
之间是单个列表中的项目的模板
{{PaginationSingle}}{{PaginationSingleEnd}}
之间是列表中的翻页部分的模板
{{PaginationPrev}}{{PaginationPrevEnd}}
之间是翻页部分后退按钮的模板
{{PaginationNext}}{{PaginationNextEnd}}
之间是翻页部分前进按钮的模板
{{PreviewBody}}{{PreviewBodyEnd}}
之间是预览的主体模板
{{ImgPreview}}{{ImgPreviewEnd}}
之间是图片预览的内容模板
{{AudioPreview}}{{AudioPreviewEnd}}
之间是音频预览的内容模板
{{VideoPreview}}{{VideoPreviewEnd}}
之间是视频预览的内容模板
{{TxtPreview}}{{TxtPreviewEnd}}
之间是文本预览的内容模板
{{MDPreview}}{{MDPreviewEnd}}
之间是markdown预览的内容模板
{{CodePreview}}{{CodePreviewEnd}}
之间是代码预览的内容模板
{{OfficePreview}}{{OfficePreviewEnd}}
之间是Office文档的内容模板
{{PasswordPage}}{{PasswordPageEnd}}
之间是密码提交页面模板 -
形如
{[xxx]}
的是模板替换符:
{[Path]}
是当前的路径,替换后形如Video/ACG/
{[HomePath]}
是主页路径
{[PathItems]}
和前面的{{PathSingle}}
相搭配,替换后是组装过后的目录定位整体
{[Items]}
和前面的{{ItemSingle}}
相搭配,替换后是组装后的文件列表
{[Pagination]}
仅在{{Body}}中有用和前面的{{PaginationSingle}}
相搭配,替换后是组装后的pagination翻页部分
{[Prev]},{[Next]}
仅在{{PaginationSingle}}中有用 , 被替换为前进和后退按钮
{[PrevLink]},{[NextLink]}
仅分别在{{PaginationPrev}}和{{PaginationNext}}中有用 , 被替换为前进和后退链接
{[CurrentPage]}
仅在{{Body}}中有用 , 被替换为当前页码
{[ReadmeFile]}
是当前目录下的readme文件的直链
{[FolderLink]},{[FolderName]}
仅在{{PathSingle}}中有用 , 指定目录定位链接和目录名
{[ItemLink]},{[ItemSize]},{[MimeIcon]},{[ItemName]}
仅在{{ItemSingle}}中有用 , 指定单个文件的链接、大小(bytes)、Mime图标标识、名字
{[FileName]}
仅在{{PreviewBody}}中可用 , 替换为当前预览的文件名
{[PreviewContent]}
仅在{{PreviewBody}}中可用 , 替换为对应的内容模板
{[CreatedDateTime]}
仅在{{PreviewBody}}和{{ItemSingle}}中可用 , 替换为当前文件的创建日期时间
{[LastModifiedDateTime]}
仅在{{PreviewBody}}和{{ItemSingle}}中可用 , 替换为当前文件的最后修改日期时间
{[MimeType]}
仅在{{PreviewBody}}和{{ItemSingle}}中可用 , 替换为当前文件mime属性
{[FileRawUrl]}
仅在预览相关模板中可用 , 替换为文件直链
{[PreviewUrl]}
仅在预览Office文档时可用 , 替换为在线预览链接
{[FileContent]}
仅在{{TxtPreview}},{{MDPreview}},{{CodePreview}}中有用 , 替换为文件原内容
{[PrismTag]}
仅在{{CodePreview}}中可用 , 替换为Prism代码高亮类型tag
{[FolderMD5]}
仅在{{PasswordPage}}中可用 , 替换为表单目录md5
$config = array(
"refresh_token" => "",
"client_id" => "",
"client_secret" => "",
"api_url" => "https://graph.microsoft.com/v1.0",
"oauth_url" => "https://login.microsoftonline.com/common/oauth2/v2.0",
"redirect_uri" => "http://localhost",
'base' => '',
'data_path' => 'data',
'rewrite' => false, // 伪静态是否开启,如果网站服务器开启了伪静态请设置为true
'site_path' => '',
"cache" => array(
'smart' => true,
'expire' => 1800, /*In seconds*/
'force' => false /*是否强制开启缓存*/
),
'queue' => array(
'start' => true,/*防并发请求队列*/
'max_num' => 15,/*队列中允许停留的最多请求数,其他请求直接返回服务繁忙*/
'last_for' => 2700 /*In seconds*/
),
'service_busy' => 'https://cdn.jsdelivr.net/gh/SomeBottle/odindex/assets/unavailable.png',/*队列过多时返回的“服务繁忙”图片url*/
'thumbnail' => true,
'preview' => true,
'max_preview_size' => 314572, /*最大支持预览的文件大小(in bytes)*/
'preview_suffix' => ['ogg', 'mp3', 'wav', 'm4a', 'mp4', 'webm', 'jpg', 'jpeg', 'png', 'gif', 'webp', 'md', 'markdown', 'txt', 'docx', 'pptx', 'xlsx', 'doc', 'ppt', 'xls', 'js', 'html', 'json', 'css'],/*可预览的类型,只少不多*/
'use_proxy' => false,
'proxy_path' => false, /*代理程序url,false则用本目录下的*/
'no_index' => false, /*关闭列表*/
'no_index_print' => 'Static powered by OdIndex', /*关闭列表访问列表时返回什么*/
'list_as_json' => false, /*改为返回json*/
'pwd_cfg_path' => '.password', /*密码配置文件路径*/
'pwd_protect' => true,/*是否采用密码保护,这会稍微多占用一些程序资源*/
'pwd_cfg_update_interval' => 1200, /*密码配置文件本地缓存时间(in seconds)*/
'pagination' => true, /*是否开启分页*/
'items_per_page' => 20 /*每页的项目数量,用于分页(推荐设置为20-35)*/
);
-
base
配置项用于规定展示onedrive根目录下哪个目录的内容.例如将你要展示列表的文件放在onedrive根目录下的Share目录里面,base
项配置为 "/Share" 即可,如果你要展示根目录的内容,请将base项设置为留空 -
preview
配置项用来配置是否开启默认预览,开启之后点击列表中的文件会默认进入预览界面.preview_suffix
是支持预览的文件格式,不建议修改. -
site_path
配置项是为了适应站点非根目录的,如果你的站点类似于https://xxx/ ,这一个配置项留空;如果你的站点类似于https://xxx/onedrive/ ,那么这个配置项你就要改成:'site_path'=>'/onedrive', //末尾不要斜杠!
-
值得注意的是,
rewrite=false
(关闭重定向)时,site_path可以留空,用不着 -
当你开启了重定向并设置了site_path,需要对应修改重定向规则:
#(比如site_path设置为/test) rewrite ^/(.*)$ /?/$1 last; #改为 rewrite ^/test/(.*)$ /test/?/$1 last;
-
use_proxy
配置项用于启动转发下载,如果为true
,调用直链时会自动用odproxy.php转发下载. -
如果
odproxy.php
和index.php
不是相同目录下的,需要配置**proxy_path
**.例如https://xxx/odproxy.php . -
rewrite
配置项若设置为true
,你必须配置伪静态(重定向规则);若设置为false
,你可以用请求的方式访问.
例如开了伪静态,你可以访问https://xxx/Document/
,没有开伪静态,你需要访问https://xxx/?/Document/
来进行访问。 -
data_path
配置项指的是数据的储存目录,默认配置成data
,OdIndex的部分数据就会储存在data
目录下 -
当
no_index
配置为true
时,除了访问文件外一律返回no_index_print内的内容 -
当
list_as_json
配置为true
时,所有的返回内容都会变成JSON形式:正常返回:
{ "success": true, "currentPath": "", "currentPage": 1, "nextPageExist": false, "prevPageExist": false, "folders": [{ "createdDateTime": "2021-04-24T03:51:36.99Z", "lastModifiedDateTime": "2021-04-27T11:17:31.457Z", "name": "Previews", "size": 117218729, "link": "Previews\/" }, { "createdDateTime": "2021-04-24T03:51:37.967Z", "lastModifiedDateTime": "2021-04-24T03:53:43.597Z", "name": "Protected", "size": 197107, "link": "Protected\/" }], "files": [{ "createdDateTime": "2021-04-24T03:51:45.093Z", "lastModifiedDateTime": "2021-04-24T03:51:45.85Z", "mimeType": "image\/png", "name": "Potato.png", "size": 314, "link": "Potato.png?p=t" }, { "createdDateTime": "2021-04-24T03:51:44.83Z", "lastModifiedDateTime": "2021-04-24T03:59:19.71Z", "mimeType": "application\/octet-stream", "name": "readme.md", "size": 141, "link": "readme.md?p=t" }] }
找不到文件/目录的返回:
{"success":false,"msg":"Not found: \/Potato.jpg"}
Json返回模式下不支持预览:
{"success":false,"msg":"Preview not available under list_as_json Mode"}
访问文件时的返回:
{ "success": true, "fileurl": "...", "createdDateTime": "2021-04-24T03:51:45.093Z", "lastModifiedDateTime": "2021-04-24T03:51:45.85Z", "mimeType": "image\/png" }
-
pwd_cfg_path
是你的密码的配置文件路径,默认是.password
,也就是列表根目录的.password
文件.
如果你想配置成在列表Test目录内的passwordconfig
文件可以这样写:
pwd_cfg_path=>'Test/passwordconfig',
-
pwd_protect
如果设置为false
会直接忽略密码配置,放行所有请求,但是能节省一定请求资源 -
pwd_cfg_update_interval
是密码配置文件缓存过期的时长,单位为秒。每次请求密码配置文件后配置文件会被暂时缓存在本地(以减少重复请求的情况),每隔这段时间进行重新请求而刷新。 -
pagination
设置为true
则开启分页,每页展示的项目数量由**items_per_page
决定,因为微软api的缺陷,建议把items_per_page
设置为20-40
**,太小了会增加请求负担,太大了会增加服务器处理负担
编辑头部config中**api_url
和oauth_url
**内容为:
"api_url"=> "https://microsoftgraph.chinacloudapi.cn/v1.0",
"oauth_url"=>"https://login.partner.microsoftonline.cn/common/oauth2/v2.0",
"cache"=>array(
'smart'=>true,
'expire'=>1200, /*In seconds*/
'force' => false /*是否强制开启缓存*/
),
AutoCache会在你的文件目录被大量访问时自动缓存目录,配置项只有以上三个。
smart
若为true则开启autoCacheexpire
自动缓存开启后持续的时间,这段时间过去后缓存文件会被自动删除,一切恢复正常- 当**
force
**设为true时开启强制缓存,此时用户访问的页面都会被缓存,经过expire时间后缓存会自动清除
'queue'=>array(
'start'=>true,/*防并发请求队列*/
'max_num'=>15,/*队列中允许停留的最多请求数,其他请求直接返回服务繁忙*/
'last_for'=>2700 /*In seconds*/
),
'service_busy'=>'https://cdn.jsdelivr.net/gh/SomeBottle/odindex/assets/unavailable.png',
TheQueue会在游客对文件造成大量请求时防止并发情况出现,可以有效防止账户被微软限制.
-
max_num
是队列中存在的最多请求数,每请求一个未缓存页面、一个文件,在请求未完成之时全部当排队请求,而当排队请求的量超过了max_num,会直接返回服务繁忙,也就是service_busy的图片. -
last_for
是队列模式开启后持续的时间,按秒计算.超过这个时间后一切会恢复正常.建议比AutoCache的设置更长一点.
-
因为在密码缓存过期的时候服务器要进行重新请求,故此时访问OdIndex页面会比平常慢上一段时间。咱的建议是设置一个crontab任务,每间隔一段时间访问一下网页以及时刷新密码配置。
-
访问目录时末尾要加上'/',如果访问
https://xxx/Document
会帮你重定向到https://xxx/Document
. -
如果特别特别久没有访问了,显示 Failed to get accesstoken. Maybe refresh_token expired ,需要更换
refresh_token
,**删掉生成的token.php,在index.php头部修改配置为自行重新获取的refreshtoken
**即可.
- LemonPrefect 提供了密码保护目录以及目录下文件的思路
- wangjiale1125 协助测试世纪互联
- Micraow 提出了预览相关的意见
- https://docs.microsoft.com/zh-cn/graph/api/resources/driveitem?view=graph-rest-1.0
- https://docs.microsoft.com/zh-cn/graph/query-parameters
- https://docs.microsoft.com/zh-cn/graph/paging