mirror of
https://github.com/imgyh/tiktok.git
synced 2025-04-05 20:11:12 +08:00
202 lines
5.9 KiB
Python
202 lines
5.9 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
|
||
'''
|
||
@FileName : utils.py
|
||
@Project : apiproxy
|
||
@Description:
|
||
@Author : imgyh
|
||
@Mail : admin@imgyh.com
|
||
@Github : https://github.com/imgyh
|
||
@Site : https://www.imgyh.com
|
||
@Date : 2023/5/12 15:18
|
||
@Version : v1.0
|
||
@ChangeLog
|
||
------------------------------------------------
|
||
|
||
------------------------------------------------
|
||
'''
|
||
|
||
import random
|
||
import requests
|
||
import re
|
||
import os
|
||
import sys
|
||
import hashlib
|
||
import base64
|
||
import time
|
||
|
||
import apiproxy
|
||
|
||
|
||
class Utils(object):
|
||
def __init__(self):
|
||
pass
|
||
|
||
def replaceStr(self, filenamestr: str):
|
||
"""
|
||
替换非法字符,缩短字符长度,使其能成为文件名
|
||
"""
|
||
# 匹配 汉字 字母 数字 空格
|
||
match = "([0-9A-Za-z\u4e00-\u9fa5]+)"
|
||
|
||
result = re.findall(match, filenamestr)
|
||
|
||
result = "".join(result).strip()
|
||
if len(result) > 20:
|
||
result = result[:20]
|
||
# 去除前后空格
|
||
return result
|
||
|
||
def resource_path(self, relative_path):
|
||
if getattr(sys, 'frozen', False): # 是否Bundle Resource
|
||
base_path = sys._MEIPASS
|
||
else:
|
||
base_path = os.path.dirname(os.path.abspath(__file__))
|
||
return os.path.join(base_path, relative_path)
|
||
|
||
def str2bool(self, v):
|
||
if isinstance(v, bool):
|
||
return v
|
||
if v.lower() in ('yes', 'true', 't', 'y', '1'):
|
||
return True
|
||
elif v.lower() in ('no', 'false', 'f', 'n', '0'):
|
||
return False
|
||
else:
|
||
return True
|
||
|
||
def generate_random_str(self, randomlength=16):
|
||
"""
|
||
根据传入长度产生随机字符串
|
||
"""
|
||
random_str = ''
|
||
base_str = 'ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789='
|
||
length = len(base_str) - 1
|
||
for _ in range(randomlength):
|
||
random_str += base_str[random.randint(0, length)]
|
||
return random_str
|
||
|
||
# https://www.52pojie.cn/thread-1589242-1-1.html
|
||
def getttwid(self):
|
||
url = 'https://ttwid.bytedance.com/ttwid/union/register/'
|
||
data = '{"region":"cn","aid":1768,"needFid":false,"service":"www.ixigua.com","migrate_info":{"ticket":"","source":"node"},"cbUrlProtocol":"https","union":true}'
|
||
res = requests.post(url=url, data=data)
|
||
|
||
for i, j in res.cookies.items():
|
||
return j
|
||
|
||
def getXbogus(self, payload, form='', ua=apiproxy.ua):
|
||
xbogus = self.get_xbogus(payload, ua, form)
|
||
params = payload + "&X-Bogus=" + xbogus
|
||
return params
|
||
|
||
def get_xbogus(self, payload, ua, form):
|
||
short_str = "Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe="
|
||
arr2 = self.get_arr2(payload, ua, form)
|
||
|
||
garbled_string = self.get_garbled_string(arr2)
|
||
|
||
xbogus = ""
|
||
|
||
for i in range(0, 21, 3):
|
||
char_code_num0 = garbled_string[i]
|
||
char_code_num1 = garbled_string[i + 1]
|
||
char_code_num2 = garbled_string[i + 2]
|
||
base_num = char_code_num2 | char_code_num1 << 8 | char_code_num0 << 16
|
||
str1 = short_str[(base_num & 16515072) >> 18]
|
||
str2 = short_str[(base_num & 258048) >> 12]
|
||
str3 = short_str[(base_num & 4032) >> 6]
|
||
str4 = short_str[base_num & 63]
|
||
xbogus += str1 + str2 + str3 + str4
|
||
|
||
return xbogus
|
||
|
||
def get_garbled_string(self, arr2):
|
||
p = [
|
||
arr2[0], arr2[10], arr2[1], arr2[11], arr2[2], arr2[12], arr2[3], arr2[13], arr2[4], arr2[14],
|
||
arr2[5], arr2[15], arr2[6], arr2[16], arr2[7], arr2[17], arr2[8], arr2[18], arr2[9]
|
||
]
|
||
|
||
char_array = [chr(i) for i in p]
|
||
f = []
|
||
f.extend([2, 255])
|
||
tmp = ['ÿ']
|
||
bytes_ = self._0x30492c(tmp, "".join(char_array))
|
||
|
||
for i in range(len(bytes_)):
|
||
f.append(bytes_[i])
|
||
|
||
return f
|
||
|
||
def get_arr2(self, payload, ua, form):
|
||
salt_payload_bytes = hashlib.md5(hashlib.md5(payload.encode()).digest()).digest()
|
||
salt_payload = [byte for byte in salt_payload_bytes]
|
||
|
||
salt_form_bytes = hashlib.md5(hashlib.md5(form.encode()).digest()).digest()
|
||
salt_form = [byte for byte in salt_form_bytes]
|
||
|
||
ua_key = ['\u0000', '\u0001', '\u000e']
|
||
salt_ua_bytes = hashlib.md5(base64.b64encode(self._0x30492c(ua_key, ua))).digest()
|
||
salt_ua = [byte for byte in salt_ua_bytes]
|
||
|
||
timestamp = int(time.time())
|
||
canvas = 1489154074
|
||
|
||
arr1 = [
|
||
64, # 固定
|
||
0, # 固定
|
||
1, # 固定
|
||
14, # 固定 这个还要再看一下,14,12,0都出现过
|
||
salt_payload[14], # payload 相关
|
||
salt_payload[15],
|
||
salt_form[14], # form 相关
|
||
salt_form[15],
|
||
salt_ua[14], # ua 相关
|
||
salt_ua[15],
|
||
(timestamp >> 24) & 255,
|
||
(timestamp >> 16) & 255,
|
||
(timestamp >> 8) & 255,
|
||
(timestamp >> 0) & 255,
|
||
(canvas >> 24) & 255,
|
||
(canvas >> 16) & 255,
|
||
(canvas >> 8) & 255,
|
||
(canvas >> 0) & 255,
|
||
64, # 校验位
|
||
]
|
||
|
||
for i in range(1, len(arr1) - 1):
|
||
arr1[18] ^= arr1[i]
|
||
|
||
arr2 = [arr1[0], arr1[2], arr1[4], arr1[6], arr1[8], arr1[10], arr1[12], arr1[14], arr1[16], arr1[18], arr1[1],
|
||
arr1[3], arr1[5], arr1[7], arr1[9], arr1[11], arr1[13], arr1[15], arr1[17]]
|
||
|
||
return arr2
|
||
|
||
def _0x30492c(self, a, b):
|
||
d = [i for i in range(256)]
|
||
c = 0
|
||
result = bytearray(len(b))
|
||
|
||
for i in range(256):
|
||
c = (c + d[i] + ord(a[i % len(a)])) % 256
|
||
e = d[i]
|
||
d[i] = d[c]
|
||
d[c] = e
|
||
|
||
t = 0
|
||
c = 0
|
||
|
||
for i in range(len(b)):
|
||
t = (t + 1) % 256
|
||
c = (c + d[t]) % 256
|
||
e = d[t]
|
||
d[t] = d[c]
|
||
d[c] = e
|
||
result[i] = ord(b[i]) ^ d[(d[t] + d[c]) % 256]
|
||
|
||
return result
|
||
|
||
|
||
if __name__ == "__main__":
|
||
pass
|