zhangwen 6 hours ago
parent
commit
c1f723afc5
  1. 9
      deepseekstart.py
  2. BIN
      kimi_tokens.db
  3. 18
      kimistart.py
  4. 25
      login/kimi_auto_login.py
  5. 266
      login/kimi_auto_login_haozhu.py
  6. 8
      mitastart.py
  7. 4
      utlit/update_db.py

9
deepseekstart.py

@ -283,6 +283,9 @@ class DeepSeekChatClient:
"search_enabled": search_enabled, "search_enabled": search_enabled,
"client_stream_id": client_stream_id + "-3e910d848b6140d5", "client_stream_id": client_stream_id + "-3e910d848b6140d5",
} }
payload = {"chat_session_id": chat_session_id.get("id"), "parent_message_id": None,
"model_type": "default", "prompt": prompt, "ref_file_ids": [], "thinking_enabled": False,
"search_enabled": True, "preempt": False}
# 5) 发送SSE请求 # 5) 发送SSE请求
with requests.post( with requests.post(
@ -299,7 +302,7 @@ class DeepSeekChatClient:
if not raw: if not raw:
continue continue
line = raw.strip() line = raw.strip()
# print(line)
print(line)
data_str = line[6:] if line.startswith("data: ") else line data_str = line[6:] if line.startswith("data: ") else line
if data_str == "[DONE]": if data_str == "[DONE]":
@ -411,7 +414,7 @@ class Start:
thinking_enabled=True, thinking_enabled=True,
search_enabled=True, search_enabled=True,
) )
if thinking == '':
if answer == '':
print('异常结果', ai_search_result_list, answer, thinking) print('异常结果', ai_search_result_list, answer, thinking)
return False return False
@ -440,7 +443,7 @@ class Start:
post_resp = self.tools.post_task(result) post_resp = self.tools.post_task(result)
# print('\n') # print('\n')
# print('\n') # print('\n')
print(result)
print(str(result)[:500])
logger.info(f"任务 {task_id} 提交返回: {post_resp}") logger.info(f"任务 {task_id} 提交返回: {post_resp}")
return result return result

BIN
kimi_tokens.db

18
kimistart.py

@ -68,7 +68,7 @@ class ToolsLoad:
response = requests.request("POST", url, headers=headers, data=payload) response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
print('提交不能用的cookie:', response.text)
return response.text return response.text
@retry('提交结果', 5) @retry('提交结果', 5)
@ -329,6 +329,7 @@ class KimiChatClient:
answer_parts: List[str] = [] answer_parts: List[str] = []
with requests.post(self.url, headers=self._build_headers(), data=framed, stream=True, with requests.post(self.url, headers=self._build_headers(), data=framed, stream=True,
timeout=60) as resp: timeout=60) as resp:
# print(resp.text)
if resp.status_code != 200: if resp.status_code != 200:
text = None text = None
try: try:
@ -345,8 +346,8 @@ class KimiChatClient:
payload_text_total = json.dumps(item, ensure_ascii=False) payload_text_total = json.dumps(item, ensure_ascii=False)
# print(payload_text_total) # print(payload_text_total)
# 判定 token 相关错误 # 判定 token 相关错误
if "当前模型对话次数已达上限" in payload_text_total or "模型对话次数或参数错误" in payload_text_total or "REASON_INVALID_AUTH_TOKEN" in payload_text_total:
raise RuntimeError("模型对话次数或参数错误: " + payload_text_total[:200])
if "当前模型对话次数已达上限" in payload_text_total or "模型对话次数或参数错误" in payload_text_total or "REASON_INVALID_AUTH_TOKEN" in payload_text_total or '请登录后继续使用' in payload_text_total:
raise RuntimeError("模型对话次数或参数错误: " + payload_text_total)
payload_dict = item.get("payload") if isinstance(item.get("payload"), dict) else {} payload_dict = item.get("payload") if isinstance(item.get("payload"), dict) else {}
block = payload_dict.get("block") if isinstance(payload_dict, dict) else None block = payload_dict.get("block") if isinstance(payload_dict, dict) else None
@ -408,12 +409,15 @@ class KimiChatClient:
except Exception as e: except Exception as e:
msg = str(e) msg = str(e)
print('异常:', msg) print('异常:', msg)
time.sleep(10)
time.sleep(5)
# 判定为 token 无效或次数上限等,标记 expired 并尝试下一个 token # 判定为 token 无效或次数上限等,标记 expired 并尝试下一个 token
if "模型对话次数或参数错误" in msg or "当前模型对话次数已达上限" in msg or msg.startswith(
if '请登录后继续使用' in msg or "模型对话次数或参数错误" in msg or "当前模型对话次数已达上限" in msg or msg.startswith(
"http_status_401"): "http_status_401"):
ToolsLoad().update_session(cookie_id, "", "3")
if '请登录后继续使用' in msg:
ToolsLoad().update_session(cookie_id, "", "2")
else:
ToolsLoad().update_session(cookie_id, "", "3")
# 继续尝试下一个 token # 继续尝试下一个 token
return False return False
else: else:
@ -466,7 +470,7 @@ class Start:
# 执行聊天任务 # 执行聊天任务
result = client.chat(platform_id=platform_id, keyword=keyword, brand=brand, task_id=task_id, cookie_id=id) result = client.chat(platform_id=platform_id, keyword=keyword, brand=brand, task_id=task_id, cookie_id=id)
logger.info(f"任务生成结果: {result}")
logger.info(f"任务生成结果: {str(result)[:500]}")
if not result: if not result:
logger.info(f"任务生成结果异常重新获取: {keyword}") logger.info(f"任务生成结果异常重新获取: {keyword}")

25
login/kimi_auto_login.py

@ -24,6 +24,8 @@ class LubanSMS:
def get_number(self): def get_number(self):
"""获取手机号码""" """获取手机号码"""
url = 'https://lubansms.com/v2/api/getKeywordNumber?apikey=5ebc10c8e8c35797de15c9af46063b36&phone=&cardType=全部' url = 'https://lubansms.com/v2/api/getKeywordNumber?apikey=5ebc10c8e8c35797de15c9af46063b36&phone=&cardType=全部'
url = 'https://lubansms.com/v2/api/getKeywordNumber?apikey=5ebc10c8e8c35797de15c9af46063b36&phone=&cardType=%E5%85%A8%E9%83%A8'
url = 'https://lubansms.com/v2/api/getKeywordNumber?apikey=5ebc10c8e8c35797de15c9af46063b36&phone=&cardType=%E5%85%A8%E9%83%A8'
response = requests.get(url) response = requests.get(url)
return response.json() return response.json()
@ -209,13 +211,17 @@ def kimi_auto_login(api_key):
# 等待登录完成 # 等待登录完成
print("等待...") print("等待...")
time.sleep(3)
time.sleep(5)
token = '' token = ''
for packet in page.listen.steps():
print(111)
req = packet.request
if req:
headers = req.headers
while True:
req = page.listen.wait(timeout=3)
if not req:
print('没有找到登录接口')
time.sleep(3)
break
else:
headers = req.request.headers
print(headers) print(headers)
if 'authorization' in headers: if 'authorization' in headers:
token = headers['authorization'] token = headers['authorization']
@ -243,16 +249,15 @@ if __name__ == '__main__':
# 需要用户输入API密钥 # 需要用户输入API密钥
api_key = '5ebc10c8e8c35797de15c9af46063b36' api_key = '5ebc10c8e8c35797de15c9af46063b36'
service_id = '541182' service_id = '541182'
# save_spider_session(
# cookie='eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ1c2VyLWNlbnRlciIsImV4cCI6MTc4MDY0OTgyNCwiaWF0IjoxNzc4MDU3ODI0LCJqdGkiOiJkN3RnNG82bjNtazNyNnJtcHZuZyIsInR5cCI6ImFjY2VzcyIsImFwcF9pZCI6ImtpbWkiLCJzdWIiOiJkNjJxZGhmZnRhZWE2OWltY3RjMCIsInNwYWNlX2lkIjoiZDYycWRoZmZ0YWVhNjlpbWN0YmciLCJhYnN0cmFjdF91c2VyX2lkIjoiZDYycWRoZmZ0YWVhNjlpbWN0YjAiLCJzc2lkIjoiMTczMTU0MTY5Nzc3MDI4NzY2NyIsImRldmljZV9pZCI6Ijc2MzY3MDAwMTk3OTM1MTQyNTIiLCJyZWdpb24iOiJjbiIsIm1lbWJlcnNoaXAiOnsibGV2ZWwiOjEwfX0.bA_j_u3JJSP7uwtBR5YAfR0tuGtbC70kYUyEI9sqXk-b_WrTFeNLDJm2ofJXPRF5yV8cyhbZou9P5K0sbrHO0A')
a = 0 a = 0
for u in range(50):
for u in range(100):
try: try:
result = kimi_auto_login(api_key) result = kimi_auto_login(api_key)
if result: if result:
a += 1 a += 1
print(f"自动登录完成,cookies文件: {result}") print(f"自动登录完成,cookies文件: {result}")
print('成功:',a)
print('成功:', a)
else: else:
print("自动登录失败") print("自动登录失败")
time.sleep(5) time.sleep(5)

266
login/kimi_auto_login_haozhu.py

@ -0,0 +1,266 @@
# coding=utf-8
import os
import re
import time
import json
import requests
from DrissionPage import ChromiumPage, ChromiumOptions, Chromium
class LubanSMS:
"""鲁班短信平台API封装"""
def __init__(self, api_key):
self.api_key = api_key
self.base_url = "https://lubansms.com/v2/api"
def get_balance(self):
"""查询余额"""
url = f"{self.base_url}/getBalance"
params = {"apikey": self.api_key}
response = requests.get(url, params=params)
return response.json()
def get_number(self):
"""获取手机号码"""
url = 'https://lubansms.com/v2/api/getKeywordNumber?apikey=5ebc10c8e8c35797de15c9af46063b36&phone=&cardType=全部'
url = 'https://lubansms.com/v2/api/getKeywordNumber?apikey=5ebc10c8e8c35797de15c9af46063b36&phone=&cardType=%E5%85%A8%E9%83%A8'
url = 'https://lubansms.com/v2/api/getKeywordNumber?apikey=5ebc10c8e8c35797de15c9af46063b36&phone=&cardType=%E5%85%A8%E9%83%A8'
response = requests.get(url)
return response.json()
def get_sms(self, phone):
"""获取短信验证码"""
url = f"https://lubansms.com/v2/api/getKeywordSms?apikey=5ebc10c8e8c35797de15c9af46063b36&phone={phone}&keyword=月之暗面"
response = requests.get(url)
return response.json()
def set_status(self, phone):
"""更改请求状态"""
url = f'https://lubansms.com/v2/api/delKeywordNumber?apikey=5ebc10c8e8c35797de15c9af46063b36&phone={phone}'
response = requests.get(url).json()
print(response)
return response
def save_spider_session(platform_id='4', file_url='', account='test', cookie=''):
"""
session
:param file_url:
:param platform_id:
:param url:
:param file_hash:
:param account:
:return:
"""
url = 'http://granking-api.neicela.com/api/third/saveSpiderSession'
json_data = {
'app_id': 'aa65700299848d6f21b969dbc9f6cf7c',
'secret': '5588071d36f0bc61af849c311a03f2c4',
'platform_id': platform_id,
'account': account,
'url': file_url,
'hash': str(int(time.time() * 1000)),
'cookie': cookie
}
res = requests.post(url, json=json_data).json()
print(res)
return res
def kimi_auto_login(api_key):
"""
使DrissionPage和鲁班短信平台API自动登录Kimi
api_key: API密钥
service_id: IDTinder越南服务
"""
# 初始化鲁班短信API
luban = LubanSMS(api_key)
# 检查余额
balance_info = luban.get_balance()
if balance_info.get("code") != 0:
print(f"API密钥错误: {balance_info.get('msg')}")
return None
print(f"当前余额: {balance_info.get('balance')}元")
co = ChromiumOptions()
co.incognito(True) # 匿名模式
co.auto_port()
# co.set_argument('--no-sandbox') # 无沙盒模式
# 创建浏览器页面
br = Chromium(co)
page = br.new_tab()
# page.set.load_mode.eager()
try:
print("正在打开Kimi网站...")
# 访问Kimi主页
page.get('https://www.kimi.ai', timeout=5)
# 等待页面加载
# 点击登录按钮
try:
login_btn = page.ele('text=登录', timeout=10)
if login_btn:
login_btn.click()
print("已点击登录按钮")
except:
print("未找到登录按钮,尝试其他方式...")
# 尝试点击用户头像区域
try:
user_info = page.ele('.user-info', timeout=10)
if user_info:
user_info.click()
print("已点击用户头像")
except:
pass
time.sleep(2)
page.ele('xpath:/html/body/div[3]/div/div/div/label/span').click()
# 获取手机号码
for i in range(30):
print("正在获取手机号码...")
number_info = luban.get_number()
print(number_info)
if number_info.get("code") != 0:
print(f"获取手机号码失败: {number_info.get('msg')}")
continue
else:
break
phone_number = number_info.get('phone')
if not phone_number:
return False
print(f"获取到手机号码: {phone_number}")
# 输入手机号码
try:
phone_input = page.ele('.phone-login-mobile-number', timeout=10)
if phone_input:
phone_input.clear()
phone_input.input(phone_number)
print("已输入手机号码")
except Exception as e:
print(f"输入手机号码失败: {e}")
return None
# 点击发送验证码按钮
try:
send_code_btn = page.ele('text:发送验证码', timeout=10)
if send_code_btn:
send_code_btn.click()
print("已点击发送验证码")
if page.ele('.yidun_tips', timeout=5):
print('出现验证码换一个')
time.sleep(5)
return False
except Exception as e:
print(f"点击发送验证码按钮失败: {e}")
return None
# 等待并获取验证码
print("等待验证码...")
sms_code = None
max_attempts = 15 # 最多等待30次,每次3秒
for i in range(max_attempts):
sms_info = luban.get_sms(phone_number)
print(sms_info)
if sms_info.get("code") == 0:
sms_code = sms_info.get("msg")
print(f"收到验证码: {sms_code}")
break
else:
print(f"等待验证码中...({i + 1}/{max_attempts})")
time.sleep(2)
if not sms_code:
print("未收到验证码,超时")
# 释放号码
luban.set_status(phone_number)
return None
# 输入验证码
try:
code_input = page.ele('css:input[placeholder="请输入验证码"]')
if code_input:
code_input.clear()
yzm = re.search(r'验证码[::]\s*(\d{4,6})', sms_code).group(1)
code_input.input(yzm)
print("已输入验证码")
except Exception as e:
print(f"输入验证码失败: {e}")
return None
# 点击登录按钮
try:
page.listen.start(['/api/user/wx/register_login/', '/api/device/register', '/api/user'])
login_submit_btn = page.ele('text:登录', timeout=10)
if login_submit_btn:
login_submit_btn.click()
print("已点击登录按钮")
except Exception as e:
print(f"点击登录按钮失败: {e}")
# return None
# 等待登录完成
print("等待...")
time.sleep(5)
token = ''
while True:
req = page.listen.wait(timeout=3)
if not req:
print('没有找到登录接口')
time.sleep(3)
break
else:
headers = req.request.headers
print(headers)
if 'authorization' in headers:
token = headers['authorization']
token = token.split(' ')[-1]
print(token)
save_spider_session(cookie=token, account=str(phone_number))
break
return token
except Exception as e:
print(f"发生错误: {e}")
return None
finally:
# 关闭浏览器
try:
page.close()
br.quit()
except Exception as e:
print(e)
# eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ1c2VyLWNlbnRlciIsImV4cCI6MTc4MDY1MDUzMSwiaWF0IjoxNzc4MDU4NTMxLCJqdGkiOiJkN3RnYTh0cWlwNjhpa3ZqdGtqMCIsInR5cCI6ImFjY2VzcyIsImFwcF9pZCI6ImtpbWkiLCJzdWIiOiJkN3RnYTh0cWlwNjhpa3ZqdGtlMCIsInNwYWNlX2lkIjoiZDd0Z2E4dHFpcDY4aWt2anRrZGciLCJhYnN0cmFjdF91c2VyX2lkIjoiZDd0Z2E4dHFpcDY4aWt2anRrZDAiLCJzc2lkIjoiMTczMTc0MTgwODg3MjkyMjE1MyIsImRldmljZV9pZCI6Ijc2MzY3MDMwMDkwOTA1ODg0MjciLCJyZWdpb24iOiJjbiIsIm1lbWJlcnNoaXAiOnsibGV2ZWwiOjEwfX0.t9mZ7v-XRWQp91QAWxhvG2l5-VKNwJUIv2R2YDD9ilOUStOh6Oz03wiwQkKLcxke17PuSfcj6DUY_8YByTl1rA
if __name__ == '__main__':
# 需要用户输入API密钥
api_key = '5ebc10c8e8c35797de15c9af46063b36'
service_id = '541182'
a = 0
for u in range(100):
try:
result = kimi_auto_login(api_key)
if result:
a += 1
print(f"自动登录完成,cookies文件: {result}")
print('成功:', a)
else:
print("自动登录失败")
time.sleep(5)
except Exception as e:
print(e)
pass

8
mitastart.py

@ -565,4 +565,12 @@ class Start:
if __name__ == "__main__": if __name__ == "__main__":
from update_db import query_tokens
DB = "./kimi_tokens.db"
TABLE = "tokens"
# 单条 upsert
# ok = upsert_token(DB, TABLE, phone="16223053815", platform_name="mita", token_value="JSESSIONID=356E6FEEBF81933FAFE924ED6A7C324C; aliyungf_tc=70df8ace7303f22dccbacee689c1abc32b0a7629a28579fdfefad08c7d04f536; tid=cc159aeb-4f9b-463a-9080-2ebc2d88f0bc; __eventn_id_UMO2dYNwFz=065s1a391e; traceid=2dc94bfd49cc4992; sid=c764bb074d3b496fbeb4ad5eaa8835f0; uid=69255736dddbb6ba7df1905c", status="active")
# print("upsert single:", ok)
query_tokens(platform_name="mita", status="active")
Start().run() Start().run()

4
utlit/update_db.py

@ -133,8 +133,8 @@ if __name__ == "__main__":
TABLE = "tokens" TABLE = "tokens"
# 单条 upsert # 单条 upsert
ok = upsert_token(DB, TABLE, phone="16223053815", platform_name="mita", token_value="JSESSIONID=356E6FEEBF81933FAFE924ED6A7C324C; aliyungf_tc=70df8ace7303f22dccbacee689c1abc32b0a7629a28579fdfefad08c7d04f536; tid=cc159aeb-4f9b-463a-9080-2ebc2d88f0bc; __eventn_id_UMO2dYNwFz=065s1a391e; traceid=2dc94bfd49cc4992; sid=c764bb074d3b496fbeb4ad5eaa8835f0; uid=69255736dddbb6ba7df1905c", status="active")
print("upsert single:", ok)
# ok = upsert_token(DB, TABLE, phone="16223053815", platform_name="mita", token_value="JSESSIONID=356E6FEEBF81933FAFE924ED6A7C324C; aliyungf_tc=70df8ace7303f22dccbacee689c1abc32b0a7629a28579fdfefad08c7d04f536; tid=cc159aeb-4f9b-463a-9080-2ebc2d88f0bc; __eventn_id_UMO2dYNwFz=065s1a391e; traceid=2dc94bfd49cc4992; sid=c764bb074d3b496fbeb4ad5eaa8835f0; uid=69255736dddbb6ba7df1905c", status="active")
# print("upsert single:", ok)
query_tokens(platform_name="mita", status="active") query_tokens(platform_name="mita", status="active")
# # 批量 upsert # # 批量 upsert
# rows = [ # rows = [

Loading…
Cancel
Save