Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
xtekky
GitHub Repository: xtekky/tiktok-viewbot
Path: blob/main/v2/main.py
617 views
1
from re import findall
2
from io import BytesIO
3
from PIL import Image
4
from time import sleep, time
5
from base64 import b64decode
6
from random import choices
7
from string import ascii_letters, digits
8
from requests import Session, post
9
from colorama import Fore, init; init()
10
from datetime import datetime
11
from urllib.parse import unquote, quote
12
13
#from tls_client import Session
14
15
16
def fmt(string) -> str:
17
return f"{Fore.CYAN}{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} {Fore.BLUE}INFO {Fore.MAGENTA}__main__ -> {Fore.RESET}{string}"
18
19
def decode(text: str) -> str:
20
return b64decode(unquote(text[::-1])).decode()
21
22
def get_client() -> Session:
23
client = Session()
24
client.headers = {
25
'authority' : 'zefoy.com',
26
'origin' : 'https://zefoy.com',
27
'authority' : 'zefoy.com',
28
'cp-extension-installed': 'Yes',
29
'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
30
}
31
32
#client.cookies.set('window_size', '546x776')
33
#client.cookies.set('user_agent', f"{quote(client.headers['user-agent'])}")
34
35
return client
36
37
def solve_captcha(client: Session) -> None:
38
try:
39
html = str(client.get('https://zefoy.com').text).replace('&', '&')
40
print(html)
41
42
captcha_token = findall(r'<input type="hidden" name="(.*)">', html)[0]
43
captcha_url = findall(r'img src="([^"]*)"', html)[0]
44
captcha_token_v2 = findall(r'type="text" maxlength="50" name="(.*)" oninput="this.value', html)[0]
45
46
print(fmt(f'captcha_token: {captcha_token}'))
47
print(fmt(f'captcha_url: {captcha_url}'))
48
49
50
captcha_image = client.get('https://zefoy.com' + captcha_url).content;
51
image = Image.open(BytesIO(captcha_image));image.show()
52
53
captcha_answer = input('solve captcha: ')
54
55
response = post('https://zefoy.com', headers = {
56
'authority': 'zefoy.com',
57
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
58
'accept-language': 'en,fr-FR;q=0.9,fr;q=0.8,es-ES;q=0.7,es;q=0.6,en-US;q=0.5,am;q=0.4,de;q=0.3',
59
'cache-control': 'no-cache',
60
'content-type': 'application/x-www-form-urlencoded',
61
'cp-extension-installed': 'Yes',
62
'origin': 'null',
63
'pragma': 'no-cache',
64
'sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"',
65
'sec-ch-ua-mobile': '?0',
66
'sec-ch-ua-platform': '"macOS"',
67
'sec-fetch-dest': 'document',
68
'sec-fetch-mode': 'navigate',
69
'sec-fetch-site': 'same-origin',
70
'sec-fetch-user': '?1',
71
'upgrade-insecure-requests': '1',
72
'cookie': f'PHPSESSID={client.cookies.get("PHPSESSID")}',
73
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
74
},
75
data = {
76
captcha_token_v2: captcha_answer,
77
captcha_token : ""
78
})
79
80
#print(response.text)
81
82
key_1 = findall(r'remove-spaces" name="(.*)" placeholder', response.text)[0]
83
84
print(fmt(f'key_1: {key_1}'))
85
86
return key_1
87
88
except Exception as e:
89
print(fmt(f'Failed to solve captcha (zefoy may have blocked you) [{e}]'))
90
return
91
92
def send(client: Session, key: str, aweme_id: str) -> None:
93
94
token = ''.join(choices(ascii_letters + digits, k=16))
95
data = f'------WebKitFormBoundary{token}\r\nContent-Disposition: form-data; name="{key}"\r\n\r\n{aweme_id}\r\n------WebKitFormBoundary{token}--\r\n'
96
97
# data = {
98
# key: aweme_id
99
# }
100
101
cookies = client.cookies.get_dict() | {
102
'user_agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
103
'window_size': '788x841',
104
105
'_ga': 'GA1.1.1129024515.1681241946',
106
'__gads': 'ID=8310bfabde912e1c-22433ff457dc0089:T=1681241946:RT=1681241946:S=ALNI_MZ595crKlMda2mcv0z8CUqI6ZPixA',
107
'__gpi': 'UID=00000c0098073f57:T=1681241946:RT=1681241946:S=ALNI_MaFjF61WwqpZTpOZ-TUV20ipRozZQ',
108
'_ga_1WEXNS5FFP': 'GS1.1.1681241946.1.1.1681241951.0.0.0',
109
}
110
111
print(cookies)
112
113
#lient = Session(client_identifier='chrome110')
114
115
response = post('https://zefoy.com/c2VuZF9mb2xsb3dlcnNfdGlrdG9L', data = data, cookies = cookies,
116
headers = {
117
'authority': 'zefoy.com',
118
'accept': '*/*',
119
'accept-language': 'en,fr-FR;q=0.9,fr;q=0.8,es-ES;q=0.7,es;q=0.6,en-US;q=0.5,am;q=0.4,de;q=0.3',
120
'cache-control': 'no-cache',
121
'content-type': f'multipart/form-data; boundary=----WebKitFormBoundary{token}',
122
'origin': 'https://zefoy.com',
123
'pragma': 'no-cache',
124
'sec-ch-ua': '"Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"',
125
'sec-ch-ua-mobile': '?0',
126
'sec-ch-ua-platform': '"macOS"',
127
'sec-fetch-dest': 'empty',
128
'sec-fetch-mode': 'cors',
129
'sec-fetch-site': 'same-origin',
130
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36',
131
'x-requested-with': 'XMLHttpRequest'}).text
132
133
response = unquote(response[::-1]).encode()
134
response = b64decode(response).decode()
135
print(response)
136
137
if 'Session expired' in response:
138
raise Exception('session expired')
139
exit()
140
141
if 'views sent' in response:
142
print(fmt(f'views sent to {aweme_id}'))
143
144
else:
145
print(fmt(f'Failed to send views to {aweme_id}'))
146
147
def search_link(client: Session, key_1: str, tiktok_url: str) -> str:
148
#token = choices(ascii_letters + digits, k=16)
149
150
data = f'------WebKitFormBoundary\r\nContent-Disposition: form-data; name="{key_1}"\r\n\r\n{tiktok_url}\r\n------WebKitFormBoundary--\r\n'
151
152
# print(client.cookies)
153
# print(client.cookies.get("PHPSESSID"))
154
# print(key_1)
155
# print(tiktok_url)
156
157
response = decode(post('https://zefoy.com/c2VuZF9mb2xsb3dlcnNfdGlrdG9L', data = data,
158
headers = {
159
'authority': 'zefoy.com',
160
'accept': '*/*',
161
'accept-language': 'en,fr-FR;q=0.9,fr;q=0.8,es-ES;q=0.7,es;q=0.6,en-US;q=0.5,am;q=0.4,de;q=0.3',
162
'cache-control': 'no-cache',
163
'content-type': f'multipart/form-data; boundary=----WebKitFormBoundary',
164
'cookie': f'PHPSESSID={client.cookies.get("PHPSESSID")}',
165
'origin': 'https://zefoy.com',
166
'pragma': 'no-cache',
167
'sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"',
168
'sec-ch-ua-mobile': '?0',
169
'sec-ch-ua-platform': '"macOS"',
170
'sec-fetch-dest': 'empty',
171
'sec-fetch-mode': 'cors',
172
'sec-fetch-site': 'same-origin',
173
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
174
'x-requested-with': 'XMLHttpRequest',}).text.encode())
175
176
#print(response)
177
178
if "onsubmit=\"showHideElements('.w1r','.w2r')" in response:
179
print(response)
180
token, aweme_id = findall(r'name="(.*)" value="(.*)" hidden', response)[0]
181
print(fmt(f'sending to: {aweme_id} | key_2: {token}'))
182
183
sleep(3); send(client, token, aweme_id)
184
185
else:
186
timer = findall(r'ltm=(\d*);', response)[0]
187
if int(timer) == 0:
188
return
189
190
print(fmt(f'time to sleep: {timer} '), end="\r")
191
192
start = time()
193
while time() < start + int(timer):
194
195
print(fmt(f'time to sleep: {round((start + int(timer)) - time())} '), end="\r")
196
sleep(1)
197
198
print(fmt(f'sending views... '), end="\r")
199
200
tiktok_url = 'https://www.tiktok.com/@minniehouse16/video/7214847085642812714' #input('tiktok url: ')
201
client = get_client()
202
key_1 = solve_captcha(client)
203
204
if not key_1:
205
print(fmt('Failed to solve captcha (zefoy may have blocked you)'))
206
exit()
207
208
while True:
209
search_link(client, key_1, tiktok_url)
210
sleep(5)
211