mirror of
https://github.com/ngfchl/ptools
synced 2023-07-10 13:41:22 +08:00
重构代码:初始化
This commit is contained in:
@@ -173,3 +173,16 @@ class PushConfig(models.TextChoices):
|
||||
class OCRConfig(models.TextChoices):
|
||||
# date = 'date', '单次任务'
|
||||
baidu_aip = 'baidu_aip', '百度OCR'
|
||||
|
||||
|
||||
class Schemas(models.TextChoices):
|
||||
"""
|
||||
站点架构,默认对应的规则模板
|
||||
"""
|
||||
AvistaZ = 'AvistaZ', 'AvistaZ'
|
||||
Discuz = 'Discuz', 'Discuz'
|
||||
Gazelle = 'Gazelle', 'Gazelle'
|
||||
IPTorrents = 'IPTorrents', 'IPTorrents'
|
||||
MeanTorrent = 'MeanTorrent', 'MeanTorrent'
|
||||
NexusPHP = 'NexusPHP', 'NexusPHP'
|
||||
NextPT = 'NextPT', 'NextPT'
|
||||
|
||||
@@ -57,6 +57,7 @@ INSTALLED_APPS = [
|
||||
'pt_site',
|
||||
'pt_test',
|
||||
'auto_pt',
|
||||
'website',
|
||||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
|
||||
0
website/__init__.py
Normal file
0
website/__init__.py
Normal file
24
website/admin.py
Normal file
24
website/admin.py
Normal file
@@ -0,0 +1,24 @@
|
||||
from django.contrib import admin
|
||||
|
||||
from website.models import *
|
||||
|
||||
|
||||
# Register your models here.
|
||||
@admin.register(WebSite)
|
||||
class WebSiteAdmin(admin.ModelAdmin):
|
||||
pass
|
||||
|
||||
|
||||
@admin.register(OwnSite)
|
||||
class OwnSiteAdmin(admin.ModelAdmin):
|
||||
pass
|
||||
|
||||
|
||||
@admin.register(AutoLogin)
|
||||
class AutoLoginAdmin(admin.ModelAdmin):
|
||||
pass
|
||||
|
||||
|
||||
@admin.register(SignIn)
|
||||
class SignInAdmin(admin.ModelAdmin):
|
||||
pass
|
||||
6
website/apps.py
Normal file
6
website/apps.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class WebsiteConfig(AppConfig):
|
||||
default_auto_field = "django.db.models.BigAutoField"
|
||||
name = "website"
|
||||
301
website/migrations/0001_initial.py
Normal file
301
website/migrations/0001_initial.py
Normal file
@@ -0,0 +1,301 @@
|
||||
# Generated by Django 4.1 on 2022-11-03 13:09
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
initial = True
|
||||
|
||||
dependencies = []
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name="InfoXpath",
|
||||
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="更新时间"),
|
||||
),
|
||||
],
|
||||
options={"abstract": False, },
|
||||
),
|
||||
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="更新时间"),
|
||||
),
|
||||
],
|
||||
options={"abstract": False, },
|
||||
),
|
||||
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="更新时间"),
|
||||
),
|
||||
],
|
||||
options={"abstract": False, },
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name="SingInXpath",
|
||||
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="更新时间"),
|
||||
),
|
||||
],
|
||||
options={"abstract": False, },
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name="TorrentListXpath",
|
||||
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="更新时间"),
|
||||
),
|
||||
],
|
||||
options={"abstract": False, },
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name="WebSite",
|
||||
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="更新时间"),
|
||||
),
|
||||
(
|
||||
"url",
|
||||
models.URLField(
|
||||
default="",
|
||||
help_text='请保留网址结尾的"/"',
|
||||
unique=True,
|
||||
verbose_name="站点网址",
|
||||
),
|
||||
),
|
||||
("name", models.CharField(max_length=32, verbose_name="站点名称")),
|
||||
(
|
||||
"schemas",
|
||||
models.CharField(
|
||||
choices=[
|
||||
("AvistaZ", "AvistaZ"),
|
||||
("Discuz", "Discuz"),
|
||||
("Gazelle", "Gazelle"),
|
||||
("IPTorrents", "IPTorrents"),
|
||||
("meanTorrent", "meanTorrent"),
|
||||
("NexusPHP", "NexusPHP"),
|
||||
],
|
||||
default="NexusPHP",
|
||||
max_length=16,
|
||||
verbose_name="站点架构",
|
||||
),
|
||||
),
|
||||
(
|
||||
"logo",
|
||||
models.URLField(
|
||||
default="", help_text="站点logo图标", verbose_name="站点logo"
|
||||
),
|
||||
),
|
||||
(
|
||||
"tracker",
|
||||
models.CharField(
|
||||
default="",
|
||||
help_text="tracker网址关键字",
|
||||
max_length=32,
|
||||
verbose_name="tracker",
|
||||
),
|
||||
),
|
||||
(
|
||||
"page_default",
|
||||
models.JSONField(
|
||||
default={"默认": "torrents.php"},
|
||||
max_length=64,
|
||||
verbose_name="搜索页面",
|
||||
),
|
||||
),
|
||||
(
|
||||
"page_sign_in",
|
||||
models.CharField(
|
||||
default="attendance.php", max_length=64, verbose_name="默认签到链接"
|
||||
),
|
||||
),
|
||||
(
|
||||
"page_control_panel",
|
||||
models.CharField(
|
||||
default="usercp.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="当前用户列表",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
"verbose_name": "站点信息",
|
||||
"verbose_name_plural": "站点信息",
|
||||
"ordering": ["name"],
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,89 @@
|
||||
# Generated by Django 4.1 on 2022-11-03 16:08
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
dependencies = [
|
||||
("website", "0001_initial"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name="Examine",
|
||||
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="更新时间"),
|
||||
),
|
||||
],
|
||||
options={"abstract": False, },
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name="website",
|
||||
options={
|
||||
"ordering": ["name"],
|
||||
"verbose_name": "PT站点",
|
||||
"verbose_name_plural": "PT站点",
|
||||
},
|
||||
),
|
||||
migrations.RemoveField(model_name="website", name="page_completed", ),
|
||||
migrations.RemoveField(model_name="website", name="page_control_panel", ),
|
||||
migrations.RemoveField(model_name="website", name="page_default", ),
|
||||
migrations.RemoveField(model_name="website", name="page_detail", ),
|
||||
migrations.RemoveField(model_name="website", name="page_download", ),
|
||||
migrations.RemoveField(model_name="website", name="page_leeching", ),
|
||||
migrations.RemoveField(model_name="website", name="page_mybonus", ),
|
||||
migrations.RemoveField(model_name="website", name="page_search", ),
|
||||
migrations.RemoveField(model_name="website", name="page_seeding", ),
|
||||
migrations.RemoveField(model_name="website", name="page_sign_in", ),
|
||||
migrations.RemoveField(model_name="website", name="page_uploaded", ),
|
||||
migrations.RemoveField(model_name="website", name="page_user", ),
|
||||
migrations.RemoveField(model_name="website", name="page_viewfilelist", ),
|
||||
migrations.RemoveField(model_name="website", name="page_viewpeerlist", ),
|
||||
migrations.AddField(
|
||||
model_name="website",
|
||||
name="nickname",
|
||||
field=models.CharField(
|
||||
default="", help_text="昵称,小名", max_length=32, verbose_name="别称"
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="website",
|
||||
name="name",
|
||||
field=models.CharField(
|
||||
help_text="站点常用名称", max_length=32, verbose_name="站点名称"
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="website",
|
||||
name="schemas",
|
||||
field=models.CharField(
|
||||
choices=[
|
||||
("AvistaZ", "AvistaZ"),
|
||||
("Discuz", "Discuz"),
|
||||
("Gazelle", "Gazelle"),
|
||||
("IPTorrents", "IPTorrents"),
|
||||
("MeanTorrent", "MeanTorrent"),
|
||||
("NexusPHP", "NexusPHP"),
|
||||
("NextPT", "NextPT"),
|
||||
],
|
||||
default="NexusPHP",
|
||||
max_length=16,
|
||||
verbose_name="站点架构",
|
||||
),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,87 @@
|
||||
# Generated by Django 4.1 on 2022-11-03 16:19
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
dependencies = [
|
||||
("website", "0002_examine_alter_website_options_and_more"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name="OwnSite",
|
||||
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=99, verbose_name="排序")),
|
||||
("user_id", models.CharField(max_length=16, verbose_name="用户ID")),
|
||||
(
|
||||
"passkey",
|
||||
models.CharField(
|
||||
blank=True, max_length=128, null=True, 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="开启搜索"
|
||||
),
|
||||
),
|
||||
],
|
||||
options={"abstract": False, },
|
||||
),
|
||||
migrations.DeleteModel(name="MySite", ),
|
||||
migrations.AddField(
|
||||
model_name="website",
|
||||
name="hr",
|
||||
field=models.BooleanField(
|
||||
default=False, help_text="站点HR状态", verbose_name="H&R"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="website",
|
||||
name="sign_in",
|
||||
field=models.BooleanField(
|
||||
default=False, help_text="是否需要签到", verbose_name="签到"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="ownsite",
|
||||
name="site",
|
||||
field=models.OneToOneField(
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="website.website",
|
||||
verbose_name="站点",
|
||||
),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,197 @@
|
||||
# Generated by Django 4.1 on 2022-11-03 22:20
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
dependencies = [
|
||||
("website", "0003_ownsite_delete_mysite_website_hr_website_sign_in_and_more"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name="ownsite",
|
||||
options={
|
||||
"ordering": ["sort_id"],
|
||||
"verbose_name": "我的站点",
|
||||
"verbose_name_plural": "我的站点",
|
||||
},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="ownsite",
|
||||
name="user_agent",
|
||||
field=models.CharField(
|
||||
default="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.28",
|
||||
max_length=256,
|
||||
verbose_name="User-Agent",
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="signin",
|
||||
name="method_sign",
|
||||
field=models.CharField(
|
||||
choices=[("post", "post"), ("get", "get")],
|
||||
default="get",
|
||||
max_length=1024,
|
||||
verbose_name="请求方式",
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="signin",
|
||||
name="params_name_xpath",
|
||||
field=models.CharField(
|
||||
default="", max_length=1024, verbose_name="签到参数名称,使用英文逗号‘,’分割"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="signin",
|
||||
name="params_sign",
|
||||
field=models.CharField(default="", max_length=1024, verbose_name="签到参数"),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="signin",
|
||||
name="params_value_xpath",
|
||||
field=models.CharField(
|
||||
default="", max_length=1024, verbose_name="签到参数Value,使用英文逗号‘,’分割"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="signin",
|
||||
name="res_sign_xpath",
|
||||
field=models.CharField(
|
||||
default="", max_length=1024, verbose_name="签到信息Xpath"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="signin",
|
||||
name="site",
|
||||
field=models.OneToOneField(
|
||||
default="",
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="website.website",
|
||||
verbose_name="站点",
|
||||
),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="signin",
|
||||
name="url_check",
|
||||
field=models.CharField(
|
||||
default="attendance.php", max_length=128, verbose_name="签到检测链接"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="website",
|
||||
name="assist",
|
||||
field=models.BooleanField(
|
||||
default=True, help_text="是否支持辅种", verbose_name="辅种"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="website",
|
||||
name="auto_login",
|
||||
field=models.BooleanField(
|
||||
default=False, help_text="是否支持自动登录并获取Cookie", verbose_name="自动登录"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="website",
|
||||
name="examine",
|
||||
field=models.BooleanField(
|
||||
default=True, help_text="是否支持新手考核信息比对", verbose_name="新手考核"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="website",
|
||||
name="info_capture",
|
||||
field=models.BooleanField(
|
||||
default=True, help_text="是否支持抓取信息", verbose_name="抓取信息"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="website",
|
||||
name="invite",
|
||||
field=models.BooleanField(
|
||||
default=True, help_text="是否支持邀请", verbose_name="邀请"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="website",
|
||||
name="search",
|
||||
field=models.BooleanField(
|
||||
default=True, help_text="是否支持聚合搜索", verbose_name="聚合搜索"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="website",
|
||||
name="tags",
|
||||
field=models.CharField(
|
||||
default="",
|
||||
help_text="定义站点资源标签,使用英文逗号‘,’分割",
|
||||
max_length=128,
|
||||
verbose_name="标签",
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="website",
|
||||
name="torrent_capture",
|
||||
field=models.BooleanField(
|
||||
default=True, help_text="是否支持抓取种子", verbose_name="抓取种子"
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="ownsite",
|
||||
name="cookie",
|
||||
field=models.TextField(verbose_name="Cookie"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="ownsite",
|
||||
name="passkey",
|
||||
field=models.CharField(
|
||||
blank=True, max_length=128, null=True, verbose_name="Passkey"
|
||||
),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name="AutoLogin",
|
||||
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="更新时间"),
|
||||
),
|
||||
("username", models.CharField(max_length=32, verbose_name="用户名")),
|
||||
("password", models.CharField(max_length=32, verbose_name="密码")),
|
||||
("captcha", models.CharField(max_length=16, verbose_name="验证码字段名")),
|
||||
(
|
||||
"captcha_xpath",
|
||||
models.CharField(max_length=128, verbose_name="验证码Xpath"),
|
||||
),
|
||||
(
|
||||
"site",
|
||||
models.OneToOneField(
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="website.website",
|
||||
verbose_name="站点",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
"verbose_name": "自动登录",
|
||||
"verbose_name_plural": "自动登录",
|
||||
"ordering": ["site"],
|
||||
},
|
||||
),
|
||||
]
|
||||
20
website/migrations/0005_alter_signin_options.py
Normal file
20
website/migrations/0005_alter_signin_options.py
Normal file
@@ -0,0 +1,20 @@
|
||||
# Generated by Django 4.1 on 2022-11-03 22:22
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
dependencies = [
|
||||
("website", "0004_alter_ownsite_options_ownsite_user_agent_and_more"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name="signin",
|
||||
options={
|
||||
"ordering": ["site"],
|
||||
"verbose_name": "站点签到",
|
||||
"verbose_name_plural": "站点签到",
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,100 @@
|
||||
# Generated by Django 4.1 on 2022-11-03 22:36
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
dependencies = [
|
||||
("website", "0005_alter_signin_options"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.DeleteModel(name="SingInXpath", ),
|
||||
migrations.AlterModelOptions(
|
||||
name="examine",
|
||||
options={
|
||||
"ordering": ["site"],
|
||||
"verbose_name": "新手考核",
|
||||
"verbose_name_plural": "新手考核",
|
||||
},
|
||||
),
|
||||
migrations.RenameField(
|
||||
model_name="website", old_name="examine", new_name="exam",
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="examine",
|
||||
name="avg_seed_time",
|
||||
field=models.FloatField(
|
||||
default=0, help_text="计算单位:小时", verbose_name="平均做种时间"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="examine",
|
||||
name="bouns",
|
||||
field=models.FloatField(default=0, verbose_name="魔力值"),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="examine",
|
||||
name="downloaded",
|
||||
field=models.FloatField(
|
||||
default=50, help_text="计算单位:GB", verbose_name="魔力值"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="examine",
|
||||
name="end_time",
|
||||
field=models.DateTimeField(default=django.utils.timezone.now, verbose_name="考核结束时间"),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="examine",
|
||||
name="rate",
|
||||
field=models.FloatField(default=0, verbose_name="做种率"),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="examine",
|
||||
name="score",
|
||||
field=models.FloatField(default=0, verbose_name="做种积分"),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="examine",
|
||||
name="site",
|
||||
field=models.OneToOneField(
|
||||
default="",
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="website.website",
|
||||
verbose_name="站点",
|
||||
),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="examine",
|
||||
name="uploaded",
|
||||
field=models.FloatField(
|
||||
default=50, help_text="计算单位:GB", verbose_name="上传量"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="infoxpath",
|
||||
name="site",
|
||||
field=models.OneToOneField(
|
||||
default="",
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="website.website",
|
||||
verbose_name="站点",
|
||||
),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="torrentlistxpath",
|
||||
name="site",
|
||||
field=models.OneToOneField(
|
||||
default="",
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="website.website",
|
||||
verbose_name="站点",
|
||||
),
|
||||
preserve_default=False,
|
||||
),
|
||||
]
|
||||
0
website/migrations/__init__.py
Normal file
0
website/migrations/__init__.py
Normal file
278
website/models.py
Normal file
278
website/models.py
Normal file
@@ -0,0 +1,278 @@
|
||||
import django
|
||||
from django.db import models
|
||||
|
||||
from ptools.base import BaseEntity, Schemas
|
||||
|
||||
|
||||
# Create your models here.
|
||||
|
||||
class WebSite(BaseEntity):
|
||||
"""站点基础信息"""
|
||||
# 基本信息
|
||||
url = models.URLField(verbose_name='站点网址', default='', help_text='请保留网址结尾的"/"', unique=True)
|
||||
name = models.CharField(max_length=32, verbose_name='站点名称', help_text='站点常用名称')
|
||||
nickname = models.CharField(max_length=32, verbose_name='别称', help_text='昵称,小名', default='')
|
||||
schemas = models.CharField(choices=Schemas.choices, default=Schemas.NexusPHP, verbose_name='站点架构',
|
||||
max_length=16)
|
||||
logo = models.URLField(verbose_name='站点logo', default='', help_text='站点logo图标')
|
||||
tracker = models.CharField(verbose_name='tracker', default='', help_text='tracker网址关键字', max_length=32)
|
||||
tags = models.CharField(verbose_name='标签', help_text='定义站点资源标签,使用英文逗号‘,’分割', default='',
|
||||
max_length=128)
|
||||
hr = models.BooleanField(verbose_name='H&R', help_text='站点HR状态', default=False)
|
||||
# 功能支持
|
||||
sign_in = models.BooleanField(verbose_name='签到', help_text='是否需要签到', default=False)
|
||||
info_capture = models.BooleanField(verbose_name='抓取信息', default=True, help_text='是否支持抓取信息')
|
||||
torrent_capture = models.BooleanField(verbose_name='抓取种子', default=True, help_text='是否支持抓取种子')
|
||||
auto_login = models.BooleanField(verbose_name='自动登录', default=False, help_text='是否支持自动登录并获取Cookie')
|
||||
search = models.BooleanField(verbose_name='聚合搜索', default=True, help_text='是否支持聚合搜索')
|
||||
assist = models.BooleanField(verbose_name='辅种', default=True, help_text='是否支持辅种')
|
||||
exam = models.BooleanField(verbose_name='新手考核', default=True, help_text='是否支持新手考核信息比对')
|
||||
invite = models.BooleanField(verbose_name='邀请', default=True, help_text='是否支持邀请')
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'PT站点'
|
||||
verbose_name_plural = verbose_name
|
||||
ordering = ['name', ]
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
class OwnSite(BaseEntity):
|
||||
"""我的站点,保存UID,PASSKEY,Cookie"""
|
||||
site = models.OneToOneField(verbose_name='站点', to=WebSite, on_delete=models.CASCADE)
|
||||
sort_id = models.IntegerField(verbose_name='排序', default=99)
|
||||
# 用户信息
|
||||
user_id = models.CharField(verbose_name='用户ID', max_length=16)
|
||||
passkey = models.CharField(max_length=128, verbose_name='Passkey', blank=True, null=True)
|
||||
cookie = models.TextField(verbose_name='Cookie')
|
||||
user_agent = models.CharField(
|
||||
verbose_name='User-Agent', max_length=256,
|
||||
default='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.28',
|
||||
)
|
||||
# 功能开启
|
||||
hr = models.BooleanField(verbose_name='开启HR下载', default=False, help_text='是否下载HR种子')
|
||||
sign_in = models.BooleanField(verbose_name='开启签到', default=True, help_text='是否开启签到')
|
||||
search = models.BooleanField(verbose_name='开启搜索', default=True, help_text='是否开启搜索')
|
||||
|
||||
class Meta:
|
||||
verbose_name = '我的站点'
|
||||
verbose_name_plural = verbose_name
|
||||
ordering = ['sort_id', ]
|
||||
|
||||
def __str__(self):
|
||||
return self.site
|
||||
|
||||
|
||||
class SignIn(BaseEntity):
|
||||
"""
|
||||
签到代码,
|
||||
签到调用的代码模板
|
||||
"""
|
||||
site = models.OneToOneField(verbose_name='站点', to=WebSite, on_delete=models.CASCADE)
|
||||
url_check = models.CharField(max_length=128, verbose_name='签到检测链接', default='attendance.php')
|
||||
url_sign_in = models.CharField(max_length=128, verbose_name='签到链接', default='attendance.php')
|
||||
params_sign = models.CharField(max_length=1024, verbose_name='签到参数', default='')
|
||||
params_name_xpath = models.CharField(
|
||||
max_length=1024, verbose_name='签到参数名称', default='', help_text='支持多个参数,使用英文逗号‘,’分割'
|
||||
)
|
||||
params_value_xpath = models.CharField(
|
||||
max_length=1024, verbose_name='签到参数Value', default='',
|
||||
help_text='支持多个参数,使用英文逗号‘,’分割'
|
||||
)
|
||||
method_sign = models.CharField(max_length=8, verbose_name='请求方式', choices=(
|
||||
('post', 'post'),
|
||||
('get', 'get')
|
||||
), default='get')
|
||||
res_sign_xpath = models.CharField(max_length=1024, verbose_name='签到信息Xpath', default='')
|
||||
|
||||
class Meta:
|
||||
verbose_name = '站点签到'
|
||||
verbose_name_plural = verbose_name
|
||||
ordering = ['site', ]
|
||||
|
||||
def __str__(self):
|
||||
return self.site
|
||||
|
||||
|
||||
class AutoLogin(BaseEntity):
|
||||
"""自动登录"""
|
||||
site = models.OneToOneField(verbose_name='站点', to=WebSite, on_delete=models.CASCADE)
|
||||
username = models.CharField(max_length=32, verbose_name='用户名')
|
||||
password = models.CharField(max_length=32, verbose_name='密码')
|
||||
captcha = models.CharField(max_length=16, verbose_name='验证码字段名')
|
||||
captcha_xpath = models.CharField(max_length=256, verbose_name='验证码Xpath')
|
||||
|
||||
class Meta:
|
||||
verbose_name = '自动登录'
|
||||
verbose_name_plural = verbose_name
|
||||
ordering = ['site', ]
|
||||
|
||||
def __str__(self):
|
||||
return self.site
|
||||
|
||||
|
||||
class InfoXpath(BaseEntity):
|
||||
"""获取个人信息Xpath规则模板"""
|
||||
site = models.OneToOneField(verbose_name='站点', to=WebSite, on_delete=models.CASCADE)
|
||||
url_user = models.CharField(verbose_name='个人主页', default='userdetails.php?id={}', max_length=64)
|
||||
url_bonus = models.CharField(verbose_name='魔力值页面',
|
||||
default='mybonus.php',
|
||||
max_length=64)
|
||||
url_seeding = models.CharField(verbose_name='当前做种信息',
|
||||
default='getusertorrentlistajax.php?userid={}&type=seeding',
|
||||
max_length=64)
|
||||
uploaded_rule = models.CharField(
|
||||
verbose_name='上传量',
|
||||
default='//font[@class="color_uploaded"]/following-sibling::text()[1]',
|
||||
max_length=128)
|
||||
downloaded_rule = models.CharField(
|
||||
verbose_name='下载量',
|
||||
default='//font[@class="color_downloaded"]/following-sibling::text()[1]',
|
||||
max_length=128)
|
||||
ratio_rule = models.CharField(
|
||||
verbose_name='分享率',
|
||||
default='//font[@class="color_ratio"][1]/following-sibling::text()[1]',
|
||||
max_length=128)
|
||||
my_bonus_rule = models.CharField(
|
||||
verbose_name='魔力值',
|
||||
default='//a[@href="mybonus.php"]/following-sibling::text()[1]',
|
||||
max_length=128)
|
||||
hour_bonus_rule = models.CharField(
|
||||
verbose_name='时魔',
|
||||
default='//div[contains(text(),"每小时能获取")]/text()[1]',
|
||||
max_length=128)
|
||||
my_score_rule = models.CharField(
|
||||
verbose_name='保种积分',
|
||||
default='//font[@class="color_bonus" and contains(text(),"积分")]/following-sibling::text()[1]',
|
||||
max_length=128)
|
||||
my_level_rule = models.CharField(
|
||||
verbose_name='用户等级',
|
||||
default='//table[@id="info_block"]//span/a[contains(@class,"_Name") and contains(@href,"userdetails.php?id=")]/@class',
|
||||
max_length=128
|
||||
)
|
||||
my_hr_rule = models.CharField(
|
||||
verbose_name='H&R',
|
||||
default='//a[@href="myhr.php"]//text()',
|
||||
max_length=128)
|
||||
leech_rule = models.CharField(
|
||||
verbose_name='下载数量',
|
||||
default='//img[@class="arrowdown"]/following-sibling::text()[1]',
|
||||
max_length=128)
|
||||
|
||||
seed_rule = models.CharField(verbose_name='做种数量',
|
||||
default='//img[@class="arrowup"]/following-sibling::text()[1]',
|
||||
max_length=128)
|
||||
|
||||
my_invite_rule = models.CharField(
|
||||
verbose_name='邀请资格',
|
||||
default='//span/a[contains(@href,"invite.php?id=")]/following-sibling::text()[1]',
|
||||
max_length=128)
|
||||
|
||||
seed_vol_rule = models.CharField(verbose_name='做种大小',
|
||||
default='//tr/td[3]',
|
||||
help_text='需对数据做处理',
|
||||
max_length=128)
|
||||
mailbox_rule = models.CharField(verbose_name='邮件规则',
|
||||
default='//a[@href="messages.php"]/font[contains(text(),"条")]/text()[1]',
|
||||
help_text='获取新邮件',
|
||||
max_length=128)
|
||||
notice_rule = models.CharField(verbose_name='公告规则',
|
||||
default='//a[@href="index.php"]/font[contains(text(),"条")]/text()[1]',
|
||||
help_text='获取新公告',
|
||||
max_length=128)
|
||||
time_join_rule = models.CharField(
|
||||
verbose_name='注册时间',
|
||||
default='//td[contains(text(),"加入")]/following-sibling::td/span/@title',
|
||||
max_length=128)
|
||||
latest_active_rule = models.CharField(
|
||||
verbose_name='最后活动时间',
|
||||
default='//td[contains(text(),"最近动向")]/following-sibling::td/span/@title',
|
||||
max_length=128)
|
||||
|
||||
class Meta:
|
||||
verbose_name = '个人信息规则'
|
||||
verbose_name_plural = verbose_name
|
||||
ordering = ['site', ]
|
||||
|
||||
def __str__(self):
|
||||
return self.site
|
||||
|
||||
|
||||
class HRListXpath(BaseEntity):
|
||||
"""种子列表Xpath模板"""
|
||||
site = models.OneToOneField(verbose_name='站点', to=WebSite, on_delete=models.CASCADE)
|
||||
url_hr = models.CharField(verbose_name='HR考核信息',
|
||||
default='myhr.php?status=1',
|
||||
max_length=64)
|
||||
torrents = models.CharField(verbose_name='考核种子列表',
|
||||
default='//table[@id="hr-table"]/tbody/tr',
|
||||
max_length=64)
|
||||
torrent_name = models.CharField(verbose_name='考核种子名称',
|
||||
default='./td[2]//text()',
|
||||
max_length=64)
|
||||
torrent_url = models.CharField(verbose_name='种子链接',
|
||||
default='./td[2]//a/@href',
|
||||
max_length=64)
|
||||
torrent_ratio = models.CharField(verbose_name='种子分享率',
|
||||
default='./td[2]//a/@href',
|
||||
max_length=64)
|
||||
time_to_seeding = models.CharField(verbose_name='还需做种时间',
|
||||
default='./td[6]//text()',
|
||||
max_length=64)
|
||||
time_end_seeding = models.CharField(verbose_name='剩余考核时间',
|
||||
default='./td[6]//text()',
|
||||
max_length=64)
|
||||
"""
|
||||
<table width="100%" id="hr-table">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="colhead" align="center"> H&R ID</td>
|
||||
<td class="colhead" align="center"> 种子名称</td>
|
||||
<td class="colhead" align="center">上传量</td>
|
||||
<td class="colhead" align="center">下载量</td>
|
||||
<td class="colhead" align="center">分享率</td>
|
||||
<td class="colhead" align="center">还需做种时间</td>
|
||||
<td class="colhead" align="center">下载完成时间</td>
|
||||
<td class="colhead" align="center">剩余考察时间</td>
|
||||
<td class="colhead" align="center">备注</td>
|
||||
<td class="colhead" align="center">操作</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
"""
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'H&R规则'
|
||||
verbose_name_plural = verbose_name
|
||||
ordering = ['site', ]
|
||||
|
||||
def __str__(self):
|
||||
return self.site
|
||||
|
||||
|
||||
class TorrentListXpath(BaseEntity):
|
||||
"""种子列表Xpath模板"""
|
||||
site = models.OneToOneField(verbose_name='站点', to=WebSite, on_delete=models.CASCADE)
|
||||
|
||||
pass
|
||||
|
||||
|
||||
class Examine(BaseEntity):
|
||||
"""新手考核"""
|
||||
site = models.OneToOneField(verbose_name='站点', to=WebSite, on_delete=models.CASCADE)
|
||||
end_time = models.DateTimeField(verbose_name='考核结束时间', default=django.utils.timezone.now)
|
||||
bonus = models.FloatField(verbose_name='魔力值', default=0)
|
||||
score = models.FloatField(verbose_name='做种积分', default=0)
|
||||
uploaded = models.FloatField(verbose_name='上传量', default=50, help_text='计算单位:GB')
|
||||
downloaded = models.FloatField(verbose_name='魔力值', default=50, help_text='计算单位:GB')
|
||||
avg_seed_time = models.FloatField(verbose_name='平均做种时间', default=0, help_text='计算单位:小时')
|
||||
rate = models.FloatField(verbose_name='做种率', default=0)
|
||||
|
||||
class Meta:
|
||||
verbose_name = '新手考核'
|
||||
verbose_name_plural = verbose_name
|
||||
ordering = ['site', ]
|
||||
|
||||
def __str__(self):
|
||||
return self.site
|
||||
1
website/tests.py
Normal file
1
website/tests.py
Normal file
@@ -0,0 +1 @@
|
||||
# Create your tests here.
|
||||
1
website/views.py
Normal file
1
website/views.py
Normal file
@@ -0,0 +1 @@
|
||||
# Create your views here.
|
||||
Reference in New Issue
Block a user