mirror of
https://github.com/daiyanan1992/qinglongtest
synced 2025-12-16 23:09:38 +08:00
重构结构
This commit is contained in:
0
JS/.gitkeep
Normal file
0
JS/.gitkeep
Normal file
@@ -126,18 +126,6 @@ class Txsp_vipRed:
|
||||
self.head = findall(r"\"head\":\"(.*?)\"", data)[0]
|
||||
self.nickname = findall(r"\"nick\":\"(.*?)\"", data)[0]
|
||||
|
||||
"""碰了别人的则上报别人的次数+1 用于计数别人的蛋有没有碰完 暂时未使用 后续观察情况再说"""
|
||||
|
||||
def laisee_id_success(self, laisee_id):
|
||||
url = "https://api.ruirui.fun/txsp/laisee_id_success"
|
||||
body = {
|
||||
"laisee_id": laisee_id
|
||||
}
|
||||
try:
|
||||
post(url, json=body)
|
||||
except:
|
||||
self.print_now("上报失败")
|
||||
|
||||
def get_laisee_id(self):
|
||||
url = "https://api.ruirui.fun/txsp/get_laisee_id"
|
||||
try:
|
||||
3
iqiyi.py
3
iqiyi.py
@@ -23,7 +23,7 @@ cookie = ""
|
||||
iqiyi_dfp = ""
|
||||
from time import sleep, time
|
||||
from random import randint, choice
|
||||
from json import dumps, loads
|
||||
from json import dumps
|
||||
from hashlib import md5 as md5Encode
|
||||
from string import digits, ascii_lowercase, ascii_uppercase
|
||||
from sys import exit, stdout
|
||||
@@ -201,6 +201,7 @@ class Iqiyi:
|
||||
self.uid = data['data']['userinfo']['pru']
|
||||
else:
|
||||
self.print_now("请求api失败 最大可能是cookie失效了 也可能是网络问题")
|
||||
self.tgpush("爱奇艺每日任务: 请求api失败 最大可能是cookie失效了 也可能是网络问题")
|
||||
exit(0)
|
||||
|
||||
def get_watch_time(self):
|
||||
|
||||
@@ -1,90 +0,0 @@
|
||||
# 本脚本是一个半成品 不可以直接使用 请先确认自己能抓到自己签到链接再折腾,避免浪费自己时间 签到链接格式如下 抓这个格式的就行 注意的是在正式发post包之前会有一个options预检包 这里面的链接应该也是能用的 ck过期则签到链接过期 理论上是三个月吧
|
||||
# url = 'https://community.iqiyi.com/openApi/task/execute?agentType=1&agentversion=1&appKey=basic_pcw&authCookie=xxx&qyid=xxx&sign=xxx&task_code=natural_month_sign×tamp=xxx&typeCode=point&userId=xxx'
|
||||
# 本来前天就弄好了 不过一直在思考可行方案 不知道发什么形式的好 增加获取签到链接的api的最有效的 但也是争议性最大的 我服务器也承担被攻击风险 想来想去还是决定按现在这个方案走 自己抓
|
||||
# 使用方式 直接下raw文件或者在自己机器上新建一个同名文件复制粘贴内容进去都可以 测试python3版本在3.6.x-3.8.x都可用 其它自测
|
||||
# 本来不太想发的 sign逆向虽然弄出来了 但不确定开源出来会不会吃票 固定签到链接虽然能签到 但是后续会怎么样不能保证,请自行斟酌是否使用
|
||||
# ck填写规则 只填写P00001的value值 如(P00001=xxx;的话 只填写xxx 不要P00001=) 会操作的话 库里有爱奇艺扫码获取P00001的脚本或者直接抓包软件抓
|
||||
# 只写了tg推送 推送信息写在 24 25行处 若是能访问tg的机器会走tg原生接口 否则走饭袋api推送(参考温佬wenmoux的) 因为自己平常都是用tg推送 本来想加一个以前写过的pushplus 不过找不到代码放在哪里了 所以还是算了
|
||||
# 本项目使用了第三方库requests 如果没安装报错请按报错信息执行,其它库均为py原生库
|
||||
# 本人不使用青龙 但是青龙原理也是一样 单独下raw脚本 然后改脚本内容 不支持环境变量
|
||||
# 后续大概可能应该也许不会更新什么了,医学生大五忙毕业了 最多加个上传ck自动获取签到链接的api 不过毕竟上传ck这种东西很敏感 而且我api服务器也可能会面临风险 所以可能也不弄 大家能抓到就用不会抓就等其它大佬更新一个更可行的方案
|
||||
# 1.21更新 增加了一个上传ck获取自己号签到链接的api 默认为关闭状态 开启请在 29 行填open 上传ck有风险 有能力请自行抓包
|
||||
# 本脚本仅供交流,请仔细斟酌得失再行使用,用户行为均与作者无关
|
||||
|
||||
try:
|
||||
from requests import post, get
|
||||
except:
|
||||
print("你还没有安装requests库,请执行pip3 install requests安装后再执行本脚本")
|
||||
from json import dumps
|
||||
from hashlib import md5
|
||||
from random import choice
|
||||
from string import digits, ascii_lowercase
|
||||
from base64 import b64decode
|
||||
|
||||
ck = ''
|
||||
bot_token = ''
|
||||
user_id = ''
|
||||
url = ''
|
||||
# 以下变量若设置为 open 则本脚本会将ck上传给api获取你自己的签到url 将打印出来的url填入 25 行的url里即可不用抓签到链接的包
|
||||
mode = '' #默认为空,为正常执行签到 填入 open 执行脚本可获取签到链接 获取保存好之后请删除 open 否则不会进行签到任务
|
||||
|
||||
def main():
|
||||
data = {
|
||||
"natural_month_sign" : {
|
||||
"taskCode" : "iQIYI_mofhr",
|
||||
"agentType" : 1,
|
||||
"agentversion" : 1,
|
||||
"authCookie" : ck,
|
||||
"qyid" : md5Encode(uuid(16)),
|
||||
"verticalCode" : "iQIYI"
|
||||
}
|
||||
}
|
||||
headers = {
|
||||
'User-Agent': 'Mozilla/5.0 (iPad; CPU iPhone OS 15_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 IqiyiApp/iqiyi IqiyiVersion/12.11.5 IqiyiPlatform/2_22_221 WebVersion/QYWebContainer QYStyleModel/(dark)',
|
||||
'Content-Type':'application/json'
|
||||
}
|
||||
data = post(url, headers=headers, data=dumps(data)).json()
|
||||
print(data)
|
||||
if data['code'] == 'A00000':
|
||||
try:
|
||||
tgpush('今日签到成功或者已经签到了')
|
||||
except:
|
||||
print('你还没有填写tg推送信息或者网络问题')
|
||||
return '签到成功'
|
||||
else:
|
||||
return '签到失败,原因可能是签到接口又又又又改了'
|
||||
|
||||
def md5Encode(str):
|
||||
m = md5(str.encode(encoding='utf-8'))
|
||||
return m.hexdigest()
|
||||
|
||||
def uuid(num):
|
||||
str = ''
|
||||
for i in range(num):
|
||||
str += choice(digits + ascii_lowercase)
|
||||
return str
|
||||
|
||||
def tgpush(content):
|
||||
url = f"https://api.telegram.org/bot{bot_token}/sendMessage"
|
||||
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
|
||||
data = {'chat_id': str(user_id), 'text': content, 'disable_web_page_preview': 'true'}
|
||||
try:
|
||||
req = post(url, headers=headers, data=data, timeout=10)
|
||||
except:
|
||||
print('推送失败,请检查网络问题')
|
||||
def tgpush2(content):
|
||||
url = f"https://telegram_proxy.lulafun.workers.dev/bot{bot_token}/sendMessage?parse_mode=Markdown&text={content}&chat_id={user_id}"
|
||||
try:
|
||||
req = get(url, timeout=30)
|
||||
except:
|
||||
print('推送失败')
|
||||
|
||||
def getUrl():
|
||||
headers = {'Content-Type':'application/json'}
|
||||
data = {"ck":ck}
|
||||
return post(str(b64decode('aHR0cHM6Ly9zZXJ2aWNlLTA4aWlldTF3LTEzMDgxNDY3MTguZ3ouYXBpZ3cudGVuY2VudGNzLmNvbS9yZWxlYXNlL2dldHVybA==').decode()), headers=headers, data=dumps(data), timeout=20).json()['s']
|
||||
if __name__ == '__main__':
|
||||
if mode == 'open':
|
||||
print(getUrl())
|
||||
else:
|
||||
main()
|
||||
0
logs/.gitkeep
Normal file
0
logs/.gitkeep
Normal file
2
requirements.txt
Normal file
2
requirements.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
requests
|
||||
pycryptodome
|
||||
49
tools/aes_encrypt.py
Normal file
49
tools/aes_encrypt.py
Normal file
@@ -0,0 +1,49 @@
|
||||
#!/usr/bin/python3
|
||||
# -- coding: utf-8 --
|
||||
# -------------------------------
|
||||
# @Author : github@limoruirui https://github.com/limoruirui
|
||||
# @Time : 2022/8/22 18:13
|
||||
# -------------------------------
|
||||
"""
|
||||
aes加密解密工具 目前仅支持ECB/CBC 块长度均为128位 padding只支持pkcs7/zero_padding(aes中没有pkcs5 能用的pkcs5其实是执行的pkcs7) 后续有需要再加
|
||||
pycryptdemo限制 同一个aes加密对象不能即加密又解密 所以当加密和解密都需要执行时 需要重新new一个对象增加额外开销
|
||||
-- A cipher object is stateful: once you have encrypted a message , you cannot encrypt (or decrypt) another message using the same object.
|
||||
"""
|
||||
from Crypto.Cipher import AES
|
||||
from binascii import b2a_hex, a2b_hex
|
||||
from base64 import b64encode, b64decode
|
||||
class AES_Ctypt:
|
||||
def __init__(self, key, iv=None, mode="ECB"):
|
||||
if len(key) % 16 != 0:
|
||||
key = key + (AES.block_size - len(key) % AES.block_size) * chr(0)
|
||||
self.key = key.encode("utf-8")
|
||||
if mode == "ECB":
|
||||
self.mode = AES.MODE_ECB
|
||||
elif mode == "CBC":
|
||||
self.mode = AES.MODE_CBC
|
||||
else:
|
||||
print("您选择的加密方式错误")
|
||||
if iv is None:
|
||||
self.cipher = AES.new(self.key, self.mode)
|
||||
else:
|
||||
if isinstance(iv, str):
|
||||
self.cipher = AES.new(self.key, self.mode, iv.encode("utf-8"))
|
||||
else:
|
||||
print("偏移量不为字符串")
|
||||
def encrypt(self, data, padding="pkcs7", b64=False):
|
||||
bs = AES.block_size
|
||||
pkcs7_padding = lambda s: s + (bs - len(s.encode()) % bs) * chr(bs - len(s.encode()) % bs)
|
||||
zero_padding = lambda s: s + (bs - len(s) % bs) * chr(0)
|
||||
pad = pkcs7_padding if padding=="pkcs7" else zero_padding
|
||||
data = self.cipher.encrypt(pad(data).encode("utf8"))
|
||||
encrypt_data = b64encode(data) if b64 else b2a_hex(data) # 输出hex或者base64
|
||||
return encrypt_data.decode('utf8')
|
||||
def decrypt(self, data, b64=False):
|
||||
data = b64decode(data) if b64 else a2b_hex(data)
|
||||
decrypt_data = self.cipher.decrypt(data).decode()
|
||||
# 去掉padding
|
||||
# pkcs7_unpadding = lambda s: s.replace(s[-1], "")
|
||||
# zero_unpadding = lambda s: s.replace(chr(0), "")
|
||||
# unpadding = pkcs7_unpadding if padding=="pkcs7" else zero_unpadding
|
||||
unpadding = lambda s: s.replace(s[-1], "")
|
||||
return unpadding(decrypt_data)
|
||||
@@ -1,13 +1,14 @@
|
||||
#留作备份
|
||||
#扫码获取爱奇艺P00001, 此二维码有效期只有半分钟,但是爱奇艺没给二维码失效判断,所以默认执行6次后未完成扫码就结束
|
||||
#实测此方法获取的P00001有效期为三个月,如果只用于签到和日常任务,超过三个月之后还能用,但是无法碰蛋和查询信息
|
||||
#第十行若选择本地展示 则需要安装PIL库,若选择tg推送,需在17 18行填写botToken和user_id
|
||||
# 留作备份
|
||||
# 扫码获取爱奇艺P00001, 此二维码有效期只有半分钟,但是爱奇艺没给二维码失效判断,所以默认执行6次后未完成扫码就结束
|
||||
# 实测此方法获取的P00001有效期为三个月,如果只用于签到和日常任务,超过三个月之后还能用,但是无法碰蛋和查询信息
|
||||
# 第十行若选择本地展示 则需要安装PIL库,若选择tg推送,需在17 18行填写botToken和user_id
|
||||
from requests import post, get
|
||||
from random import random
|
||||
from hashlib import md5
|
||||
from time import sleep
|
||||
from os import remove
|
||||
qrShowType = '本地展示' #可选择 本地展示 tg推送 #默认本地展示 适合本地有图形界面的机器使用 tg推送则不需要图形界面,但需要考虑网络问题
|
||||
|
||||
qrShowType = '本地展示' # 可选择 本地展示 tg推送 #默认本地展示 适合本地有图形界面的机器使用 tg推送则不需要图形界面,但需要考虑网络问题
|
||||
if qrShowType == '本地展示':
|
||||
try:
|
||||
from PIL import image
|
||||
@@ -16,6 +17,8 @@ if qrShowType == '本地展示':
|
||||
else:
|
||||
botToken = ''
|
||||
user_id = ''
|
||||
|
||||
|
||||
def tgpush(content):
|
||||
url = f"https://api.telegram.org/bot{botToken}/sendPhoto"
|
||||
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
|
||||
@@ -24,6 +27,8 @@ def tgpush(content):
|
||||
req = post(url, headers=headers, data=data, timeout=20)
|
||||
except:
|
||||
print('推送失败')
|
||||
|
||||
|
||||
def getToken():
|
||||
url = 'https://passport.iqiyi.com/apis/qrcode/gen_login_token.action'
|
||||
headers = {
|
||||
@@ -40,6 +45,8 @@ def getToken():
|
||||
'surl': 1
|
||||
}
|
||||
return post(url, headers=headers, data=data).json()['data']['token']
|
||||
|
||||
|
||||
def qrcode(token):
|
||||
url = f'https://qrcode.iqiyipic.com/login/?data=https%3A%2F%2Fpassport.iqiyi.com%2Fapis%2Fqrcode%2Ftoken_login.action%3Ftoken%3D{token}&property=0&salt={md5Encode(f"35f4223bb8f6c8638dc91d94e9b16f5https%3A%2F%2Fpassport.iqiyi.com%2Fapis%2Fqrcode%2Ftoken_login.action%3Ftoken%3D{token}")}&width=162&_={random()}'
|
||||
if qrShowType == 'tg推送':
|
||||
@@ -52,11 +59,13 @@ def qrcode(token):
|
||||
with open('登录二维码.png', 'wb') as f:
|
||||
f.write(req.content)
|
||||
image.open('登录二维码.png').show()
|
||||
|
||||
|
||||
def login(token):
|
||||
url = 'https://passport.iqiyi.com/apis/qrcode/is_token_login.action'
|
||||
headers = {
|
||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
|
||||
}
|
||||
}
|
||||
data = {
|
||||
'agenttype': 1,
|
||||
'app_version': '',
|
||||
@@ -78,18 +87,24 @@ def login(token):
|
||||
return cookie
|
||||
else:
|
||||
sleep(8)
|
||||
continue
|
||||
continue
|
||||
try:
|
||||
remove('登录二维码.png')
|
||||
except:
|
||||
print('当前为tg推送,未生成本地图片,无需删除')
|
||||
return '本次扫码未成功,可能是二维码失效或者未知原因'
|
||||
|
||||
|
||||
def start():
|
||||
token = getToken()
|
||||
qrcode(token)
|
||||
print(login(token))
|
||||
def md5Encode(str):
|
||||
m = md5(str.encode(encoding='utf-8'))
|
||||
return m.hexdigest()
|
||||
|
||||
|
||||
def md5Encode(str):
|
||||
m = md5(str.encode(encoding='utf-8'))
|
||||
return m.hexdigest()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
start()
|
||||
23
tools/rsa_encrypt.py
Normal file
23
tools/rsa_encrypt.py
Normal file
@@ -0,0 +1,23 @@
|
||||
#!/usr/bin/python3
|
||||
# -- coding: utf-8 --
|
||||
# -------------------------------
|
||||
# @Author : github@limoruirui https://github.com/limoruirui
|
||||
# @Time : 2022/8/23 13:05
|
||||
# -------------------------------
|
||||
from Crypto.PublicKey.RSA import importKey
|
||||
from Crypto.Cipher import PKCS1_v1_5
|
||||
from base64 import b64encode
|
||||
|
||||
class RSA_Encrypt:
|
||||
def __init__(self, key):
|
||||
if isinstance(key, str):
|
||||
# 若提供的rsa公钥不为pem格式 则先将hex转化为pem格式
|
||||
self.key = bytes.fromhex(key) if "PUBLIC KEY" not in key else key.encode()
|
||||
else:
|
||||
print("提供的公钥格式不正确")
|
||||
def Encrypt(self, data, b64=False):
|
||||
pub_key = importKey(self.key)
|
||||
cipher = PKCS1_v1_5.new(pub_key)
|
||||
rsa_text = cipher.encrypt(data.encode("utf8"))
|
||||
rsa_text = b64encode(rsa_text).decode() if b64 else rsa_text.hex()
|
||||
return rsa_text
|
||||
44
tools/send_msg.py
Normal file
44
tools/send_msg.py
Normal file
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/python3
|
||||
# -- coding: utf-8 --
|
||||
# -------------------------------
|
||||
# @Author : github@limoruirui https://github.com/limoruirui
|
||||
# @Time : 2022/8/23 23:31
|
||||
# -------------------------------
|
||||
from requests import post
|
||||
from json import dumps
|
||||
from tool import get_environ
|
||||
|
||||
tg_userId = get_environ("TG_USER_ID")
|
||||
tgbot_token = get_environ("TG_BOT_TOKEN")
|
||||
tg_push_api = get_environ("TG_API_HOST")
|
||||
pushplus_token = get_environ("PUSH_PLUS_TOKEN")
|
||||
|
||||
def tgpush(title, 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': f"{title}\n{content}", 'disable_web_page_preview': 'true'}
|
||||
try:
|
||||
post(url, headers=headers, data=data, timeout=10)
|
||||
except:
|
||||
print('推送失败')
|
||||
def pushplus(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, data=dumps(data))
|
||||
except:
|
||||
print('推送失败')
|
||||
def push(self, title, content):
|
||||
if pushplus_token != "":
|
||||
self.pushplus(title, content)
|
||||
if tgbot_token != "" and tg_userId != "":
|
||||
self.tgpush(title, content)
|
||||
77
tools/tool.py
Normal file
77
tools/tool.py
Normal file
@@ -0,0 +1,77 @@
|
||||
#!/usr/bin/python3
|
||||
# -- coding: utf-8 --
|
||||
# -------------------------------
|
||||
# @Author : github@limoruirui https://github.com/limoruirui
|
||||
# @Time : 2022/8/22 17:56
|
||||
# -------------------------------
|
||||
"""
|
||||
封装一些工具
|
||||
"""
|
||||
from hashlib import md5 as md5Encode, sha1
|
||||
from hmac import new
|
||||
from random import choice, randint
|
||||
from string import digits, ascii_lowercase, ascii_uppercase
|
||||
from time import sleep, time
|
||||
from datetime import datetime, timedelta
|
||||
from sys import stdout
|
||||
from os import environ
|
||||
from json import load
|
||||
|
||||
|
||||
# 生成随机字符串
|
||||
def uuid(num, upper=False):
|
||||
str = ''
|
||||
if upper:
|
||||
for i in range(num):
|
||||
str += choice(digits + ascii_lowercase + ascii_uppercase)
|
||||
else:
|
||||
for i in range(num):
|
||||
str += choice(digits + ascii_lowercase)
|
||||
return str
|
||||
|
||||
|
||||
# 修改print方法 避免某些环境下python执行print 不会去刷新缓存区导致信息第一时间不及时输出
|
||||
def print_now(content):
|
||||
print(content)
|
||||
stdout.flush()
|
||||
|
||||
|
||||
def get_ua():
|
||||
with open("../user_agent.json", "rb") as f:
|
||||
ua_list = load(f)["Chrome"]
|
||||
ua = choice(ua_list)
|
||||
return ua
|
||||
|
||||
|
||||
# 随机休眠时长 若为0时区 TimeZone为真
|
||||
def random_sleep(min_time=300, max_time=5400, TimeZone=True):
|
||||
random_time = randint(min_time, max_time)
|
||||
print_now(f"随机等待{random_time}秒")
|
||||
sleep(random_time)
|
||||
now_time = (datetime.now() + timedelta(hours=8)).__format__("%Y-%m-%d %H:%M:%S")
|
||||
if TimeZone:
|
||||
now_time = (datetime.now()).__format__("%Y-%m-%d %H:%M:%S")
|
||||
print_now(f"等待结束.开始执行 现在时间是------{now_time} ------------")
|
||||
|
||||
|
||||
def timestamp(short=False):
|
||||
if short:
|
||||
return int(round(time()))
|
||||
return int(round(time() * 1000))
|
||||
|
||||
|
||||
# md5
|
||||
def md5(str):
|
||||
m = md5Encode(str.encode('utf8'))
|
||||
return m.hexdigest()
|
||||
|
||||
|
||||
# hmac sha1
|
||||
def hmac_sha1(data, key):
|
||||
hmac_code = new(key.encode(), data.encode(), sha1)
|
||||
return hmac_code.hexdigest()
|
||||
|
||||
|
||||
# 封装读取环境变量的方法
|
||||
def get_environ(key, default=""):
|
||||
return environ.get(key) if environ.get(key) else default
|
||||
11804
user-agent.json
11804
user-agent.json
File diff suppressed because it is too large
Load Diff
94930
user-agents.json
94930
user-agents.json
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user