mirror of
https://github.com/zhangjie369/ql.git
synced 2025-12-17 07:18:45 +08:00
Add files via upload
This commit is contained in:
255
Ruishu.py
Normal file
255
Ruishu.py
Normal file
@@ -0,0 +1,255 @@
|
|||||||
|
import os
|
||||||
|
import ssl
|
||||||
|
import time
|
||||||
|
import json
|
||||||
|
import execjs
|
||||||
|
import base64
|
||||||
|
import random
|
||||||
|
import certifi
|
||||||
|
import aiohttp
|
||||||
|
import asyncio
|
||||||
|
import requests
|
||||||
|
from http import cookiejar
|
||||||
|
from Crypto.Cipher import DES3
|
||||||
|
from Crypto.Util.Padding import pad, unpad
|
||||||
|
from aiohttp import ClientSession, TCPConnector
|
||||||
|
import httpx
|
||||||
|
httpx._config.DEFAULT_CIPHERS += ":ALL:@SECLEVEL=1"
|
||||||
|
diffValue = 2
|
||||||
|
filename='Cache.js'
|
||||||
|
if os.path.exists(filename):
|
||||||
|
with open(filename, 'r', encoding='utf-8') as file:
|
||||||
|
fileContent = file.read()
|
||||||
|
else:
|
||||||
|
fileContent=''
|
||||||
|
|
||||||
|
class BlockAll(cookiejar.CookiePolicy):
|
||||||
|
return_ok = set_ok = domain_return_ok = path_return_ok = lambda self, *args, **kwargs: False
|
||||||
|
netscape = True
|
||||||
|
rfc2965 = hide_cookie2 = False
|
||||||
|
|
||||||
|
def printn(m):
|
||||||
|
print(f'\n{m}')
|
||||||
|
|
||||||
|
context = ssl.create_default_context()
|
||||||
|
context.set_ciphers('DEFAULT@SECLEVEL=1') # 低安全级别0/1
|
||||||
|
context.check_hostname = False # 禁用主机
|
||||||
|
context.verify_mode = ssl.CERT_NONE # 禁用证书
|
||||||
|
|
||||||
|
class DESAdapter(requests.adapters.HTTPAdapter):
|
||||||
|
def init_poolmanager(self, *args, **kwargs):
|
||||||
|
kwargs['ssl_context'] = context
|
||||||
|
return super().init_poolmanager(*args, **kwargs)
|
||||||
|
|
||||||
|
requests.DEFAULT_RETRIES = 0
|
||||||
|
requests.packages.urllib3.disable_warnings()
|
||||||
|
ss = requests.session()
|
||||||
|
ss.headers = {"User-Agent": "Mozilla/5.0 (Linux; Android 13; 22081212C Build/TKQ1.220829.002) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.97 Mobile Safari/537.36", "Referer": "https://wapact.189.cn:9001/JinDouMall/JinDouMall_independentDetails.html"}
|
||||||
|
ss.mount('https://', DESAdapter())
|
||||||
|
ss.cookies.set_policy(BlockAll())
|
||||||
|
runTime = 0
|
||||||
|
sleepTime = 1
|
||||||
|
key = b'1234567`90koiuyhgtfrdews'
|
||||||
|
iv = 8 * b'\0'
|
||||||
|
|
||||||
|
def encrypt(text):
|
||||||
|
cipher = DES3.new(key, DES3.MODE_CBC, iv)
|
||||||
|
ciphertext = cipher.encrypt(pad(text.encode(), DES3.block_size))
|
||||||
|
return ciphertext.hex()
|
||||||
|
|
||||||
|
def decrypt(text):
|
||||||
|
ciphertext = bytes.fromhex(text)
|
||||||
|
cipher = DES3.new(key, DES3.MODE_CBC, iv)
|
||||||
|
plaintext = unpad(cipher.decrypt(ciphertext), DES3.block_size)
|
||||||
|
return plaintext.decode()
|
||||||
|
|
||||||
|
def initCookie(getUrl='https://wapact.189.cn:9001/gateway/standQuery/detailNew/exchange'):
|
||||||
|
global js_code_ym, fileContent
|
||||||
|
cookie = ''
|
||||||
|
response = httpx.post(getUrl)
|
||||||
|
content = response.text.split(' content="')[2].split('" r=')[0]
|
||||||
|
code1 = response.text.split('$_ts=window')[1].split('</script><script type="text/javascript"')[0]
|
||||||
|
code1Content = '$_ts=window' + code1
|
||||||
|
Url = response.text.split('$_ts.lcd();</script><script type="text/javascript" charset="utf-8" src="')[1].split('" r=')[0]
|
||||||
|
urls = getUrl.split('/')
|
||||||
|
rsurl = urls[0] + '//' + urls[2] + Url
|
||||||
|
filename = 'Cache.js'
|
||||||
|
if fileContent == '':
|
||||||
|
if not os.path.exists(filename):
|
||||||
|
fileRes = httpx.get(rsurl)
|
||||||
|
fileContent = fileRes.text
|
||||||
|
if fileRes.status_code == 200:
|
||||||
|
with open(filename, 'w', encoding='utf-8') as file:
|
||||||
|
file.write(fileRes.text)
|
||||||
|
else:
|
||||||
|
print(f"Failed to download {rsurl}. Status code: {fileRes.status_code}")
|
||||||
|
if response.headers['Set-Cookie']:
|
||||||
|
cookie = response.headers['Set-Cookie'].split(';')[0].split('=')[1]
|
||||||
|
runJs = js_code_ym.replace('content_code', content).replace("'ts_code'", code1Content + fileContent)
|
||||||
|
execjsRun = RefererCookie(runJs)
|
||||||
|
return {
|
||||||
|
'cookie': cookie,
|
||||||
|
'execjsRun': execjsRun
|
||||||
|
}
|
||||||
|
|
||||||
|
def RefererCookie(runJs):
|
||||||
|
try:
|
||||||
|
execjsRun = execjs.compile(runJs)
|
||||||
|
return execjsRun
|
||||||
|
except execjs._exceptions.CompileError as e:
|
||||||
|
print(f"JavaScript 编译错误: {e}")
|
||||||
|
except execjs._exceptions.RuntimeError as e:
|
||||||
|
print(f"JavaScript 运行时错误: {e}")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"其他错误: {e}")
|
||||||
|
|
||||||
|
js_code_ym = '''delete __filename
|
||||||
|
delete __dirname
|
||||||
|
ActiveXObject = undefined
|
||||||
|
|
||||||
|
window = global;
|
||||||
|
|
||||||
|
content="content_code"
|
||||||
|
|
||||||
|
navigator = {"platform": "Linux aarch64"}
|
||||||
|
navigator = {"userAgent": "CtClient;11.0.0;Android;13;22081212C;NTIyMTcw!#!MTUzNzY"}
|
||||||
|
|
||||||
|
location={
|
||||||
|
"href": "https://",
|
||||||
|
"origin": "",
|
||||||
|
"protocol": "",
|
||||||
|
"host": "",
|
||||||
|
"hostname": "",
|
||||||
|
"port": "",
|
||||||
|
"pathname": "",
|
||||||
|
"search": "",
|
||||||
|
"hash": ""
|
||||||
|
}
|
||||||
|
|
||||||
|
i = {length: 0}
|
||||||
|
base = {length: 0}
|
||||||
|
div = {
|
||||||
|
getElementsByTagName: function (res) {
|
||||||
|
console.log('div中的getElementsByTagName:', res)
|
||||||
|
if (res === 'i') {
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
return '<div></div>'
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
script = {
|
||||||
|
|
||||||
|
}
|
||||||
|
meta = [
|
||||||
|
{charset:"UTF-8"},
|
||||||
|
{
|
||||||
|
content: content,
|
||||||
|
getAttribute: function (res) {
|
||||||
|
console.log('meta中的getAttribute:', res)
|
||||||
|
if (res === 'r') {
|
||||||
|
return 'm'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
parentNode: {
|
||||||
|
removeChild: function (res) {
|
||||||
|
console.log('meta中的removeChild:', res)
|
||||||
|
|
||||||
|
return content
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
}
|
||||||
|
]
|
||||||
|
form = '<form></form>'
|
||||||
|
|
||||||
|
window.addEventListener= function (res) {
|
||||||
|
console.log('window中的addEventListener:', res)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
document = {
|
||||||
|
createElement: function (res) {
|
||||||
|
console.log('document中的createElement:', res)
|
||||||
|
|
||||||
|
if (res === 'div') {
|
||||||
|
return div
|
||||||
|
} else if (res === 'form') {
|
||||||
|
return form
|
||||||
|
}
|
||||||
|
else{return res}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
},
|
||||||
|
addEventListener: function (res) {
|
||||||
|
console.log('document中的addEventListener:', res)
|
||||||
|
|
||||||
|
},
|
||||||
|
appendChild: function (res) {
|
||||||
|
console.log('document中的appendChild:', res)
|
||||||
|
return res
|
||||||
|
},
|
||||||
|
removeChild: function (res) {
|
||||||
|
console.log('document中的removeChild:', res)
|
||||||
|
},
|
||||||
|
getElementsByTagName: function (res) {
|
||||||
|
console.log('document中的getElementsByTagName:', res)
|
||||||
|
if (res === 'script') {
|
||||||
|
return script
|
||||||
|
}
|
||||||
|
if (res === 'meta') {
|
||||||
|
return meta
|
||||||
|
}
|
||||||
|
if (res === 'base') {
|
||||||
|
return base
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getElementById: function (res) {
|
||||||
|
console.log('document中的getElementById:', res)
|
||||||
|
if (res === 'root-hammerhead-shadow-ui') {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
setInterval = function () {}
|
||||||
|
setTimeout = function () {}
|
||||||
|
window.top = window
|
||||||
|
|
||||||
|
'ts_code'
|
||||||
|
|
||||||
|
function main() {
|
||||||
|
cookie = document.cookie.split(';')[0]
|
||||||
|
return cookie
|
||||||
|
}'''
|
||||||
|
|
||||||
|
async def main(timeValue):
|
||||||
|
global runTime, js_codeRead
|
||||||
|
tasks = []
|
||||||
|
|
||||||
|
init_result = initCookie()
|
||||||
|
if init_result:
|
||||||
|
cookie = init_result['cookie']
|
||||||
|
execjsRun = init_result['execjsRun']
|
||||||
|
else:
|
||||||
|
print("初始化 cookies 失败")
|
||||||
|
return
|
||||||
|
|
||||||
|
runcookie = {
|
||||||
|
'cookie': cookie,
|
||||||
|
'execjsRun': execjsRun
|
||||||
|
}
|
||||||
|
|
||||||
|
# 添加输出 cookies 的代码
|
||||||
|
cookies = {
|
||||||
|
'yiUIIlbdQT3fO': runcookie['cookie'],
|
||||||
|
'yiUIIlbdQT3fP': runcookie['execjsRun'].call('main').split('=')[1]
|
||||||
|
}
|
||||||
|
print(json.dumps(cookies)) # 确保输出是 JSON 格式的
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
asyncio.run(main(0))
|
||||||
134
瑞数通杀.js
Normal file
134
瑞数通杀.js
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
delete __filename
|
||||||
|
delete __dirname
|
||||||
|
ActiveXObject = undefined
|
||||||
|
|
||||||
|
window = global;
|
||||||
|
|
||||||
|
|
||||||
|
content="content_code"
|
||||||
|
|
||||||
|
|
||||||
|
navigator = {"platform": "Linux aarch64"}
|
||||||
|
navigator = {"userAgent": "CtClient;11.0.0;Android;13;22081212C;NTIyMTcw!#!MTUzNzY"}
|
||||||
|
|
||||||
|
location={
|
||||||
|
"href": "https://",
|
||||||
|
"origin": "",
|
||||||
|
"protocol": "",
|
||||||
|
"host": "",
|
||||||
|
"hostname": "",
|
||||||
|
"port": "",
|
||||||
|
"pathname": "",
|
||||||
|
"search": "",
|
||||||
|
"hash": ""
|
||||||
|
}
|
||||||
|
|
||||||
|
i = {length: 0}
|
||||||
|
base = {length: 0}
|
||||||
|
div = {
|
||||||
|
getElementsByTagName: function (res) {
|
||||||
|
console.log('div中的getElementsByTagName:', res)
|
||||||
|
if (res === 'i') {
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
return '<div></div>'
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
script = {
|
||||||
|
|
||||||
|
}
|
||||||
|
meta = [
|
||||||
|
{charset:"UTF-8"},
|
||||||
|
{
|
||||||
|
content: content,
|
||||||
|
getAttribute: function (res) {
|
||||||
|
console.log('meta中的getAttribute:', res)
|
||||||
|
if (res === 'r') {
|
||||||
|
return 'm'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
parentNode: {
|
||||||
|
removeChild: function (res) {
|
||||||
|
console.log('meta中的removeChild:', res)
|
||||||
|
|
||||||
|
return content
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
}
|
||||||
|
]
|
||||||
|
form = '<form></form>'
|
||||||
|
|
||||||
|
|
||||||
|
window.addEventListener= function (res) {
|
||||||
|
console.log('window中的addEventListener:', res)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
document = {
|
||||||
|
|
||||||
|
|
||||||
|
createElement: function (res) {
|
||||||
|
console.log('document中的createElement:', res)
|
||||||
|
|
||||||
|
|
||||||
|
if (res === 'div') {
|
||||||
|
return div
|
||||||
|
} else if (res === 'form') {
|
||||||
|
return form
|
||||||
|
}
|
||||||
|
else{return res}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
},
|
||||||
|
addEventListener: function (res) {
|
||||||
|
console.log('document中的addEventListener:', res)
|
||||||
|
|
||||||
|
},
|
||||||
|
appendChild: function (res) {
|
||||||
|
console.log('document中的appendChild:', res)
|
||||||
|
return res
|
||||||
|
},
|
||||||
|
removeChild: function (res) {
|
||||||
|
console.log('document中的removeChild:', res)
|
||||||
|
},
|
||||||
|
getElementsByTagName: function (res) {
|
||||||
|
console.log('document中的getElementsByTagName:', res)
|
||||||
|
if (res === 'script') {
|
||||||
|
return script
|
||||||
|
}
|
||||||
|
if (res === 'meta') {
|
||||||
|
return meta
|
||||||
|
}
|
||||||
|
if (res === 'base') {
|
||||||
|
return base
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getElementById: function (res) {
|
||||||
|
console.log('document中的getElementById:', res)
|
||||||
|
if (res === 'root-hammerhead-shadow-ui') {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
setInterval = function () {}
|
||||||
|
setTimeout = function () {}
|
||||||
|
window.top = window
|
||||||
|
|
||||||
|
|
||||||
|
'ts_code'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function main() {
|
||||||
|
cookie = document.cookie.split(';')[0]
|
||||||
|
return cookie
|
||||||
|
}
|
||||||
|
|
||||||
506
电信金豆换话费.py
Normal file
506
电信金豆换话费.py
Normal file
@@ -0,0 +1,506 @@
|
|||||||
|
'''
|
||||||
|
依赖:bs4,requests,PyExecJs,pycryptodome
|
||||||
|
变量chinaTelecomAccount 值手机号#服务密码
|
||||||
|
有代理接口的建议给抢券接口加上代理,不然到点都是412
|
||||||
|
并发用threading效率不高,希望有大佬改改并发发
|
||||||
|
'''
|
||||||
|
import requests
|
||||||
|
import re
|
||||||
|
import time
|
||||||
|
import json
|
||||||
|
import random
|
||||||
|
import datetime
|
||||||
|
import base64
|
||||||
|
import threading
|
||||||
|
import ssl
|
||||||
|
import execjs
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import urllib3
|
||||||
|
|
||||||
|
from bs4 import BeautifulSoup
|
||||||
|
|
||||||
|
from Crypto.PublicKey import RSA
|
||||||
|
from Crypto.Cipher import PKCS1_v1_5
|
||||||
|
from Crypto.Cipher import DES3
|
||||||
|
from Crypto.Util.Padding import pad, unpad
|
||||||
|
from Crypto.Util.strxor import strxor
|
||||||
|
from Crypto.Cipher import AES
|
||||||
|
from http import cookiejar # Python 2: import cookielib as cookiejar
|
||||||
|
from requests.adapters import HTTPAdapter
|
||||||
|
from requests.packages.urllib3.util.ssl_ import create_urllib3_context
|
||||||
|
|
||||||
|
|
||||||
|
class BlockAll(cookiejar.CookiePolicy):
|
||||||
|
return_ok = set_ok = domain_return_ok = path_return_ok = lambda self, *args, **kwargs: False
|
||||||
|
netscape = True
|
||||||
|
rfc2965 = hide_cookie2 = False
|
||||||
|
|
||||||
|
def printn(m):
|
||||||
|
print(f'\n{m}')
|
||||||
|
ORIGIN_CIPHERS = ('DEFAULT@SECLEVEL=1')
|
||||||
|
|
||||||
|
ip_list = []
|
||||||
|
class DESAdapter(HTTPAdapter):
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
A TransportAdapter that re-enables 3DES support in Requests.
|
||||||
|
"""
|
||||||
|
CIPHERS = ORIGIN_CIPHERS.split(':')
|
||||||
|
random.shuffle(CIPHERS)
|
||||||
|
CIPHERS = ':'.join(CIPHERS)
|
||||||
|
self.CIPHERS = CIPHERS + ':!aNULL:!eNULL:!MD5'
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
def init_poolmanager(self, *args, **kwargs):
|
||||||
|
context = create_urllib3_context(ciphers=self.CIPHERS)
|
||||||
|
context.check_hostname = False
|
||||||
|
context.verify_mode = ssl.CERT_NONE
|
||||||
|
kwargs['ssl_context'] = context
|
||||||
|
return super(DESAdapter, self).init_poolmanager(*args, **kwargs)
|
||||||
|
|
||||||
|
def proxy_manager_for(self, *args, **kwargs):
|
||||||
|
context = create_urllib3_context(ciphers=self.CIPHERS)
|
||||||
|
context.check_hostname = False
|
||||||
|
context.verify_mode = ssl.CERT_NONE
|
||||||
|
kwargs['ssl_context'] = context
|
||||||
|
return super(DESAdapter, self).proxy_manager_for(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
requests.packages.urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
||||||
|
ssl_context = ssl.create_default_context()
|
||||||
|
ssl_context.check_hostname = False
|
||||||
|
ssl_context.verify_mode = ssl.CERT_NONE
|
||||||
|
ssl_context.set_ciphers('DEFAULT@SECLEVEL=0')
|
||||||
|
ss = requests.session()
|
||||||
|
ss.verify = False
|
||||||
|
ss.headers={"User-Agent":"Mozilla/5.0 (Linux; Android 13; 22081212C Build/TKQ1.220829.002) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.97 Mobile Safari/537.36","Referer":"https://wapact.189.cn:9001/JinDouMall/JinDouMall_independentDetails.html"}
|
||||||
|
ss.mount('https://', DESAdapter())
|
||||||
|
yc = 0.1
|
||||||
|
wt = 0
|
||||||
|
kswt = -3
|
||||||
|
yf = datetime.datetime.now().strftime("%Y%m")
|
||||||
|
|
||||||
|
|
||||||
|
jp = {"9":{},"12":{},"13":{},"23":{}}
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open('电信金豆换话费.log') as fr:
|
||||||
|
dhjl = json.load(fr)
|
||||||
|
except:
|
||||||
|
dhjl = {}
|
||||||
|
if yf not in dhjl:
|
||||||
|
dhjl[yf] = {}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
wxp={}
|
||||||
|
errcode = {
|
||||||
|
"0":"兑换成功",
|
||||||
|
"412":"兑换次数已达上限",
|
||||||
|
"413":"商品已兑完",
|
||||||
|
"420":"未知错误",
|
||||||
|
"410":"该活动已失效~",
|
||||||
|
"Y0001":"当前等级不足,去升级兑当前话费",
|
||||||
|
"Y0002":"使用翼相连网络600分钟或连接并拓展网络500分钟可兑换此奖品",
|
||||||
|
"Y0003":"使用翼相连共享流量400M或共享WIFI:2GB可兑换此奖品",
|
||||||
|
"Y0004":"使用翼相连共享流量2GB可兑换此奖品",
|
||||||
|
"Y0005":"当前等级不足,去升级兑当前话费",
|
||||||
|
"E0001":"您的网龄不足10年,暂不能兑换"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#加密参数
|
||||||
|
key = b'1234567`90koiuyhgtfrdews'
|
||||||
|
iv = 8 * b'\0'
|
||||||
|
|
||||||
|
public_key_b64 = '''-----BEGIN PUBLIC KEY-----
|
||||||
|
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBkLT15ThVgz6/NOl6s8GNPofdWzWbCkWnkaAm7O2LjkM1H7dMvzkiqdxU02jamGRHLX/ZNMCXHnPcW/sDhiFCBN18qFvy8g6VYb9QtroI09e176s+ZCtiv7hbin2cCTj99iUpnEloZm19lwHyo69u5UMiPMpq0/XKBO8lYhN/gwIDAQAB
|
||||||
|
-----END PUBLIC KEY-----'''
|
||||||
|
|
||||||
|
public_key_data = '''-----BEGIN PUBLIC KEY-----
|
||||||
|
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+ugG5A8cZ3FqUKDwM57GM4io6JGcStivT8UdGt67PEOihLZTw3P7371+N47PrmsCpnTRzbTgcupKtUv8ImZalYk65dU8rjC/ridwhw9ffW2LBwvkEnDkkKKRi2liWIItDftJVBiWOh17o6gfbPoNrWORcAdcbpk2L+udld5kZNwIDAQAB
|
||||||
|
-----END PUBLIC KEY-----'''
|
||||||
|
|
||||||
|
|
||||||
|
def t(h):
|
||||||
|
date = datetime.datetime.now()
|
||||||
|
date_zero = datetime.datetime.now().replace(year=date.year, month=date.month, day=date.day, hour=h, minute=59, second=59)
|
||||||
|
date_zero_time = int(time.mktime(date_zero.timetuple()))
|
||||||
|
return date_zero_time
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def encrypt(text):
|
||||||
|
cipher = DES3.new(key, DES3.MODE_CBC, iv)
|
||||||
|
ciphertext = cipher.encrypt(pad(text.encode(), DES3.block_size))
|
||||||
|
return ciphertext.hex()
|
||||||
|
|
||||||
|
def decrypt(text):
|
||||||
|
ciphertext = bytes.fromhex(text)
|
||||||
|
cipher = DES3.new(key, DES3.MODE_CBC, iv)
|
||||||
|
plaintext = unpad(cipher.decrypt(ciphertext), DES3.block_size)
|
||||||
|
return plaintext.decode()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def b64(plaintext):
|
||||||
|
public_key = RSA.import_key(public_key_b64)
|
||||||
|
cipher = PKCS1_v1_5.new(public_key)
|
||||||
|
ciphertext = cipher.encrypt(plaintext.encode())
|
||||||
|
return base64.b64encode(ciphertext).decode()
|
||||||
|
|
||||||
|
def encrypt_para(plaintext):
|
||||||
|
public_key = RSA.import_key(public_key_data)
|
||||||
|
cipher = PKCS1_v1_5.new(public_key)
|
||||||
|
ciphertext = cipher.encrypt(plaintext.encode())
|
||||||
|
return ciphertext.hex()
|
||||||
|
|
||||||
|
|
||||||
|
def encode_phone(text):
|
||||||
|
encoded_chars = []
|
||||||
|
for char in text:
|
||||||
|
encoded_chars.append(chr(ord(char) + 2))
|
||||||
|
return ''.join(encoded_chars)
|
||||||
|
|
||||||
|
def ophone(t):
|
||||||
|
key = b'34d7cb0bcdf07523'
|
||||||
|
utf8_key = key.decode('utf-8')
|
||||||
|
utf8_t = t.encode('utf-8')
|
||||||
|
cipher = AES.new(key, AES.MODE_ECB)
|
||||||
|
ciphertext = cipher.encrypt(pad(utf8_t, AES.block_size))
|
||||||
|
return ciphertext.hex()
|
||||||
|
|
||||||
|
def send(uid,content):
|
||||||
|
r = requests.post('https://wxpusher.zjiecode.com/api/send/message',json={"appToken":"AT_3hr0wdZn5QzPNBbpTHFXawoDIsSUmPkN","content":content,"contentType":1,"uids":[uid]}).json()
|
||||||
|
return r
|
||||||
|
|
||||||
|
|
||||||
|
def userLoginNormal(phone,password):
|
||||||
|
alphabet = 'abcdef0123456789'
|
||||||
|
uuid = [''.join(random.sample(alphabet, 8)),''.join(random.sample(alphabet, 4)),'4'+''.join(random.sample(alphabet, 3)),''.join(random.sample(alphabet, 4)),''.join(random.sample(alphabet, 12))]
|
||||||
|
timestamp=datetime.datetime.now().strftime("%Y%m%d%H%M%S")
|
||||||
|
loginAuthCipherAsymmertric = 'iPhone 14 15.4.' + uuid[0] + uuid[1] + phone + timestamp + password[:6] + '0$$$0.'
|
||||||
|
|
||||||
|
try:
|
||||||
|
r = ss.post('https://appgologin.189.cn:9031/login/client/userLoginNormal',json={"headerInfos": {"code": "userLoginNormal", "timestamp": timestamp, "broadAccount": "", "broadToken": "", "clientType": "#9.6.1#channel50#iPhone 14 Pro Max#", "shopId": "20002", "source": "110003", "sourcePassword": "Sid98s", "token": "", "userLoginName": phone}, "content": {"attach": "test", "fieldData": {"loginType": "4", "accountType": "", "loginAuthCipherAsymmertric": b64(loginAuthCipherAsymmertric), "deviceUid": uuid[0] + uuid[1] + uuid[2], "phoneNum": encode_phone(phone), "isChinatelecom": "0", "systemVersion": "15.4.0", "authentication": password}}}).json()
|
||||||
|
|
||||||
|
printn(f"登录响应: {r}") # 打印完整的响应以便调试
|
||||||
|
|
||||||
|
if 'responseData' not in r or 'data' not in r['responseData'] or 'loginSuccessResult' not in r['responseData']['data']:
|
||||||
|
printn(f"登录失败: 响应数据结构不正确")
|
||||||
|
return False
|
||||||
|
|
||||||
|
l = r['responseData']['data']['loginSuccessResult']
|
||||||
|
|
||||||
|
if l:
|
||||||
|
load_token[phone] = l
|
||||||
|
with open(load_token_file, 'w') as f:
|
||||||
|
json.dump(load_token, f)
|
||||||
|
ticket = get_ticket(phone,l['userId'],l['token'])
|
||||||
|
return ticket
|
||||||
|
except Exception as e:
|
||||||
|
printn(f"登录过程中发生错误: {str(e)}")
|
||||||
|
|
||||||
|
return False
|
||||||
|
def get_ticket(phone,userId,token):
|
||||||
|
r = ss.post('https://appgologin.189.cn:9031/map/clientXML',data='<Request><HeaderInfos><Code>getSingle</Code><Timestamp>'+datetime.datetime.now().strftime("%Y%m%d%H%M%S")+'</Timestamp><BroadAccount></BroadAccount><BroadToken></BroadToken><ClientType>#9.6.1#channel50#iPhone 14 Pro Max#</ClientType><ShopId>20002</ShopId><Source>110003</Source><SourcePassword>Sid98s</SourcePassword><Token>'+token+'</Token><UserLoginName>'+phone+'</UserLoginName></HeaderInfos><Content><Attach>test</Attach><FieldData><TargetId>'+encrypt(userId)+'</TargetId><Url>4a6862274835b451</Url></FieldData></Content></Request>',headers={'user-agent': 'CtClient;10.4.1;Android;13;22081212C;NTQzNzgx!#!MTgwNTg1'})
|
||||||
|
|
||||||
|
#printn(phone, '获取ticket', re.findall('<Reason>(.*?)</Reason>',r.text)[0])
|
||||||
|
|
||||||
|
tk = re.findall('<Ticket>(.*?)</Ticket>',r.text)
|
||||||
|
if len(tk) == 0:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
return decrypt(tk[0])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def queryInfo(phone,s):
|
||||||
|
global rs
|
||||||
|
a = 1
|
||||||
|
while a < 10:
|
||||||
|
if rs:
|
||||||
|
bd = js.call('main').split('=')
|
||||||
|
ck[bd[0]] = bd[1]
|
||||||
|
|
||||||
|
r = s.get('https://wapact.189.cn:9001/gateway/golden/api/queryInfo',cookies=ck).json()
|
||||||
|
|
||||||
|
try:
|
||||||
|
printn(f'{phone} 金豆余额 {r["biz"]["amountTotal"]}')
|
||||||
|
amountTotal= r["biz"]["amountTotal"]
|
||||||
|
except:
|
||||||
|
amountTotal = 0
|
||||||
|
if amountTotal< 3000:
|
||||||
|
if rs == 1:
|
||||||
|
bd = js.call('main').split('=')
|
||||||
|
ck [bd[0]] = bd[1]
|
||||||
|
|
||||||
|
|
||||||
|
res = s.post('http://wapact.189.cn:9000/gateway/stand/detail/exchange',json={"activityId":jdaid},cookies=ck).text
|
||||||
|
|
||||||
|
if '$_ts=window' in res:
|
||||||
|
first_request()
|
||||||
|
rs = 1
|
||||||
|
|
||||||
|
time.sleep(3)
|
||||||
|
else:
|
||||||
|
return r
|
||||||
|
a += 1
|
||||||
|
|
||||||
|
|
||||||
|
return r
|
||||||
|
|
||||||
|
|
||||||
|
def exchange(phone,s,title,aid, uid):
|
||||||
|
|
||||||
|
try:
|
||||||
|
bd = js.call('main').split('=')
|
||||||
|
ck [bd[0]] = bd[1]
|
||||||
|
r = s.post('https://wapact.189.cn:9001/gateway/standExchange/detailNew/exchange',json={"activityId":aid},cookies=ck)
|
||||||
|
printn(f"响应码: {r.status_code}")
|
||||||
|
|
||||||
|
if '$_ts=window' in r.text:
|
||||||
|
|
||||||
|
first_request(r.text)
|
||||||
|
return
|
||||||
|
r = r.json()
|
||||||
|
|
||||||
|
if r["code"] == 0:
|
||||||
|
if r["biz"] != {} and r["biz"]["resultCode"] in errcode:
|
||||||
|
#printn(str(datetime.datetime.now())[11:22], phone, title,errcode[r["biz"]["resultCode"]])
|
||||||
|
printn(f'{str(datetime.datetime.now())[11:22]} {phone} {title} {errcode[r["biz"]["resultCode"]]}')
|
||||||
|
|
||||||
|
|
||||||
|
if r["biz"]["resultCode"] in ["0","412"]:
|
||||||
|
if r["biz"]["resultCode"] == "0":
|
||||||
|
msg = phone+":"+title+"兑换成功"
|
||||||
|
|
||||||
|
send(uid, msg)
|
||||||
|
if phone not in dhjl[yf][title]:
|
||||||
|
dhjl[yf][title] += "#"+phone
|
||||||
|
with open('电信金豆换话费.log', 'w') as f:
|
||||||
|
json.dump(dhjl, f, ensure_ascii=False)
|
||||||
|
|
||||||
|
|
||||||
|
else:
|
||||||
|
#printn(str(datetime.datetime.now())[11:22], phone, r["message"])
|
||||||
|
printn(f'{str(datetime.datetime.now())[11:22]} {phone} {r}')
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
#print(e)
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def dh(phone,s,title,aid,wt, uid):
|
||||||
|
|
||||||
|
while wt > time.time():
|
||||||
|
pass
|
||||||
|
|
||||||
|
printn(f"{str(datetime.datetime.now())[11:22]} {phone} {title} 开始兑换")
|
||||||
|
|
||||||
|
if rs:
|
||||||
|
bd = js.call('main').split('=')
|
||||||
|
ck [bd[0]] = bd[1]
|
||||||
|
for cs in range(cfcs):
|
||||||
|
threading.Thread(target=exchange,args=(phone,s,title,aid, uid)).start()
|
||||||
|
#time.sleep(5)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def lottery(s):
|
||||||
|
for cishu in range(3):
|
||||||
|
try:
|
||||||
|
if rs:
|
||||||
|
bd = js.call('main').split('=')
|
||||||
|
ck [bd[0]] = bd[1]
|
||||||
|
else:
|
||||||
|
cookie = {}
|
||||||
|
r = s.post('https://wapact.189.cn:9001/gateway/golden/api/lottery',json={"activityId":"6384b49b1e44396da4f1e4a3"},cookies=ck)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
time.sleep(3)
|
||||||
|
|
||||||
|
|
||||||
|
def ks(phone, ticket, uid):
|
||||||
|
global wt
|
||||||
|
|
||||||
|
wxp[phone] = uid
|
||||||
|
s = requests.session()
|
||||||
|
s.verify = False
|
||||||
|
s.headers={"User-Agent":"Mozilla/5.0 (Linux; Android 13; 22081212C Build/TKQ1.220829.002) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.97 Mobile Safari/537.36","Referer":"https://wapact.189.cn:9001/JinDouMall/JinDouMall_independentDetails.html"}
|
||||||
|
s.cookies.set_policy(BlockAll())
|
||||||
|
s.mount('https://', DESAdapter())
|
||||||
|
s.timeout = 30
|
||||||
|
if rs:
|
||||||
|
bd = js.call('main').split('=')
|
||||||
|
ck [bd[0]] = bd[1]
|
||||||
|
|
||||||
|
|
||||||
|
login = s.post('https://wapact.189.cn:9001/unified/user/login',json={"ticket":ticket,"backUrl":"https%3A%2F%2Fwapact.189.cn%3A9001","platformCode":"P201010301","loginType":2}, cookies=ck).json()
|
||||||
|
if login['code'] == 0:
|
||||||
|
printn(phone+" 获取token成功")
|
||||||
|
s.headers["Authorization"] = "Bearer " + login["biz"]["token"]
|
||||||
|
|
||||||
|
queryInfo(phone,s)
|
||||||
|
|
||||||
|
|
||||||
|
if rs:
|
||||||
|
bd = js.call('main').split('=')
|
||||||
|
ck [bd[0]] = bd[1]
|
||||||
|
|
||||||
|
queryBigDataAppGetOrInfo = s.get('https://wapact.189.cn:9001/gateway/golden/api/queryBigDataAppGetOrInfo?floorType=0&userType=1&page&1&order=2&tabOrder=',cookies=ck).json()
|
||||||
|
#printn(queryBigDataAppGetOrInfo)
|
||||||
|
for i in queryBigDataAppGetOrInfo["biz"]["ExchangeGoodslist"]:
|
||||||
|
if '话费' not in i["title"]:continue
|
||||||
|
|
||||||
|
if '0.5元' in i["title"] or '5元' in i["title"]:
|
||||||
|
jp["9"][i["title"]] = i["id"]
|
||||||
|
elif '1元' in i["title"] or '10元' in i["title"]:
|
||||||
|
jp["13"][i["title"]] = i["id"]
|
||||||
|
else:
|
||||||
|
jp["12"][i["title"]] = i["id"]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
h = datetime.datetime.now().hour
|
||||||
|
if 11 > h > 1:
|
||||||
|
h = 9
|
||||||
|
|
||||||
|
elif 23 > h > 1:
|
||||||
|
h = 13
|
||||||
|
|
||||||
|
else:
|
||||||
|
h = 23
|
||||||
|
|
||||||
|
if len(sys.argv) ==2:
|
||||||
|
h = int(sys.argv[1])
|
||||||
|
#h=23
|
||||||
|
d = jp[str(h)]
|
||||||
|
|
||||||
|
wt = t(h) + kswt
|
||||||
|
|
||||||
|
if jp["12"] != {}:
|
||||||
|
d.update(jp["12"])
|
||||||
|
wt = 0
|
||||||
|
|
||||||
|
for di in d:
|
||||||
|
#if '5' in di:
|
||||||
|
if di not in dhjl[yf]:
|
||||||
|
dhjl[yf][di] = ""
|
||||||
|
if phone in dhjl[yf][di] :
|
||||||
|
printn(f"{phone} {di} 已兑换")
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
printn(f"{phone} {di}")
|
||||||
|
if wt - time.time() > 20 * 60:
|
||||||
|
print("等待时间超过20分钟")
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
threading.Thread(target=dh,args=(phone,s,di,d[di],wt, uid)).start()
|
||||||
|
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
printn(f"{phone} 获取token {login['message']}")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def first_request(res=''):
|
||||||
|
global js, fw
|
||||||
|
url = 'https://wapact.189.cn:9001/gateway/stand/detail/exchange'
|
||||||
|
if res == '':
|
||||||
|
response = ss.get(url)
|
||||||
|
res = response.text
|
||||||
|
soup = BeautifulSoup(res, 'html.parser')
|
||||||
|
scripts = soup.find_all('script')
|
||||||
|
for script in scripts:
|
||||||
|
if 'src' in str(script):
|
||||||
|
rsurl = re.findall('src="([^"]+)"', str(script))[0]
|
||||||
|
|
||||||
|
if '$_ts=window' in script.get_text():
|
||||||
|
ts_code = script.get_text()
|
||||||
|
|
||||||
|
|
||||||
|
urls = url.split('/')
|
||||||
|
rsurl = urls[0] + '//' + urls[2] + rsurl
|
||||||
|
#print(rsurl)
|
||||||
|
ts_code += ss.get(rsurl).text
|
||||||
|
content_code = soup.find_all('meta')[1].get('content')
|
||||||
|
with open("瑞数通杀.js") as f:
|
||||||
|
js_code_ym = f.read()
|
||||||
|
js_code = js_code_ym.replace('content_code', content_code).replace("'ts_code'", ts_code)
|
||||||
|
js = execjs.compile(js_code)
|
||||||
|
|
||||||
|
for cookie in ss.cookies:
|
||||||
|
ck[cookie.name] = cookie.value
|
||||||
|
return content_code, ts_code, ck
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
global wt,rs
|
||||||
|
r = ss.get('https://wapact.189.cn:9001/gateway/stand/detailNew/exchange')
|
||||||
|
if '$_ts=window' in r.text:
|
||||||
|
rs = 1
|
||||||
|
print("瑞数加密已开启")
|
||||||
|
first_request()
|
||||||
|
else:
|
||||||
|
print("瑞数加密已关闭")
|
||||||
|
rs = 0
|
||||||
|
if os.environ.get('chinaTelecomAccount')!= None:
|
||||||
|
chinaTelecomAccount = os.environ.get('chinaTelecomAccount')
|
||||||
|
else:
|
||||||
|
chinaTelecomAccount = chinaTelecomAccount
|
||||||
|
|
||||||
|
for i in chinaTelecomAccount.split('&'):
|
||||||
|
|
||||||
|
i = i.split('#')
|
||||||
|
phone = i[0]
|
||||||
|
password = i[1]
|
||||||
|
uid = i[-1]
|
||||||
|
ticket = False
|
||||||
|
|
||||||
|
#ticket = get_userTicket(phone)
|
||||||
|
|
||||||
|
if phone in load_token:
|
||||||
|
printn(f'{phone} 使用缓存登录')
|
||||||
|
ticket = get_ticket(phone,load_token[phone]['userId'],load_token[phone]['token'])
|
||||||
|
|
||||||
|
if ticket == False:
|
||||||
|
printn(f'{phone} 使用密码登录')
|
||||||
|
ticket = userLoginNormal(phone,password)
|
||||||
|
|
||||||
|
if ticket:
|
||||||
|
threading.Thread(target=ks,args=(phone, ticket, uid)).start()
|
||||||
|
|
||||||
|
time.sleep(1)
|
||||||
|
else:
|
||||||
|
printn(f'{phone} 登录失败')
|
||||||
|
|
||||||
|
|
||||||
|
chinaTelecomAccount = ""
|
||||||
|
cfcs = 5
|
||||||
|
jdaid = '60dd79533dc03d3c76bdde30'
|
||||||
|
ck = {}
|
||||||
|
load_token_file = 'chinaTelecom_cache.json'
|
||||||
|
try:
|
||||||
|
with open(load_token_file, 'r') as f:
|
||||||
|
load_token = json.load(f)
|
||||||
|
except:
|
||||||
|
load_token = {}
|
||||||
|
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user