重构代码:初始化

This commit is contained in:
ngfchl
2022-11-12 21:06:25 +08:00
parent ac156701b1
commit f1a36b7afc
15 changed files with 1118 additions and 0 deletions

View File

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

View File

@@ -57,6 +57,7 @@ INSTALLED_APPS = [
'pt_site',
'pt_test',
'auto_pt',
'website',
]
MIDDLEWARE = [

0
website/__init__.py Normal file
View File

24
website/admin.py Normal file
View 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
View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class WebsiteConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "website"

View 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"],
},
),
]

View File

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

View File

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

View File

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

View 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": "站点签到",
},
),
]

View File

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

View File

278
website/models.py Normal file
View 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):
"""我的站点保存UIDPASSKEYCookie"""
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&amp;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
View File

@@ -0,0 +1 @@
# Create your tests here.

1
website/views.py Normal file
View File

@@ -0,0 +1 @@
# Create your views here.