autotok 2.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- autotok-2.0.0/.gitignore +160 -0
- autotok-2.0.0/CHANGELOG.md +67 -0
- autotok-2.0.0/LICENSE +661 -0
- autotok-2.0.0/PKG-INFO +601 -0
- autotok-2.0.0/README.md +555 -0
- autotok-2.0.0/THIRD_PARTY_NOTICES.md +18 -0
- autotok-2.0.0/autotok/__init__.py +63 -0
- autotok-2.0.0/autotok/__main__.py +7 -0
- autotok-2.0.0/autotok/accounts.py +233 -0
- autotok-2.0.0/autotok/auth.py +175 -0
- autotok-2.0.0/autotok/browsers/__init__.py +90 -0
- autotok-2.0.0/autotok/browsers/base.py +112 -0
- autotok-2.0.0/autotok/browsers/browserbase.py +131 -0
- autotok-2.0.0/autotok/browsers/http.py +40 -0
- autotok-2.0.0/autotok/browsers/local.py +75 -0
- autotok-2.0.0/autotok/browsers/steel.py +136 -0
- autotok-2.0.0/autotok/captions.py +93 -0
- autotok-2.0.0/autotok/cli.py +368 -0
- autotok-2.0.0/autotok/env.py +76 -0
- autotok-2.0.0/autotok/errors.py +84 -0
- autotok-2.0.0/autotok/proxy.py +188 -0
- autotok-2.0.0/autotok/py.typed +0 -0
- autotok-2.0.0/autotok/settings.py +80 -0
- autotok-2.0.0/autotok/signer.py +153 -0
- autotok-2.0.0/autotok/signer_js/signer.js +1 -0
- autotok-2.0.0/autotok/signer_js/webmssdk.js +7 -0
- autotok-2.0.0/autotok/signer_js/xbogus.js +562 -0
- autotok-2.0.0/autotok/uploader.py +447 -0
- autotok-2.0.0/autotok/youtube.py +62 -0
- autotok-2.0.0/pyproject.toml +80 -0
autotok-2.0.0/.gitignore
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
pip-wheel-metadata/
|
|
24
|
+
share/python-wheels/
|
|
25
|
+
*.egg-info/
|
|
26
|
+
.installed.cfg
|
|
27
|
+
*.egg
|
|
28
|
+
MANIFEST
|
|
29
|
+
|
|
30
|
+
# PyInstaller
|
|
31
|
+
# Usually these files are written by a python script from a template
|
|
32
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
33
|
+
*.manifest
|
|
34
|
+
*.spec
|
|
35
|
+
|
|
36
|
+
# Installer logs
|
|
37
|
+
pip-log.txt
|
|
38
|
+
pip-delete-this-directory.txt
|
|
39
|
+
|
|
40
|
+
# Unit test / coverage reports
|
|
41
|
+
htmlcov/
|
|
42
|
+
.tox/
|
|
43
|
+
.nox/
|
|
44
|
+
.coverage
|
|
45
|
+
.coverage.*
|
|
46
|
+
.cache
|
|
47
|
+
nosetests.xml
|
|
48
|
+
coverage.xml
|
|
49
|
+
*.cover
|
|
50
|
+
*.py,cover
|
|
51
|
+
.hypothesis/
|
|
52
|
+
.pytest_cache/
|
|
53
|
+
|
|
54
|
+
# Translations
|
|
55
|
+
*.mo
|
|
56
|
+
*.pot
|
|
57
|
+
|
|
58
|
+
# Django stuff:
|
|
59
|
+
*.log
|
|
60
|
+
local_settings.py
|
|
61
|
+
db.sqlite3
|
|
62
|
+
db.sqlite3-journal
|
|
63
|
+
|
|
64
|
+
# Flask stuff:
|
|
65
|
+
instance/
|
|
66
|
+
.webassets-cache
|
|
67
|
+
|
|
68
|
+
# Scrapy stuff:
|
|
69
|
+
.scrapy
|
|
70
|
+
|
|
71
|
+
# Sphinx documentation
|
|
72
|
+
docs/_build/
|
|
73
|
+
|
|
74
|
+
# PyBuilder
|
|
75
|
+
target/
|
|
76
|
+
|
|
77
|
+
# Jupyter Notebook
|
|
78
|
+
.ipynb_checkpoints
|
|
79
|
+
|
|
80
|
+
# IPython
|
|
81
|
+
profile_default/
|
|
82
|
+
ipython_config.py
|
|
83
|
+
|
|
84
|
+
# pyenv
|
|
85
|
+
.python-version
|
|
86
|
+
|
|
87
|
+
# pipenv
|
|
88
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
89
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
90
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
91
|
+
# install all needed dependencies.
|
|
92
|
+
#Pipfile.lock
|
|
93
|
+
|
|
94
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
|
|
95
|
+
__pypackages__/
|
|
96
|
+
|
|
97
|
+
# Celery stuff
|
|
98
|
+
celerybeat-schedule
|
|
99
|
+
celerybeat.pid
|
|
100
|
+
|
|
101
|
+
# SageMath parsed files
|
|
102
|
+
*.sage.py
|
|
103
|
+
|
|
104
|
+
# Environments
|
|
105
|
+
tests/.env
|
|
106
|
+
.venv
|
|
107
|
+
# env/
|
|
108
|
+
venv/
|
|
109
|
+
ENV/
|
|
110
|
+
env.bak/
|
|
111
|
+
venv.bak/
|
|
112
|
+
|
|
113
|
+
# Spyder project settings
|
|
114
|
+
.spyderproject
|
|
115
|
+
.spyproject
|
|
116
|
+
|
|
117
|
+
# Rope project settings
|
|
118
|
+
.ropeproject
|
|
119
|
+
|
|
120
|
+
# mkdocs documentation
|
|
121
|
+
/site
|
|
122
|
+
|
|
123
|
+
# mypy
|
|
124
|
+
.mypy_cache/
|
|
125
|
+
.dmypy.json
|
|
126
|
+
dmypy.json
|
|
127
|
+
|
|
128
|
+
# Pyre type checker
|
|
129
|
+
.pyre/
|
|
130
|
+
|
|
131
|
+
# Personal Development Files (legacy 1.x data folders)
|
|
132
|
+
CookiesDir/
|
|
133
|
+
VideosDirPath/
|
|
134
|
+
*.cookie
|
|
135
|
+
output/
|
|
136
|
+
*.mp4
|
|
137
|
+
youtube_downloader.py
|
|
138
|
+
|
|
139
|
+
# Local SQLite database (api/scheduler) — contains usernames, login session
|
|
140
|
+
# history, and cookie paths. Never commit.
|
|
141
|
+
data/
|
|
142
|
+
*.db
|
|
143
|
+
*.db-shm
|
|
144
|
+
*.db-wal
|
|
145
|
+
*.sqlite
|
|
146
|
+
*.sqlite3
|
|
147
|
+
|
|
148
|
+
# Environment
|
|
149
|
+
.env
|
|
150
|
+
|
|
151
|
+
# Node
|
|
152
|
+
node_modules/
|
|
153
|
+
*.tsbuildinfo
|
|
154
|
+
|
|
155
|
+
# IDE
|
|
156
|
+
.idea/
|
|
157
|
+
.vscode/
|
|
158
|
+
|
|
159
|
+
# Local autotok data (sessions are account credentials)
|
|
160
|
+
.autotok/
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 2.0.0
|
|
4
|
+
|
|
5
|
+
First release on PyPI as **autotok** (`pip install autotok`).
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- Installable package with an `autotok` command and a Python API (`autotok.Client`,
|
|
9
|
+
`autotok.upload_video`, `autotok.login`, typed exceptions). `python cli.py` still works.
|
|
10
|
+
- Proxy support everywhere an account talks to TikTok: the login browser, signature generation and
|
|
11
|
+
every upload request. Proxies are saved per account (`autotok proxy set|clear|test`,
|
|
12
|
+
`autotok login -p`), accept the common provider formats (including `host:port:user:pass`) and
|
|
13
|
+
SOCKS5, and are always shown with the password masked. The account proxy is pinned on every
|
|
14
|
+
request, so `HTTP(S)_PROXY` environment variables can't redirect an account through another IP,
|
|
15
|
+
and the signing browser can't make direct connections.
|
|
16
|
+
- Cloud browsers: `AUTOTOK_BROWSER=browserbase` or `steel` (Steel Cloud or a self-hosted
|
|
17
|
+
steel-browser) runs the login and signing browser remotely instead of on your machine. Login
|
|
18
|
+
happens through a live-view link; the account's proxy is applied to the cloud session. Providers
|
|
19
|
+
plug into a small factory (`autotok.browsers.register_provider`).
|
|
20
|
+
- Settings can live in a `.env` file (`.env.example` is the template). The CLI reads `./.env`, then
|
|
21
|
+
`~/.autotok/.env`, without overriding real environment variables; `autotok.load_env()` does the
|
|
22
|
+
same from Python.
|
|
23
|
+
- `Dockerfile` for the CLI (with or without a local Chromium) and a CI job that builds it and the
|
|
24
|
+
web app's compose stack.
|
|
25
|
+
- `autotok accounts list|check|remove`, `autotok browser check`, `autotok install-browser`,
|
|
26
|
+
`autotok shell`, `--browser`, and `python -m autotok`.
|
|
27
|
+
- Sessions can be imported from a browser cookie (`autotok login --sessionid`).
|
|
28
|
+
- Web app: per-account proxy editing and testing, session check, video library (add, delete,
|
|
29
|
+
schedule by name), immediate upload from the library, proxy field on browser login.
|
|
30
|
+
- Test suite and CI (Python 3.10–3.13, package build, web app build) and a PyPI publishing
|
|
31
|
+
workflow using trusted publishing.
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
- Request signing runs in Python Playwright; Node.js is no longer needed.
|
|
35
|
+
- Login uses Playwright Chromium (honours the account's proxy); undetected-chromedriver and Selenium
|
|
36
|
+
are no longer dependencies.
|
|
37
|
+
- Sessions are stored as JSON in `~/.autotok/accounts` (owner-only permissions). 1.x pickle files in
|
|
38
|
+
`CookiesDir/` are migrated automatically with a safe loader.
|
|
39
|
+
- Uploads reuse the user agent of the browser that logged in, instead of a random one per upload.
|
|
40
|
+
- `-sc/--schedule` schedules on TikTok's side again (15 minutes to 10 days).
|
|
41
|
+
- Licence: AGPL-3.0 with a commercial option (see README).
|
|
42
|
+
|
|
43
|
+
### Fixed
|
|
44
|
+
- Privacy, comment, duet and stitch settings were ignored: every post went out public with
|
|
45
|
+
everything allowed.
|
|
46
|
+
- Hashtags weren't clickable (the caption markup was not sent), and emoji shifted hashtag offsets.
|
|
47
|
+
- Successful uploads were reported as failures by the API and scheduler, which then retried them,
|
|
48
|
+
so a scheduled post could go out up to three times. The scheduler now only retries failures that
|
|
49
|
+
happened before publishing, and never retries a job that was interrupted mid-upload.
|
|
50
|
+
- YouTube downloads always reused the same file name, so a second link re-posted the first video.
|
|
51
|
+
- A missing session made the library call `sys.exit`, killing the API or scheduler.
|
|
52
|
+
- Uploads could hang forever if signing failed; failures are now reported as errors.
|
|
53
|
+
- Web app: uploads over 1 MB were rejected by nginx; uploads blocked the API while running; login
|
|
54
|
+
failures and timeouts were never shown; ticking an option checkbox could stop the form from
|
|
55
|
+
submitting; `docker compose up --build` failed on a clean machine because the shared base image
|
|
56
|
+
was not built first.
|
|
57
|
+
- Login callbacks from the virtual browser are now signed, so other local processes can't inject a
|
|
58
|
+
session.
|
|
59
|
+
|
|
60
|
+
### Security
|
|
61
|
+
- The web app's API no longer allows cross-origin requests, and `POST`/`PATCH`/`DELETE` requests
|
|
62
|
+
must send `X-Requested-With: autotok`, so other web pages can't drive the local API.
|
|
63
|
+
- Proxy passwords are never returned by the API or shown in logs and `repr()`.
|
|
64
|
+
|
|
65
|
+
### Removed
|
|
66
|
+
- `config.txt`, `setup.py` and the unused ImageMagick video-editing helpers.
|
|
67
|
+
- The `cli.py schedule list|cancel` commands (use the web app's Schedules page).
|