已注册账号表
| 31 | |
| 32 | |
| 33 | class Account(Base): |
| 34 | """已注册账号表""" |
| 35 | __tablename__ = 'accounts' |
| 36 | |
| 37 | id = Column(Integer, primary_key=True, autoincrement=True) |
| 38 | email = Column(String(255), nullable=False, unique=True, index=True) |
| 39 | password = Column(String(255)) # 注册密码(明文存储) |
| 40 | access_token = Column(Text) |
| 41 | refresh_token = Column(Text) |
| 42 | id_token = Column(Text) |
| 43 | session_token = Column(Text) # 会话令牌(优先刷新方式) |
| 44 | client_id = Column(String(255)) # OAuth Client ID |
| 45 | account_id = Column(String(255)) |
| 46 | workspace_id = Column(String(255)) |
| 47 | email_service = Column(String(50), nullable=False) # 'tempmail', 'outlook', 'moe_mail' |
| 48 | email_service_id = Column(String(255)) # 邮箱服务中的ID |
| 49 | proxy_used = Column(String(255)) |
| 50 | registered_at = Column(DateTime, default=utcnow_naive) |
| 51 | last_refresh = Column(DateTime) # 最后刷新时间 |
| 52 | expires_at = Column(DateTime) # Token 过期时间 |
| 53 | status = Column(String(20), default='active') # 'active', 'expired', 'banned', 'failed' |
| 54 | extra_data = Column(JSONEncodedDict) # 额外信息存储 |
| 55 | cpa_uploaded = Column(Boolean, default=False) # 是否已上传到 CPA |
| 56 | cpa_uploaded_at = Column(DateTime) # 上传时间 |
| 57 | source = Column(String(20), default='register') # 'register' 或 'login',区分账号来源 |
| 58 | priority = Column(Integer, default=50, index=True) # 账号优先级 |
| 59 | last_used_at = Column(DateTime, index=True) # 最近用于邀请/绑卡等任务的时间 |
| 60 | subscription_type = Column(String(20)) # None / 'plus' / 'free' |
| 61 | subscription_at = Column(DateTime) # 订阅开通时间 |
| 62 | cookies = Column(Text) # 完整 cookie 字符串,用于支付请求 |
| 63 | created_at = Column(DateTime, default=utcnow_naive) |
| 64 | updated_at = Column(DateTime, default=utcnow_naive, onupdate=utcnow_naive) |
| 65 | bind_card_tasks = relationship("BindCardTask", back_populates="account") |
| 66 | |
| 67 | def to_dict(self) -> Dict[str, Any]: |
| 68 | """转换为字典""" |
| 69 | return { |
| 70 | 'id': self.id, |
| 71 | 'email': self.email, |
| 72 | 'password': self.password, |
| 73 | 'client_id': self.client_id, |
| 74 | 'email_service': self.email_service, |
| 75 | 'account_id': self.account_id, |
| 76 | 'workspace_id': self.workspace_id, |
| 77 | 'registered_at': self.registered_at.isoformat() if self.registered_at else None, |
| 78 | 'last_refresh': self.last_refresh.isoformat() if self.last_refresh else None, |
| 79 | 'expires_at': self.expires_at.isoformat() if self.expires_at else None, |
| 80 | 'status': self.status, |
| 81 | 'proxy_used': self.proxy_used, |
| 82 | 'cpa_uploaded': self.cpa_uploaded, |
| 83 | 'cpa_uploaded_at': self.cpa_uploaded_at.isoformat() if self.cpa_uploaded_at else None, |
| 84 | 'source': self.source, |
| 85 | 'priority': self.priority, |
| 86 | 'last_used_at': self.last_used_at.isoformat() if self.last_used_at else None, |
| 87 | 'subscription_type': self.subscription_type, |
| 88 | 'subscription_at': self.subscription_at.isoformat() if self.subscription_at else None, |
| 89 | 'created_at': self.created_at.isoformat() if self.created_at else None, |
| 90 | 'updated_at': self.updated_at.isoformat() if self.updated_at else None |