mirror of
https://github.com/KingJin-web/zy.git
synced 2025-12-17 15:34:37 +08:00
ksjsb
This commit is contained in:
@@ -1,46 +1,18 @@
|
|||||||
# 由于负载过高和提供更稳定的服务 目前免费卡密暂时禁用 改用收费模式
|
# v29
|
||||||
# 卡密价格 8r/24小时 无限车位 相当于8r跑2天
|
# 部分逻辑回退v23
|
||||||
# 购卡机器人 @LinDong6789_bot 购卡命令: 快手菜单
|
# 新增变量 lindong_onegoldmax 可以设置出现多少1金币后才停止运行
|
||||||
# 购卡后替换掉原来的免费卡密即可 其余无影响无变化
|
# 低金币尝试开启养号功能 1金币自行分辨是否代理(ip)或黑号(宝箱都是1)或上限(跑着跑着1金币要过一会才有金币) 排除这三个原因基本可以养到1000-2500
|
||||||
|
|
||||||
# 快手v11/v12/v17:
|
# 快手v11/v12/v17:
|
||||||
#
|
|
||||||
# 1.更新养号逻辑(仅限于低金币 1/10金币还是ip或者号的问题)
|
# 1.更新养号逻辑(仅限于低金币 1/10金币还是ip或者号的问题)
|
||||||
# 2.修复部分情况下不能跑的bug
|
# 2.修复部分情况下不能跑的bug
|
||||||
# 3.修复获取不到广告的bug
|
# 3.修复获取不到广告的bug
|
||||||
# 4.适配一键获取的ck 可以直接填 备注#ck#salt(有代理后面接上#代理就行了)就能跑了
|
# 4.适配一键获取的ck 可以直接填 备注#ck#salt(有代理后面接上#代理就行了)就能跑了
|
||||||
# 5.新建提现
|
# 5.新建提现
|
||||||
#
|
|
||||||
# 统一格式为 备注#ck#salt 或者 备注@ck@salt 备注不能不填否则报错
|
# 统一格式为 备注#ck#salt 或者 备注@ck@salt 备注不能不填否则报错
|
||||||
# 如果需要ua就 备注#ck#salt#ua 或者 备注@ck@salt@ua
|
# 如果需要ua就 备注#ck#salt#ua 或者 备注@ck@salt@ua
|
||||||
# 如果需要代理就 备注#ck#salt#ua#代理 或者 备注@ck@salt@ua@代理
|
# 如果需要代理就 备注#ck#salt#ua#代理 或者 备注@ck@salt@ua@代理
|
||||||
#
|
#
|
||||||
# 变量有所变化 请参照文件内容重新填写
|
|
||||||
# 入口: 快手极速版App 一机一号一个实名 只限安卓机器 (无需root) 最好一号一ip
|
|
||||||
# 需抓取数据:
|
|
||||||
# * 开抓包点福利后 搜索 earn/overview/tasks 找到此请求的cookie 同时找到此请求下的请求头的user-agent的值
|
|
||||||
# * 登录时搜索 api_client_salt 找到5kb左右的链接 在响应里最下面找到你的salt 不会可以用一键抓取
|
|
||||||
# * 如果一个青龙跑两号及以上 则就需要填写socket5代理防止黑号,注意一号一代理,不允许多号共用 第一个号不使用代理则不填
|
|
||||||
# * 代理为万安格式 即代理ip|端口|代理用户名|代理密码
|
|
||||||
# * 变量: Lindong_ksjsb 填写上面获取的数据 格式为 备注@cookie@salt@ua(选填)[@代理ip|端口|代理用户名|代理密码](可选 代理格式不包括括号)
|
|
||||||
# * 也可以是 备注#cookie#salt@ua(选填)[@代理ip|端口|代理用户名|代理密码](可选 代理格式不包括括号)
|
|
||||||
# * 也可以不填备注
|
|
||||||
# * 多号换行或新建同名变量
|
|
||||||
# * 变量: Lindong_ksCard 卡密变量 免费卡密: Lindong|频道:https://t.me/+1BVEpYhydgplYWY9
|
|
||||||
# * 可选变量(可不填): lindong_ks_thread 最大线程数 默认 1 设置 2 以上为多线程 不懂设置为100即可
|
|
||||||
# * 可选变量(可不填): lindong_ks_maxgold 最大金币数 默认 50w (跑多了第二天可能1金币 有此需求请勿兑换金币)
|
|
||||||
# * 可选变量(可不填): lindong_ks_run_task 额外执行任务 默认 无 多个额外执行的任务用,分割 填0,1,2,3 执行所有任务
|
|
||||||
# * 可选的是 0:签到 | 1.宝箱 | 2.宝箱广告(需要运行宝箱广告必须开宝箱) | 3.饭补广告
|
|
||||||
# * 可选变量(可不填): lindong_ksyhtimes 执行多少个广告后进行养号操作 默认 40
|
|
||||||
# * 可选变量(可不填): lindong_autotixi 是否自动提现 默认否 填1自动提现(只会提现50 不够50手动提)
|
|
||||||
# * 可选变量(可不填): lindong_tixipay 提现渠道 填1微信 填2支付宝 默认微信
|
|
||||||
# * 需要安装依赖: py的 requests[socks]
|
|
||||||
# * 需要安装依赖: py的 requests[socks]
|
|
||||||
# * 需要安装依赖: py的 requests[socks]
|
|
||||||
# * 需要安装依赖: py的 requests[socks]
|
|
||||||
# * 多号方式 [ 换行 | 新建同名变量 | & 分割 ]
|
|
||||||
# * tg群组:https://t.me/+1BVEpYhydgplYWY9
|
|
||||||
# ========================================================================================
|
|
||||||
|
|
||||||
# ===========================================
|
# ===========================================
|
||||||
# ==================广告======================
|
# ==================广告======================
|
||||||
@@ -51,6 +23,33 @@
|
|||||||
# https://www.xiequ.cn/index.html?d630539f 注册送10元免费使用长效独享代理一天
|
# https://www.xiequ.cn/index.html?d630539f 注册送10元免费使用长效独享代理一天
|
||||||
# http://www.gzsk5.com/#/register?invitation=hnking&shareid=425 光子sk5代理100M 4.5一条
|
# http://www.gzsk5.com/#/register?invitation=hnking&shareid=425 光子sk5代理100M 4.5一条
|
||||||
|
|
||||||
|
# 入口: 快手极速版App 一机一号一个实名 只限安卓机器 (无需root) 最好一号一ip
|
||||||
|
# 抓包工具 https://pan.quark.cn/s/44f90724e243
|
||||||
|
# 需抓取数据:
|
||||||
|
# * 登录时搜索 api_client_salt 找到5kb左右的链接 在响应里最下面找到你的salt 不会可以用一键抓取
|
||||||
|
# * 开抓包点福利后 搜索 earn/overview/tasks 找到此请求的cookie 同时找到此请求下的请求头的user-agent的值
|
||||||
|
|
||||||
|
# * 如果一个青龙跑两号及以上 则就需要填写socket5代理防止黑号,注意一号一代理,不允许多号共用 第一个号不使用代理则不填
|
||||||
|
# * 代理为万安格式 即代理ip|端口|代理用户名|代理密码
|
||||||
|
# * 变量: Lindong_ksjsb 填写上面获取的数据 格式为 备注@cookie@salt@ua(选填)[@代理ip|端口|代理用户名|代理密码](可选 代理格式不包括括号)
|
||||||
|
# * 也可以是 备注#cookie#salt@ua(选填)[@代理ip|端口|代理用户名|代理密码](可选 代理格式不包括括号)
|
||||||
|
# * 也可以不填备注
|
||||||
|
# * 多号换行或新建同名变量
|
||||||
|
# * 变量: Lindong_ksCard 卡密变量
|
||||||
|
# * 可选变量(可不填): lindong_ks_thread 最大线程数 默认 1 设置 2 以上为多线程 不懂设置为100即可
|
||||||
|
# * 可选变量(可不填): lindong_ks_maxgold 最大金币数 默认 50w (跑多了第二天可能1金币 有此需求请勿兑换金币)
|
||||||
|
# * 可选变量(可不填): lindong_ks_run_task 额外执行任务 默认 无 多个额外执行的任务用,分割 填0,1,2,3 执行所有任务
|
||||||
|
# * 可选的是 0:签到 | 1.宝箱 | 2.宝箱广告(需要运行宝箱广告必须开宝箱) | 3.饭补广告
|
||||||
|
# * 可选变量(可不填): lindong_ksyhtimes 执行多少个广告后进行休眠操作 默认 40
|
||||||
|
# * 可选变量(可不填): lindong_autotixi 是否自动提现 默认否 填1自动提现(只会提现50 不够50手动提)
|
||||||
|
# * 可选变量(可不填): lindong_tixipay 提现渠道 默认微信 填1微信 填2支付宝
|
||||||
|
# * 可选变量(可不填): lindong_dijinbyh 低金币是否进行养号 默认否 填1是 (由于服务放在云端运行 人多时可能会出现失败)
|
||||||
|
# * 可选变量(可不填): lindong_dijinbyhyz 养号金币阈值 默认500 范围10-1000 (上一个不开这个不生效)
|
||||||
|
# * 可选变量(可不填): lindong_onegoldmax 出现多少1金币后停止脚本 默认3
|
||||||
|
# * 需要安装依赖: py的 requests[socks]
|
||||||
|
# * 多号方式 [ 换行 | 新建同名变量 | & 分割 ]
|
||||||
|
# * tg群组:https://t.me/+1BVEpYhydgplYWY9
|
||||||
|
# ========================================================================================
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import platform
|
import platform
|
||||||
@@ -59,13 +58,13 @@ import importlib
|
|||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
import glob
|
import glob
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import requests
|
import requests
|
||||||
except ImportError:
|
except ImportError:
|
||||||
print("请安装requests依赖")
|
print("请安装requests依赖")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
MODULE_NAME = 'ksjsb'
|
MODULE_NAME = 'ksjsb'
|
||||||
API_BASE_URL = 'http://pyenc.lindong.xyz'
|
API_BASE_URL = 'http://pyenc.lindong.xyz'
|
||||||
|
|
||||||
@@ -73,6 +72,7 @@ MAX_RETRY = 3
|
|||||||
logging.basicConfig(level=logging.INFO, format='[%(levelname)s] ===> %(message)s')
|
logging.basicConfig(level=logging.INFO, format='[%(levelname)s] ===> %(message)s')
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class SoManager:
|
class SoManager:
|
||||||
def __init__(self, module_name, api_base_url):
|
def __init__(self, module_name, api_base_url):
|
||||||
self.module_name = module_name
|
self.module_name = module_name
|
||||||
@@ -82,9 +82,7 @@ class SoManager:
|
|||||||
self.python_version = f"{sys.version_info.major}.{sys.version_info.minor}"
|
self.python_version = f"{sys.version_info.major}.{sys.version_info.minor}"
|
||||||
self.arch = self._get_arch()
|
self.arch = self._get_arch()
|
||||||
self.platform_key = f"{self.arch}_py{self.python_version.replace('.', '')}"
|
self.platform_key = f"{self.arch}_py{self.python_version.replace('.', '')}"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def _get_arch(self):
|
def _get_arch(self):
|
||||||
machine = platform.machine().lower()
|
machine = platform.machine().lower()
|
||||||
if machine in ['x86_64', 'amd64', 'x64']:
|
if machine in ['x86_64', 'amd64', 'x64']:
|
||||||
@@ -94,7 +92,7 @@ class SoManager:
|
|||||||
else:
|
else:
|
||||||
log.warning(f"未知架构 {machine},默认使用 aarch64")
|
log.warning(f"未知架构 {machine},默认使用 aarch64")
|
||||||
return 'aarch64'
|
return 'aarch64'
|
||||||
|
|
||||||
def _check_system_compatibility(self):
|
def _check_system_compatibility(self):
|
||||||
if sys.version_info.major != 3 or sys.version_info.minor not in [10, 11]:
|
if sys.version_info.major != 3 or sys.version_info.minor not in [10, 11]:
|
||||||
log.error(f"不支持的Python版本 {sys.version},请使用Python 3.10或3.11")
|
log.error(f"不支持的Python版本 {sys.version},请使用Python 3.10或3.11")
|
||||||
@@ -104,7 +102,7 @@ class SoManager:
|
|||||||
return False
|
return False
|
||||||
log.info(f"系统检测通过 [Python {sys.version}] [{platform.system()} {platform.machine()}]")
|
log.info(f"系统检测通过 [Python {sys.version}] [{platform.system()} {platform.machine()}]")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def _get_local_version(self):
|
def _get_local_version(self):
|
||||||
try:
|
try:
|
||||||
if os.path.exists(self.version_file):
|
if os.path.exists(self.version_file):
|
||||||
@@ -113,39 +111,39 @@ class SoManager:
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
log.warning(f"读取本地版本失败: {e}")
|
log.warning(f"读取本地版本失败: {e}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def _save_local_version(self, version):
|
def _save_local_version(self, version):
|
||||||
try:
|
try:
|
||||||
with open(self.version_file, 'w') as f:
|
with open(self.version_file, 'w') as f:
|
||||||
f.write(str(version))
|
f.write(str(version))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
log.error(f"保存版本号失败: {e}")
|
log.error(f"保存版本号失败: {e}")
|
||||||
|
|
||||||
def _get_remote_latest(self):
|
def _get_remote_latest(self):
|
||||||
try:
|
try:
|
||||||
payload = {
|
payload = {
|
||||||
"action": "get_latest",
|
"action": "get_latest",
|
||||||
"module_name": self.module_name
|
"module_name": self.module_name
|
||||||
}
|
}
|
||||||
|
|
||||||
response = requests.post(
|
response = requests.post(
|
||||||
self.api_url,
|
self.api_url,
|
||||||
json=payload,
|
json=payload,
|
||||||
timeout=30,
|
timeout=30,
|
||||||
headers={'Content-Type': 'application/json'}
|
headers={'Content-Type': 'application/json'}
|
||||||
)
|
)
|
||||||
|
|
||||||
if response.status_code != 200:
|
if response.status_code != 200:
|
||||||
log.error(f"API请求失败: HTTP {response.status_code}")
|
log.error(f"API请求失败: HTTP {response.status_code}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
data = response.json()
|
data = response.json()
|
||||||
if not data.get('success'):
|
if not data.get('success'):
|
||||||
log.error(f"API返回错误: {data.get('message', '未知错误')}")
|
log.error(f"API返回错误: {data.get('message', '未知错误')}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
return data
|
return data
|
||||||
|
|
||||||
except requests.exceptions.RequestException as e:
|
except requests.exceptions.RequestException as e:
|
||||||
log.error(f"网络请求失败: {e}")
|
log.error(f"网络请求失败: {e}")
|
||||||
return None
|
return None
|
||||||
@@ -155,15 +153,15 @@ class SoManager:
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
log.error(f"获取远程版本失败: {e}")
|
log.error(f"获取远程版本失败: {e}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def _download_file(self, download_url):
|
def _download_file(self, download_url):
|
||||||
"""下载.so文件"""
|
"""下载.so文件"""
|
||||||
temp_file = f"{self.so_filename}.tmp"
|
temp_file = f"{self.so_filename}.tmp"
|
||||||
|
|
||||||
for attempt in range(MAX_RETRY):
|
for attempt in range(MAX_RETRY):
|
||||||
try:
|
try:
|
||||||
log.info(f"开始下载 (尝试 {attempt + 1}/{MAX_RETRY}): {download_url}")
|
log.info(f"开始下载 (尝试 {attempt + 1}/{MAX_RETRY}): {download_url}")
|
||||||
|
|
||||||
response = requests.get(download_url, timeout=180, stream=True)
|
response = requests.get(download_url, timeout=180, stream=True)
|
||||||
if response.status_code != 200:
|
if response.status_code != 200:
|
||||||
log.error(f"下载失败: HTTP {response.status_code}")
|
log.error(f"下载失败: HTTP {response.status_code}")
|
||||||
@@ -179,34 +177,34 @@ class SoManager:
|
|||||||
if os.path.exists(self.so_filename):
|
if os.path.exists(self.so_filename):
|
||||||
os.remove(self.so_filename)
|
os.remove(self.so_filename)
|
||||||
os.rename(temp_file, self.so_filename)
|
os.rename(temp_file, self.so_filename)
|
||||||
|
|
||||||
log.info(f"文件下载成功: {self.so_filename}")
|
log.info(f"文件下载成功: {self.so_filename}")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
log.error(f"下载失败: {e}")
|
log.error(f"下载失败: {e}")
|
||||||
if os.path.exists(temp_file):
|
if os.path.exists(temp_file):
|
||||||
os.remove(temp_file)
|
os.remove(temp_file)
|
||||||
|
|
||||||
log.error(f"下载失败,已尝试 {MAX_RETRY} 次")
|
log.error(f"下载失败,已尝试 {MAX_RETRY} 次")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def _execute_module(self):
|
def _execute_module(self):
|
||||||
"""执行模块"""
|
"""执行模块"""
|
||||||
try:
|
try:
|
||||||
if not os.path.exists(self.so_filename):
|
if not os.path.exists(self.so_filename):
|
||||||
log.error(f".so文件不存在: {self.so_filename}")
|
log.error(f".so文件不存在: {self.so_filename}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
print('=' * 50)
|
print('=' * 50)
|
||||||
module_obj = importlib.import_module(self.so_moudel)
|
module_obj = importlib.import_module(self.so_moudel)
|
||||||
if hasattr(module_obj, 'main'):
|
if hasattr(module_obj, 'main'):
|
||||||
module_obj.main()
|
module_obj.main()
|
||||||
else:
|
else:
|
||||||
log.warning("模块中没有找到main函数")
|
log.warning("模块中没有找到main函数")
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
log.error(f"模块导入失败: {e}")
|
log.error(f"模块导入失败: {e}")
|
||||||
return False
|
return False
|
||||||
@@ -216,7 +214,7 @@ class SoManager:
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
log.error(f"执行异常: {e}")
|
log.error(f"执行异常: {e}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def check_and_update(self):
|
def check_and_update(self):
|
||||||
remote_info = self._get_remote_latest()
|
remote_info = self._get_remote_latest()
|
||||||
if not remote_info:
|
if not remote_info:
|
||||||
@@ -227,7 +225,7 @@ class SoManager:
|
|||||||
self.so_moudel = f"{self.module_name}_{remote_version}"
|
self.so_moudel = f"{self.module_name}_{remote_version}"
|
||||||
local_version = self._get_local_version()
|
local_version = self._get_local_version()
|
||||||
vlocal_version = 'v' + local_version if local_version else '无'
|
vlocal_version = 'v' + local_version if local_version else '无'
|
||||||
|
|
||||||
log.info(f"本地版本: {vlocal_version} | 远程最新版本: v{remote_version}")
|
log.info(f"本地版本: {vlocal_version} | 远程最新版本: v{remote_version}")
|
||||||
need_download = False
|
need_download = False
|
||||||
if not os.path.exists(self.so_filename):
|
if not os.path.exists(self.so_filename):
|
||||||
@@ -242,21 +240,21 @@ class SoManager:
|
|||||||
if need_download:
|
if need_download:
|
||||||
files = remote_info.get('files', {})
|
files = remote_info.get('files', {})
|
||||||
download_url = files.get(self.platform_key)
|
download_url = files.get(self.platform_key)
|
||||||
|
|
||||||
if not download_url:
|
if not download_url:
|
||||||
log.error(f"没有找到适合平台 {self.platform_key} 的下载链接")
|
log.error(f"没有找到适合平台 {self.platform_key} 的下载链接")
|
||||||
available_platforms = list(files.keys())
|
available_platforms = list(files.keys())
|
||||||
log.error(f"可用平台: {available_platforms}")
|
log.error(f"可用平台: {available_platforms}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
if self._download_file(download_url):
|
if self._download_file(download_url):
|
||||||
self._save_local_version(remote_version)
|
self._save_local_version(remote_version)
|
||||||
else:
|
else:
|
||||||
log.error("文件下载失败")
|
log.error("文件下载失败")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
if not self._check_system_compatibility():
|
if not self._check_system_compatibility():
|
||||||
return False
|
return False
|
||||||
@@ -264,12 +262,13 @@ class SoManager:
|
|||||||
return False
|
return False
|
||||||
return self._execute_module()
|
return self._execute_module()
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
try:
|
try:
|
||||||
manager = SoManager(MODULE_NAME, API_BASE_URL)
|
manager = SoManager(MODULE_NAME, API_BASE_URL)
|
||||||
manager.run()
|
manager.run()
|
||||||
|
|
||||||
|
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
log.info("用户中断执行")
|
log.info("用户中断执行")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
@@ -277,5 +276,6 @@ def main():
|
|||||||
log.error(f"未知错误: {e}")
|
log.error(f"未知错误: {e}")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
Reference in New Issue
Block a user