TikTokOpen / Main.py
pane2k's picture
Upload folder using huggingface_hub
7e4b742 verified
import asyncio
import websockets
import time
import json
import threading
import requests
import datetime
import traceback
from playwright.async_api import async_playwright
from TikTok.Server.main import getInfo
from TikTok.Server.SaveTotalView import saveTotalViewAndVideos, getTotalDict
from TikTok.Cookies.cookie import get_tiktok_cookies_from_file
import os
import random
import math
# Replace with your actual function to get TikTok data
def get_tiktok_data(hashtag="костиккакто", userlistLink="Data/TXT/Cacto0o.txt") -> dict:
try:
return getInfo(hashtag, userlistLink)
except requests.exceptions.RequestException as e:
print(f"Error fetching TikTok data: {e}")
return None
except Exception as e:
print(f"An unexpected error occurred: {e}")
return None
# Global variables (better to use a class)
startTime = 1734648586
donateAddTime = 35497352
endTime = startTime + donateAddTime
data_dict = None
global lastReloadTime
global doUpdating
lastReloadTime = time.time()
def save_data(data):
if not os.path.exists("Data/JSON/"):
os.makedirs("Data/JSON/")
if type(data) == str:
json_acceptable_string = data.replace("'", "\"")
data = json.loads(json_acceptable_string)
with open("Data/JSON/data.json", "r") as f:
data_dict = json.loads(f.read())
for user_data in data["userStats"]:
if user_data == 0:
continue
for new_user_data in data_dict["userStats"]:
if new_user_data == 0:
continue
if (user_data["username"] == new_user_data["username"]):
user_data["total_views"] = new_user_data["total_views"]
user_data["total_videos_with_tag"] = new_user_data["total_videos_with_tag"]
print(f"Updated user: {user_data['username']}")
break
else:
data_dict.get("userStats").append(user_data)
print(f"newUser {user_data['username']}")
with open("Data/JSON/dataNew.json", "w") as f:
f.write(json.dumps(data_dict))
def open_dataDict() -> dict:
with open("Data/JSON/TotalView.json", "r") as f:
data = f.read()
return json.loads(data)
async def send_data_to_websocket(websocket):
global data_dict
global lastReloadTime
while True:
data_dict = open_dataDict()
if data_dict is not None:
data_dict_a: dict = data_dict
tiktokTime = startTime + data_dict_a.get('total_total_views', 0)
time_left = int(tiktokTime - time.time())
timeToRestart = (lastReloadTime + 300) - time.time()
transferData = json.dumps({"type": "transfer", "data": {
"time": time_left, "timerToRestart": timeToRestart}})
try:
await websocket.send(transferData)
except websockets.exceptions.ConnectionClosedError:
print("Websocket connection closed. Exiting send thread.")
break
await asyncio.sleep(1)
def fetch_tiktok_data_periodically_main(hashtag="костиккакто"):
asyncio.run(fetch_tiktok_data_periodically(hashtag))
# 5 minutes
async def fetch_tiktok_data_periodically(hashtag="костиккакто", interval=300):
global data_dict
global lastReloadTime
global doUpdating
isFirst = True
while True:
# print("Starting fetch_tiktok_data_periodically")
# if isFirst:
# isFirst = False
# data = getTotalDict()
# print(data)
# else:
doUpdating = True
data: dict = await get_tiktok_data(hashtag, userlistLink="Data/TXT/Cacto0o.txt")
saveTotalViewAndVideos(hashtag)
data_dict = open_dataDict()
print(data_dict)
# if data.get('total_total_views', 0) > 0:
# save_data(data)
doUpdating = False
lastReloadTime = time.time()
time.sleep(interval)
def update_data_periodically():
global data_dict
print("Starting update_data_periodically")
hashtag = "костиккакто"
while True:
#
saveTotalViewAndVideos(hashtag)
data = open_dataDict()
if data.get('total_views', 0) > 0:
data_dict = open_dataDict()
time.sleep(1)
async def handler(websocket):
global data_dict
global doUpdating
while True:
try:
data_dict = open_dataDict()
# Slight delay to avoid immediate re-execution
if data_dict is not None:
tiktokTime = startTime + \
math.floor(data_dict.get('total_views', 0) / 30000 * 3600)
time_left = int(tiktokTime - time.time())
timeToRestart = int((lastReloadTime + 300) - time.time())
transferData = json.dumps({"type": "transfer", "data": {"time": time_left,
"timerToRestart": timeToRestart,
"isUpdating": doUpdating
}})
await websocket.send(transferData)
await asyncio.sleep(1)
except websockets.exceptions.ConnectionClosedError:
print("Websocket connection closed.")
break
except Exception as e:
print(f"Error in handler: {e}")
break
def msTokenFromTiktok():
asyncio.run(msTokenFromTiktokMain())
async def msTokenFromTiktokMain():
playwright = await async_playwright().start()
browser = await playwright.chromium.launch(
headless=False,
executable_path="C:/Program Files/Google/Chrome/Application/chrome.exe"
)
page = await browser.new_page()
await page.goto("https://www.tiktok.com/")
try:
await asyncio.sleep(2)
await page.goto("https://www.tiktok.com/")
while True:
await asyncio.sleep(random.uniform(0, 2))
random_number = random.randint(1, 1000)
if random_number % 2 == 0:
await page.keyboard.press("L")
await page.keyboard.press("ArrowDown")
await asyncio.sleep(random.uniform(0, 2))
cookies = await page.context.cookies()
# Save cookies to a file
with open("Data/JSON/cookies.json", "w") as f:
json.dump(cookies, f)
print(get_tiktok_cookies_from_file("Data/JSON/cookies.json"))
await asyncio.sleep(10)
except Exception as e:
print(f"An error occurred: {e}")
await browser.close()
async def main():
async with websockets.serve(handler, "localhost", 8001):
print("Server started on ws://localhost:8001")
# Start separate thread for fetching data
threadTikTokInfo = threading.Thread(
target=fetch_tiktok_data_periodically_main)
threadTikTokInfo.daemon = True # Allow the main thread to exit
threadTikTokInfo.start()
# threadGettingMsToken = threading.Thread(target=msTokenFromTiktok)
# threadGettingMsToken.daemon = True # Allow the main thread to exit
# threadGettingMsToken.start()
threadUpdate = threading.Thread(target=update_data_periodically)
threadUpdate.daemon = True # Allow the main thread to exit
threadUpdate.start()
await asyncio.Future() # Keep the event loop running
if __name__ == "__main__":
asyncio.run(main())