diff --git a/deepseekstart.py b/deepseekstart.py index 5087f38..ca5197c 100644 --- a/deepseekstart.py +++ b/deepseekstart.py @@ -283,6 +283,9 @@ class DeepSeekChatClient: "search_enabled": search_enabled, "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请求 with requests.post( @@ -299,7 +302,7 @@ class DeepSeekChatClient: if not raw: continue line = raw.strip() - # print(line) + print(line) data_str = line[6:] if line.startswith("data: ") else line if data_str == "[DONE]": @@ -411,7 +414,7 @@ class Start: thinking_enabled=True, search_enabled=True, ) - if thinking == '': + if answer == '': print('异常结果', ai_search_result_list, answer, thinking) return False @@ -440,7 +443,7 @@ class Start: post_resp = self.tools.post_task(result) # print('\n') # print('\n') - print(result) + print(str(result)[:500]) logger.info(f"任务 {task_id} 提交返回: {post_resp}") return result diff --git a/kimi_tokens.db b/kimi_tokens.db index d409df2..cea9cb3 100644 Binary files a/kimi_tokens.db and b/kimi_tokens.db differ diff --git a/kimistart.py b/kimistart.py index d57d9e1..31b1b6b 100644 --- a/kimistart.py +++ b/kimistart.py @@ -68,7 +68,7 @@ class ToolsLoad: response = requests.request("POST", url, headers=headers, data=payload) - print(response.text) + print('提交不能用的cookie:', response.text) return response.text @retry('提交结果', 5) @@ -329,6 +329,7 @@ class KimiChatClient: answer_parts: List[str] = [] with requests.post(self.url, headers=self._build_headers(), data=framed, stream=True, timeout=60) as resp: + # print(resp.text) if resp.status_code != 200: text = None try: @@ -345,8 +346,8 @@ class KimiChatClient: payload_text_total = json.dumps(item, ensure_ascii=False) # print(payload_text_total) # 判定 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 {} block = payload_dict.get("block") if isinstance(payload_dict, dict) else None @@ -408,12 +409,15 @@ class KimiChatClient: except Exception as e: msg = str(e) print('异常:', msg) - time.sleep(10) + time.sleep(5) # 判定为 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"): - ToolsLoad().update_session(cookie_id, "", "3") + if '请登录后继续使用' in msg: + ToolsLoad().update_session(cookie_id, "", "2") + else: + ToolsLoad().update_session(cookie_id, "", "3") # 继续尝试下一个 token return False 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) - logger.info(f"任务生成结果: {result}") + logger.info(f"任务生成结果: {str(result)[:500]}") if not result: logger.info(f"任务生成结果异常重新获取: {keyword}") diff --git a/login/kimi_auto_login.py b/login/kimi_auto_login.py index 502813c..19685de 100644 --- a/login/kimi_auto_login.py +++ b/login/kimi_auto_login.py @@ -24,6 +24,8 @@ class LubanSMS: 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() @@ -209,13 +211,17 @@ def kimi_auto_login(api_key): # 等待登录完成 print("等待...") - time.sleep(3) + time.sleep(5) 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) if 'authorization' in headers: token = headers['authorization'] @@ -243,16 +249,15 @@ if __name__ == '__main__': # 需要用户输入API密钥 api_key = '5ebc10c8e8c35797de15c9af46063b36' service_id = '541182' - # save_spider_session( - # cookie='eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ1c2VyLWNlbnRlciIsImV4cCI6MTc4MDY0OTgyNCwiaWF0IjoxNzc4MDU3ODI0LCJqdGkiOiJkN3RnNG82bjNtazNyNnJtcHZuZyIsInR5cCI6ImFjY2VzcyIsImFwcF9pZCI6ImtpbWkiLCJzdWIiOiJkNjJxZGhmZnRhZWE2OWltY3RjMCIsInNwYWNlX2lkIjoiZDYycWRoZmZ0YWVhNjlpbWN0YmciLCJhYnN0cmFjdF91c2VyX2lkIjoiZDYycWRoZmZ0YWVhNjlpbWN0YjAiLCJzc2lkIjoiMTczMTU0MTY5Nzc3MDI4NzY2NyIsImRldmljZV9pZCI6Ijc2MzY3MDAwMTk3OTM1MTQyNTIiLCJyZWdpb24iOiJjbiIsIm1lbWJlcnNoaXAiOnsibGV2ZWwiOjEwfX0.bA_j_u3JJSP7uwtBR5YAfR0tuGtbC70kYUyEI9sqXk-b_WrTFeNLDJm2ofJXPRF5yV8cyhbZou9P5K0sbrHO0A') + a = 0 - for u in range(50): + for u in range(100): try: result = kimi_auto_login(api_key) if result: a += 1 print(f"自动登录完成,cookies文件: {result}") - print('成功:',a) + print('成功:', a) else: print("自动登录失败") time.sleep(5) diff --git a/login/kimi_auto_login_haozhu.py b/login/kimi_auto_login_haozhu.py new file mode 100644 index 0000000..19685de --- /dev/null +++ b/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: 服务ID,默认为Tinder越南服务 + """ + # 初始化鲁班短信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 diff --git a/mitastart.py b/mitastart.py index 85de659..5b87efd 100644 --- a/mitastart.py +++ b/mitastart.py @@ -565,4 +565,12 @@ class Start: 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() diff --git a/utlit/update_db.py b/utlit/update_db.py index 712ef00..625ce7e 100644 --- a/utlit/update_db.py +++ b/utlit/update_db.py @@ -133,8 +133,8 @@ if __name__ == "__main__": 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) + # 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") # # 批量 upsert # rows = [