Ephoto360
Python client for Ephoto360.com — scrapes and generates text/logo effect images. No API key needed.
I hope a STAR ⭐ from you 😊.
Installation
pip install Ephoto360 -U
Setup
Simple setup:
from Ephoto360 import Ephoto360
client = Ephoto360()
Use it as a context manager if you want the session cleaned up automatically:
with Ephoto360() as client:
...
Generating an image
result = client.create(
slug="/create-a-blackpink-style-logo-with-members-signatures-810.html",
texts=["My Band"],
)
if result.ok:
print(result.url) # image URL
result.save("output.jpg") # download
else:
print(result.error)
Picking a style
Every effect has a radio0[radio] group (and sometimes radio1[radio] too and one has radio2[radio] too.). Pass a styles dict to pin specific ones:
result = client.create(
slug="/create-a-blackpink-style-logo-with-members-signatures-810.html",
texts=["My Band"],
styles={"radio0[radio]": "Jennie"},
)
For effects with two radio groups & When an effect requires 3 texts ( as ["a", "b", "c"] ) but only one is given, so two other "?" will be appended to the texts list:
result = client.create(
slug="/free-retro-neon-text-effect-online-538.html",
texts=["RETRO"],
styles={
"radio0[radio]": "Bg 3",
"radio1[radio]": "Style 2",
},
)
Leave styles out and the first available option is used. Pass random_style=True if you want a random pick instead:
result = client.create(slug, ["Hello"], random_style=True)
Browsing the catalogue
# all effects, alphabetically
for effect in client.list_effects():
print(effect.slug)
print(effect.name)
print(effect.text_count, "text field(s)")
print(effect.radio_keys) # e.g. ['radio0[radio]', 'radio1[radio]']
# search by name or slug
results = client.search("neon")
results = client.search("blackpink")
# grab one directly — full slug or just the numeric tail works
info = client.get_effect("/create-a-blackpink-style-logo-with-members-signatures-810.html")
info = client.get_effect("810") # same thing
# random effect
effect = client.random_effect(require_radio=True)
Inspecting an effect
info = client.get_effect("810")
print(info.name) # "Create A Blackpink Style Logo With Members Signatures"
print(info.text_labels) # ['Your text*']
print(info.style_labels) # ['Jennie', 'Jisoo', 'Lisa', 'Rose']
# all options for a specific radio group
for style in info.options_for("radio0[radio]"):
print(style.label, style.thumb)
# lookup by label (case-insensitive)
style = info.option_by_label("radio0[radio]", "lisa")
# lookup by position
style = info.option_by_index("radio0[radio]", 2) # third option
Generating all styles
Iterates every radio0 option and returns one result per style. Good for previewing what an effect looks like across all variants.
results = client.create_all_styles(
slug="/create-a-blackpink-style-logo-with-members-signatures-810.html",
texts=["My Band"],
)
for r in results:
if r.ok:
r.save(f"{r.style}.jpg")
Some effects have a lot of options (the LoL one has 322) LOL. Use limit to avoid firing hundreds of requests:
results = client.create_all_styles(slug, ["My Band"], limit=10)
If the effect also has radio1, pin it while iterating radio0:
results = client.create_all_styles(
slug="/free-retro-neon-text-effect-online-538.html",
texts=["RETRO"],
radio1_label="Style 2",
limit=6,
)
Batch
results = client.batch_create([
{
"slug": "/create-a-blackpink-style-logo-with-members-signatures-810.html",
"texts": ["Alice"],
"styles": {"radio0[radio]": "Jennie"},
},
{
"slug": "/free-retro-neon-text-effect-online-538.html",
"texts": ["RETRO"],
"random_style": True,
},
])
Runs sequentially. No concurrency — the site rate-limits aggressively enough that threading causes more problems than it solves.
CreationResult fields
| Field | Type | Notes |
|---|---|---|
ok |
bool |
False means something went wrong |
url |
str |
Remote image URL (only when ok is True) |
styles |
dict[str,str] |
Maps radio key → label that was applied |
style |
str |
Shorthand for styles["radio0[radio]"] |
slug |
str |
Effect slug used |
error |
str |
Populated only when ok is False |
Retry and timeout settings
client = Ephoto360(
retry_count=5, # attempts before giving up (default 3)
retry_delay=2.0, # seconds between retries (default 1.5)
timeout=60.0, # per-request timeout in seconds (default 30)
)
Metadata
Release files for Ephoto360 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ephoto360-0.1.1.tar.gz | 288.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ephoto360-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 594.2 kB
Release files / ephoto360-0.1.1.tar.gz
| Download URL | ephoto360-0.1.1.tar.gz |
|---|---|
| Size | 288.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dafc2eecd49c8ef037a4c3dc0de5738ab840f1dbb4888e9d252fbf77c3f917f6
|
|
BLAKE2b-256 checksum How to use checksums |
0ff06473f3ed0558ef97a6d042030cd6cb44651ae9c2e131b83acaaeeacae7e4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.1
|
Release files / ephoto360-0.1.1-py3-none-any.whl
| Download URL | ephoto360-0.1.1-py3-none-any.whl |
|---|---|
| Size | 305.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1ff515914907cebff5755d13931f0b6f5041addf39a464700bd0d604ac17a7df
|
|
BLAKE2b-256 checksum How to use checksums |
1de0a1b1b87766eaa53719331846154df3e5a5d7dbf2ae95130c83ec2e4261d1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.1
|