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')

        profile = await client.users.get_by_username('forgivenforget')
        print(client.users.extract_username(profile.text))
        print(client.users.extract_credits(profile.text))


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; extract 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

Send a PM

Most authenticated POSTs need a my_post_key. Pull it off whatever page you're already loading — here, the compose page:

compose = await client.messages.get_compose_page()

await client.messages.send(
    to = 'recipient',
    message = 'hello',
    my_post_key = client.messages.extract_my_post_key(compose.text),
)

Read the feed

explore = await client.feed.get_explore()

for link in client.feed.extract_thread_links(explore.text)[:5]:
    thread = await client.threads.get_by_link(link)
    print(thread.text[:200])

extract_thread_links returns paths for both numeric (/showthread.php?tid=1234) and slug-rewritten (/Thread-Some-Slug) thread URLs. If you specifically need numeric thread IDs, use extract_thread_ids — it skips slug-only links.

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.2.0.tar.gz (13.4 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.2.0-py3-none-any.whl (21.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: ogu_api-0.2.0.tar.gz
  • Upload date:
  • Size: 13.4 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.2.0.tar.gz
Algorithm Hash digest
SHA256 87933a28d65ba4cf667f867a22711a43dabc41fb3ce7cb6154868000b12452d5
MD5 d45b373dd6e3f8f98e714e04987c98b1
BLAKE2b-256 89ec3644ed0094e595bceff04606d21d8bc4a6a4402c6b1e6e43b99bb247f481

See more details on using hashes here.

Provenance

The following attestation bundles were made for ogu_api-0.2.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.2.0-py3-none-any.whl.

File metadata

  • Download URL: ogu_api-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 21.7 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.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e210152d18b15a5cce93e8e0df3b4e7dfce9fb8a276c9b37a5288fb2435ab05e
MD5 dfea0a6af419ee45d4c66c6004ab6c1a
BLAKE2b-256 1ae8d6642b4614fb06af41084735b69e5d6466414f7cf609075aa639fa3b0c87

See more details on using hashes here.

Provenance

The following attestation bundles were made for ogu_api-0.2.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