179 lines
5.9 KiB
Python
179 lines
5.9 KiB
Python
import requests
|
||
from datetime import datetime, timedelta
|
||
import json
|
||
import logging
|
||
|
||
# 配置日志
|
||
logging.basicConfig(
|
||
level=logging.INFO,
|
||
format='%(asctime)s - %(levelname)s - %(message)s'
|
||
)
|
||
|
||
|
||
class MobgiAPIClient:
|
||
def __init__(self):
|
||
self.session = requests.Session()
|
||
self.login_time = None
|
||
self.expire_time = None
|
||
self.api_base = "https://180.213.188.227"
|
||
self.api_host = "cli1.mobgi.com"
|
||
self.is_logged_in = False
|
||
# 添加用于存储 cookie 的变量
|
||
self.session_cookie = None
|
||
|
||
def login(self, email, password, expire_hours=24):
|
||
"""登录并保存会话状态"""
|
||
# 清除可能的旧会话
|
||
self.session.cookies.clear()
|
||
self.is_logged_in = False
|
||
|
||
url = f"{self.api_base}/User/AdminUser/login"
|
||
payload = {"email": email, "password": password, "product_version": 0}
|
||
|
||
try:
|
||
# 登录请求使用独立的 headers
|
||
headers = {"Content-Type": "application/json", "Host": self.api_host}
|
||
response = self.session.post(
|
||
url,
|
||
json=payload,
|
||
headers=headers,
|
||
verify=False,
|
||
timeout=10
|
||
)
|
||
response.raise_for_status()
|
||
|
||
# 解析响应
|
||
resp_data = response.json()
|
||
if resp_data.get('code') != 0:
|
||
logging.error(f"登录失败: {resp_data.get('message', '未知错误')}")
|
||
return False
|
||
|
||
# 提取并保存会话 cookie
|
||
self.session_cookie = self._extract_session_cookie(response)
|
||
|
||
if not self.session_cookie:
|
||
logging.error("未能获取会话cookie")
|
||
return False
|
||
|
||
# 更新登录状态
|
||
self.login_time = datetime.now()
|
||
self.expire_time = self.login_time + timedelta(hours=expire_hours)
|
||
self.is_logged_in = True
|
||
|
||
logging.info(f"登录成功! 会话有效期至 {self.expire_time.strftime('%Y-%m-%d %H:%M:%S')}")
|
||
logging.info(f"cookie: {self.session_cookie}")
|
||
# return self.session_cookie
|
||
return True
|
||
|
||
except requests.exceptions.RequestException as e:
|
||
logging.error(f"登录请求异常: {str(e)}")
|
||
return False
|
||
except json.JSONDecodeError:
|
||
logging.error("登录响应解析失败: 无效的JSON格式")
|
||
return False
|
||
|
||
def _extract_session_cookie(self, response):
|
||
"""从响应中提取会话cookie"""
|
||
# 直接查找特定的 cookie 名称
|
||
cookie_value = response.cookies.get("chuangliang_session")
|
||
if cookie_value:
|
||
return f"chuangliang_session={cookie_value};"
|
||
|
||
# 如果无法直接获取,尝试从 Set-Cookie 头解析
|
||
set_cookie = response.headers.get("Set-Cookie")
|
||
if set_cookie:
|
||
# 简单地从 Set-Cookie 中提取会话信息
|
||
# 实际处理可能需要更复杂的逻辑
|
||
if "chuangliang_session=" in set_cookie:
|
||
parts = set_cookie.split(";")
|
||
for part in parts:
|
||
if "chuangliang_session=" in part:
|
||
return part.strip() + ";"
|
||
|
||
return None
|
||
|
||
def _get_request_headers(self):
|
||
"""构造请求头,包含必要的cookie"""
|
||
headers = {
|
||
"Content-Type": "application/json",
|
||
# 添加其他可能需要的通用头
|
||
}
|
||
|
||
if self.session_cookie:
|
||
# 将会话 cookie 添加到 headers
|
||
headers["cookie"] = self.session_cookie
|
||
|
||
return headers
|
||
|
||
def check_session(self):
|
||
"""检查会话有效性"""
|
||
if not self.is_logged_in or not self.expire_time:
|
||
logging.warning("会话未初始化,请先登录")
|
||
return False
|
||
|
||
if datetime.now() > self.expire_time:
|
||
logging.warning(f"会话已过期,有效期至 {self.expire_time.strftime('%Y-%m-%d %H:%M:%S')}")
|
||
return False
|
||
|
||
return True
|
||
|
||
|
||
def __del__(self):
|
||
"""关闭会话"""
|
||
self.session.close()
|
||
logging.info("会话已关闭")
|
||
|
||
|
||
def cookie():
|
||
client = MobgiAPIClient()
|
||
email = "974509022@qq.com"
|
||
# password = "0e3bc01f8f0409f4541015737925ed8e"
|
||
# email = "chuangliang@lyzh.com"
|
||
password = "0e3bc01f8f0409f4541015737925ed8e"
|
||
client.login(email=email, password=password)
|
||
cookies_str = client.session_cookie
|
||
# 将字符串转换为字典
|
||
cookies_dict = {}
|
||
parts = cookies_str.strip(';').split(';')
|
||
for part in parts:
|
||
part = part.strip()
|
||
if '=' in part:
|
||
key, value = part.split('=', 1)
|
||
cookies_dict[key.strip()] = value.strip()
|
||
|
||
return cookies_dict
|
||
# 使用示例
|
||
# if __name__ == "__main__":
|
||
# cookie = cookie()
|
||
# # 初始化客户端
|
||
# client = MobgiAPIClient()
|
||
# email = "974509022@qq.com"
|
||
# password = "0e3bc01f8f0409f4541015737925ed8e"
|
||
# client.login(email=email, password=password)
|
||
# cookie = client.session_cookie
|
||
# 登录(使用您提供的凭证)
|
||
# if client.login(
|
||
# email="974509022@qq.com",
|
||
# password="0e3bc01f8f0409f4541015737925ed8e"
|
||
# ):
|
||
# logging.info(f"获取的会话Cookie: {client.session_cookie}")
|
||
#
|
||
# # 获取广告主列表
|
||
# advertiser_data = client.get_advertiser_list(
|
||
# start_date="2025-07-01",
|
||
# end_date="2025-07-31",
|
||
# conditions=None,
|
||
# page=1,
|
||
# page_size=50
|
||
# )
|
||
#
|
||
# if advertiser_data:
|
||
# print("成功获取广告主列表:")
|
||
# print(f"总记录数: {advertiser_data.get('total_count', 0)}")
|
||
# print(f"总页数: {advertiser_data.get('total_page', 1)}")
|
||
# print(f"当前页数据: {json.dumps(advertiser_data.get('list', []), indent=2, ensure_ascii=False)}")
|
||
# else:
|
||
# print("获取广告主列表失败")
|
||
# else:
|
||
# print("登录失败")
|