You've already forked my-video-workflow
自动投稿alpha
This commit is contained in:
1
workflow/bilibiliupload/util/__init__.py
Normal file
1
workflow/bilibiliupload/util/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
from .cipher import *
|
119
workflow/bilibiliupload/util/cipher.py
Normal file
119
workflow/bilibiliupload/util/cipher.py
Normal file
@ -0,0 +1,119 @@
|
||||
import hashlib
|
||||
import rsa
|
||||
import base64
|
||||
import subprocess
|
||||
import platform
|
||||
import os.path
|
||||
|
||||
|
||||
def md5(data: str):
|
||||
"""
|
||||
generate md5 hash of utf-8 encoded string.
|
||||
"""
|
||||
return hashlib.md5(data.encode("utf-8")).hexdigest()
|
||||
|
||||
|
||||
def md5_bytes(data: bytes):
|
||||
"""
|
||||
generate md5 hash of binary.
|
||||
"""
|
||||
return hashlib.md5(data).hexdigest()
|
||||
|
||||
|
||||
def sign_str(data: str, app_secret: str):
|
||||
"""
|
||||
sign a string of request parameters
|
||||
Args:
|
||||
data: string of request parameters, must be sorted by key before input.
|
||||
app_secret: a secret string coupled with app_key.
|
||||
|
||||
Returns:
|
||||
A hash string. len=32
|
||||
"""
|
||||
return md5(data + app_secret)
|
||||
|
||||
|
||||
def sign_dict(data: dict, app_secret: str):
|
||||
"""
|
||||
sign a dictionary of request parameters
|
||||
Args:
|
||||
data: dictionary of request parameters.
|
||||
app_secret: a secret string coupled with app_key.
|
||||
|
||||
Returns:
|
||||
A hash string. len=32
|
||||
"""
|
||||
data_str = []
|
||||
keys = list(data.keys())
|
||||
keys.sort()
|
||||
for key in keys:
|
||||
data_str.append("{}={}".format(key, data[key]))
|
||||
data_str = "&".join(data_str)
|
||||
data_str = data_str + app_secret
|
||||
return md5(data_str)
|
||||
|
||||
|
||||
def login_sign_dict_bin(data: dict):
|
||||
data_str = []
|
||||
keys = list(data.keys())
|
||||
keys.sort()
|
||||
for key in keys:
|
||||
data_str.append("{}={}".format(key, data[key]))
|
||||
data_str = "&".join(data_str)
|
||||
package_directory = os.path.dirname(os.path.abspath(__file__))
|
||||
if platform.system().lower() == 'windows':
|
||||
print(data_str)
|
||||
print(subprocess.Popen([os.path.join(package_directory, "sign.exe"), data_str], stdout=subprocess.PIPE).communicate()[0].decode().strip())
|
||||
|
||||
return subprocess.Popen([os.path.join(package_directory, "sign.exe"), data_str], stdout=subprocess.PIPE).communicate()[0].decode().strip()
|
||||
if platform.system().lower() == 'linux':
|
||||
return subprocess.Popen([os.path.join(package_directory, "sign.out"), data_str], stdout=subprocess.PIPE).communicate()[0].decode().strip()
|
||||
raise Exception("Operating System is not supported.")
|
||||
|
||||
|
||||
def encrypt_login_password(password, hash, pubkey):
|
||||
"""
|
||||
encrypt password for login api.
|
||||
Args:
|
||||
password: plain text of user password.
|
||||
hash: hash provided by /api/oauth2/getKey.
|
||||
pubkey: public key provided by /api/oauth2/getKey.
|
||||
|
||||
Returns:
|
||||
An encrypted cipher of password.
|
||||
"""
|
||||
return base64.b64encode(rsa.encrypt(
|
||||
(hash + password).encode('utf-8'),
|
||||
rsa.PublicKey.load_pkcs1_openssl_pem(pubkey.encode()),
|
||||
))
|
||||
|
||||
|
||||
def av2bv(av: int):
|
||||
table = 'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'
|
||||
tr = {}
|
||||
for i in range(58):
|
||||
tr[table[i]] = i
|
||||
s = [11, 10, 3, 8, 4, 6]
|
||||
xor = 177451812
|
||||
add = 8728348608
|
||||
|
||||
av = (av ^ xor) + add
|
||||
r = list('BV1 4 1 7 ')
|
||||
for i in range(6):
|
||||
r[s[i]] = table[av // 58 ** i % 58]
|
||||
return ''.join(r)
|
||||
|
||||
|
||||
def bv2av(bv: str):
|
||||
table = 'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'
|
||||
tr = {}
|
||||
for i in range(58):
|
||||
tr[table[i]] = i
|
||||
s = [11, 10, 3, 8, 4, 6]
|
||||
xor = 177451812
|
||||
add = 8728348608
|
||||
|
||||
r = 0
|
||||
for i in range(6):
|
||||
r += tr[bv[s[i]]] * 58 ** i
|
||||
return (r - add) ^ xor
|
18
workflow/bilibiliupload/util/retry.py
Normal file
18
workflow/bilibiliupload/util/retry.py
Normal file
@ -0,0 +1,18 @@
|
||||
|
||||
|
||||
class Retry:
|
||||
def __init__(self, max_retry, success_return_value):
|
||||
self.max_retry = max_retry
|
||||
self.success_return_value = success_return_value
|
||||
|
||||
def run(self, func, *args, **kwargs):
|
||||
status = False
|
||||
for i in range(0, self.max_retry):
|
||||
try:
|
||||
return_value = func(*args, **kwargs)
|
||||
except Exception:
|
||||
return_value = not self.success_return_value
|
||||
if return_value == self.success_return_value:
|
||||
status = True
|
||||
break
|
||||
return status
|
Reference in New Issue
Block a user