1. 优化网站连接失败错误返回信息

2. 继续优化在线更新功能
3. 优化MT个人数据获取规则
This commit is contained in:
ngfchl
2022-08-25 09:26:26 +08:00
parent 78efd05d66
commit 9b5ae94079
23 changed files with 250 additions and 6453 deletions

1
.dockerignore Normal file
View File

@@ -0,0 +1 @@
/venv/

1
.gitignore vendored
View File

@@ -1 +1,2 @@
/venv/
/db/

View File

@@ -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

View File

@@ -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": "计划任务",},
),
]

View File

@@ -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'),
]

View File

@@ -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
View 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
View File

@@ -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,

View File

@@ -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表示无限

View File

@@ -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="站点",
),
),
]

View File

@@ -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
View File

@@ -28,92 +28,100 @@
| 日期 | 功能 | 实现 |
| ------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------- |
| 0717 | 站点管理(内附爬虫规则、站点授权信息) | 已实现,支持站点见下表 |
| 0718 | 抓取种子信息 | 已实现 |
| 0718 | 种子信息抓取并保存 | 已实现 |
| 0719 | 下载器管理 | 已实现目前仅支持TransmissionqBittorrent下载器添加任务不返回任务信息需迂回容后处理 |
| 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 大佬第一个捐助本项目,使我更有动力继续写下去!
>
>

View File

@@ -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
View File

10
start.sh Executable file → Normal file
View 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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -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: '已取消更新'
});
});
}

BIN
tmp.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -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`

View File

@@ -1,5 +1,3 @@
git pull https://gitee.com/ngfchl/ptools &&
git pull &&
python manage.py makemigrations &&
python manage.py migrate &&
python manage.py loaddata db/pt.json
python manage.py migrate