Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
enoyee
Scriptable
提交
ccfbf01d
S
Scriptable
项目概览
enoyee
/
Scriptable
通知
9
Star
0
Fork
3
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
Scriptable
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
ccfbf01d
编写于
2月 24, 2023
作者:
AndroidLeaves
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update
上级
9886ede4
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
93 addition
and
289 deletion
+93
-289
JD.js
JD.js
+2
-1
img/ic_filter.png
img/ic_filter.png
+0
-0
模板.js
模板.js
+65
-277
电信.js
电信.js
+26
-11
未找到文件。
JD.js
浏览文件 @
ccfbf01d
...
...
@@ -3,7 +3,7 @@
// icon-color: pink; icon-glyph: feather-alt;
/**
* Author:LSP
* Date:2023-02-
07
* Date:2023-02-
13
*/
// -------------------------------------------------------
// 是否是开发环境,配合手机端调试使用,正式发布设置为false
...
...
@@ -1170,6 +1170,7 @@ class Widget extends BaseWidget {
let
percent
=
'
--
'
;
if
(
treeState
==
2
||
treeState
==
3
)
{
percent
=
"
100%
"
;
this
.
notify
(
'
东东农场
'
,
`⊱
${
simpleName
}
⊰可以兑换啦~`
);
}
else
{
percent
=
Math
.
floor
((
treeEnergy
/
treeTotalEnergy
)
*
100
)
+
"
%
"
;
}
...
...
img/ic_filter.png
0 → 100644
浏览文件 @
ccfbf01d
5.5 KB
模板.js
浏览文件 @
ccfbf01d
// Variables used by Scriptable.
// These must be at the very top of the file. Do not edit.
// icon-color: deep-blue; icon-glyph: film;
/**
* Author:LSP
* Date:2023-02-04
*/
// -------------------------------------------------------
// 是否是开发环境,配合手机端调试使用,正式发布设置为false
const
isDev
=
false
;
const
dependencyLSP
=
'
20230204
'
;
console
.
log
(
`当前环境 👉👉👉👉👉
${
isDev
?
'
DEV
'
:
'
RELEASE
'
}
`
);
console
.
log
(
`----------------------------------------`
);
// 分支
const
branch
=
'
master
'
;
// 仓库根目录
const
remoteRoot
=
`https://gitcode.net/enoyee/scriptable/-/raw/
${
branch
}
`
;
// 依赖包目录
const
fm
=
FileManager
.
local
();
const
rootDir
=
fm
.
documentsDirectory
();
const
cacheDir
=
fm
.
joinPath
(
rootDir
,
'
LSP
'
);
const
dependencyFileName
=
isDev
?
"
_LSP.js
"
:
`
${
cacheDir
}
/_LSP.js`
;
// 下载依赖包
await
downloadLSPDependency
();
// -------------------------------------------------------
if
(
typeof
require
===
'
undefined
'
)
require
=
importModule
// 引入相关方法
const
{
BaseWidget
}
=
require
(
dependencyFileName
);
const
canvSize
=
200
;
const
canvTextSize
=
18
;
// @定义小组件
c
lass
Widget
extends
BaseWidget
{
const
canvWidth
=
22
;
// 圆圈stroke大小
c
onst
canvRadius
=
canvSize
/
2
-
canvWidth
;
// 半径
constructor
(
scriptName
)
{
super
(
scriptName
);
this
.
domain
=
'
https://www.cikeee.com
'
;
this
.
defaultConfig
.
refreshInterval
=
`
${
2
*
60
}
`
;
this
.
backgroundColor
=
'
#f0f0f4,#161823
'
;
this
.
defaultConfig
.
bgType
=
'
2
'
;
this
.
titleColor
=
Color
.
dynamic
(
new
Color
(
'
#222222
'
),
new
Color
(
'
#AAAAAA
'
));
this
.
descColor
=
Color
.
dynamic
(
new
Color
(
'
#FFFFFF
'
),
new
Color
(
'
#EEEEEE
'
));
this
.
subTitleColor
=
Color
.
dynamic
(
new
Color
(
'
#555555
'
),
new
Color
(
'
#AAAAAA
'
));
}
async
getAppViewOptions
()
{
return
{
widgetProvider
:
{
small
:
true
,
// 是否提供小号组件
medium
:
false
,
// 是否提供中号组件
large
:
false
,
// 是否提供大号组件
},
// 预览界面的组件设置item
settingItems
:
[
{
name
:
'
pic
'
,
label
:
'
选择图片
'
,
type
:
'
cell
'
,
icon
:
{
name
:
'
tag
'
,
color
:
'
#7678ed
'
,
},
showDesc
:
false
,
needLoading
:
true
,
},
],
// cell类型的item点击回调
onItemClick
:
async
(
item
)
=>
{
let
widgetSetting
=
this
.
readWidgetSetting
();
let
insertDesc
=
''
;
switch
(
item
.
name
)
{
case
'
pic
'
:
try
{
let
image
=
await
Photos
.
fromLibrary
();
this
.
useFileManager
().
writeImgCache
(
'
pic
'
,
image
);
}
catch
(
error
)
{
}
break
;
}
// 写入更新配置
this
.
writeWidgetSetting
(
widgetSetting
);
return
{
desc
:
{
value
:
insertDesc
},
};
},
};
}
async
render
({
widgetSetting
,
family
})
{
return
await
this
.
provideLargeWidget
();
}
async
provideLargeWidget
()
{
// ----------------------------------------
const
widgetSize
=
this
.
getWidgetSize
(
'
小号
'
);
console
.
log
(
JSON
.
stringify
(
widgetSize
,
null
,
2
));
//
//=================================
const
widget
=
new
ListWidget
();
//=================================
let
stack
=
widget
.
addStack
();
stack
.
size
=
new
Size
(
widgetSize
.
width
-
12
,
widgetSize
.
height
-
12
);
let
image
=
await
this
.
getImageByUrl
(
"
https://s1.ax1x.com/2023/02/09/pSWWFeO.png
"
);
stack
.
backgroundImage
=
this
.
useFileManager
().
readImgCache
(
'
pic
'
)
stack
.
centerAlignContent
()
const
battCircleRemainColor
=
new
Color
(
'
#799351
'
);
//Battery remaining color
const
battCircleDepletedColor
=
new
Color
(
'
#d54062
'
);
//Battery depleted color
let
picStack
=
stack
.
addStack
();
picStack
.
size
=
new
Size
(
widgetSize
.
width
-
4
,
widgetSize
.
height
-
4
);
picStack
.
backgroundImage
=
image
// let imgSpan = stack.addImage(image)
// imgSpan.centerAlignImage();
// imgSpan.applyFillingContentMode();
//=================================
return
widget
;
}
// --------------------------NET START--------------------------
async
loadHTML
(
url
)
{
let
req
=
new
Request
(
url
);
req
.
headers
=
{
"
user-agent
"
:
"
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36
"
,
};
let
html
=
await
req
.
loadString
();
return
html
.
replace
(
/
(\r\n
|
\n
|
\r)
/gm
,
""
);
}
async
loadMovieCalendar
()
{
const
link
=
this
.
domain
;
let
response
=
undefined
;
try
{
const
ufm
=
this
.
useFileManager
();
const
webview
=
new
WebView
();
const
cacheFileName
=
this
.
md5
(
link
);
const
lastCacheTime
=
ufm
.
getCacheModifyDate
(
cacheFileName
);
const
timeInterval
=
Math
.
floor
((
this
.
getCurrentTimeStamp
()
-
lastCacheTime
)
/
60
);
// 读取本地缓存
const
localCache
=
ufm
.
readStringCache
(
cacheFileName
);
const
canUseCache
=
localCache
!=
null
&&
localCache
.
length
>
0
;
// 过时且有本地缓存则直接返回本地缓存数据
const
{
refreshInterval
=
'
0
'
}
=
this
.
readWidgetSetting
();
const
shouldLoadCache
=
timeInterval
<=
Number
(
refreshInterval
)
&&
canUseCache
;
let
html
=
undefined
;
if
(
!
shouldLoadCache
)
{
console
.
log
(
`-->>在线加载网页数据:
${
link
}
`
);
html
=
await
this
.
loadHTML
(
link
);
ufm
.
writeStringCache
(
cacheFileName
,
html
);
}
else
{
html
=
ufm
.
readStringCache
(
cacheFileName
);
console
.
log
(
`-->>加载缓存网页数据:
${
link
}
`
);
}
await
webview
.
loadHTML
(
html
);
const
getData
=
`
function getData() {
let movieImg = document.getElementById('movie-img').src;
let movieDesc = document.querySelector('span#movie-text').textContent;
let movieName = document.querySelector('a#movie-name').textContent.replaceAll('——', '');
let movieInformation = document.querySelector('a#movie-information').textContent;
let movieRating = movieInformation.slice(0, 3);
movieInformation = movieInformation.slice(5);
let movieLink = document.querySelector('a#movie-img-a').href;
return { movieImg, movieDesc, movieName, movieInformation, movieRating, movieLink };
}
getData()
`
// 热榜数据
response
=
await
webview
.
evaluateJavaScript
(
getData
,
false
);
if
(
response
.
titleArr
?.
length
>
0
)
{
this
.
useFileManager
().
writeStringCache
(
'
movieCalendar
'
,
JSON
.
stringify
(
response
));
}
}
catch
(
error
)
{
console
.
error
(
`🚫 请求数据出错了=>
${
error
}
`
);
response
=
JSON
.
parse
(
this
.
useFileManager
().
readStringCache
(
'
movieCalendar
'
));
}
return
response
;
}
// --------------------------NET END--------------------------
function
sinDeg
(
deg
)
{
return
Math
.
sin
((
deg
*
Math
.
PI
)
/
180
);
}
await
new
Widget
(
Script
.
name
()).
run
();
// =================================================================================
// =================================================================================
async
function
downloadLSPDependency
()
{
let
fm
=
FileManager
.
local
();
const
dependencyURL
=
`
${
remoteRoot
}
/_LSP.js`
;
const
update
=
needUpdateDependency
();
if
(
isDev
)
{
const
iCloudPath
=
FileManager
.
iCloud
().
documentsDirectory
();
const
localIcloudDependencyExit
=
fm
.
isFileStoredIniCloud
(
`
${
iCloudPath
}
/_LSP.js`
);
const
localDependencyExit
=
fm
.
fileExists
(
`
${
rootDir
}
/_LSP.js`
);
const
fileExist
=
localIcloudDependencyExit
||
localDependencyExit
;
console
.
log
(
`🚀 DEV开发依赖文件
${
fileExist
?
'
已存在 ✅
'
:
'
不存在 🚫
'
}
`
);
if
(
!
fileExist
||
update
)
{
console
.
log
(
`🤖 DEV 开始
${
update
?
'
更新
'
+
dependencyLSP
:
'
下载
'
}
依赖~`
);
keySave
(
'
VERSION
'
,
dependencyLSP
);
await
downloadFile2Scriptable
(
'
_LSP
'
,
dependencyURL
);
}
return
}
//////////////////////////////////////////////////////////
console
.
log
(
`----------------------------------------`
);
const
remoteDependencyExit
=
fm
.
fileExists
(
`
${
cacheDir
}
/_LSP.js`
);
console
.
log
(
`🚀 RELEASE依赖文件
${
remoteDependencyExit
?
'
已存在 ✅
'
:
'
不存在 🚫
'
}
`
);
// ------------------------------
if
(
!
remoteDependencyExit
||
update
)
{
// 下载依赖
// 创建根目录
if
(
!
fm
.
fileExists
(
cacheDir
))
{
fm
.
createDirectory
(
cacheDir
,
true
);
}
// 下载
console
.
log
(
`🤖 RELEASE开始
${
update
?
'
更新
'
:
'
下载
'
}
依赖~`
);
console
.
log
(
`----------------------------------------`
);
const
req
=
new
Request
(
dependencyURL
);
const
moduleJs
=
await
req
.
load
();
if
(
moduleJs
)
{
fm
.
write
(
fm
.
joinPath
(
cacheDir
,
'
/_LSP.js
'
),
moduleJs
);
keySave
(
'
VERSION
'
,
dependencyLSP
);
console
.
log
(
'
✅ LSP远程依赖环境下载成功!
'
);
console
.
log
(
`----------------------------------------`
);
}
else
{
console
.
error
(
'
🚫 获取依赖环境脚本失败,请重试!
'
);
console
.
log
(
`----------------------------------------`
);
}
}
function
cosDeg
(
deg
)
{
return
Math
.
cos
((
deg
*
Math
.
PI
)
/
180
);
}
/**
* 获取保存的文件名
* @param {*} fileName
* @returns
*/
function
getSaveFileName
(
fileName
)
{
const
hasSuffix
=
fileName
.
lastIndexOf
(
"
.
"
)
+
1
;
return
!
hasSuffix
?
`
${
fileName
}
.js`
:
fileName
;
};
/**
* 保存文件到Scriptable软件目录,app可看到
* @param {*} fileName
* @param {*} content
* @returns
*/
function
saveFile2Scriptable
(
fileName
,
content
)
{
try
{
const
fm
=
FileManager
.
iCloud
();
let
fileSimpleName
=
getSaveFileName
(
fileName
);
const
filePath
=
fm
.
joinPath
(
fm
.
documentsDirectory
(),
fileSimpleName
);
fm
.
writeString
(
filePath
,
content
);
return
true
;
}
catch
(
error
)
{
return
false
;
}
};
/**
* 下载js文件到Scriptable软件目录
* @param {*} moduleName 名称
* @param {*} url 在线地址
* @returns
*/
async
function
downloadFile2Scriptable
(
moduleName
,
url
)
{
const
req
=
new
Request
(
url
);
const
content
=
await
req
.
loadString
();
return
saveFile2Scriptable
(
`
${
moduleName
}
`
,
content
);
};
/**
* 是否需要更新依赖版本
*/
function
needUpdateDependency
()
{
return
dependencyLSP
!=
keyGet
(
'
VERSION
'
);
};
function
keySave
(
cacheKey
,
cache
)
{
if
(
cache
)
{
Keychain
.
set
(
Script
.
name
()
+
cacheKey
,
cache
);
function
drawArc
(
deg
,
fillColor
,
strokeColor
,
text
,
label
,
txtColor
)
{
const
canvas
=
new
DrawContext
();
canvas
.
opaque
=
false
;
canvas
.
respectScreenScale
=
true
let
ctr
=
new
Point
(
canvSize
/
2
,
canvSize
/
2
),
bgx
=
ctr
.
x
-
canvRadius
;
bgy
=
ctr
.
y
-
canvRadius
;
bgd
=
2
*
canvRadius
;
bgr
=
new
Rect
(
bgx
,
bgy
,
bgd
,
bgd
);
canvas
.
setFillColor
(
fillColor
);
canvas
.
setStrokeColor
(
strokeColor
);
canvas
.
setLineWidth
(
canvWidth
);
canvas
.
strokeEllipse
(
bgr
);
for
(
t
=
0
;
t
<
deg
;
t
++
)
{
rect_x
=
ctr
.
x
+
canvRadius
*
sinDeg
(
t
)
-
canvWidth
/
2
;
rect_y
=
ctr
.
y
-
canvRadius
*
cosDeg
(
t
)
-
canvWidth
/
2
;
rect_r
=
new
Rect
(
rect_x
,
rect_y
,
canvWidth
,
canvWidth
);
canvas
.
fillEllipse
(
rect_r
);
}
// attempt to draw info text
const
canvTextRect
=
new
Rect
(
0
,
canvSize
/
2
+
canvWidth
/
2
-
canvTextSize
/
2
,
canvSize
,
canvTextSize
);
const
canvLabelRect
=
new
Rect
(
0
,
(
canvSize
/
2
+
canvWidth
/
2
-
canvTextSize
/
2
)
-
canvTextSize
*
1.5
,
canvSize
,
canvTextSize
+
130
);
canvas
.
setTextAlignedCenter
();
canvas
.
setTextColor
(
txtColor
);
canvas
.
setFont
(
Font
.
boldSystemFont
(
canvTextSize
));
canvas
.
drawTextInRect
(
text
,
canvTextRect
);
canvas
.
drawTextInRect
(
label
,
canvLabelRect
);
return
canvas
.
getImage
()
}
function
keyGet
(
cacheKey
,
defaultValue
=
''
)
{
if
(
Keychain
.
contains
(
Script
.
name
()
+
cacheKey
))
{
return
Keychain
.
get
(
Script
.
name
()
+
cacheKey
);
}
else
{
return
defaultValue
;
}
}
// =================================================================================
// =================================================================================
\ No newline at end of file
let
widget
=
new
ListWidget
();
widget
.
setPadding
(
0
,
0
,
0
,
0
);
let
image
=
drawArc
(
330
,
battCircleRemainColor
,
battCircleDepletedColor
,
"
总流量:1.46T
"
,
"
已用:900GB
"
,
battCircleRemainColor
)
widget
.
addImage
(
image
)
// let mainStack = widget.addStack();
// mainStack.size = new Size(158, 158);
// mainStack.backgroundImage = image
// mainStack.layoutHorizontally();
// mainStack.setPadding(0, 0, 0, 0);
// let imgSpan = mainStack.addImage(drawArc(330, battCircleRemainColor, battCircleDepletedColor, "总流量:1.46T", "已用:900GB", battCircleRemainColor))
// imgSpan.imageSize = new Size(158, 158)
// widget.backgroundColor = Color.white()
Script
.
setWidget
(
widget
);
widget
.
presentSmall
();
Script
.
complete
();
电信.js
浏览文件 @
ccfbf01d
...
...
@@ -3,7 +3,7 @@
// icon-color: blue; icon-glyph: mobile-alt;
/**
* Author:LSP
* Date:2023-02-
13
* Date:2023-02-
24
*/
// -------------------------------------------------------
// 是否是开发环境,配合手机端调试使用,正式发布设置为false
...
...
@@ -102,6 +102,14 @@ class Widget extends BaseWidget {
needLoading
:
true
,
desc
:
this
.
getValueByKey
(
'
cookie
'
)?.
length
>
0
?
'
已登录
'
:
'
未登录
'
},
{
name
:
'
filterOrientateFlow
'
,
label
:
'
过滤定向流量
'
,
type
:
'
switch
'
,
icon
:
`
${
remoteRoot
}
/img/ic_filter.png`
,
needLoading
:
false
,
default
:
false
},
{
name
:
'
otherSetting
'
,
label
:
'
其他设置
'
,
...
...
@@ -225,14 +233,14 @@ class Widget extends BaseWidget {
};
}
async
render
()
{
return
await
this
.
provideSmallWidget
();
async
render
(
{
widgetSetting
}
)
{
return
await
this
.
provideSmallWidget
(
widgetSetting
);
}
async
provideSmallWidget
()
{
async
provideSmallWidget
(
widgetSetting
)
{
// ========================================
await
this
.
loadMoneyBalance
();
await
this
.
loadDetailInfo
();
await
this
.
loadDetailInfo
(
widgetSetting
.
filterOrientateFlow
);
const
voiceBalance
=
this
.
voice
.
balance
;
// ========================================
const
widget
=
new
ListWidget
();
...
...
@@ -378,7 +386,7 @@ class Widget extends BaseWidget {
* 加载明细
* @returns
*/
loadDetailInfo
=
async
()
=>
{
loadDetailInfo
=
async
(
filterOrientateFlow
)
=>
{
const
response
=
await
this
.
httpGet
(
this
.
defaultPreference
.
fetchUrl
.
detail
,
{
...
...
@@ -408,12 +416,19 @@ class Widget extends BaseWidget {
data
.
items
?.
forEach
((
item
)
=>
{
if
(
item
.
unitTypeId
==
3
)
{
if
(
!
(
item
.
usageAmount
==
0
&&
item
.
balanceAmount
==
0
))
{
console
.
log
(
`套餐名称:«
${
item
.
ratableResourcename
}
»`
);
console
.
log
(
`套餐总流量:
${
item
.
ratableAmount
}
MB`
);
console
.
log
(
`套餐剩余流量:
${
item
.
balanceAmount
}
MB`
);
let
ratableResourcename
=
item
.
ratableResourcename
;
let
ratableAmount
=
item
.
ratableAmount
;
let
balanceAmount
=
item
.
balanceAmount
;
console
.
log
(
`套餐名称:«
${
ratableResourcename
}
»`
);
console
.
log
(
`套餐总流量:
${
ratableAmount
}
MB`
);
console
.
log
(
`套餐剩余流量:
${
balanceAmount
}
MB`
);
console
.
log
(
`================================= `
);
totalFlowAmount
+=
parseFloat
(
item
.
ratableAmount
);
totalBalanceFlowAmount
+=
parseFloat
(
item
.
balanceAmount
);
if
(
filterOrientateFlow
&&
ratableResourcename
.
search
(
'
定向
'
)
!=
-
1
)
{
ratableAmount
=
0
;
balanceAmount
=
0
;
}
totalFlowAmount
+=
parseFloat
(
ratableAmount
);
totalBalanceFlowAmount
+=
parseFloat
(
balanceAmount
);
}
if
(
data
.
offerType
==
21
&&
item
.
ratableAmount
==
'
0
'
)
{
// 无限流量用户
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录