Skip to main content

Async Python wrapper for the OGUsers (oguser.com) forum.

Project description

ogu-api

An async Python wrapper for the OGUsers forum.

Wraps the public-facing pages and forms; login, profile lookup, reputation, credits, private messages, feed, threads, notifications, member search, account control panel, with a typed, async-first client.

Install

pip install ogu-api

Requires Python 3.11+.

Quick start

import asyncio

from ogu_api import OGUClient


async def main() -> None:
    async with OGUClient() as client:
        await login(client, 'username', 'password')

        user = await client.users.get_by_username('forgivenforget')
        print(user.username, user.credits, user.reputation, user.vouches)


async def login(client: OGUClient, username: str, password: str, two_factor: str = '') -> None:
    page = await client.session.get_login_page()
    hidden = client.session.extract_login_hidden(page.text)

    await client.session.login(username, password, two_factor, **hidden)


asyncio.run(main())

Resources

Resource What it covers
client.session login page, login, logout
client.users profile lookup by username or uid; returns UserProfile (id, username, reputation, vouches, credits)
client.usercp notepad, signature, options, profile, change username/password/email
client.reputation reputation page, send reputation
client.credits donate page, stats page, send credits, parse recently-sent transactions
client.messages PM inbox, conversation, compose, send, tracking, delete
client.notifications notifications page, alerts, mark alerts read
client.feed explore feed, home feed, thread-id extraction
client.threads view thread, view forum, reply, create thread
client.search full-text search form + post
client.members member list, top, statistics, team, groups, vouches, awards, reputation history

Inbox & PMs

inbox = await client.messages.inbox()

for m in inbox.messages:
    print(m.username, m.message)

await client.messages.send(
    to = 'recipient',
    message = 'hello',
    my_post_key = inbox.my_post_key,
)

Inbox is a dataclass with messages: tuple[Message, ...], conversation_ids: tuple[str, ...], and my_post_key. Most authenticated POSTs across the SDK need a my_post_keyinbox.my_post_key (or extract_my_post_key() from any logged-in page) gives you one.

Read the feed

for thread in await client.feed.explore():
    print(thread.title, thread.link, thread.tid)

for thread in await client.feed.home():
    print(thread.title, thread.tid)

feed.explore() and feed.home() return list[ThreadSummary] with title, link, and tid (numeric, or None for slug-rewritten URLs that don't carry one). For raw HTML access, use get_explore() / get_home().

Reply to a thread

reply_page = await client.threads.get_reply_page(tid)
hidden = client.threads.extract_reply_hidden(reply_page.text)

await client.threads.reply(
    tid,
    message = 'great post',
    my_post_key = hidden['my_post_key'],
    post_hash = hidden.get('posthash', ''),
)

Persist a session

ogu-api doesn't store credentials. After login, the session lives on the client's cookie jar — serialize it however you like:

cookies = {cookie.name: cookie.value for cookie in client.cookies}

To resume a session, pre-seed the cookies on a fresh client:

client = OGUClient()

for name, value in cookies.items():
    client.cookies.set(name, value)

Configuration

client = OGUClient(
    proxy = 'user:pass@host:8080',
    timeout_seconds = 30.0,
    max_retries = 3,
    retry_backoff_seconds = 0.5,
    client_identifier = 'chrome131',
)

Proxy strings accept user:pass@host:port, host:port:user:pass, or plain host:port and are normalized to http://... for the underlying tls_client session.

Errors

from ogu_api import OGUNotFoundError, OGURateLimitError

try:
    await client.users.get_by_username('does-not-exist')

except OGUNotFoundError as E:
    print('not found:', E.url)

except OGURateLimitError as E:
    print('rate limited, retry after', E.retry_after_seconds)

Full hierarchy:

  • OGUError
    • OGUAPIErrorOGUAuthenticationError, OGUAuthorizationError, OGUNotFoundError, OGUValidationError, OGURateLimitError, OGUServerError
    • OGUNetworkErrorOGUTimeoutError
    • OGUParseError, OGUSessionError, OGULoginError, OGUReputationError, OGUCreditsError

Captcha

Sending credits requires an hCaptcha token. ogu-api doesn't ship a solver — pass a pre-solved token in:

page = await client.credits.get_donate_page()

await client.credits.send(
    username = 'recipient',
    amount = 100,
    captcha_token = solved_token,
    **client.credits.extract_hidden(page.text),
)

Features

  • Async-first — every request is async, backed by tls_client on a worker thread for Cloudflare-friendly TLS fingerprints
  • Typedfrom __future__ import annotations everywhere, py.typed marker, dataclass models for parsed payloads
  • Resource-oriented — calls grouped under client.session, client.users, client.messages, etc.
  • Typed errors — full exception hierarchy mapped from HTTP status codes
  • Retries — exponential backoff on 429 and 5xx, honors Retry-After
  • Proxies — string-form proxies auto-normalized

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ogu_api-0.4.0.tar.gz (14.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ogu_api-0.4.0-py3-none-any.whl (22.6 kB view details)

Uploaded Python 3

File details

Details for the file ogu_api-0.4.0.tar.gz.

File metadata

  • Download URL: ogu_api-0.4.0.tar.gz
  • Upload date:
  • Size: 14.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ogu_api-0.4.0.tar.gz
Algorithm Hash digest
SHA256 cbc13dbcee7031ea961b239af50cd1d1c2167efc97e265f2e8230fba567dc0da
MD5 d080b14865b388f996316db521949b75
BLAKE2b-256 8f80c179bb8cbb3cde8e3686750e8478edd3e1ce73f7109ed05d2a5036ae5ab7

See more details on using hashes here.

Provenance

The following attestation bundles were made for ogu_api-0.4.0.tar.gz:

Publisher: publish.yml on forgivenforget/ogu-api

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ogu_api-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: ogu_api-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 22.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ogu_api-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 50cbbd09b500572a3830180736b533dd96a3992b34fd44214a5184a250689043
MD5 81eabdd9eb6a1a309a1e9a7a38dc136a
BLAKE2b-256 852935895981cf6eaad59cb212f342c0249f9f8342ab514e6c6e99927f96b2d1

See more details on using hashes here.

Provenance

The following attestation bundles were made for ogu_api-0.4.0-py3-none-any.whl:

Publisher: publish.yml on forgivenforget/ogu-api

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page