青龙面板安装搭建教程

青龙面板

青龙面板安装

安装Docker

拉取青龙镜像

1
docker pull whyour/qinglong:develop

启动青龙镜像

/data/ql/ql:映射文件夹

QlBaseUrl:访问路径,为空时:ip:5700,不为空时:ip:5700/ql/

1
2
3
4
5
6
7
8
9
docker run -dit \
-v /data/ql/ql:/ql/data \
-p 5700:5700 \
-e QlBaseUrl="/ql/" \
-e QlPort="5700" \
--name qinglong \
--hostname qinglong \
--restart unless-stopped \
whyour/qinglong:develop

青龙nginx代理配置

1
2
3
4
5
6
7
8
9
10
    location ^~ /ql/ {
proxy_pass http://127.0.0.1:5700/ql/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 300s;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}

内置命令

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
# 依次执行,如果设置了随机延迟,将随机延迟一定秒数
task <file_path>
# 依次执行,无论是否设置了随机延迟,均立即运行,前台会输出日,同时记录在日志文件中
task <file_path> now
# 并发执行,无论是否设置了随机延迟,均立即运行,前台不产生日,直接记录在日志文件中,且可指定账号执行
task <file_path> conc <env_name> <account_number>(可选的)
# 指定账号执行,无论是否设置了随机延迟,均立即运行
task <file_path> desi <env_name> <account_number>
# 设置任务超时时间
task -m <max_time> <file_path>
# 使用 -- 分割,-- 后面的参数会传给脚本,下面的例子,脚本就可接收到参数 -u whyour -p password
task <file_path> -- -u whyour -p password

# 更新并重启青龙
ql update
# 运行自定义脚本extra.sh
ql extra
# 添加单个脚本文件
ql raw <file_url>
# 添加单个仓库的指定脚本
ql repo <repo_url> <whitelist> <blacklist> <dependence> <branch> <extensions>
# 删除旧日志
ql rmlog <days>
# 启动tg-bot
ql bot
# 检测青龙环境并修复
ql check
# 重置登录错误次数
ql resetlet
# 禁用两步登录
ql resettfa

自用脚本

掘金签到脚本

感谢大佬的依赖库

  • 依赖管理中下载juejin-helper
  • sendNotify是青龙面板自带的消息通知脚本
  • 环境变量中配置JJ_COOKIE
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
const $ = new Env('掘金-社区签到');
const JuejinHelper = require("juejin-helper");

const juejin = new JuejinHelper();

const notify = require('../../sendNotify');

const COOKIE = process.env.JJ_COOKIE

const state = {
simulateSpeed: 100, // ms/进行一次抽奖
signStatus:'', // 签到状态
sumPoint: 0, //矿石数量
incrPoint:0, //签到成功获取的矿石数量
contCount:0, //累计签到天数
sumCount:0, // 连续签到天数
luckyValue: 0, //当前幸运值

lottery: [], // 奖池
pointCost: 0, //抽奖一次消耗矿石
freeCount: 0, // 免费抽奖次数
counter: 0, //抽奖次数

supplyPoint: 0,
prize: {}
};

!(async () => {
await $.wait(500);
if (!COOKIE) {
console.log($.name, "【提示】请先获取一cookie", "https://juejin.cn/");
return;
}
await juejin.login(COOKIE);
const api = juejin.growth();
const recordInfo = [];
// Browser 浏览器访问示例
console.log("--------模拟访问---------");
try {
const browser = juejin.browser();
await browser.open();
try {
await browser.visitPage("/");
console.log("掘金首页:页面访问成功");
} catch (e) {
console.log("掘金首页:页面访问失败");
}
await $.wait(2000);
try {
await browser.visitPage("/user/center/signin");
console.log("掘金每日签到:页面访问成功");
} catch (e) {
console.log("掘金每日签到:页面访问失败");
}
await $.wait(2000);
await browser.close();
} catch {
console.log("浏览器API异常");
}
console.log("-------------------------");

console.log("------事件埋点追踪-------");

const sdk = juejin.sdk();
calledSdkSetting = false;
calledTrackGrowthEvent = false;
calledTrackOnloadEvent = false;
try {
await sdk.slardarSDKSetting();
calledSdkSetting = true;
} catch {
calledSdkSetting = false;
}
console.log(`SDK状态: ${calledSdkSetting ? "加载成功" : "加载失败"}`);

try {
const result = await sdk.mockTrackGrowthEvent();
if (result && result.e === 0) {
calledTrackGrowthEvent = true;
} else {
throw result;
}
} catch {
calledTrackGrowthEvent = false;
}
console.log(`成长API事件埋点: ${calledTrackGrowthEvent ? "调用成功" : "调用失败"}`);

try {
const result = await sdk.mockTrackOnloadEvent();
if (result && result.e === 0) {
calledTrackOnloadEvent = true;
} else {
throw result;
}
} catch {
calledTrackOnloadEvent = false;
}
console.log(`OnLoad事件埋点: ${calledTrackOnloadEvent ? "调用成功" : "调用失败"}`);

recordInfo.push("=====[签到详情]=====");
// 获取今日签到状态 true / false
const checkInStatus = await api.getTodayStatus();
if (!checkInStatus) {
const checkInResult = await api.checkIn();
state.incrPoint = checkInResult.incr_point;
state.sumPoint = checkInResult.sum_point;
state.signStatus = "本次签到成功";
recordInfo.push("今日签到成功:++"+state.incrPoint+"矿石");
} else {
const sumPoint = await api.getCurrentPoint();
state.sumPoint = sumPoint;
state.signStatus = "今日已签到";
recordInfo.push("今日已签到");
}

const counts = await api.getCounts();
state.contCount = counts.cont_count;
state.sumCount = counts.sum_count;
recordInfo.push("连续签到:"+state.contCount+"天");
recordInfo.push("累计签到:"+state.sumCount+"天");
try {
const luckyusersResult = await api.getLotteriesLuckyUsers();
if (luckyusersResult.count > 0) {
const no1LuckyUser = luckyusersResult.lotteries[0];
const dipLuckyResult = await api.dipLucky(no1LuckyUser.history_id);
if (dipLuckyResult.has_dip) {
console.log(`今天你已经沾过喜气,明天再来吧!`);
} else {
console.log(`沾喜气 +${dipLuckyResult.dip_value} 幸运值`);
}
}
} catch(e) {
console.log(e);
}

const luckyResult = await api.getMyLucky();
state.luckyValue = luckyResult.total_value;
console.log(`当前幸运值:${state.luckyValue}/6000`);


// 获取抽奖配置

const lotteryConfig = await api.getLotteryConfig();
state.lottery = lotteryConfig.lottery;
state.pointCost = lotteryConfig.point_cost;
state.freeCount = lotteryConfig.free_count;
state.sumPoint += state.freeCount * state.pointCost;
console.log(`免费抽奖次数: ${state.freeCount}`);

console.group("奖品实况");

const getSupplyPoint = draw => {
const maybe = [
["lottery_id", "6981716980386496552"],
["lottery_name", "随机矿石"],
["lottery_type", 1]
];
if (maybe.findIndex(([prop, value]) => draw[prop] === value) !== -1) {
const supplyPoint = Number.parseInt(draw.lottery_name);
if (!isNaN(supplyPoint)) {
return supplyPoint;
}
}
return 0;
};

const lottery = async () => {
const result = await api.drawLottery();
state.sumPoint -= state.pointCost;
state.sumPoint += getSupplyPoint(result);
state.luckyValue += result.draw_lucky_value;
state.counter++;
state.prize[result.lottery_name] = (state.prize[result.lottery_name] || 0) + 1;
console.log(`[第${state.counter}抽]:${result.lottery_name}`);
};

while (state.freeCount > 0) {
await lottery();
state.freeCount--;
await $.wait(500);
}

console.groupEnd("奖品实况");

recordInfo.push("当前余额:"+state.sumPoint+"矿石");
recordInfo.push("当前幸运值:"+state.luckyValue+"/6000");
recordInfo.push("=====[抽奖详情]=====");
if (state.counter > 0) {
const prizeList = [];
for (const key in state.prize) {
prizeList.push(`${key}: ${state.prize[key]}`);
}
recordInfo.push(...prizeList);
recordInfo.push("-------------------");
recordInfo.push(`共计: ${state.counter}`);
} else {
recordInfo.push("暂无奖品");
}

try {
const bugfix = juejin.bugfix();
const notCollectBugList = await bugfix.getNotCollectBugList();
recordInfo.push("=====[bugfix]=====");
await bugfix.collectBugBatch(notCollectBugList);
recordInfo.push(`收集Bug ${notCollectBugList.length}`);

const competition = await bugfix.getCompetition();
const bugfixInfo = await bugfix.getUser(competition);
recordInfo.push(`未消除Bug数量 ${bugfixInfo.user_own_bug}`);
} catch(e) {
console.log(e);
}


await juejin.logout();
notify.sendNotify("掘金每日签到", recordInfo.join("\n"));
})()
.catch((e) => {
console.error(`❗️ ${$.name} 运行错误!\n${e}`);
})
.finally(() => $.done());



function Env(name, opts) {
class Http {
constructor(env) {
this.env = env;
}

send(opts, method = "GET") {
opts = typeof opts === "string" ? {
url: opts,
} : opts;
let sender = this.get;
if (method === "POST") {
sender = this.post;
}
return new Promise((resolve, reject) => {
sender.call(this, opts, (err, resp, body) => {
if (err) reject(err); else resolve(resp);
});
});
}

get(opts) {
return this.send.call(this.env, opts);
}

post(opts) {
return this.send.call(this.env, opts, "POST");
}
}

return new (class {
constructor(name, opts) {
this.name = name;
this.http = new Http(this);
this.data = null;
this.dataFile = "box.dat";
this.logs = [];
this.isMute = false;
this.isNeedRewrite = false;
this.logSeparator = "\n";
this.startTime = new Date().getTime();
Object.assign(this, opts);
this.log("", `🔔${this.name}, 开始!`);
}

initAxios() {
if (!this.axios) {
this.axios = axios.create();
}
}

restApi(opts, callback = () => {
}) {
this.initAxios();
this.axios(opts)
.then(resp => {
const {status, headers, data} = resp;
callback(null, {
status, headers, data,
}, data);
}, (err) => {
const {message: error, response: resp} = err;
callback(error, resp, resp && resp.data);
});
}

log(...logs) {
if (logs.length > 0) {
this.logs = [...this.logs, ...logs];
}
console.log(logs.join(this.logSeparator));
}

wait(time) {
return new Promise((resolve) => setTimeout(resolve, time));
}

done() {
const endTime = new Date().getTime();
const costTime = (endTime - this.startTime) / 1000;
this.log("", `🔔${this.name}, 结束! 🕛 ${costTime} 秒`);
}
}

)
(name, opts);
}

bilibili签到脚本

BiliBiliTool 是一个自动执行任务的工具,当我们忘记做某项任务时,它会像一个贴心小助手,按照我们预先吩咐它的命令,在指定频率、时间范围内帮助我们完成计划的任务。

详细功能如下:

  • 扫码登录,自动更新cookie
  • 每日获取满额升级经验(登录、投币、点赞、分享视频)(支持指定支持up主)
  • 直播间挂机
  • 每天漫画签到
  • 每天直播签到
  • 直播中心银瓜子兑换为硬币
  • 每月领取大会员赠送的 5 张 B 币券和福利(忘记或者不领就浪费了哦)
  • 每月领取大会员漫画福利
  • 月底在 B 币券过期前进行充电(支持指定想要支持的up主,如果没有喜欢的up,也可以为自己充个电啊,做个用爱为自己发电的人~)
  • 直播中心天选时刻自动参与抽奖
  • 批量取关
  • 大会员大积分任务
  • 支持多账号
  • 理论上支持所有远端的日志推送(默认支持推送到Telegram、企业微信、钉钉、PushPlus、Server酱、钉钉、酷推,另外也支持自定义推送到任意api)

青龙使用教程

1. 登录青龙面板并修改配置

青龙面板,配置文件页。

修改 RepoFileExtensions="js py"RepoFileExtensions="js py sh"

保存配置。

2 在青龙面板中添加拉库定时任务

两种方式,任选其一即可:

2.1. 方式一:订阅管理
1
2
3
4
5
6
7
名称:Bilibili
类型:公开仓库
链接:https://github.com/RayWangQvQ/BiliBiliToolPro.git
定时类型:crontab
定时规则:2 2 28 * *
白名单:bili_task_.+\.sh
文件后缀:sh

没提到的不要动。

保存后,点击运行按钮,运行拉库。

2.2. 方式二:定时任务拉库

青龙面板,定时任务页,右上角添加任务,填入以下信息:

1
2
3
名称:拉取Bili库
命令:ql repo https://github.com/RayWangQvQ/BiliBiliToolPro.git "bili_task_"
定时规则:2 2 28 * *

点击确定。

保存成功后,找到该定时任务,点击运行按钮,运行拉库。

3. 检查定时任务

如果正常,拉库成功后,会自动添加bilibili相关的task任务。

qinglong-tasks.png

1.4. 登录

在青龙定时任务中,点击运行bili扫码登录任务,查看运行日志,扫描日志中的二维码进行登录。
qinglong-login.png

登录成功后,会将cookie保存到青龙的环境变量中:

qinglong-env.png

首次运行会自动安装环境,时间可能长一点,之后就不需要重复安装了。

签到盒

签到列表

签到列表

时光相册每日签到

书香门第每日签到

多看阅读app每日任务薅书豆+自动延期 保底6k+

绅士领域每日签到得硬币

网易蜗牛读书每日签到

香网小说每日签到

网易云游戏每日签到得免费时长

晋江小说网每日签到

橙光游戏app每日签到+登陆奖励领取

龙空每日签到

NGA论坛每日签到

mt论坛每日签到

经管之家每日签到

好游快爆全任务(签到,分享/下载/体验游戏,抖音任务,邀请下载,照料好友)

猫耳FM每日任务

爱好论坛早中晚打卡以及全勤领取

刺猬猫每日任务(除了订阅章节)

acfun每日签到/投🍌/点赞/直播扭蛋

次元狗每日签到

联动云租车每日签到

数码之家每日签到

玩物志好物商店小程序/网页版 每日签到+浏览任务+三次抽奖

阅次元论坛每日签到

富贵论坛每日签到

好书友论坛每日签到

ug爱好者每日签到

纪录片之家每日签到

togamemod每日签到

魅族社区每日签到

菜鸟图库每日签到

埋堆堆app每日任务

闪艺app每日所有任务

有分享每日签到

bigfun每日任务

阡陌居每日签到

HiFiNi每日签到

Hires后花园每日签到

爱企查每日任务

曲奇云盘每日任务

4399游戏盒疯狂游乐城/app试玩/等级小怪/闯三关/福利中心任务

鱼C论坛每日签到

村花论坛每日签到

帆软社区签到/大转盘/摇摇乐

瞻彼文学app每日签到

云原神每日签到

Qoo app 每日签到

天使动漫每日签到and打工 tsdmsign为单独的签到模块,tsdmwork为单独的打工模块

耽漫每日签到

轻之文库每日签到

游戏动力app每日任务

立创每日签到

捷配每日签到

花火论坛每日签到

17k小说每日签到

触站每日签到任务

起点读书 app每日签到+投推荐票+角色比心

美团买菜每日任务

次元姬小说每日任务

AME字幕论坛每日签到

黑丝次元每日签到

克拉漫播每日签到

库街区每日任务

linkai每日签到

泡芙加速器每日签到+看广告+兑换(抓包vx小程序)

海贼王论坛每日签到

共创世界每日签到

月影别墅每日任务

科研通每日签到

pdg2pdf每日签到

高清mp4每日登录

Go柄每日签到

小白云盘每日签到

青龙使用教程

1
ql repo https://github.com/Wenmoux/checkbox.git "checkbox|install" "old" "modules|scripts|config|Template|sendmsg" "master"

1 首先在青龙目录下config.sh设置里拉取sh后缀文件 大概这个自己找RepoFileExtensions = xxx这一行 里边加上sh就可以了
2 在面板内添加定时任务 (上面ql repo那条 定时看你)
3 手动运行签到盒安装任务 无需禁用
4 在ql/data/config/config.yml里填写cookie以及需要运行的任务列表(开头cbList)等信息
5 注意 必须最新版青龙 不然你就手动创建个配置文件吧

JD领豆

京东各种活动,签到领京豆。

推荐获取 JD_cookie工具