mirror of
https://github.com/ngfchl/ptools
synced 2023-07-10 13:41:22 +08:00
1. 优化网站连接失败错误返回信息
2. 继续优化在线更新功能 3. 优化MT个人数据获取规则
This commit is contained in:
1
.dockerignore
Normal file
1
.dockerignore
Normal file
@@ -0,0 +1 @@
|
||||
/venv/
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
||||
/venv/
|
||||
/db/
|
||||
|
||||
@@ -11,8 +11,6 @@ ENV PYTHONUNBUFFERED 1
|
||||
ENV DJANGO_SUPERUSER_USERNAME=admin
|
||||
ENV DJANGO_SUPERUSER_EMAIL=admin@eamil.com
|
||||
ENV DJANGO_SUPERUSER_PASSWORD=adminadmin
|
||||
ENV DJANGO_WEB_PORT=8000
|
||||
ENV DJANGO_DEBUG=True
|
||||
|
||||
COPY pip.conf /root/.pip/pip.conf
|
||||
|
||||
|
||||
@@ -1,289 +0,0 @@
|
||||
# Generated by Django 4.1 on 2022-08-24 15:08
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = []
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name="Notify",
|
||||
fields=[
|
||||
(
|
||||
"id",
|
||||
models.BigAutoField(
|
||||
auto_created=True,
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
verbose_name="ID",
|
||||
),
|
||||
),
|
||||
(
|
||||
"created_at",
|
||||
models.DateTimeField(auto_now_add=True, verbose_name="创建时间"),
|
||||
),
|
||||
(
|
||||
"updated_at",
|
||||
models.DateTimeField(auto_now=True, verbose_name="更新时间"),
|
||||
),
|
||||
(
|
||||
"name",
|
||||
models.CharField(
|
||||
choices=[
|
||||
("wechat_work_push", "企业微信通知"),
|
||||
("wxpusher_push", "WxPusher通知"),
|
||||
("pushdeer_push", "PushDeer通知"),
|
||||
("bark_push", "Bark通知"),
|
||||
],
|
||||
default="wechat_work_push",
|
||||
max_length=64,
|
||||
verbose_name="通知方式",
|
||||
),
|
||||
),
|
||||
(
|
||||
"enable",
|
||||
models.BooleanField(
|
||||
default=True, help_text="只有开启才能发送哦!", verbose_name="开启通知"
|
||||
),
|
||||
),
|
||||
(
|
||||
"corpid",
|
||||
models.CharField(
|
||||
blank=True,
|
||||
help_text="微信企业ID",
|
||||
max_length=64,
|
||||
null=True,
|
||||
verbose_name="企业ID",
|
||||
),
|
||||
),
|
||||
(
|
||||
"corpsecret",
|
||||
models.CharField(
|
||||
blank=True,
|
||||
help_text="应用的Secret/Token",
|
||||
max_length=64,
|
||||
null=True,
|
||||
verbose_name="Secret",
|
||||
),
|
||||
),
|
||||
(
|
||||
"agentid",
|
||||
models.CharField(
|
||||
blank=True,
|
||||
help_text="APP ID",
|
||||
max_length=64,
|
||||
null=True,
|
||||
verbose_name="应用ID",
|
||||
),
|
||||
),
|
||||
(
|
||||
"touser",
|
||||
models.CharField(
|
||||
blank=True,
|
||||
help_text="接收者用户名/UID",
|
||||
max_length=64,
|
||||
null=True,
|
||||
verbose_name="接收者",
|
||||
),
|
||||
),
|
||||
(
|
||||
"custom_server",
|
||||
models.URLField(
|
||||
blank=True,
|
||||
help_text="无自定义服务器的,请勿填写!",
|
||||
null=True,
|
||||
verbose_name="自定义服务器",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={"verbose_name": "通知推送", "verbose_name_plural": "通知推送",},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name="OCR",
|
||||
fields=[
|
||||
(
|
||||
"id",
|
||||
models.BigAutoField(
|
||||
auto_created=True,
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
verbose_name="ID",
|
||||
),
|
||||
),
|
||||
(
|
||||
"created_at",
|
||||
models.DateTimeField(auto_now_add=True, verbose_name="创建时间"),
|
||||
),
|
||||
(
|
||||
"updated_at",
|
||||
models.DateTimeField(auto_now=True, verbose_name="更新时间"),
|
||||
),
|
||||
(
|
||||
"name",
|
||||
models.CharField(
|
||||
choices=[("baidu_aip", "百度OCR")],
|
||||
default="baidu_aip",
|
||||
max_length=64,
|
||||
verbose_name="OCR",
|
||||
),
|
||||
),
|
||||
("enable", models.BooleanField(default=False, verbose_name="启用")),
|
||||
(
|
||||
"api_key",
|
||||
models.CharField(
|
||||
blank=True, max_length=64, null=True, verbose_name="API-Key"
|
||||
),
|
||||
),
|
||||
(
|
||||
"secret_key",
|
||||
models.CharField(
|
||||
blank=True,
|
||||
help_text="应用的Secret",
|
||||
max_length=64,
|
||||
null=True,
|
||||
verbose_name="Secret",
|
||||
),
|
||||
),
|
||||
(
|
||||
"app_id",
|
||||
models.CharField(
|
||||
blank=True,
|
||||
help_text="APP ID",
|
||||
max_length=64,
|
||||
null=True,
|
||||
verbose_name="应用ID",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={"verbose_name": "OCR识别", "verbose_name_plural": "OCR识别",},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name="Task",
|
||||
fields=[
|
||||
(
|
||||
"id",
|
||||
models.BigAutoField(
|
||||
auto_created=True,
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
verbose_name="ID",
|
||||
),
|
||||
),
|
||||
(
|
||||
"created_at",
|
||||
models.DateTimeField(auto_now_add=True, verbose_name="创建时间"),
|
||||
),
|
||||
(
|
||||
"updated_at",
|
||||
models.DateTimeField(auto_now=True, verbose_name="更新时间"),
|
||||
),
|
||||
("name", models.CharField(max_length=32, verbose_name="任务名称")),
|
||||
("desc", models.CharField(max_length=32, verbose_name="任务描述")),
|
||||
],
|
||||
options={
|
||||
"verbose_name": "任务",
|
||||
"verbose_name_plural": "任务",
|
||||
"ordering": ("name",),
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name="TaskJob",
|
||||
fields=[
|
||||
(
|
||||
"id",
|
||||
models.BigAutoField(
|
||||
auto_created=True,
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
verbose_name="ID",
|
||||
),
|
||||
),
|
||||
(
|
||||
"created_at",
|
||||
models.DateTimeField(auto_now_add=True, verbose_name="创建时间"),
|
||||
),
|
||||
(
|
||||
"updated_at",
|
||||
models.DateTimeField(auto_now=True, verbose_name="更新时间"),
|
||||
),
|
||||
(
|
||||
"job_id",
|
||||
models.CharField(max_length=16, unique=True, verbose_name="任务ID"),
|
||||
),
|
||||
(
|
||||
"trigger",
|
||||
models.CharField(
|
||||
choices=[("interval", "间隔任务"), ("cron", "cron任务")],
|
||||
default="cron",
|
||||
max_length=64,
|
||||
verbose_name="任务类型",
|
||||
),
|
||||
),
|
||||
("task_exec", models.BooleanField(default=False, verbose_name="开启任务")),
|
||||
(
|
||||
"replace_existing",
|
||||
models.BooleanField(
|
||||
default=True,
|
||||
help_text="不设置此项重启项目后会报任务id已存在的错误, 设置此参数后会对已有的任务进行覆盖",
|
||||
verbose_name="覆盖任务",
|
||||
),
|
||||
),
|
||||
(
|
||||
"expression_time",
|
||||
models.CharField(
|
||||
help_text="在间隔任务表示间隔时长使用数字,单位:秒,corn任务中为corn表达式:“0 15 8 ? * * 2022”",
|
||||
max_length=64,
|
||||
verbose_name="时间表达式",
|
||||
),
|
||||
),
|
||||
(
|
||||
"start_date",
|
||||
models.DateTimeField(blank=True, null=True, verbose_name="任务开始时间"),
|
||||
),
|
||||
(
|
||||
"end_date",
|
||||
models.DateTimeField(blank=True, null=True, verbose_name="任务结束时间"),
|
||||
),
|
||||
(
|
||||
"misfire_grace_time",
|
||||
models.IntegerField(
|
||||
default=120,
|
||||
help_text="强制执行结束的时间, 为避免撞车导致任务丢失, 没执行完就别执行了",
|
||||
verbose_name="任务运行时间",
|
||||
),
|
||||
),
|
||||
(
|
||||
"jitter",
|
||||
models.IntegerField(
|
||||
default=120,
|
||||
help_text="强制执行结束的时间, 为避免撞车导致任务丢失, 没执行完就别执行了",
|
||||
verbose_name="时间浮动参数",
|
||||
),
|
||||
),
|
||||
(
|
||||
"args",
|
||||
models.CharField(
|
||||
blank=True,
|
||||
help_text="执行代码所需要的参数。",
|
||||
max_length=128,
|
||||
null=True,
|
||||
verbose_name="任务参数",
|
||||
),
|
||||
),
|
||||
(
|
||||
"task",
|
||||
models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="auto_pt.task",
|
||||
verbose_name="任务名称",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={"verbose_name": "计划任务", "verbose_name_plural": "计划任务",},
|
||||
),
|
||||
]
|
||||
@@ -10,5 +10,6 @@ urlpatterns = [
|
||||
path(r'test_notify', views.test_notify, name='test_notify'),
|
||||
path(r'restart', views.restart_container, name='restart_container'),
|
||||
path(r'do_restart', views.do_restart, name='do_restart'),
|
||||
path(r'do_restart', views.do_restart, name='do_restart'),
|
||||
path(r'do_update', views.do_update, name='do_update'),
|
||||
]
|
||||
|
||||
@@ -85,10 +85,14 @@ def do_restart(request):
|
||||
try:
|
||||
print('重启')
|
||||
# print(os.system('pwd'))
|
||||
subprocess.Popen('chmod +x ./update.sh', shell=True)
|
||||
subprocess.Popen('./restart.sh')
|
||||
return JsonResponse(data=CommonResponse.success(
|
||||
msg='重启指令发送成功!!'
|
||||
if os.environ.get('DJANGO_DEBUG'):
|
||||
subprocess.Popen('chmod +x ./restart.sh', shell=True)
|
||||
subprocess.Popen('./restart.sh', shell=True)
|
||||
return JsonResponse(data=CommonResponse.success(
|
||||
msg='重启指令发送成功!!'
|
||||
).to_dict(), safe=False)
|
||||
return JsonResponse(data=CommonResponse.error(
|
||||
msg='未配置CONTAINER_NAME(容器名称)环境变量!!'
|
||||
).to_dict(), safe=False)
|
||||
except Exception as e:
|
||||
return JsonResponse(data=CommonResponse.error(
|
||||
@@ -99,13 +103,19 @@ def do_restart(request):
|
||||
def do_update(request):
|
||||
try:
|
||||
print('更新')
|
||||
print(os.system('cat ./update.sh'))
|
||||
p = subprocess.Popen('chmod +x ./update.sh', shell=True)
|
||||
# print(os.system('cat ./update.sh'))
|
||||
subprocess.Popen('chmod +x ./update.sh', shell=True)
|
||||
|
||||
subprocess.Popen('./update.sh')
|
||||
p = subprocess.Popen('./update.sh', shell=True, stdout=subprocess.PIPE, bufsize=1)
|
||||
p.wait()
|
||||
# result = []
|
||||
# for i in p.stdout.readlines():
|
||||
# print(i)
|
||||
# result.append(i)
|
||||
return JsonResponse(data=CommonResponse.success(
|
||||
msg='更新成功!!'
|
||||
msg='更新成功!!', data={
|
||||
'p': str(p.stdout.readlines())
|
||||
}
|
||||
).to_dict(), safe=False)
|
||||
except Exception as e:
|
||||
return JsonResponse(data=CommonResponse.error(
|
||||
|
||||
1
dumpdata.sh
Normal file
1
dumpdata.sh
Normal file
@@ -0,0 +1 @@
|
||||
python manage.py dumpdata django_apscheduler pt_site.site auto_pt.task auto_pt.taskjob --indent 2 -o pt.json
|
||||
51
pt.json
51
pt.json
@@ -3,24 +3,24 @@
|
||||
"model": "django_apscheduler.djangojob",
|
||||
"pk": "拉取最新种子",
|
||||
"fields": {
|
||||
"next_run_time": "2022-08-24T19:55:18.824",
|
||||
"job_state": "gAWVAQIAAAAAAAB9lCiMB3ZlcnNpb26USwGMAmlklIwS5ouJ5Y+W5pyA5paw56eN5a2QlIwEZnVuY5SMInB0X3NpdGUudmlld3M6YXV0b191cGRhdGVfdG9ycmVudHOUjAd0cmlnZ2VylIwdYXBzY2hlZHVsZXIudHJpZ2dlcnMuaW50ZXJ2YWyUjA9JbnRlcnZhbFRyaWdnZXKUk5QpgZR9lChoAUsCjAh0aW1lem9uZZSMBHB5dHqUjAJfcJSTlCiMDUFzaWEvU2hhbmdoYWmUTehxSwCMA0xNVJR0lFKUjApzdGFydF9kYXRllIwIZGF0ZXRpbWWUjAhkYXRldGltZZSTlEMKB+YIEgMaCQnXnJRoDyhoEE2AcEsAjANDU1SUdJRSlIaUUpSMCGVuZF9kYXRllE6MCGludGVydmFslGgVjAl0aW1lZGVsdGGUk5RLAE1QRksAh5RSlIwGaml0dGVylEt4dWKMCGV4ZWN1dG9ylIwHZGVmYXVsdJSMBGFyZ3OUKYwGa3dhcmdzlH2UjARuYW1llIwUYXV0b191cGRhdGVfdG9ycmVudHOUjBJtaXNmaXJlX2dyYWNlX3RpbWWUS3iMCGNvYWxlc2NllIiMDW1heF9pbnN0YW5jZXOUSwGMDW5leHRfcnVuX3RpbWWUaBdDCgfmCBgTNxIMk4qUaBuGlFKUdS4="
|
||||
"next_run_time": "2022-08-25T10:58:36.742",
|
||||
"job_state": "gAWVAQIAAAAAAAB9lCiMB3ZlcnNpb26USwGMAmlklIwS5ouJ5Y+W5pyA5paw56eN5a2QlIwEZnVuY5SMInB0X3NpdGUudmlld3M6YXV0b191cGRhdGVfdG9ycmVudHOUjAd0cmlnZ2VylIwdYXBzY2hlZHVsZXIudHJpZ2dlcnMuaW50ZXJ2YWyUjA9JbnRlcnZhbFRyaWdnZXKUk5QpgZR9lChoAUsCjAh0aW1lem9uZZSMBHB5dHqUjAJfcJSTlCiMDUFzaWEvU2hhbmdoYWmUTehxSwCMA0xNVJR0lFKUjApzdGFydF9kYXRllIwIZGF0ZXRpbWWUjAhkYXRldGltZZSTlEMKB+YIEgMaCQnXnJRoDyhoEE2AcEsAjANDU1SUdJRSlIaUUpSMCGVuZF9kYXRllE6MCGludGVydmFslGgVjAl0aW1lZGVsdGGUk5RLAE1QRksAh5RSlIwGaml0dGVylEt4dWKMCGV4ZWN1dG9ylIwHZGVmYXVsdJSMBGFyZ3OUKYwGa3dhcmdzlH2UjARuYW1llIwUYXV0b191cGRhdGVfdG9ycmVudHOUjBJtaXNmaXJlX2dyYWNlX3RpbWWUS3iMCGNvYWxlc2NllIiMDW1heF9pbnN0YW5jZXOUSwGMDW5leHRfcnVuX3RpbWWUaBdDCgfmCBkKOiQLVeuUaBuGlFKUdS4="
|
||||
}
|
||||
},
|
||||
{
|
||||
"model": "django_apscheduler.djangojob",
|
||||
"pk": "更新个人数据",
|
||||
"fields": {
|
||||
"next_run_time": "2022-08-24T19:50:46.323",
|
||||
"job_state": "gAWV9wEAAAAAAAB9lCiMB3ZlcnNpb26USwGMAmlklIwS5pu05paw5Liq5Lq65pWw5o2ulIwEZnVuY5SMHXB0X3NpdGUudmlld3M6YXV0b19nZXRfc3RhdHVzlIwHdHJpZ2dlcpSMHWFwc2NoZWR1bGVyLnRyaWdnZXJzLmludGVydmFslIwPSW50ZXJ2YWxUcmlnZ2VylJOUKYGUfZQoaAFLAowIdGltZXpvbmWUjARweXR6lIwCX3CUk5QojA1Bc2lhL1NoYW5naGFplE3ocUsAjANMTVSUdJRSlIwKc3RhcnRfZGF0ZZSMCGRhdGV0aW1llIwIZGF0ZXRpbWWUk5RDCgfmCBIDDiEIBqyUaA8oaBBNgHBLAIwDQ1NUlHSUUpSGlFKUjAhlbmRfZGF0ZZROjAhpbnRlcnZhbJRoFYwJdGltZWRlbHRhlJOUSwBNUEZLAIeUUpSMBmppdHRlcpRLeHVijAhleGVjdXRvcpSMB2RlZmF1bHSUjARhcmdzlCmMBmt3YXJnc5R9lIwEbmFtZZSMD2F1dG9fZ2V0X3N0YXR1c5SMEm1pc2ZpcmVfZ3JhY2VfdGltZZRLeIwIY29hbGVzY2WUiIwNbWF4X2luc3RhbmNlc5RLAYwNbmV4dF9ydW5fdGltZZRoF0MKB+YIGBMyLgTuRZRoG4aUUpR1Lg=="
|
||||
"next_run_time": "2022-08-25T10:52:39.798",
|
||||
"job_state": "gAWV9wEAAAAAAAB9lCiMB3ZlcnNpb26USwGMAmlklIwS5pu05paw5Liq5Lq65pWw5o2ulIwEZnVuY5SMHXB0X3NpdGUudmlld3M6YXV0b19nZXRfc3RhdHVzlIwHdHJpZ2dlcpSMHWFwc2NoZWR1bGVyLnRyaWdnZXJzLmludGVydmFslIwPSW50ZXJ2YWxUcmlnZ2VylJOUKYGUfZQoaAFLAowIdGltZXpvbmWUjARweXR6lIwCX3CUk5QojA1Bc2lhL1NoYW5naGFplE3ocUsAjANMTVSUdJRSlIwKc3RhcnRfZGF0ZZSMCGRhdGV0aW1llIwIZGF0ZXRpbWWUk5RDCgfmCBIDDiEIBqyUaA8oaBBNgHBLAIwDQ1NUlHSUUpSGlFKUjAhlbmRfZGF0ZZROjAhpbnRlcnZhbJRoFYwJdGltZWRlbHRhlJOUSwBNUEZLAIeUUpSMBmppdHRlcpRLeHVijAhleGVjdXRvcpSMB2RlZmF1bHSUjARhcmdzlCmMBmt3YXJnc5R9lIwEbmFtZZSMD2F1dG9fZ2V0X3N0YXR1c5SMEm1pc2ZpcmVfZ3JhY2VfdGltZZRLeIwIY29hbGVzY2WUiIwNbWF4X2luc3RhbmNlc5RLAYwNbmV4dF9ydW5fdGltZZRoF0MKB+YIGQo0JwwwlJRoG4aUUpR1Lg=="
|
||||
}
|
||||
},
|
||||
{
|
||||
"model": "django_apscheduler.djangojob",
|
||||
"pk": "自动签到",
|
||||
"fields": {
|
||||
"next_run_time": "2022-08-24T21:32:11.150",
|
||||
"job_state": "gAWV6wEAAAAAAAB9lCiMB3ZlcnNpb26USwGMAmlklIwM6Ieq5Yqo562+5YiwlIwEZnVuY5SMGnB0X3NpdGUudmlld3M6YXV0b19zaWduX2lulIwHdHJpZ2dlcpSMHWFwc2NoZWR1bGVyLnRyaWdnZXJzLmludGVydmFslIwPSW50ZXJ2YWxUcmlnZ2VylJOUKYGUfZQoaAFLAowIdGltZXpvbmWUjARweXR6lIwCX3CUk5QojA1Bc2lhL1NoYW5naGFplE3ocUsAjANMTVSUdJRSlIwKc3RhcnRfZGF0ZZSMCGRhdGV0aW1llIwIZGF0ZXRpbWWUk5RDCgfmCBYUGRENK2+UaA8oaBBNgHBLAIwDQ1NUlHSUUpSGlFKUjAhlbmRfZGF0ZZROjAhpbnRlcnZhbJRoFYwJdGltZWRlbHRhlJOUSwBNcGJLAIeUUpSMBmppdHRlcpRLeHVijAhleGVjdXRvcpSMB2RlZmF1bHSUjARhcmdzlCmMBmt3YXJnc5R9lIwEbmFtZZSMDGF1dG9fc2lnbl9pbpSMEm1pc2ZpcmVfZ3JhY2VfdGltZZRLeIwIY29hbGVzY2WUiIwNbWF4X2luc3RhbmNlc5RLAYwNbmV4dF9ydW5fdGltZZRoF0MKB+YIGBUgCwJKF5RoG4aUUpR1Lg=="
|
||||
"next_run_time": "2022-08-25T11:33:58.995",
|
||||
"job_state": "gAWV6wEAAAAAAAB9lCiMB3ZlcnNpb26USwGMAmlklIwM6Ieq5Yqo562+5YiwlIwEZnVuY5SMGnB0X3NpdGUudmlld3M6YXV0b19zaWduX2lulIwHdHJpZ2dlcpSMHWFwc2NoZWR1bGVyLnRyaWdnZXJzLmludGVydmFslIwPSW50ZXJ2YWxUcmlnZ2VylJOUKYGUfZQoaAFLAowIdGltZXpvbmWUjARweXR6lIwCX3CUk5QojA1Bc2lhL1NoYW5naGFplE3ocUsAjANMTVSUdJRSlIwKc3RhcnRfZGF0ZZSMCGRhdGV0aW1llIwIZGF0ZXRpbWWUk5RDCgfmCBYUGRENK2+UaA8oaBBNgHBLAIwDQ1NUlHSUUpSGlFKUjAhlbmRfZGF0ZZROjAhpbnRlcnZhbJRoFYwJdGltZWRlbHRhlJOUSwBNcGJLAIeUUpSMBmppdHRlcpRLeHVijAhleGVjdXRvcpSMB2RlZmF1bHSUjARhcmdzlCmMBmt3YXJnc5R9lIwEbmFtZZSMDGF1dG9fc2lnbl9pbpSMEm1pc2ZpcmVfZ3JhY2VfdGltZZRLeIwIY29hbGVzY2WUiIwNbWF4X2luc3RhbmNlc5RLAYwNbmV4dF9ydW5fdGltZZRoF0MKB+YIGQshOg8v35RoG4aUUpR1Lg=="
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -374,6 +374,45 @@
|
||||
"traceback": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"model": "django_apscheduler.djangojobexecution",
|
||||
"pk": 321,
|
||||
"fields": {
|
||||
"job": "更新个人数据",
|
||||
"status": "Missed!",
|
||||
"run_time": "2022-08-25T05:51:44.120",
|
||||
"duration": "2685.67",
|
||||
"finished": "1661380589.79",
|
||||
"exception": "Run time of job '更新个人数据' was missed!",
|
||||
"traceback": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"model": "django_apscheduler.djangojobexecution",
|
||||
"pk": 322,
|
||||
"fields": {
|
||||
"job": "拉取最新种子",
|
||||
"status": "Missed!",
|
||||
"run_time": "2022-08-25T05:58:15.166",
|
||||
"duration": "2294.64",
|
||||
"finished": "1661380589.80",
|
||||
"exception": "Run time of job '拉取最新种子' was missed!",
|
||||
"traceback": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"model": "django_apscheduler.djangojobexecution",
|
||||
"pk": 323,
|
||||
"fields": {
|
||||
"job": "自动签到",
|
||||
"status": "Missed!",
|
||||
"run_time": "2022-08-25T04:33:39.143",
|
||||
"duration": "7370.67",
|
||||
"finished": "1661380589.81",
|
||||
"exception": "Run time of job '自动签到' was missed!",
|
||||
"traceback": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"model": "pt_site.site",
|
||||
"pk": 1,
|
||||
|
||||
@@ -1,17 +1,18 @@
|
||||
import logging
|
||||
import re
|
||||
import threading
|
||||
import time
|
||||
from datetime import datetime
|
||||
|
||||
import aip
|
||||
import cloudscraper
|
||||
import opencc
|
||||
import time
|
||||
from django.db import transaction
|
||||
from django.db.models import QuerySet
|
||||
from lxml import etree
|
||||
from pypushdeer import PushDeer
|
||||
from requests import Response
|
||||
from urllib3.exceptions import NewConnectionError
|
||||
from wechat_push import WechatPush
|
||||
from wxpusher import WxPusher
|
||||
|
||||
@@ -721,6 +722,10 @@ class PtSpider:
|
||||
'seeding_html': seeding_html,
|
||||
# 'leeching_html': leeching_html
|
||||
})
|
||||
except NewConnectionError as nce:
|
||||
return CommonResponse.error(
|
||||
status=StatusCodeEnum.WEB_CONNECT_ERR,
|
||||
msg='链接网站失败,请检查网站是否维护状态??')
|
||||
except Exception as e:
|
||||
message = my_site.site.name + '访问个人主页信息:失败!原因:' + str(e)
|
||||
logging.error(message)
|
||||
@@ -747,7 +752,7 @@ class PtSpider:
|
||||
seed_vol_list = seeding_html.xpath(site.seed_vol_rule)
|
||||
if len(seed_vol_list) > 0:
|
||||
seed_vol_list.pop(0)
|
||||
# print('seeding_vol', seed_vol_list)
|
||||
print('seeding_vol', len(seed_vol_list))
|
||||
# 做种体积
|
||||
seed_vol_all = 0
|
||||
for seed_vol in seed_vol_list:
|
||||
@@ -765,8 +770,8 @@ class PtSpider:
|
||||
# leech = self.get_user_torrent(leeching_html, site.leech_rule)
|
||||
# seed = self.get_user_torrent(seeding_html, site.seed_rule)
|
||||
leech = ''.join(details_html.xpath(site.leech_rule)).strip()
|
||||
# seed = ''.join(details_html.xpath(site.leech_rule)).strip()
|
||||
seed = len(seed_vol_list)
|
||||
seed = ''.join(details_html.xpath(site.leech_rule)).strip()
|
||||
# seed = len(seed_vol_list)
|
||||
ratio = ''.join(details_html.xpath(site.ratio_rule)).replace(',', '').strip(']:').strip()
|
||||
if ratio == '无限' or ratio == '∞' or ratio == '---':
|
||||
# inf表示无限
|
||||
|
||||
@@ -1,867 +0,0 @@
|
||||
# Generated by Django 4.1 on 2022-08-24 15:08
|
||||
|
||||
import django.core.validators
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = []
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name="Downloader",
|
||||
fields=[
|
||||
(
|
||||
"id",
|
||||
models.BigAutoField(
|
||||
auto_created=True,
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
verbose_name="ID",
|
||||
),
|
||||
),
|
||||
(
|
||||
"created_at",
|
||||
models.DateTimeField(auto_now_add=True, verbose_name="创建时间"),
|
||||
),
|
||||
(
|
||||
"updated_at",
|
||||
models.DateTimeField(auto_now=True, verbose_name="更新时间"),
|
||||
),
|
||||
("name", models.CharField(max_length=12, verbose_name="名称")),
|
||||
(
|
||||
"category",
|
||||
models.CharField(
|
||||
choices=[("Qb", "qBittorrent")],
|
||||
default="Qb",
|
||||
max_length=128,
|
||||
verbose_name="下载器",
|
||||
),
|
||||
),
|
||||
("username", models.CharField(max_length=16, verbose_name="用户名")),
|
||||
("password", models.CharField(max_length=128, verbose_name="密码")),
|
||||
("host", models.CharField(max_length=32, verbose_name="HOST")),
|
||||
(
|
||||
"port",
|
||||
models.IntegerField(
|
||||
default=8999,
|
||||
validators=[
|
||||
django.core.validators.MaxValueValidator(65535),
|
||||
django.core.validators.MinValueValidator(1001),
|
||||
],
|
||||
verbose_name="端口",
|
||||
),
|
||||
),
|
||||
(
|
||||
"reserved_space",
|
||||
models.IntegerField(
|
||||
default=30,
|
||||
help_text="单位GB,最小为1G,最大512G",
|
||||
validators=[
|
||||
django.core.validators.MinValueValidator(1),
|
||||
django.core.validators.MaxValueValidator(512),
|
||||
],
|
||||
verbose_name="预留磁盘空间",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={"verbose_name": "下载器", "verbose_name_plural": "下载器",},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name="MySite",
|
||||
fields=[
|
||||
(
|
||||
"id",
|
||||
models.BigAutoField(
|
||||
auto_created=True,
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
verbose_name="ID",
|
||||
),
|
||||
),
|
||||
(
|
||||
"created_at",
|
||||
models.DateTimeField(auto_now_add=True, verbose_name="创建时间"),
|
||||
),
|
||||
(
|
||||
"updated_at",
|
||||
models.DateTimeField(auto_now=True, verbose_name="更新时间"),
|
||||
),
|
||||
("sort_id", models.IntegerField(default=1, verbose_name="排序")),
|
||||
("user_id", models.CharField(max_length=16, verbose_name="用户ID")),
|
||||
("passkey", models.CharField(max_length=128, verbose_name="PassKey")),
|
||||
("cookie", models.TextField(verbose_name="COOKIE")),
|
||||
(
|
||||
"hr",
|
||||
models.BooleanField(
|
||||
default=False, help_text="是否下载HR种子", verbose_name="开启HR下载"
|
||||
),
|
||||
),
|
||||
(
|
||||
"sign_in",
|
||||
models.BooleanField(
|
||||
default=True, help_text="是否开启签到", verbose_name="开启签到"
|
||||
),
|
||||
),
|
||||
(
|
||||
"search",
|
||||
models.BooleanField(
|
||||
default=True, help_text="是否开启搜索", verbose_name="开启搜索"
|
||||
),
|
||||
),
|
||||
("invitation", models.IntegerField(default=0, verbose_name="邀请资格")),
|
||||
(
|
||||
"time_join",
|
||||
models.DateTimeField(blank=True, null=True, verbose_name="注册时间"),
|
||||
),
|
||||
(
|
||||
"latest_active",
|
||||
models.DateTimeField(blank=True, null=True, verbose_name="最近活动时间"),
|
||||
),
|
||||
(
|
||||
"sp_hour",
|
||||
models.CharField(default="", max_length=8, verbose_name="时魔"),
|
||||
),
|
||||
(
|
||||
"my_level",
|
||||
models.CharField(default="", max_length=16, verbose_name="用户等级"),
|
||||
),
|
||||
(
|
||||
"my_hr",
|
||||
models.CharField(default="", max_length=16, verbose_name="H&R"),
|
||||
),
|
||||
("leech", models.IntegerField(default=0, verbose_name="当前下载")),
|
||||
("seed", models.IntegerField(default=0, verbose_name="当前做种")),
|
||||
("mail", models.IntegerField(default=0, verbose_name="新邮件")),
|
||||
("publish", models.IntegerField(default=0, verbose_name="发布种子")),
|
||||
],
|
||||
options={"verbose_name": "我的站点", "verbose_name_plural": "我的站点",},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name="Site",
|
||||
fields=[
|
||||
(
|
||||
"id",
|
||||
models.BigAutoField(
|
||||
auto_created=True,
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
verbose_name="ID",
|
||||
),
|
||||
),
|
||||
(
|
||||
"created_at",
|
||||
models.DateTimeField(auto_now_add=True, verbose_name="创建时间"),
|
||||
),
|
||||
(
|
||||
"updated_at",
|
||||
models.DateTimeField(auto_now=True, verbose_name="更新时间"),
|
||||
),
|
||||
("name", models.CharField(max_length=32, verbose_name="站点名称")),
|
||||
(
|
||||
"url",
|
||||
models.URLField(
|
||||
default="", help_text='请保留网址结尾的"/"', verbose_name="站点网址"
|
||||
),
|
||||
),
|
||||
(
|
||||
"logo",
|
||||
models.URLField(
|
||||
default="", help_text="站点logo图标", verbose_name="站点logo"
|
||||
),
|
||||
),
|
||||
(
|
||||
"sign_in_support",
|
||||
models.BooleanField(default=True, verbose_name="签到支持"),
|
||||
),
|
||||
(
|
||||
"get_torrent_support",
|
||||
models.BooleanField(default=True, verbose_name="拉取首页种子"),
|
||||
),
|
||||
(
|
||||
"get_userinfo_support",
|
||||
models.BooleanField(default=True, verbose_name="获取个人数据"),
|
||||
),
|
||||
(
|
||||
"search_support",
|
||||
models.BooleanField(default=False, verbose_name="搜索支持"),
|
||||
),
|
||||
(
|
||||
"page_default",
|
||||
models.CharField(
|
||||
default="torrents.php", max_length=64, verbose_name="默认搜索页面"
|
||||
),
|
||||
),
|
||||
(
|
||||
"page_sign_in",
|
||||
models.CharField(
|
||||
default="attendance.php", max_length=64, verbose_name="默认签到链接"
|
||||
),
|
||||
),
|
||||
(
|
||||
"page_detail",
|
||||
models.CharField(
|
||||
default="details.php?id={}",
|
||||
max_length=64,
|
||||
verbose_name="详情页面链接",
|
||||
),
|
||||
),
|
||||
(
|
||||
"page_download",
|
||||
models.CharField(
|
||||
default="download.php?id={}",
|
||||
max_length=64,
|
||||
verbose_name="默认下载链接",
|
||||
),
|
||||
),
|
||||
(
|
||||
"page_user",
|
||||
models.CharField(
|
||||
default="userdetails.php?id={}",
|
||||
max_length=64,
|
||||
verbose_name="用户信息链接",
|
||||
),
|
||||
),
|
||||
(
|
||||
"page_search",
|
||||
models.CharField(
|
||||
default="torrents.php?search={}",
|
||||
max_length=64,
|
||||
verbose_name="搜索链接",
|
||||
),
|
||||
),
|
||||
(
|
||||
"page_leeching",
|
||||
models.CharField(
|
||||
default="getusertorrentlistajax.php?userid={}&type=leeching",
|
||||
max_length=64,
|
||||
verbose_name="当前下载信息",
|
||||
),
|
||||
),
|
||||
(
|
||||
"page_uploaded",
|
||||
models.CharField(
|
||||
default="getusertorrentlistajax.php?userid={}&type=uploaded",
|
||||
max_length=64,
|
||||
verbose_name="发布种子信息",
|
||||
),
|
||||
),
|
||||
(
|
||||
"page_seeding",
|
||||
models.CharField(
|
||||
default="getusertorrentlistajax.php?userid={}&type=seeding",
|
||||
max_length=64,
|
||||
verbose_name="当前做种信息",
|
||||
),
|
||||
),
|
||||
(
|
||||
"page_completed",
|
||||
models.CharField(
|
||||
default="getusertorrentlistajax.php?userid={}&type=completed",
|
||||
max_length=64,
|
||||
verbose_name="完成种子信息",
|
||||
),
|
||||
),
|
||||
(
|
||||
"page_mybonus",
|
||||
models.CharField(
|
||||
default="mybonus.php", max_length=64, verbose_name="魔力值页面"
|
||||
),
|
||||
),
|
||||
(
|
||||
"page_viewfilelist",
|
||||
models.CharField(
|
||||
default="viewfilelist.php?id={}",
|
||||
max_length=64,
|
||||
verbose_name="文件列表链接",
|
||||
),
|
||||
),
|
||||
(
|
||||
"page_viewpeerlist",
|
||||
models.CharField(
|
||||
default="viewpeerlist.php?id={}",
|
||||
max_length=64,
|
||||
verbose_name="当前用户列表",
|
||||
),
|
||||
),
|
||||
(
|
||||
"sign_in_method",
|
||||
models.CharField(
|
||||
default="get",
|
||||
help_text="get或post,请使用小写字母,默认get",
|
||||
max_length=5,
|
||||
verbose_name="签到请求方法",
|
||||
),
|
||||
),
|
||||
(
|
||||
"sign_in_captcha",
|
||||
models.BooleanField(
|
||||
default=False, help_text="有签到验证码的站点请开启", verbose_name="签到验证码"
|
||||
),
|
||||
),
|
||||
(
|
||||
"sign_in_params",
|
||||
models.CharField(
|
||||
blank=True,
|
||||
default="{}",
|
||||
help_text="默认无参数",
|
||||
max_length=128,
|
||||
null=True,
|
||||
verbose_name="签到请求参数",
|
||||
),
|
||||
),
|
||||
(
|
||||
"sign_in_headers",
|
||||
models.CharField(
|
||||
default="{}",
|
||||
help_text='字典格式:{"accept":"application/json","c":"d"},默认无参数',
|
||||
max_length=128,
|
||||
verbose_name="签到请求头",
|
||||
),
|
||||
),
|
||||
(
|
||||
"hr",
|
||||
models.BooleanField(
|
||||
default=False, help_text="站点是否开启HR", verbose_name="H&R"
|
||||
),
|
||||
),
|
||||
(
|
||||
"hr_rate",
|
||||
models.IntegerField(
|
||||
default=2, help_text="站点要求HR种子的分享率,最小:1", verbose_name="HR分享率"
|
||||
),
|
||||
),
|
||||
(
|
||||
"hr_time",
|
||||
models.IntegerField(
|
||||
default=10,
|
||||
help_text="站点要求HR种子最短做种时间,单位:小时",
|
||||
verbose_name="HR时间",
|
||||
),
|
||||
),
|
||||
(
|
||||
"sp_full",
|
||||
models.FloatField(default=0, help_text="时魔满魔", verbose_name="满魔"),
|
||||
),
|
||||
(
|
||||
"limit_speed",
|
||||
models.IntegerField(
|
||||
default=100,
|
||||
help_text="站点盒子限速,家宽用户无需理会,单位:MB/S",
|
||||
verbose_name="上传速度限制",
|
||||
),
|
||||
),
|
||||
(
|
||||
"torrents_rule",
|
||||
models.CharField(
|
||||
default='//table[@class="torrents"]/tr',
|
||||
max_length=128,
|
||||
verbose_name="种子行信息",
|
||||
),
|
||||
),
|
||||
(
|
||||
"name_rule",
|
||||
models.CharField(
|
||||
default='.//td[@class="embedded"]/a/b/text()',
|
||||
max_length=128,
|
||||
verbose_name="种子名称",
|
||||
),
|
||||
),
|
||||
(
|
||||
"title_rule",
|
||||
models.CharField(
|
||||
default=".//tr/td[1]/text()",
|
||||
max_length=128,
|
||||
verbose_name="种子标题",
|
||||
),
|
||||
),
|
||||
(
|
||||
"detail_url_rule",
|
||||
models.CharField(
|
||||
default='.//td[@class="embedded"]/a[contains(@href,"detail")]/@href',
|
||||
max_length=128,
|
||||
verbose_name="种子详情",
|
||||
),
|
||||
),
|
||||
(
|
||||
"category_rule",
|
||||
models.CharField(
|
||||
default='.//td[@class="rowfollow nowrap"][1]/a[1]/img/@class',
|
||||
max_length=128,
|
||||
verbose_name="分类",
|
||||
),
|
||||
),
|
||||
(
|
||||
"poster_rule",
|
||||
models.CharField(
|
||||
default=".//table/tr/td[1]/img/@src",
|
||||
max_length=128,
|
||||
verbose_name="海报",
|
||||
),
|
||||
),
|
||||
(
|
||||
"magnet_url_rule",
|
||||
models.CharField(
|
||||
default='.//td/a[contains(@href,"download")]/@href',
|
||||
max_length=128,
|
||||
verbose_name="下载链接",
|
||||
),
|
||||
),
|
||||
(
|
||||
"download_url_rule",
|
||||
models.CharField(
|
||||
default='.//a[contains(@href,"download.php?id=") and contains(@href,"passkey")]/@href',
|
||||
max_length=128,
|
||||
verbose_name="种子链接",
|
||||
),
|
||||
),
|
||||
(
|
||||
"size_rule",
|
||||
models.CharField(
|
||||
default=".//td[5]/text()", max_length=128, verbose_name="文件大小"
|
||||
),
|
||||
),
|
||||
(
|
||||
"hr_rule",
|
||||
models.CharField(
|
||||
default='.//table/tr/td/img[@class="hitandrun"]/@title',
|
||||
max_length=128,
|
||||
verbose_name="H&R",
|
||||
),
|
||||
),
|
||||
(
|
||||
"sale_rule",
|
||||
models.CharField(
|
||||
default='.//table/tr/td/img[contains(@class,"pro_")]/@alt',
|
||||
max_length=128,
|
||||
verbose_name="促销信息",
|
||||
),
|
||||
),
|
||||
(
|
||||
"sale_expire_rule",
|
||||
models.CharField(
|
||||
default=".//table/tr/td/font/span/@title",
|
||||
max_length=128,
|
||||
verbose_name="促销时间",
|
||||
),
|
||||
),
|
||||
(
|
||||
"release_rule",
|
||||
models.CharField(
|
||||
default=".//td[4]/span/@title",
|
||||
max_length=128,
|
||||
verbose_name="发布时间",
|
||||
),
|
||||
),
|
||||
(
|
||||
"seeders_rule",
|
||||
models.CharField(
|
||||
default=".//td[6]/b/a/text()",
|
||||
max_length=128,
|
||||
verbose_name="做种人数",
|
||||
),
|
||||
),
|
||||
(
|
||||
"leechers_rule",
|
||||
models.CharField(
|
||||
default=".//td[7]/b/a/text()",
|
||||
max_length=128,
|
||||
verbose_name="下载人数",
|
||||
),
|
||||
),
|
||||
(
|
||||
"completers_rule",
|
||||
models.CharField(
|
||||
default=".//td[8]/a/b/text()",
|
||||
max_length=128,
|
||||
verbose_name="完成人数",
|
||||
),
|
||||
),
|
||||
(
|
||||
"viewfilelist_rule",
|
||||
models.CharField(
|
||||
default=".//td/text()", max_length=128, verbose_name="解析文件结构"
|
||||
),
|
||||
),
|
||||
(
|
||||
"viewpeerlist_rule",
|
||||
models.CharField(
|
||||
default=".//tr/td[9]/nobr/text()",
|
||||
max_length=128,
|
||||
verbose_name="平均下载进度",
|
||||
),
|
||||
),
|
||||
(
|
||||
"peer_speed_rule",
|
||||
models.CharField(
|
||||
default=".//tr/td[5]/nobr/text()",
|
||||
max_length=128,
|
||||
verbose_name="平均上传速度",
|
||||
),
|
||||
),
|
||||
(
|
||||
"remark",
|
||||
models.TextField(
|
||||
blank=True, default="", null=True, verbose_name="备注"
|
||||
),
|
||||
),
|
||||
(
|
||||
"invitation_rule",
|
||||
models.CharField(
|
||||
default='//a[contains(@href,"invite.php?id=")]/following-sibling::text()[1]',
|
||||
max_length=128,
|
||||
verbose_name="邀请资格",
|
||||
),
|
||||
),
|
||||
(
|
||||
"time_join_rule",
|
||||
models.CharField(
|
||||
default='//td[contains(text(),"加入")]/following-sibling::td/span/@title',
|
||||
max_length=128,
|
||||
verbose_name="注册时间",
|
||||
),
|
||||
),
|
||||
(
|
||||
"latest_active_rule",
|
||||
models.CharField(
|
||||
default='//td[contains(text(),"最近动向")]/following-sibling::td/span/@title',
|
||||
max_length=128,
|
||||
verbose_name="最后活动时间",
|
||||
),
|
||||
),
|
||||
(
|
||||
"uploaded_rule",
|
||||
models.CharField(
|
||||
default='//font[@class="color_uploaded"]/following-sibling::text()[1]',
|
||||
max_length=128,
|
||||
verbose_name="上传量",
|
||||
),
|
||||
),
|
||||
(
|
||||
"downloaded_rule",
|
||||
models.CharField(
|
||||
default='//font[@class="color_downloaded"]/following-sibling::text()[1]',
|
||||
max_length=128,
|
||||
verbose_name="下载量",
|
||||
),
|
||||
),
|
||||
(
|
||||
"ratio_rule",
|
||||
models.CharField(
|
||||
default='//font[@class="color_ratio"][1]/following-sibling::text()[1]',
|
||||
max_length=128,
|
||||
verbose_name="分享率",
|
||||
),
|
||||
),
|
||||
(
|
||||
"my_sp_rule",
|
||||
models.CharField(
|
||||
default='//a[@href="mybonus.php"]/following-sibling::text()[1]',
|
||||
max_length=128,
|
||||
verbose_name="魔力值",
|
||||
),
|
||||
),
|
||||
(
|
||||
"hour_sp_rule",
|
||||
models.CharField(
|
||||
default='//div[contains(text(),"每小时能获取")]/text()[1]',
|
||||
max_length=128,
|
||||
verbose_name="时魔",
|
||||
),
|
||||
),
|
||||
(
|
||||
"my_bonus_rule",
|
||||
models.CharField(
|
||||
default='//font[@class="color_bonus" and contains(text(),"积分")]/following-sibling::text()[1]',
|
||||
max_length=128,
|
||||
verbose_name="保种积分",
|
||||
),
|
||||
),
|
||||
(
|
||||
"my_level_rule",
|
||||
models.CharField(
|
||||
default='//span[@class="medium"]/span[@class="nowrap"]/a[contains(@class,"_Name")]/@class',
|
||||
max_length=128,
|
||||
verbose_name="用户等级",
|
||||
),
|
||||
),
|
||||
(
|
||||
"my_hr_rule",
|
||||
models.CharField(
|
||||
default="//tr[14]/td[2]/a/text()",
|
||||
max_length=128,
|
||||
verbose_name="H&R",
|
||||
),
|
||||
),
|
||||
(
|
||||
"leech_rule",
|
||||
models.CharField(
|
||||
default='//img[@class="arrowdown"]/following-sibling::text()[1]',
|
||||
max_length=128,
|
||||
verbose_name="下载数量",
|
||||
),
|
||||
),
|
||||
(
|
||||
"seed_rule",
|
||||
models.CharField(
|
||||
default='//img[@class="arrowup"]/following-sibling::text()[1]',
|
||||
max_length=128,
|
||||
verbose_name="做种数量",
|
||||
),
|
||||
),
|
||||
(
|
||||
"record_count_rule",
|
||||
models.CharField(
|
||||
default="/html/body/b/text()",
|
||||
max_length=128,
|
||||
verbose_name="种子记录数",
|
||||
),
|
||||
),
|
||||
(
|
||||
"seed_vol_rule",
|
||||
models.CharField(
|
||||
default="//tr/td[3]",
|
||||
help_text="需对数据做处理",
|
||||
max_length=128,
|
||||
verbose_name="做种大小",
|
||||
),
|
||||
),
|
||||
(
|
||||
"mailbox_rule",
|
||||
models.CharField(
|
||||
default='//a[@href="messages.php"]/following-sibling::text()[1]',
|
||||
help_text="获取新邮件",
|
||||
max_length=128,
|
||||
verbose_name="邮件规则",
|
||||
),
|
||||
),
|
||||
(
|
||||
"hash_rule",
|
||||
models.CharField(
|
||||
default='//tr[11]//td[@class="no_border_wide"][2]/text()',
|
||||
max_length=128,
|
||||
verbose_name="种子HASH",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
"verbose_name": "站点信息",
|
||||
"verbose_name_plural": "站点信息",
|
||||
"ordering": ["name"],
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name="TorrentInfo",
|
||||
fields=[
|
||||
(
|
||||
"id",
|
||||
models.BigAutoField(
|
||||
auto_created=True,
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
verbose_name="ID",
|
||||
),
|
||||
),
|
||||
(
|
||||
"created_at",
|
||||
models.DateTimeField(auto_now_add=True, verbose_name="创建时间"),
|
||||
),
|
||||
(
|
||||
"updated_at",
|
||||
models.DateTimeField(auto_now=True, verbose_name="更新时间"),
|
||||
),
|
||||
(
|
||||
"name",
|
||||
models.CharField(default="", max_length=256, verbose_name="种子名称"),
|
||||
),
|
||||
(
|
||||
"title",
|
||||
models.CharField(default="", max_length=256, verbose_name="标题"),
|
||||
),
|
||||
(
|
||||
"category",
|
||||
models.CharField(default="", max_length=128, verbose_name="分类"),
|
||||
),
|
||||
(
|
||||
"poster_url",
|
||||
models.URLField(default="", max_length=512, verbose_name="海报链接"),
|
||||
),
|
||||
(
|
||||
"detail_url",
|
||||
models.URLField(default="", max_length=512, verbose_name="种子详情"),
|
||||
),
|
||||
("magnet_url", models.URLField(verbose_name="下载链接")),
|
||||
(
|
||||
"download_url",
|
||||
models.URLField(max_length=255, unique=True, verbose_name="种子链接"),
|
||||
),
|
||||
("size", models.IntegerField(default=0, verbose_name="文件大小")),
|
||||
(
|
||||
"state",
|
||||
models.BooleanField(
|
||||
default=False, max_length=16, verbose_name="推送状态"
|
||||
),
|
||||
),
|
||||
(
|
||||
"save_path",
|
||||
models.FilePathField(
|
||||
default="/downloads/brush", verbose_name="保存路径"
|
||||
),
|
||||
),
|
||||
("hr", models.BooleanField(default=False, verbose_name="H&R")),
|
||||
(
|
||||
"sale_status",
|
||||
models.CharField(default="无促销", max_length=16, verbose_name="优惠状态"),
|
||||
),
|
||||
(
|
||||
"sale_expire",
|
||||
models.CharField(default="无限期", max_length=32, verbose_name="到期时间"),
|
||||
),
|
||||
(
|
||||
"on_release",
|
||||
models.CharField(default="", max_length=32, verbose_name="发布时间"),
|
||||
),
|
||||
(
|
||||
"seeders",
|
||||
models.CharField(default="0", max_length=8, verbose_name="做种人数"),
|
||||
),
|
||||
(
|
||||
"leechers",
|
||||
models.CharField(default="0", max_length=8, verbose_name="下载人数"),
|
||||
),
|
||||
(
|
||||
"completers",
|
||||
models.CharField(default="0", max_length=8, verbose_name="完成人数"),
|
||||
),
|
||||
(
|
||||
"hash_string",
|
||||
models.CharField(
|
||||
default="", max_length=128, verbose_name="Info_hash"
|
||||
),
|
||||
),
|
||||
(
|
||||
"viewfilelist",
|
||||
models.CharField(default="", max_length=128, verbose_name="文件列表"),
|
||||
),
|
||||
(
|
||||
"viewpeerlist",
|
||||
models.FloatField(default=0, max_length=128, verbose_name="下载总进度"),
|
||||
),
|
||||
(
|
||||
"peer_list_speed",
|
||||
models.FloatField(default=0, max_length=128, verbose_name="平均上传速度"),
|
||||
),
|
||||
(
|
||||
"downloader",
|
||||
models.ForeignKey(
|
||||
blank=True,
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="pt_site.downloader",
|
||||
verbose_name="下载器",
|
||||
),
|
||||
),
|
||||
(
|
||||
"site",
|
||||
models.ForeignKey(
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="pt_site.site",
|
||||
verbose_name="所属站点",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={"verbose_name": "种子管理", "verbose_name_plural": "种子管理",},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name="SiteStatus",
|
||||
fields=[
|
||||
(
|
||||
"id",
|
||||
models.BigAutoField(
|
||||
auto_created=True,
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
verbose_name="ID",
|
||||
),
|
||||
),
|
||||
(
|
||||
"created_at",
|
||||
models.DateTimeField(auto_now_add=True, verbose_name="创建时间"),
|
||||
),
|
||||
(
|
||||
"updated_at",
|
||||
models.DateTimeField(auto_now=True, verbose_name="更新时间"),
|
||||
),
|
||||
(
|
||||
"uploaded",
|
||||
models.CharField(default="0", max_length=16, verbose_name="上传量"),
|
||||
),
|
||||
(
|
||||
"downloaded",
|
||||
models.CharField(default="0", max_length=16, verbose_name="下载量"),
|
||||
),
|
||||
("ratio", models.FloatField(default=0, verbose_name="分享率")),
|
||||
("my_sp", models.FloatField(default=0, verbose_name="魔力值")),
|
||||
("my_bonus", models.FloatField(default=0, verbose_name="做种积分")),
|
||||
("seed_vol", models.IntegerField(default=0, verbose_name="做种体积")),
|
||||
(
|
||||
"site",
|
||||
models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="pt_site.mysite",
|
||||
verbose_name="站点名称",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={"verbose_name": "我的数据", "verbose_name_plural": "我的数据",},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name="SignIn",
|
||||
fields=[
|
||||
(
|
||||
"id",
|
||||
models.BigAutoField(
|
||||
auto_created=True,
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
verbose_name="ID",
|
||||
),
|
||||
),
|
||||
(
|
||||
"created_at",
|
||||
models.DateTimeField(auto_now_add=True, verbose_name="创建时间"),
|
||||
),
|
||||
(
|
||||
"updated_at",
|
||||
models.DateTimeField(auto_now=True, verbose_name="更新时间"),
|
||||
),
|
||||
(
|
||||
"sign_in_today",
|
||||
models.BooleanField(default=False, verbose_name="签到"),
|
||||
),
|
||||
(
|
||||
"site",
|
||||
models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="pt_site.mysite",
|
||||
verbose_name="站点名称",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={"verbose_name": "签到", "verbose_name_plural": "签到",},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="mysite",
|
||||
name="site",
|
||||
field=models.OneToOneField(
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="pt_site.site",
|
||||
verbose_name="站点",
|
||||
),
|
||||
),
|
||||
]
|
||||
@@ -22,6 +22,7 @@ BASE_DIR = Path(__file__).resolve().parent.parent
|
||||
# SECURITY WARNING: keep the secret key used in production secret!
|
||||
SECRET_KEY = 'django-insecure-6wrh^t$@gbb^s^=79@%cv=%yhq6gl^kane#g@-n-*n6+s1lo2f'
|
||||
|
||||
# SECURITY WARNING: don't run with debug turned on in production!
|
||||
# SECURITY WARNING: don't run with debug turned on in production!
|
||||
# if os.environ.get('DJANGO_DEBUG'):
|
||||
# print("Debug is enabled.")
|
||||
|
||||
146
readme.md
146
readme.md
@@ -28,92 +28,100 @@
|
||||
| 日期 | 功能 | 实现 |
|
||||
| ------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------- |
|
||||
| 0717 | 站点管理(内附爬虫规则、站点授权信息) | 已实现,支持站点见下表 |
|
||||
| 0718 | 抓取种子信息 | 已实现 |
|
||||
| 0718 | 种子信息抓取并保存 | 已实现 |
|
||||
| 0719 | 下载器管理 | 已实现,目前仅支持Transmission,qBittorrent下载器添加任务不返回任务信息,需迂回,容后处理 |
|
||||
| 0720 | 推送种子到下载器 | 已实现 |
|
||||
| 0721 | 推送种子后下载任务与种子信息关联 | 已关联,但目前仅支持Tr |
|
||||
| 0725 | 签到功能 | 已实现 |
|
||||
| 0729 | 实现站点个人数据抓取 | |
|
||||
| 0725 | 实现可签到站点的签到功能,支持一键多站签到 | 已实现 |
|
||||
| 0729 | 实现站点个人数据抓取,天空个人主页盾比较强力,目前迂回获取数据,不是很全 | |
|
||||
| 0731 | 获取信息时直接签到(如果没有当天数据或者当天数据中签到为否,则执行签到) | |
|
||||
| 0801 | 多线程开发 | 已实现 |
|
||||
| 0802 | 重构部分代码,将用户数据与站点配置文件分离,防止误操作 | 已完成 |
|
||||
| 0805 | docker部署 | 已实现 |
|
||||
| 0806 | 定时任务 | 已实现 |
|
||||
| 0806 | 定时任务 | 已实现 |
|
||||
| 0808 | 通知服务 | 已实现,企业微信需要可信IP,可能需要自行添加 |
|
||||
| - | 实时监控种子上传下载信息(开发下载器主页,通过hash与种子关联,并获取种子促销信息) | 未开发 |
|
||||
| - | 后台推送种子信息 | 计划内,未开发 |
|
||||
| - | 后台推送种子信息 | 计划内,未开发 |
|
||||
|
||||
### 更新日志
|
||||
|
||||
- > 2022.08.24
|
||||
>
|
||||
|
||||
- > 发布PTools1.0版本
|
||||
>
|
||||
|
||||
1. 支持站点列表附后
|
||||
2. 支持多站签到,支持天空验证码签到
|
||||
3. 支持拉取多站个人数据信息
|
||||
4. 支持多站拉取首页种子信息
|
||||
5. 支持企业微信、WxPusher、PushDeer、Bark通知
|
||||
6. 支持定时任务
|
||||
1. 支持自动签到,默认一天签到三次,每七小时签到一次,保留签到状态,已签到的不会重复签到
|
||||
2. 支持自动拉取个人数据,默认五个小时拉取一次
|
||||
3. 支持自动拉取首页促销种子,默认五个小时拉取一次
|
||||
7. 提供一份NP架构站点通用配置,未适配站点可以通过XPATH自行适配
|
||||
- > 2022.08.13
|
||||
- > -> 正式命名为PTools,感谢群友
|
||||
- > -> 支持铂金家
|
||||
- > -> 提供了通用配置,可自行添加站点(网站细节不同,不保证能用)
|
||||
- > -> 支持数据导入导出
|
||||
- > -> 提供docker,支持映射数据库文件
|
||||
- > 2022.08.12
|
||||
- > -> 优化签到信息显示:无签到功能的:无需,已签到:v,未签到:x
|
||||
- > -> 优化获取个人数据提示,返回信息加上数据
|
||||
- > -> 修复部分不能访问个人主页页面导致签到失败的bug
|
||||
- > -> 增加时魔显示
|
||||
- > 2022.08.10
|
||||
- > -> 增加HD天空验证码签到功能开关
|
||||
- > -> 调整数据库,历次个人数据展示到我的站点详情页
|
||||
- > 2022.08.08
|
||||
- > -> 对目前已完成功能进行优化,并清理冗余代码
|
||||
- > -> 打包新版Docker镜像并推送
|
||||
- > 2022.08.07
|
||||
- > -> 实现企业微信通知,需要自行抓取个人公网IP,
|
||||
- > 2022.08.05
|
||||
- > -> 自动化代码部署完毕,实现签到、拉取个人数据以及拉取首页促销种子的自动化
|
||||
- > 2022.08.03
|
||||
- > -> 获取个人数据的代码已经改造完毕
|
||||
- > -> 调整抓取种子的代码,降低对数据库的消耗
|
||||
- > -> 调整代码后,sqlite3数据库已经满足需求,已切回sqlite3
|
||||
- > 2022.08.02
|
||||
- > -> 重构部分代码,将用户数据与站点配置文件分离,避免用户误操作
|
||||
- > -> 增加排序ID,用户数据根据站点排序进行排序
|
||||
- > 2022.08.01
|
||||
- > -> 切换使用Mysql数据库,性能瓶颈问题已解决
|
||||
- > 2022.07.31
|
||||
- > -> 信息抓取使用多线程,大幅度降低等待时间,但是在数据库写入时Sqlite3本地数据库遇到性能瓶颈,出现无法写入的bug
|
||||
|
||||
### 站点支持列表
|
||||
|
||||
> 2022.08.03支持列表,根本本人现有站点数据整理
|
||||
|
||||
|
||||
| 序号 | 站点 | 签到 | 个人数据 | 推送种子 |
|
||||
| ------ | ------------------ | ------ | ---------- | ---------- |
|
||||
| 1 | 阿童木 | 支持 | 支持 | 支持 |
|
||||
| 2 | 猪猪网 | 支持 | 支持 | 支持 |
|
||||
| 3 | 学校 | 支持 | 支持 | 支持 |
|
||||
| 4 | 1PT | 支持 | 支持 | 支持 |
|
||||
| 5 | ASL | 支持 | 支持 | 支持 |
|
||||
| 6 | CarPT | 支持 | 支持 | 支持 |
|
||||
| 7 | 高清视界HDArea | 支持 | 支持 | 支持 |
|
||||
| 8 | 红豆饭HDFans | 支持 | 支持 | 支持 |
|
||||
| 9 | 时光HDTIME | 支持 | 支持 | 支持 |
|
||||
| 10 | MTeam | 支持 | 支持 | 支持 |
|
||||
| 11 | HDZONE | 支持 | 支持 | 支持 |
|
||||
| 12 | 冬樱WinterSakura | 支持 | 支持 | 支持 |
|
||||
| 13 | 蚂蚁HDMayi | 支持 | 支持 | 支持 |
|
||||
| 14 | 自由农场 | 支持 | 支持 | 支持 |
|
||||
| 15 | 铂金学院 | 支持 | 不支持 | 支持 |
|
||||
| 16 | 烧包 | 无需 | 支持 | 支持 |
|
||||
| 17 | 海棠 | 支持 | 支持 | 支持 |
|
||||
| 18 | 欧神 | 支持 | 支持 | 支持 |
|
||||
| 19 | 时间PTT | 支持 | 支持 | 支持 |
|
||||
| 20 | 海带 | 无需 | 支持 | 支持 |
|
||||
| 21 | 白兔 | 支持 | 支持 | 支持 |
|
||||
| 22 | 芒果 | 支持 | 支持 | 支持 |
|
||||
| 23 | 艾薇 | 无需 | 支持 | 支持 |
|
||||
| 24 | 老师 | 支持 | 支持 | 支持 |
|
||||
| 25 | 马杀鸡 | 无需 | 支持 | 支持 |
|
||||
| 26 | 欧绅 | 无需 | 支持 | 支持 |
|
||||
| 27 | 备胎 | 无需 | 支持 | 支持 |
|
||||
| 28 | 观众 | 支持 | 支持 | 支持 |
|
||||
| 29 | 丐帮 | 支持 | 支持 | 支持 |
|
||||
| 30 | 明教 | 支持 | 支持 | 支持 |
|
||||
| 21 | 天空HDSKY | 支持 | 支持 | 不支持 |
|
||||
| 32 | 杜比 | 支持 | 支持 | 不支持 |
|
||||
| 33 | 海胆 | 支持 | 支持 | 不支持 |
|
||||
| 34 | 海豹 | 无需 | 不支持 | 不支持 |
|
||||
| 35 | 明教 | 支持 | 支持 | 支持 |
|
||||
| 36 | 月月 | 支持 | 支持 | |
|
||||
| 37 | 吐鲁番 | 支持 | 支持 | |
|
||||
| 38 | 城市 | 支持 | 支持 | |
|
||||
| 39 | 铂金家 | 支持 | 支持 | |
|
||||
| 40 | 梓喵 | 支持 | 支持 | |
|
||||
| 41 | TTG | | | |
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| 序号 | 站点 | 获取种子 | 签到 | 个人数据 | 推送种子 | 备注 |
|
||||
| ------ | ------------------ | ---------- | ------ | ---------- | ---------- | -------------------------------------- |
|
||||
| 1 | 阿童木 | 支持 | 支持 | 支持 | 支持 | |
|
||||
| 2 | 猪猪网 | 支持 | 支持 | 支持 | 支持 | |
|
||||
| 3 | 学校 | 支持 | 支持 | 支持 | 支持 | 由于更新了防御盾,时灵时不灵 |
|
||||
| 4 | 1PT | 支持 | 支持 | 支持 | 支持 | |
|
||||
| 5 | ASL | 支持 | 支持 | 支持 | 支持 | |
|
||||
| 6 | CarPT | 支持 | 支持 | 支持 | 支持 | |
|
||||
| 7 | 高清视界HDArea | 支持 | 支持 | 支持 | 支持 | |
|
||||
| 8 | 红豆饭HDFans | 支持 | 支持 | 支持 | 支持 | |
|
||||
| 9 | 时光HDTIME | 支持 | 支持 | 支持 | 支持 | |
|
||||
| 10 | MTeam | 支持 | 支持 | 支持 | 支持 | |
|
||||
| 11 | HDZONE | 支持 | 支持 | 支持 | 支持 | |
|
||||
| 12 | 冬樱WinterSakura | 支持 | 支持 | 支持 | 支持 | |
|
||||
| 13 | 蚂蚁HDMayi | 支持 | 支持 | 支持 | 支持 | |
|
||||
| 14 | 自由农场 | 支持 | 支持 | 支持 | 支持 | |
|
||||
| 15 | 铂金学院 | 支持 | 支持 | 不支持 | 支持 | |
|
||||
| 16 | 烧包 | 支持 | 无需 | 支持 | 支持 | |
|
||||
| 17 | 海棠 | 支持 | 支持 | 支持 | 支持 | |
|
||||
| 18 | 欧神 | 支持 | 支持 | 支持 | 支持 | |
|
||||
| 19 | 时间PTT | 支持 | 支持 | 支持 | 支持 | |
|
||||
| 20 | 海带 | 支持 | 无需 | 支持 | 支持 | |
|
||||
| 21 | 白兔 | 支持 | 支持 | 支持 | 支持 | |
|
||||
| 22 | 芒果 | 支持 | 支持 | 支持 | 支持 | |
|
||||
| 23 | 艾薇 | 支持 | 无需 | 支持 | 支持 | |
|
||||
| 24 | 老师 | 支持 | 支持 | 支持 | 支持 | |
|
||||
| 25 | 马杀鸡 | 支持 | 无需 | 支持 | 支持 | |
|
||||
| 26 | 欧绅 | 支持 | 无需 | 支持 | 支持 | |
|
||||
| 27 | 备胎 | 支持 | 无需 | 支持 | 支持 | |
|
||||
| 28 | 观众 | 支持 | 支持 | 支持 | 支持 | |
|
||||
| 29 | 丐帮 | 支持 | 支持 | 支持 | 支持 | |
|
||||
| 30 | 明教 | 支持 | 支持 | 支持 | 支持 | |
|
||||
| 21 | 天空HDSKY | 支持 | 支持 | 支持 | 不支持 | 个人主页加盾,暂时无法突破,迂回处理 |
|
||||
| 32 | 杜比 | 支持 | 支持 | 支持 | 不支持 | |
|
||||
| 33 | 海胆 | 暂不支持 | 支持 | 支持 | 不支持 | |
|
||||
| 34 | 海豹 | 不支持 | 无需 | 不支持 | 不支持 | |
|
||||
| 35 | 明教 | 支持 | 支持 | 支持 | 支持 | |
|
||||
|
||||
### 捐助记录
|
||||
|
||||
- ## 感谢大佬捐助支持本项目!!!
|
||||
- > viichien 大佬第一个捐助本项目,使我更有动力继续写下去!
|
||||
>
|
||||
|
||||
>
|
||||
|
||||
@@ -1,11 +1,29 @@
|
||||
APScheduler==3.9.1
|
||||
asgiref==3.5.2
|
||||
astor==0.8.1
|
||||
async-timeout==4.0.2
|
||||
attrdict==2.0.1
|
||||
attrs==21.4.0
|
||||
Automat==20.2.0
|
||||
Babel==2.10.3
|
||||
baidu-aip==4.16.7
|
||||
bce-python-sdk==0.8.74
|
||||
beautifulsoup4==4.11.1
|
||||
cachetools==5.2.0
|
||||
certifi==2022.6.15
|
||||
cffi==1.15.1
|
||||
cfscrape==2.1.1
|
||||
chardet==5.0.0
|
||||
charset-normalizer==2.1.1
|
||||
click==8.1.3
|
||||
cloudscraper==1.2.60
|
||||
constantly==15.1.0
|
||||
cryptography==37.0.4
|
||||
cssselect==1.1.0
|
||||
cssutils==2.5.1
|
||||
cycler==0.11.0
|
||||
Cython==0.29.32
|
||||
decorator==5.1.1
|
||||
defusedxml==0.7.1
|
||||
deluge-client==1.9.0
|
||||
Deprecated==1.2.13
|
||||
@@ -16,35 +34,94 @@ django-import-export==2.8.0
|
||||
django-redis==5.2.0
|
||||
django-simpleui==2022.7.29
|
||||
et-xmlfile==1.1.0
|
||||
filelock==3.7.1
|
||||
Flask==2.2.2
|
||||
Flask-Babel==2.0.0
|
||||
fonttools==4.35.0
|
||||
future==0.18.2
|
||||
hyperlink==21.0.0
|
||||
idna==3.3
|
||||
imageio==2.21.1
|
||||
imgaug==0.4.0
|
||||
importlib-metadata==4.12.0
|
||||
incremental==21.3.0
|
||||
itemadapter==0.6.0
|
||||
itemloaders==1.0.4
|
||||
itsdangerous==2.1.2
|
||||
Jinja2==3.1.2
|
||||
jmespath==1.0.1
|
||||
kiwisolver==1.4.4
|
||||
lmdb==1.3.0
|
||||
lxml==4.9.1
|
||||
Markdown==3.4.1
|
||||
MarkupPy==1.14
|
||||
MarkupSafe==2.1.1
|
||||
matplotlib==3.5.3
|
||||
mysqlclient==2.1.1
|
||||
networkx==2.8.5
|
||||
numpy==1.23.2
|
||||
odfpy==1.4.1
|
||||
OpenCC==1.1.4
|
||||
opencv-contrib-python==4.4.0.46
|
||||
opencv-python==4.6.0.66
|
||||
openpyxl==3.0.10
|
||||
opt-einsum==3.3.0
|
||||
packaging==21.3
|
||||
paddle-bfloat==0.1.7
|
||||
paddleocr==2.5.0.3
|
||||
paddlepaddle==2.3.1
|
||||
pandas==1.4.3
|
||||
parsel==1.6.0
|
||||
Pillow==9.2.0
|
||||
premailer==3.10.0
|
||||
Protego==0.2.1
|
||||
protobuf==3.20.0
|
||||
pyasn1==0.4.8
|
||||
pyasn1-modules==0.2.8
|
||||
pyclipper==1.3.0.post3
|
||||
pycparser==2.21
|
||||
pycryptodome==3.15.0
|
||||
PyDispatcher==2.0.5
|
||||
pyOpenSSL==22.0.0
|
||||
pyparsing==3.0.9
|
||||
pypushdeer==0.0.3
|
||||
python-dateutil==2.8.2
|
||||
python-Levenshtein==0.12.2
|
||||
pytz==2022.2.1
|
||||
pytz-deprecation-shim==0.1.0.post0
|
||||
PyWavelets==1.3.0
|
||||
PyYAML==6.0
|
||||
qbittorrent-api==2022.8.36
|
||||
queuelib==1.6.2
|
||||
redis==4.3.4
|
||||
requests==2.28.1
|
||||
requests-file==1.5.1
|
||||
requests-toolbelt==0.9.1
|
||||
scikit-image==0.19.3
|
||||
scipy==1.9.0
|
||||
Scrapy==2.6.2
|
||||
service-identity==21.1.0
|
||||
Shapely==1.8.3
|
||||
six==1.16.0
|
||||
soupsieve==2.3.2.post1
|
||||
sqlparse==0.4.2
|
||||
tablib==3.2.1
|
||||
tifffile==2022.8.12
|
||||
tldextract==3.3.1
|
||||
tqdm==4.64.0
|
||||
transmission-rpc==3.3.2
|
||||
Twisted==22.4.0
|
||||
typing_extensions==4.3.0
|
||||
tzdata==2022.2
|
||||
tzlocal==4.2
|
||||
urllib3==1.26.11
|
||||
visualdl==2.3.0
|
||||
w3lib==1.22.0
|
||||
wechat-push==1.0.1
|
||||
Werkzeug==2.2.2
|
||||
wrapt==1.14.1
|
||||
wxpusher==2.2.0
|
||||
xlrd==2.0.1
|
||||
xlwt==1.3.0
|
||||
zipp==3.8.1
|
||||
zope.interface==5.4.0
|
||||
|
||||
0
restart.sh
Normal file → Executable file
0
restart.sh
Normal file → Executable file
10
start.sh
Executable file → Normal file
10
start.sh
Executable file → Normal file
@@ -1,16 +1,12 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 安装依赖
|
||||
git pull https://ngfchl:.wq891222@gitee.com/ngfchl/pt_assister
|
||||
pip install -r requirements.txt
|
||||
|
||||
CONTAINER_ALREADY_STARTED="CONTAINER_ALREADY_STARTED_PLACEHOLDER"
|
||||
if [ ! -f ./db/db.sqlite3 ]; then
|
||||
echo "-- 初始化数据库 init database --"
|
||||
# 如果数据库存在,就不执行
|
||||
python manage.py makemigrations &&
|
||||
python manage.py migrate &&
|
||||
python manage.py loaddata pt.json
|
||||
# mv db.sqlite3 ./db/db.sqlite3
|
||||
mv db.sqlite3 ./db/db.sqlite3
|
||||
fi
|
||||
if [ ! -e $CONTAINER_ALREADY_STARTED ]; then
|
||||
touch $CONTAINER_ALREADY_STARTED
|
||||
@@ -30,4 +26,4 @@ else
|
||||
fi
|
||||
|
||||
python manage.py migrate &&
|
||||
python manage.py runserver 0.0.0.0:$DJANGO_WEB_PORT --noreload
|
||||
python manage.py runserver 0.0.0.0:8000 --noreload
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
3
static/showdown/showdown.min.js
vendored
3
static/showdown/showdown.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -15,7 +15,10 @@
|
||||
</span>
|
||||
</div>
|
||||
<div class="text item">
|
||||
{{ update_notes|safe }}
|
||||
<ul v-for="item in update_note">
|
||||
<li v-text="item"></li>
|
||||
</ul>
|
||||
{# {{ update_notes|safe }}#}
|
||||
</div>
|
||||
</el-card>
|
||||
|
||||
@@ -34,7 +37,7 @@
|
||||
// element: 指定用vue来管理页面中的哪个标签区域
|
||||
el: '#app',
|
||||
data: {
|
||||
update_note: ''
|
||||
update_note: ['请先拉取更新哦']
|
||||
},
|
||||
created: function () {
|
||||
{#this.data.update_note = converter.makeHtml({{ update_notes }});#}
|
||||
@@ -89,19 +92,21 @@
|
||||
{#url + '/task/do_restart'#}
|
||||
).then(res => {
|
||||
if (res.data.code === 0) {
|
||||
console.log(res, 1)
|
||||
this.update_note = res.data.data.p.split(',')
|
||||
this.$message({
|
||||
type: 'success',
|
||||
message: res.data.msg
|
||||
});
|
||||
} else {
|
||||
console.log(res)
|
||||
console.log(res, 2)
|
||||
this.$message({
|
||||
type: 'warning',
|
||||
message: res.data.msg
|
||||
});
|
||||
}
|
||||
|
||||
}).catch(res => {
|
||||
console.log(res, 3)
|
||||
this.$message({
|
||||
type: 'error',
|
||||
message: "更新失败!"
|
||||
@@ -111,8 +116,8 @@
|
||||
}).catch(res => {
|
||||
console.log(res)
|
||||
this.$message({
|
||||
type: 'info',
|
||||
message: '已取消重启'
|
||||
type: 'warning',
|
||||
message: '已取消更新'
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
32
update.md
32
update.md
@@ -1,29 +1,3 @@
|
||||
commit 1dae92af7e982315807acc3c7339fe105232b5f9
|
||||
Author: ngfchl <ngfchl@126.com>
|
||||
Date: Wed Aug 24 13:30:36 2022 +0800
|
||||
|
||||
1. 美化重启页面
|
||||
|
||||
commit a4d53aead9ed01ad3fb1c1298f58b39d1da5562f
|
||||
Author: ngfchl <ngfchl@126.com>
|
||||
Date: Wed Aug 24 08:50:34 2022 +0800
|
||||
|
||||
1. 优化添加站点界面显示
|
||||
|
||||
commit 454ca1f0b04001364646742718965bae6936d20d
|
||||
Author: ngfchl <ngfchl@126.com>
|
||||
Date: Wed Aug 24 06:18:39 2022 +0800
|
||||
|
||||
1. 支持月月frds和吐鲁番拉取个人数据
|
||||
|
||||
commit 3ad0a84ca1e1a55543f0ecc095ba1b1e02432ddc
|
||||
Author: ngfchl <ngfchl@126.com>
|
||||
Date: Tue Aug 23 16:54:56 2022 +0800
|
||||
|
||||
1. 支持月月frds拉取个人数据
|
||||
|
||||
commit ae54de97cd8ec79e13b75c3e5e4e64a3bed37b98
|
||||
Author: ngfchl <ngfchl@126.com>
|
||||
Date: Tue Aug 23 16:39:14 2022 +0800
|
||||
|
||||
1. 添加重启更新按钮
|
||||
# M-Team 规则修改
|
||||
1. 由于页面链接填写错误,导致做种体积统计未0,修改站点信息->主要页面->当前下载信息:/发布种子信息:/当前做种信息:/完成种子信息:四项页面的链接地址
|
||||
将四个条目中页面地址中的`getusertorrentlistajax`替换为`getusertorrentlist`
|
||||
Reference in New Issue
Block a user