From f1a36b7afce73a3c83208f6faf372f2dccbc0e4a Mon Sep 17 00:00:00 2001 From: ngfchl Date: Sat, 12 Nov 2022 21:06:25 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BB=A3=E7=A0=81=EF=BC=9A?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ptools/base.py | 13 + ptools/settings.py | 1 + website/__init__.py | 0 website/admin.py | 24 ++ website/apps.py | 6 + website/migrations/0001_initial.py | 301 ++++++++++++++++++ ..._examine_alter_website_options_and_more.py | 89 ++++++ ...ite_website_hr_website_sign_in_and_more.py | 87 +++++ ...ite_options_ownsite_user_agent_and_more.py | 197 ++++++++++++ .../migrations/0005_alter_signin_options.py | 20 ++ ...ginxpath_alter_examine_options_and_more.py | 100 ++++++ website/migrations/__init__.py | 0 website/models.py | 278 ++++++++++++++++ website/tests.py | 1 + website/views.py | 1 + 15 files changed, 1118 insertions(+) create mode 100644 website/__init__.py create mode 100644 website/admin.py create mode 100644 website/apps.py create mode 100644 website/migrations/0001_initial.py create mode 100644 website/migrations/0002_examine_alter_website_options_and_more.py create mode 100644 website/migrations/0003_ownsite_delete_mysite_website_hr_website_sign_in_and_more.py create mode 100644 website/migrations/0004_alter_ownsite_options_ownsite_user_agent_and_more.py create mode 100644 website/migrations/0005_alter_signin_options.py create mode 100644 website/migrations/0006_delete_singinxpath_alter_examine_options_and_more.py create mode 100644 website/migrations/__init__.py create mode 100644 website/models.py create mode 100644 website/tests.py create mode 100644 website/views.py diff --git a/ptools/base.py b/ptools/base.py index 68fd759..f1a76a0 100644 --- a/ptools/base.py +++ b/ptools/base.py @@ -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' diff --git a/ptools/settings.py b/ptools/settings.py index 2bd1dc7..e71ffe5 100644 --- a/ptools/settings.py +++ b/ptools/settings.py @@ -57,6 +57,7 @@ INSTALLED_APPS = [ 'pt_site', 'pt_test', 'auto_pt', + 'website', ] MIDDLEWARE = [ diff --git a/website/__init__.py b/website/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/website/admin.py b/website/admin.py new file mode 100644 index 0000000..3de6694 --- /dev/null +++ b/website/admin.py @@ -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 diff --git a/website/apps.py b/website/apps.py new file mode 100644 index 0000000..bc26c09 --- /dev/null +++ b/website/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class WebsiteConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "website" diff --git a/website/migrations/0001_initial.py b/website/migrations/0001_initial.py new file mode 100644 index 0000000..bb13945 --- /dev/null +++ b/website/migrations/0001_initial.py @@ -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"], + }, + ), + ] diff --git a/website/migrations/0002_examine_alter_website_options_and_more.py b/website/migrations/0002_examine_alter_website_options_and_more.py new file mode 100644 index 0000000..06a3884 --- /dev/null +++ b/website/migrations/0002_examine_alter_website_options_and_more.py @@ -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="站点架构", + ), + ), + ] diff --git a/website/migrations/0003_ownsite_delete_mysite_website_hr_website_sign_in_and_more.py b/website/migrations/0003_ownsite_delete_mysite_website_hr_website_sign_in_and_more.py new file mode 100644 index 0000000..c8238bb --- /dev/null +++ b/website/migrations/0003_ownsite_delete_mysite_website_hr_website_sign_in_and_more.py @@ -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="站点", + ), + ), + ] diff --git a/website/migrations/0004_alter_ownsite_options_ownsite_user_agent_and_more.py b/website/migrations/0004_alter_ownsite_options_ownsite_user_agent_and_more.py new file mode 100644 index 0000000..693b3d1 --- /dev/null +++ b/website/migrations/0004_alter_ownsite_options_ownsite_user_agent_and_more.py @@ -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"], + }, + ), + ] diff --git a/website/migrations/0005_alter_signin_options.py b/website/migrations/0005_alter_signin_options.py new file mode 100644 index 0000000..7ae4868 --- /dev/null +++ b/website/migrations/0005_alter_signin_options.py @@ -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": "站点签到", + }, + ), + ] diff --git a/website/migrations/0006_delete_singinxpath_alter_examine_options_and_more.py b/website/migrations/0006_delete_singinxpath_alter_examine_options_and_more.py new file mode 100644 index 0000000..014c12a --- /dev/null +++ b/website/migrations/0006_delete_singinxpath_alter_examine_options_and_more.py @@ -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, + ), + ] diff --git a/website/migrations/__init__.py b/website/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/website/models.py b/website/models.py new file mode 100644 index 0000000..34e79c9 --- /dev/null +++ b/website/models.py @@ -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) + """ + + + + + + + + + + + + + + + +
H&R ID 种子名称上传量下载量分享率还需做种时间下载完成时间剩余考察时间备注操作
+ """ + + 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 diff --git a/website/tests.py b/website/tests.py new file mode 100644 index 0000000..a39b155 --- /dev/null +++ b/website/tests.py @@ -0,0 +1 @@ +# Create your tests here. diff --git a/website/views.py b/website/views.py new file mode 100644 index 0000000..60f00ef --- /dev/null +++ b/website/views.py @@ -0,0 +1 @@ +# Create your views here.