mirror of
https://github.com/daiyanan1992/qinglongtest
synced 2025-12-23 02:04:36 +08:00
活动恢复 改用pycryptodome
This commit is contained in:
@@ -4,6 +4,8 @@
|
|||||||
# @Author : github@limoruirui https://github.com/limoruirui
|
# @Author : github@limoruirui https://github.com/limoruirui
|
||||||
# @Time : 2022/8/10 13:23
|
# @Time : 2022/8/10 13:23
|
||||||
# -------------------------------
|
# -------------------------------
|
||||||
|
# cron "30 9 * * *" script-path=xxx.py,tag=匹配cron用
|
||||||
|
# const $ = new Env('某通阅读');
|
||||||
"""
|
"""
|
||||||
联通app抽奖 入口:联通app 搜索 阅读专区 进入话费派送中
|
联通app抽奖 入口:联通app 搜索 阅读专区 进入话费派送中
|
||||||
1. 脚本仅供学习交流使用, 请在下载后24h内删除
|
1. 脚本仅供学习交流使用, 请在下载后24h内删除
|
||||||
@@ -14,71 +16,9 @@
|
|||||||
推送通知的变量同青龙 只写了tgbot(支持反代api)和pushplus
|
推送通知的变量同青龙 只写了tgbot(支持反代api)和pushplus
|
||||||
"""
|
"""
|
||||||
"""
|
"""
|
||||||
|
updateTime: 2022.12.1 log: 活动重新上架 改用 pycryptodome 替代 cryptography 进行aes加密
|
||||||
updateTime: 2022.9.1 log: 每个月活动id改变更新
|
updateTime: 2022.9.1 log: 每个月活动id改变更新
|
||||||
"""
|
"""
|
||||||
import base64
|
|
||||||
|
|
||||||
from cryptography.hazmat.primitives import padding
|
|
||||||
from cryptography.hazmat.primitives.ciphers import algorithms
|
|
||||||
from Crypto.Cipher import AES
|
|
||||||
from binascii import b2a_hex, a2b_hex
|
|
||||||
|
|
||||||
|
|
||||||
class PrpCrypt(object):
|
|
||||||
|
|
||||||
def __init__(self, key):
|
|
||||||
self.key = key.encode('utf-8')
|
|
||||||
self.mode = AES.MODE_CBC
|
|
||||||
|
|
||||||
# 加密函数,如果text不足16位就用空格补足为16位,
|
|
||||||
# 如果大于16当时不是16的倍数,那就补足为16的倍数。
|
|
||||||
def encrypt(self, text):
|
|
||||||
cryptor = AES.new(self.key, self.mode, b'16-Bytes--String')
|
|
||||||
text = text.encode('utf-8')
|
|
||||||
|
|
||||||
# 这里**key 长度必须为16(AES-128),
|
|
||||||
# 24(AES-192),或者32 (AES-256)Bytes 长度
|
|
||||||
# 目前AES-128 足够目前使用
|
|
||||||
|
|
||||||
text = self.pkcs7_padding(text)
|
|
||||||
|
|
||||||
self.ciphertext = cryptor.encrypt(text)
|
|
||||||
|
|
||||||
# 因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题
|
|
||||||
# 所以这里统一把加密后的字符串转化为16进制字符串
|
|
||||||
return b2a_hex(self.ciphertext)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def pkcs7_padding(data):
|
|
||||||
if not isinstance(data, bytes):
|
|
||||||
data = data.encode()
|
|
||||||
|
|
||||||
padder = padding.PKCS7(algorithms.AES.block_size).padder()
|
|
||||||
|
|
||||||
padded_data = padder.update(data) + padder.finalize()
|
|
||||||
|
|
||||||
return padded_data
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def pkcs7_unpadding(padded_data):
|
|
||||||
unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder()
|
|
||||||
data = unpadder.update(padded_data)
|
|
||||||
|
|
||||||
try:
|
|
||||||
uppadded_data = data + unpadder.finalize()
|
|
||||||
except ValueError:
|
|
||||||
raise Exception('无效的加密信息!')
|
|
||||||
else:
|
|
||||||
return uppadded_data
|
|
||||||
|
|
||||||
# 解密后,去掉补足的空格用strip() 去掉
|
|
||||||
def decrypt(self, text):
|
|
||||||
# 偏移量'abcdefg'
|
|
||||||
cryptor = AES.new(self.key, self.mode, b'16-Bytes--String')
|
|
||||||
plain_text = cryptor.decrypt(a2b_hex(text))
|
|
||||||
# return plain_text.rstrip('\0')
|
|
||||||
return bytes.decode(plain_text).rstrip('\0')
|
|
||||||
|
|
||||||
|
|
||||||
from requests import post
|
from requests import post
|
||||||
from time import sleep, time
|
from time import sleep, time
|
||||||
@@ -87,17 +27,16 @@ from hashlib import md5 as md5Encode
|
|||||||
from random import randint, uniform
|
from random import randint, uniform
|
||||||
from os import environ
|
from os import environ
|
||||||
from sys import stdout, exit
|
from sys import stdout, exit
|
||||||
|
from base64 import b64encode
|
||||||
|
from json import dumps
|
||||||
|
|
||||||
|
from tools.encrypt_symmetric import Crypt
|
||||||
|
from tools.send_msg import push
|
||||||
|
from tools.tool import get_environ, random_sleep
|
||||||
|
random_sleep(0, 1600)
|
||||||
|
|
||||||
|
|
||||||
"""读取环境变量"""
|
|
||||||
phone_num = environ.get("PHONE_NUM") if environ.get("PHONE_NUM") else ""
|
|
||||||
unicom_lotter = environ.get("UNICOM_LOTTER") if environ.get("UNICOM_LOTTER") else True
|
|
||||||
pushplus_token = environ.get("PUSH_PLUS_TOKEN") if environ.get("PUSH_PLUS_TOKEN") else ""
|
|
||||||
tgbot_token = environ.get("TG_BOT_TOKEN") if environ.get("TG_BOT_TOKEN") else ""
|
|
||||||
tg_userId = environ.get("TG_USER_ID") if environ.get("TG_USER_ID") else ""
|
|
||||||
tg_push_api = environ.get("TG_API_HOST") if environ.get("TG_API_HOST") else ""
|
|
||||||
"""主类"""
|
"""主类"""
|
||||||
|
|
||||||
|
|
||||||
class China_Unicom:
|
class China_Unicom:
|
||||||
def __init__(self, phone_num):
|
def __init__(self, phone_num):
|
||||||
self.phone_num = phone_num
|
self.phone_num = phone_num
|
||||||
@@ -125,43 +64,11 @@ class China_Unicom:
|
|||||||
m = md5Encode(str.encode(encoding='utf-8'))
|
m = md5Encode(str.encode(encoding='utf-8'))
|
||||||
return m.hexdigest()
|
return m.hexdigest()
|
||||||
|
|
||||||
def pushplus(self, title, content):
|
|
||||||
url = "http://www.pushplus.plus/send"
|
|
||||||
headers = {
|
|
||||||
"Content-Type": "application/json"
|
|
||||||
}
|
|
||||||
data = {
|
|
||||||
"token": pushplus_token,
|
|
||||||
"title": title,
|
|
||||||
"content": content
|
|
||||||
}
|
|
||||||
try:
|
|
||||||
post(url, headers=headers, json=data)
|
|
||||||
except:
|
|
||||||
self.print_now('推送失败')
|
|
||||||
|
|
||||||
def tgpush(self, content):
|
|
||||||
url = f"https://api.telegram.org/bot{tgbot_token}/sendMessage"
|
|
||||||
if tg_push_api != "":
|
|
||||||
url = f"https://{tg_push_api}/bot{tgbot_token}/sendMessage"
|
|
||||||
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
|
|
||||||
data = {'chat_id': str(tg_userId), 'text': content, 'disable_web_page_preview': 'true'}
|
|
||||||
try:
|
|
||||||
post(url, headers=headers, data=data, timeout=10)
|
|
||||||
except:
|
|
||||||
self.print_now('推送失败')
|
|
||||||
|
|
||||||
def push(self, msg):
|
|
||||||
if pushplus_token != "":
|
|
||||||
self.pushplus("联通app大转盘", msg)
|
|
||||||
if tgbot_token != "" and tg_userId != "":
|
|
||||||
self.tgpush(f"联通app大转盘:\n{msg}")
|
|
||||||
|
|
||||||
def req(self, url, crypt_text):
|
def req(self, url, crypt_text):
|
||||||
body = {
|
body = {
|
||||||
"sign": base64.b64encode(PrpCrypt(self.headers["accesstoken"][-16:]).encrypt(crypt_text)).decode()
|
"sign": b64encode(Crypt(crypt_type="AES", key=self.headers["accesstoken"][-16:], iv="16-Bytes--String", mode="CBC").encrypt(crypt_text).encode()).decode()
|
||||||
}
|
}
|
||||||
self.headers["Content-Length"] = str(len(str(body)) - 1)
|
self.headers["Content-Length"] = str(len(dumps(body).replace(" ", "")))
|
||||||
data = post(url, headers=self.headers, json=body).json()
|
data = post(url, headers=self.headers, json=body).json()
|
||||||
return data
|
return data
|
||||||
|
|
||||||
@@ -171,7 +78,7 @@ class China_Unicom:
|
|||||||
url = f"https://10010.woread.com.cn/ng_woread_service/rest/app/auth/10000002/{timestamp}/{self.md5(f'100000027k1HcDL8RKvc{timestamp}')}"
|
url = f"https://10010.woread.com.cn/ng_woread_service/rest/app/auth/10000002/{timestamp}/{self.md5(f'100000027k1HcDL8RKvc{timestamp}')}"
|
||||||
crypt_text = f'{{"timestamp":"{date}"}}'
|
crypt_text = f'{{"timestamp":"{date}"}}'
|
||||||
body = {
|
body = {
|
||||||
"sign": base64.b64encode(PrpCrypt("1234567890abcdef").encrypt(crypt_text)).decode()
|
"sign": b64encode(Crypt(crypt_type="AES", key="1234567890abcdef").encrypt(crypt_text).encode()).decode()
|
||||||
}
|
}
|
||||||
self.headers["Content-Length"] = str(len(str(body)) - 1)
|
self.headers["Content-Length"] = str(len(str(body)) - 1)
|
||||||
data = post(url, headers=self.headers, json=body).json()
|
data = post(url, headers=self.headers, json=body).json()
|
||||||
@@ -202,7 +109,7 @@ class China_Unicom:
|
|||||||
self.print_now(data)
|
self.print_now(data)
|
||||||
if self.fail_num == 3:
|
if self.fail_num == 3:
|
||||||
self.print_now("当前任务出现异常 且错误次数达到3次 请手动检查")
|
self.print_now("当前任务出现异常 且错误次数达到3次 请手动检查")
|
||||||
self.push("当前任务出现异常 且错误次数达到3次 请手动检查")
|
push("某通阅读", "当前任务出现异常 且错误次数达到3次 请手动检查")
|
||||||
exit(0)
|
exit(0)
|
||||||
if data["code"] == "9999":
|
if data["code"] == "9999":
|
||||||
self.print_now("当前任务出现异常 正在重新执行")
|
self.print_now("当前任务出现异常 正在重新执行")
|
||||||
@@ -212,7 +119,7 @@ class China_Unicom:
|
|||||||
|
|
||||||
def read_novel(self):
|
def read_novel(self):
|
||||||
self.print_now("正在执行观看150次小说, 此过程较久, 最大时长为150 * 8s = 20min")
|
self.print_now("正在执行观看150次小说, 此过程较久, 最大时长为150 * 8s = 20min")
|
||||||
for i in range(150):
|
for i in range(1):
|
||||||
date = datetime.today().__format__("%Y%m%d%H%M%S")
|
date = datetime.today().__format__("%Y%m%d%H%M%S")
|
||||||
chapterAllIndex = randint(100000000, 999999999)
|
chapterAllIndex = randint(100000000, 999999999)
|
||||||
cntIndex = randint(1000000, 9999999)
|
cntIndex = randint(1000000, 9999999)
|
||||||
@@ -271,19 +178,15 @@ class China_Unicom:
|
|||||||
url = "https://10010.woread.com.cn/ng_woread_service/rest/phone/vouchers/queryTicketAccount"
|
url = "https://10010.woread.com.cn/ng_woread_service/rest/phone/vouchers/queryTicketAccount"
|
||||||
date = datetime.today().__format__("%Y%m%d%H%M%S")
|
date = datetime.today().__format__("%Y%m%d%H%M%S")
|
||||||
crypt_text = f'{{"timestamp":"{date}","token":"{self.userinfo["token"]}","userId":"{self.userinfo["userid"]}","userIndex":{self.userinfo["userindex"]},"userAccount":"{self.userinfo["phone"]}","verifyCode":"{self.userinfo["verifycode"]}"}}'
|
crypt_text = f'{{"timestamp":"{date}","token":"{self.userinfo["token"]}","userId":"{self.userinfo["userid"]}","userIndex":{self.userinfo["userindex"]},"userAccount":"{self.userinfo["phone"]}","verifyCode":"{self.userinfo["verifycode"]}"}}'
|
||||||
body = {
|
|
||||||
"sign": base64.b64encode(PrpCrypt(self.headers["accesstoken"][-16:]).encrypt(crypt_text)).decode()
|
|
||||||
}
|
|
||||||
self.headers["Content-Length"] = str(len(str(body)) - 1)
|
|
||||||
data = self.req(url, crypt_text)
|
data = self.req(url, crypt_text)
|
||||||
if data["code"] == "0000":
|
if data["code"] == "0000":
|
||||||
can_use_red = data["data"]["usableNum"] / 100
|
can_use_red = data["data"]["usableNum"] / 100
|
||||||
if can_use_red >= 3:
|
if can_use_red >= 3:
|
||||||
self.print_now(f"查询成功 你当前有话费红包{can_use_red} 可以去兑换了")
|
self.print_now(f"查询成功 你当前有话费红包{can_use_red} 可以去兑换了")
|
||||||
self.push(f"查询成功 你当前有话费红包{can_use_red} 可以去兑换了")
|
push("某通阅读", f"查询成功 你当前有话费红包{can_use_red} 可以去兑换了")
|
||||||
else:
|
else:
|
||||||
self.print_now(f"查询成功 你当前有话费红包{can_use_red} 不足兑换的最低额度")
|
self.print_now(f"查询成功 你当前有话费红包{can_use_red} 不足兑换的最低额度")
|
||||||
self.push(f"查询成功 你当前有话费红包{can_use_red} 不足兑换的最低额度")
|
push("某通阅读", f"查询成功 你当前有话费红包{can_use_red} 不足兑换的最低额度")
|
||||||
|
|
||||||
def main(self):
|
def main(self):
|
||||||
self.referer_login()
|
self.referer_login()
|
||||||
@@ -303,4 +206,9 @@ class China_Unicom:
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
"""读取环境变量"""
|
||||||
|
phone_num = get_environ("PHONE_NUM")
|
||||||
|
unicom_lotter = environ.get("UNICOM_LOTTER") if environ.get("UNICOM_LOTTER") else True
|
||||||
|
if phone_num == "":
|
||||||
|
exit(0)
|
||||||
China_Unicom(phone_num).main()
|
China_Unicom(phone_num).main()
|
||||||
Reference in New Issue
Block a user