Skip to content

Commit

Permalink
Merge pull request #176 from Starry-OvO/develop
Browse files Browse the repository at this point in the history
Update 4.2.0
  • Loading branch information
Starry-OvO committed Mar 8, 2024
2 parents f5a2a3d + 63ef862 commit 797430c
Show file tree
Hide file tree
Showing 34 changed files with 579 additions and 76 deletions.
2 changes: 1 addition & 1 deletion aiotieba/__version__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "4.1.0"
__version__ = "4.2.0"
97 changes: 75 additions & 22 deletions aiotieba/api/_classdef/user.py
Original file line number Diff line number Diff line change
@@ -1,46 +1,75 @@
import dataclasses as dcs
from typing import Union
from typing import List

from ...enums import Gender, PrivLike, PrivReply
from .vimage import VirtualImage


@dcs.dataclass
class UserInfo:
"""
用户信息
一般用于构造参数
Args:
id_ (str | int, optional): 用于快速构造UserInfo的自适应参数 输入用户名或portrait或user_id
Attributes:
user_id (int): user_id
portrait (str): portrait
user_name (str): 用户名
nick_name_old (str): 旧版昵称
nick_name_new (str): 新版昵称
tieba_uid (int): 用户个人主页uid
glevel (int): 贴吧成长等级
gender (Gender): 性别
age (float): 吧龄 以年为单位
post_num (int): 发帖数
agree_num (int): 获赞数
fan_num (int): 粉丝数
follow_num (int): 关注数
forum_num (int): 关注贴吧数
sign (str): 个性签名
ip (str): ip归属地
icons (list[str]): 印记信息
vimage (VirtualImage_pf): 虚拟形象信息
is_vip (bool): 是否超级会员
is_god (bool): 是否大神
is_blocked (bool): 是否被永久封禁屏蔽
priv_like (PrivLike): 关注吧列表的公开状态
priv_reply (PrivReply): 帖子评论权限
nick_name (str): 用户昵称
show_name (str): 显示名称
log_name (str): 用于在日志中记录用户信息
"""

user_id: int = 0
portrait: str = ''
user_name: str = ''
nick_name_old: str = ''
nick_name_new: str = ''
tieba_uid: int = 0

def __init__(self, id_: Union[str, int, None] = None) -> None:
self.user_id = 0
self.portrait = ''
self.user_name = ''
glevel: int = 0
gender: Gender = Gender.UNKNOWN
age: float = 0.0
post_num: int = 0
agree_num: int = 0
fan_num: int = 0
follow_num: int = 0
forum_num: int = 0
sign: str = ""
ip: str = ''
icons: List[str] = dcs.field(default_factory=list)
vimage: VirtualImage = dcs.field(default_factory=VirtualImage)

if id_ is not None:
if isinstance(id_, int):
self.user_id = id_
else:
self.portrait = id_
if not self.portrait:
self.user_name = id_
is_vip: bool = False
is_god: bool = False
is_blocked: bool = False
priv_like: PrivLike = PrivLike.PUBLIC
priv_reply: PrivReply = PrivReply.ALL

def __str__(self) -> str:
if self.user_name:
return self.user_name
elif self.portrait:
return self.portrait
else:
return str(self.user_id)
return self.user_name or self.portrait or str(self.user_id)

def __eq__(self, obj: "UserInfo") -> bool:
return self.user_id == obj.user_id
Expand All @@ -50,3 +79,27 @@ def __hash__(self) -> int:

def __bool__(self) -> bool:
return bool(self.user_id)

def __ior__(self, obj: "UserInfo") -> "UserInfo":
for field in dcs.fields(obj):
if hasattr(self, field.name):
val = getattr(obj, field.name)
setattr(self, field.name, val)
return self

@property
def nick_name(self) -> str:
return self.nick_name_new or self.nick_name_old

@property
def show_name(self) -> str:
return self.nick_name_new or self.nick_name_old or self.user_name

@property
def log_name(self) -> str:
if self.user_name:
return self.user_name
elif self.portrait:
return f"{self.nick_name}/{self.portrait}"
else:
return str(self.user_id)
2 changes: 1 addition & 1 deletion aiotieba/api/get_bawu_blacklist/_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,5 @@ async def request(http_core: HttpCore, fname: str, pn: int) -> BawuBlacklistUser
yarl.URL.build(scheme="https", host=WEB_BASE_HOST, path="/bawu2/platform/listBlackUser"), params
)

body = await http_core.net_core.send_request(request, read_bufsize=64 * 1024)
body = await http_core.net_core.send_request(request, read_bufsize=16 * 1024)
return parse_body(body)
2 changes: 1 addition & 1 deletion aiotieba/api/get_bawu_postlogs/_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,5 @@ async def request(
yarl.URL.build(scheme="https", host=WEB_BASE_HOST, path="/bawu2/platform/listPostLog"), params
)

body = await http_core.net_core.send_request(request, read_bufsize=64 * 1024)
body = await http_core.net_core.send_request(request, read_bufsize=32 * 1024)
return parse_body(body)
2 changes: 1 addition & 1 deletion aiotieba/api/get_blocks/_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,5 @@ async def request(http_core: HttpCore, fid: int, name: str, pn: int) -> Blocks:
yarl.URL.build(scheme="https", host=WEB_BASE_HOST, path="/mo/q/bawublock"), params
)

body = await http_core.net_core.send_request(request, read_bufsize=64 * 1024)
body = await http_core.net_core.send_request(request, read_bufsize=32 * 1024)
return parse_body(body)
2 changes: 2 additions & 0 deletions aiotieba/api/get_forum/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from ._api import parse_body, request
from ._classdef import Forum
29 changes: 29 additions & 0 deletions aiotieba/api/get_forum/_api.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import yarl

from ...const import APP_BASE_HOST, APP_SECURE_SCHEME
from ...core import HttpCore
from ...exception import TiebaServerError
from ...helper import parse_json
from ._classdef import Forum


def parse_body(body: bytes) -> Forum:
res_json = parse_json(body)
if code := int(res_json['error_code']):
raise TiebaServerError(code, res_json['error_msg'])

forum_dict = res_json['forum']
forum = Forum.from_tbdata(forum_dict)

return forum


async def request(http_core: HttpCore, fname: str) -> Forum:
data = [('kw', fname)]

request = http_core.pack_form_request(
yarl.URL.build(scheme=APP_SECURE_SCHEME, host=APP_BASE_HOST, path="/c/f/frs/frsBottom"), data
)

body = await http_core.net_core.send_request(request, read_bufsize=8 * 1024)
return parse_body(body)
58 changes: 58 additions & 0 deletions aiotieba/api/get_forum/_classdef.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import dataclasses as dcs
from typing import Mapping

from ...exception import TbErrorExt


@dcs.dataclass
class Forum(TbErrorExt):
"""
贴吧信息
Attributes:
err (Exception | None): 捕获的异常
fid (int): 贴吧id
fname (str): 贴吧名
category (str): 一级分类
subcategory (str): 二级分类
small_avatar (str): 吧头像(小)
slogan (str): 吧标语
member_num (int): 吧会员数
post_num (int): 发帖量
thread_num (int): 主题帖数
has_bawu (bool): 是否有吧务
"""

fid: int = 0
fname: str = ''

category: str = ''
subcategory: str = ''

small_avatar: str = ""
slogan: str = ""
member_num: int = 0
post_num: int = 0
thread_num: int = 0

has_bawu: bool = False

@staticmethod
def from_tbdata(data_map: Mapping) -> "Forum":
fid = data_map['id']
fname = data_map['name']
category = data_map['first_class']
subcategory = data_map['second_class']
small_avatar = data_map['avatar']
slogan = data_map['slogan']
member_num = data_map['member_num']
post_num = data_map['post_num']
thread_num = data_map['thread_num']
has_bawu = 'managers' in data_map
return Forum(
fid, fname, category, subcategory, small_avatar, slogan, member_num, post_num, thread_num, has_bawu
)
9 changes: 7 additions & 2 deletions aiotieba/api/get_forum_detail/_classdef.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,16 @@
@dcs.dataclass
class Forum_detail(TbErrorExt):
"""
吧基本信息
贴吧信息
Attributes:
err (Exception | None): 捕获的异常
fid (int): 贴吧id
fname (str): 贴吧名
category (str): 一级分类
small_avatar (str): 吧头像(小)
origin_avatar (str): 吧头像(原图)
slogan (str): 吧标语
Expand All @@ -27,6 +29,8 @@ class Forum_detail(TbErrorExt):
fid: int = 0
fname: str = ''

category: str = ''

small_avatar: str = ""
origin_avatar: str = ""
slogan: str = ""
Expand All @@ -40,10 +44,11 @@ def from_tbdata(data_proto: TypeMessage) -> "Forum_detail":
forum_proto = data_proto.forum_info
fid = forum_proto.forum_id
fname = forum_proto.forum_name
category = forum_proto.lv1_name
small_avatar = forum_proto.avatar
origin_avatar = forum_proto.avatar_origin
slogan = forum_proto.slogan
member_num = forum_proto.member_count
post_num = forum_proto.thread_count
has_bawu = data_proto.election_tab.new_strategy_text == "已有吧主"
return Forum_detail(fid, fname, small_avatar, origin_avatar, slogan, member_num, post_num, has_bawu)
return Forum_detail(fid, fname, category, small_avatar, origin_avatar, slogan, member_num, post_num, has_bawu)
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ message GetForumDetailResIdl {
uint32 member_count = 5;
uint32 thread_count = 6;
string slogan = 7;
string lv1_name = 18;
string avatar_origin = 20;
}
RecommendForumInfo forum_info = 1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from ..._protobuf import Error_pb2 as Error__pb2

DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(
b'\n\x1aGetForumDetailResIdl.proto\x1a\x0b\x45rror.proto\"\xc5\x03\n\x14GetForumDetailResIdl\x12\x15\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x06.Error\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.GetForumDetailResIdl.DataRes\x1a\xe8\x02\n\x07\x44\x61taRes\x12\x44\n\nforum_info\x18\x01 \x01(\x0b\x32\x30.GetForumDetailResIdl.DataRes.RecommendForumInfo\x12\x46\n\x0c\x65lection_tab\x18\x08 \x01(\x0b\x32\x30.GetForumDetailResIdl.DataRes.ManagerElectionTab\x1a\x9d\x01\n\x12RecommendForumInfo\x12\x0e\n\x06\x61vatar\x18\x01 \x01(\t\x12\x10\n\x08\x66orum_id\x18\x02 \x01(\x04\x12\x12\n\nforum_name\x18\x03 \x01(\t\x12\x14\n\x0cmember_count\x18\x05 \x01(\r\x12\x14\n\x0cthread_count\x18\x06 \x01(\r\x12\x0e\n\x06slogan\x18\x07 \x01(\t\x12\x15\n\ravatar_origin\x18\x14 \x01(\t\x1a/\n\x12ManagerElectionTab\x12\x19\n\x11new_strategy_text\x18\x05 \x01(\tb\x06proto3'
b'\n\x1aGetForumDetailResIdl.proto\x1a\x0b\x45rror.proto\"\xd7\x03\n\x14GetForumDetailResIdl\x12\x15\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x06.Error\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x1d.GetForumDetailResIdl.DataRes\x1a\xfa\x02\n\x07\x44\x61taRes\x12\x44\n\nforum_info\x18\x01 \x01(\x0b\x32\x30.GetForumDetailResIdl.DataRes.RecommendForumInfo\x12\x46\n\x0c\x65lection_tab\x18\x08 \x01(\x0b\x32\x30.GetForumDetailResIdl.DataRes.ManagerElectionTab\x1a\xaf\x01\n\x12RecommendForumInfo\x12\x0e\n\x06\x61vatar\x18\x01 \x01(\t\x12\x10\n\x08\x66orum_id\x18\x02 \x01(\x04\x12\x12\n\nforum_name\x18\x03 \x01(\t\x12\x14\n\x0cmember_count\x18\x05 \x01(\r\x12\x14\n\x0cthread_count\x18\x06 \x01(\r\x12\x0e\n\x06slogan\x18\x07 \x01(\t\x12\x10\n\x08lv1_name\x18\x12 \x01(\t\x12\x15\n\ravatar_origin\x18\x14 \x01(\t\x1a/\n\x12ManagerElectionTab\x12\x19\n\x11new_strategy_text\x18\x05 \x01(\tb\x06proto3'
)

_globals = globals()
Expand All @@ -20,10 +20,10 @@
if _descriptor._USE_C_DESCRIPTORS is False:
DESCRIPTOR._options = None
_globals['_GETFORUMDETAILRESIDL']._serialized_start = 44
_globals['_GETFORUMDETAILRESIDL']._serialized_end = 497
_globals['_GETFORUMDETAILRESIDL']._serialized_end = 515
_globals['_GETFORUMDETAILRESIDL_DATARES']._serialized_start = 137
_globals['_GETFORUMDETAILRESIDL_DATARES']._serialized_end = 497
_globals['_GETFORUMDETAILRESIDL_DATARES']._serialized_end = 515
_globals['_GETFORUMDETAILRESIDL_DATARES_RECOMMENDFORUMINFO']._serialized_start = 291
_globals['_GETFORUMDETAILRESIDL_DATARES_RECOMMENDFORUMINFO']._serialized_end = 448
_globals['_GETFORUMDETAILRESIDL_DATARES_MANAGERELECTIONTAB']._serialized_start = 450
_globals['_GETFORUMDETAILRESIDL_DATARES_MANAGERELECTIONTAB']._serialized_end = 497
_globals['_GETFORUMDETAILRESIDL_DATARES_RECOMMENDFORUMINFO']._serialized_end = 466
_globals['_GETFORUMDETAILRESIDL_DATARES_MANAGERELECTIONTAB']._serialized_start = 468
_globals['_GETFORUMDETAILRESIDL_DATARES_MANAGERELECTIONTAB']._serialized_end = 515
2 changes: 1 addition & 1 deletion aiotieba/api/get_member_users/_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,5 @@ async def request(http_core: HttpCore, fname: str, pn: int) -> MemberUsers:
yarl.URL.build(scheme="https", host=WEB_BASE_HOST, path="/bawu2/platform/listMemberInfo"), params
)

body = await http_core.net_core.send_request(request, read_bufsize=64 * 1024)
body = await http_core.net_core.send_request(request, read_bufsize=32 * 1024)
return parse_body(body)
2 changes: 2 additions & 0 deletions aiotieba/api/get_rank_forums/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from ._api import parse_body, request
from ._classdef import RankForum, RankForums
30 changes: 30 additions & 0 deletions aiotieba/api/get_rank_forums/_api.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import bs4
import yarl

from ...const import WEB_BASE_HOST
from ...core import HttpCore
from ...enums import RankForumType
from ._classdef import RankForums


def parse_body(body: bytes) -> RankForums:
soup = bs4.BeautifulSoup(body, 'lxml')
bawu_postlogs = RankForums.from_tbdata(soup)

return bawu_postlogs


async def request(http_core: HttpCore, fname: str, pn: int, rank_type: RankForumType) -> RankForums:
params = [
('kw', fname),
('type', int(rank_type)),
('pn', pn),
('ie', 'utf-8'),
]

request = http_core.pack_web_get_request(
yarl.URL.build(scheme="https", host=WEB_BASE_HOST, path="/sign/index"), params
)

body = await http_core.net_core.send_request(request, read_bufsize=8 * 1024)
return parse_body(body)
Loading

0 comments on commit 797430c

Please sign in to comment.