Skip to main content

Golike gateway auth client (JWT + g-device-id; optional legacy g-auth)

Project description

golike-gauth

PyPI Python License: MIT

Client auth cho Golike gateway API — JWT + g-device-id / t (API 2026), tương thích legacy g-auth khi cần.

Repo: https://github.com/deno4908/golike-gauth
Version: 0.1.6

Changelog

0.1.6 (Golike API mới — 2026)

App Golike mới không còn g-authkhông trả firebase_id / signing_key từ /users/me.

Request thật (curl app) chỉ còn:

Header Bắt buộc
Authorization: Bearer <JWT>
g-device-id ✅ UUID
g-username
t ✅ (triple-btoa timestamp)
g-auth / g-version / g-client / sig ❌ không dùng

Thay đổi thư viện:

  • GolikeAuth.from_token(token)chỉ JWT, không bắt signing_key / firebase_id.
  • headers() / get / post mặc định không gắn g-auth.
  • enable_gauth=False (mặc định). Bật legacy: enable_gauth=True + signing_key=....
  • verify mặc định False (echo /security/echo chỉ khi legacy).
  • Export lại: generate_g_auth, generate_device_id, build_headers, resolve_signing_key, …
  • auth.firebase_id — alias optional (thường None trên API mới).
from golike_gauth import GolikeAuth

auth = GolikeAuth.from_token("eyJ...")  # không cần signing_key

print(auth.user_id, auth.username, auth.device_id)
print(auth.signing_key)   # None trên API mới
print("g-auth" in auth.headers("GET", "/users/me"))  # False

# jobs 2026 (Facebook / multi)
auth.get(
    "/advertising/publishers/get-jobs-2026",
    params={"fb_id": "6158...", "server": "sv2", "low_job": 1},
)

# path cũ vẫn gọi được (Bearer only)
auth.get("/advertising/publishers/tiktok/jobs", params={"account_id": "1"})
auth.post("/advertising/publishers/instagram/skip-jobs", json={...})

Legacy (opt-in) — nếu gateway cũ còn bắt g-auth:

auth = GolikeAuth.from_token(
    "eyJ...",
    signing_key="...",      # store.state.signing_key hoặc firebase_id cũ
    enable_gauth=True,
    verify=True,
)

0.1.5

  • Gỡ helper theo platform (get_instagram_job, get_tiktok_job, …).
  • Auth dùng chung: from_token + get / post / put / delete / request / headers.

0.1.4

  • enable_sig trên GolikeAuth / from_token (TikTok sig).

0.1.3

  • Header sig TikTok; gộp query vào path khi ký.

0.1.2

  • from_token(token) bootstrap /users/me + firebase_id (API cũ).

0.1.1 / 0.1.0

  • HKDF + AES-GCM g-auth, g-device-id, header t.

Nâng cấp

pip install -U "golike-gauth[requests]"

Breaking (0.1.6): mặc định không sinh g-auth. Code cũ dựa vào auth.signing_key / auth.g_auth() bắt buộc → truyền enable_gauth=True + signing_key, hoặc bỏ hẳn (API mới không cần).

Breaking (0.1.5): get_tiktok_job / get_instagram_job → dùng auth.get / auth.post.

Install

pip install -U golike-gauth

# HTTP helper (requests) — khuyến nghị
pip install -U "golike-gauth[requests]"

# từ GitHub
pip install -U git+https://github.com/deno4908/golike-gauth.git

Quick start

Chỉ cần token (API 2026 — khuyến dùng)

from golike_gauth import GolikeAuth

auth = GolikeAuth.from_token("eyJ...")  # chỉ token

print(auth.user_id)       # JWT sub
print(auth.username)      # /users/me
print(auth.device_id)     # UUID tự sinh
print(auth.signing_key)   # None (API mới không firebase_id)
print(auth.profile)       # raw /users/me

Flow from_token làm gì?

Bước Nguồn Kết quả
1 Decode JWT user_id = sub
2 GET /users/me (UA mobile) username, coin, profile… (không firebase_id)
3 signing_key None (API mới) — chỉ set nếu enable_gauth=True
4 device_id UUID v4 (tự tạo)
5 Headers Bearer + g-device-id + g-username + tkhông g-auth
# mac dinh API moi
auth = GolikeAuth.from_token("eyJ...")

# legacy g-auth (hiếm)
auth = GolikeAuth.from_token(
    "eyJ...",
    signing_key="cxbbf6td1EXc...",
    enable_gauth=True,
    verify=True,
)

Lấy token từ đâu?

Trên https://app.golike.net (đã login, F12 → Network):

  • Request bất kỳ → header Authorization: Bearer eyJ...
  • Hoặc Application / Local Storage / vuex (field token)

Ví dụ: lấy job Facebook chỉ với token

from golike_gauth import GolikeAuth

auth = GolikeAuth.from_token("eyJ...")

# list account FB tren Golike
accs = auth.get("/fb-account", params={"limit": 200}).json().get("data") or []
fb_id = accs[0]["fb_id"]

r = auth.get(
    "/advertising/publishers/get-jobs-2026",
    params={"fb_id": fb_id, "server": "sv2", "high_job": 1, "low_job": 1},
)
print(r.status_code, r.json())

Script mẫu trong workspace: test_fb_jobs.py (chỉ hỏi token).

Thủ công (5 trường)

from golike_gauth import GolikeAuth

auth = GolikeAuth(
    token="eyJ...",              # JWT Bearer
    signing_key="...",           # = firebase_id hoac store.state.signing_key
    user_id=123456,              # JWT sub
    username="your_username",
    device_id="32484704-8a4e-4909-9d42-866773b321d6",  # nên giữ cố định
)

Lib dùng được với mọi path gateway. Chỉ cần đúng method + path + body/query như browser.

Cách dùng chung (khuyến nghị)

# GET — không body, params = query string
r = auth.get("/path/to/api", params={"key": "value"})
print(r.status_code, r.json())

# POST — có JSON body (g-auth ký đúng body compact, không space)
r = auth.post("/path/to/api", json={"a": 1, "b": "x"})
print(r.status_code, r.json())

# method bất kỳ
r = auth.request("PUT", "/path/to/api", json={...})
r = auth.request("DELETE", "/path/to/api")

Ví dụ thật theo platform

Instagram — lấy job (GET)

r = auth.get(
    "/advertising/publishers/instagram/jobs",
    params={
        "instagram_account_id": "966624",
        "data": "null",
    },
)
# hoặc helper:
r = auth.get_instagram_job("966624")
print(r.json())

Instagram — skip job (POST, không phải GET!)

r = auth.post(
    "/advertising/publishers/instagram/skip-jobs",
    json={
        "ads_id": 620978,
        "object_id": "6155111723",
        "account_id": 966624,
        "type": "follow",  # follow | like | comment | ...
    },
)
# hoặc helper:
r = auth.skip_instagram_job(
    ads_id=620978,
    object_id="6155111723",
    account_id=966624,
    type="follow",
)
print(r.json())

Instagram — complete job (POST)

r = auth.post(
    "/advertising/publishers/instagram/complete-jobs",
    json={
        "instagram_users_advertising_id": 620978,
        "instagram_account_id": 966624,
        "async": True,
        "data": None,
    },
)
# hoặc helper:
r = auth.complete_instagram_job(
    instagram_users_advertising_id=620978,
    instagram_account_id=966624,
)
print(r.json())

Twitter / X — lấy job (GET)

Tương đương curl:

GET /api/advertising/publishers/twitter/jobs?account_id=97445

r = auth.get(
    "/advertising/publishers/twitter/jobs",
    params={"account_id": "97445"},
)
print(r.status_code, r.json())

TikTok / Facebook / … (cùng pattern)

# GET jobs (query tùy platform — copy từ Network tab browser)
r = auth.get(
    "/advertising/publishers/tiktok/jobs",
    params={"account_id": "123"},  # hoặc param khác tùy API
)

# POST skip / complete — luôn dùng auth.post(..., json={...})
r = auth.post(
    "/advertising/publishers/tiktok/skip-jobs",
    json={...},  # body copy từ Network tab
)

Users / endpoint khác

r = auth.get("/users/me")
r = auth.post("/some/path", json={"foo": "bar"})

Sai thường gặp

# ❌ SAI: auth.post() đã gọi API, không phải headers
# ❌ SAI: skip-jobs dùng GET → 405
response = requests.get(
    "https://gateway.golike.net/api/advertising/publishers/instagram/skip-jobs",
    headers=auth.post("/advertising/publishers/instagram/skip-jobs", json={...}),
)

# ✅ ĐÚNG
response = auth.post(
    "/advertising/publishers/instagram/skip-jobs",
    json={
        "ads_id": 620978,
        "object_id": "6155111723",
        "account_id": 966624,
        "type": "follow",
    },
)
print(response.json())

Nếu tự dùng requests, method + body bytes phải khớp lúc ký:

import json
import requests

body = {
    "ads_id": 620978,
    "object_id": "6155111723",
    "account_id": 966624,
    "type": "follow",
}
raw = json.dumps(body, separators=(",", ":"), ensure_ascii=False)  # không space
headers = auth.headers(
    "POST",
    "/advertising/publishers/instagram/skip-jobs",
    body=raw,
)
response = requests.post(
    "https://gateway.golike.net/api/advertising/publishers/instagram/skip-jobs",
    headers=headers,
    data=raw.encode("utf-8"),
)

Headers only / low-level

from golike_gauth import generate_g_auth, generate_device_id, decode_g_auth

# headers: method/path/body phải trùng request thật
headers = auth.headers(
    "GET",
    "/advertising/publishers/twitter/jobs",
    body="",  # GET không body
)

g_auth = generate_g_auth(
    method="GET",
    path="/advertising/publishers/twitter/jobs",
    body="",
    signing_key="...",
    device_id=generate_device_id(),
    user_id=123456,
)
print(decode_g_auth(g_auth, "..."))

Method cheatsheet

API Method Params / Body
/advertising/publishers/instagram/jobs GET query: instagram_account_id, data
/advertising/publishers/instagram/skip-jobs POST JSON: {ads_id, object_id, account_id, type}
/advertising/publishers/instagram/complete-jobs POST JSON: {instagram_users_advertising_id, instagram_account_id, async, data, ...}
/advertising/publishers/twitter/jobs GET query: account_id
/users/me GET
path khác copy từ browser Network đúng method + body như browser

Quy tắc:

  1. GETauth.get(path, params=...) — body ký = ""
  2. POSTauth.post(path, json=...) — body ký = JSON compact
  3. 405 = sai method (vd. GET skip-jobs)
  4. g-auth tạo mới mỗi request, khớp method + path + body
  5. Path truyền vào không cần /api prefix (auth tự thêm base .../api)

Where to get signing_key

On https://app.golike.net (logged in), DevTools console:

document.querySelector('#app').__vue__.$store.state.signing_key

This value may differ from data.firebase_id in /users/me. Always use the store key the browser actually signs with.

CLI

golike-gauth \
  --token eyJ... \
  --signing-key ... \
  --user-id 123456 \
  --username your_username \
  --call --ig-account-id YOUR_IG_ACCOUNT_ID

Notes

  • g-auth must be regenerated for every request (binds method + path + body hash + timestamp).
  • GET requests sign body as empty string "".
  • Path signed is pathname only, e.g. /api/advertising/publishers/instagram/jobs.

Development

git clone https://github.com/deno4908/golike-gauth.git
cd golike-gauth
python -m pip install -e ".[dev,requests]"

Build & publish (PyPI)

python -m pip install -U build twine
python -m build
python -m twine upload dist/*

Contributing

Issues and PRs: https://github.com/deno4908/golike-gauth/issues

License

MIT — see LICENSE


Phân tích mã hóa / giải mã g-auth (Golike Gateway)

Tài liệu này mô tả cách app web Golike tạo header g-auth cho mỗi request tới gateway.golike.net, và cách server (hoặc client debug) giải mã token đó.

Nguồn reverse: bundle index-68ef440b.js (các hàm H_, q_, Mg, M_, j_, Jd, aA, bu).


1. Vai trò của g-auth

g-authrequest-binding token: mỗi request HTTP mang một token mới, gắn với:

Trường payload Ý nghĩa
n HTTP method (GET / POST / …)
k Pathname API (không có query)
q SHA-256 hex của body
d g-device-id (UUID)
u user_id
t timestamp client (ms)
x nonce ngẫu nhiên
r digest ngắn chống giả mạo thô

Token được mã hóa AES-GCM bằng khóa dẫn xuất từ signing_key của user. Server giải mã → kiểm tra method/path/body/device/user/time → cho phép request.

g-auth không tái sử dụng được giữa các request (path/body/time khác nhau, và có nonce).


2. Các header liên quan

Ngoài JWT Authorization: Bearer …, client còn gửi:

Header Nguồn / công thức
g-auth AES-GCM token (mục 4–5)
g-device-id UUID v4, lưu localStorage.device_id
g-username username user
g-version version app, ví dụ 26.07.10.2
g-client client id app
t btoa(btoa(btoa(unix_seconds))) — timestamp 3 lớp Base64

3. signing_key — nguyên liệu khóa

3.1. Lấy key ở đâu?

Trong Vuex store:

$store.state.signing_key
// DevTools:
document.querySelector('#app').__vue__.$store.state.signing_key

Lưu ý thực tế: giá trị store có thể khác data.firebase_id trả về từ GET /users/me.
Luôn dùng đúng key mà browser đang ký (store / console), không chỉ dựa vào field API.

Key là 32 bytes, thường encode Base64 (có +, /, =), ví dụ:

cxbbf6td1EXcoEWlnk0eVmJwG1NJYhiqPxNcUXG+cBc=

Client cũng chấp nhận hex 64 ký tự.

3.2. Parse key (k_)

nếu chuỗi là hex hợp lệ và decode ra 32 bytes  → dùng
else decode Base64 / Base64URL → 32 bytes     → dùng
else lỗi: signing key must decode to 32 bytes

4. Dẫn xuất khóa AES (HKDF)

Trước khi AES-GCM, raw key 32 bytes được đưa qua HKDF-SHA256:

Tham số Giá trị
IKM 32 bytes từ signing_key
Hash SHA-256
Salt glk-gauth-v3-2026q3
Info aes-gcm-key
Output length 32 bytes
AES_KEY = HKDF-SHA256(
  ikm  = decode(signing_key),
  salt = "glk-gauth-v3-2026q3",
  info = "aes-gcm-key",
  len  = 32
)

Hằng số trong JS:

B_ = "glk-gauth"
E_ = "v3-2026"          // sn(247)
S_ = "q3"
Sg = B_ + "-" + E_ + S_ // => "glk-gauth-v3-2026q3"
I_ = "aes-gcm-key"

AES_KEY import vào WebCrypto / OpenSSL dưới dạng AES-256-GCM.


5. Tạo payload trước khi mã hóa

5.1. Chuẩn hóa path (Pg + yu)

  • Bỏ query (?...) và hash (#...)
  • Ghép với base https://gateway.golike.net/api
  • Chỉ lấy pathname

Ví dụ:

request URL:
  /advertising/publishers/instagram/jobs?instagram_account_id=966624&data=null

signed path k:
  /api/advertising/publishers/instagram/jobs

5.2. Hash body (j_)

body_str =
  null/undefined  →  ""
  string          →  chính nó
  object          →  JSON.stringify(obj)   // compact, không space
                     // JS: JSON.stringify → {"a":1}

q = SHA256_hex(body_str)

GET / HEAD / DELETE trong app: body ký = chuỗi rỗng ""

q = SHA256("")
  = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

5.3. Digest r (M_)

r = SHA256_hex( f"{t}:{device_id}:{q}:{salt}" )[0:16]

với salt = glk-gauth-v3-2026q3, t là timestamp milliseconds.

5.4. Object payload đầy đủ

Thứ tự key (quan trọng vì JSON.stringify giữ insertion order):

{
  "t": 1783944428398,
  "x": "z7Yv5E5ClYSc0gyyjllQ2w",
  "d": "32484704-8a4e-4909-9d42-866773b321d6",
  "u": 639111,
  "n": "GET",
  "k": "/api/advertising/publishers/instagram/jobs",
  "q": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
  "r": "286c4f5bd68ec1c4"
}
Field Mô tả
t Date.now() (ms)
x 16 bytes random → Base64URL (no padding)
d device UUID (g-device-id)
u user id (number)
n method upper-case
k pathname đã chuẩn hóa
q body hash
r digest 16 hex chars

Chuỗi plaintext:

plaintext = JSON.stringify(payload)   // separators mặc định JS: không space
         → UTF-8 bytes

6. Mã hóa (encrypt) — H_

IV  = 12 bytes random          (crypto.getRandomValues)
CT  = AES-256-GCM.Encrypt(
        key = AES_KEY,
        iv  = IV,
        pt  = plaintext_utf8
      )
      // CT = ciphertext || 16-byte auth tag  (WebCrypto / cryptography)

token_bytes = IV || CT
g-auth      = Base64URL(token_bytes)   // bỏ padding '='

Sơ đồ:

signing_key (b64/hex)
        │
        ▼ decode 32B
       IKM
        │
        ▼ HKDF-SHA256(salt, info)
     AES_KEY (32B)
        │
        │   ┌─ method, path, body, device, user, now ─┐
        │   ▼                                         │
        │  JSON payload {t,x,d,u,n,k,q,r}             │
        │   ▼ UTF-8                                   │
        │  plaintext ──────────┐                      │
        │                      │                      │
        ▼                      ▼                      │
   AES-256-GCM(IV=12B)  ←── encrypt                   │
        │                                             │
        ▼                                             │
   IV || ciphertext+tag                               │
        │                                             │
        ▼ Base64URL                                   │
     header g-auth ───────────────────────────────────┘

7. Giải mã (decrypt) — q_ / server / debug

raw = Base64URL_decode(g-auth)
IV  = raw[0:12]
CT  = raw[12:]          // ciphertext + tag

plaintext = AES-256-GCM.Decrypt(AES_KEY, IV, CT)
payload   = JSON.parse(plaintext)

Sau khi giải mã, server thường kiểm tra:

  1. Decrypt OK (key + IV + tag đúng)
    • Fail → decrypt_fail_check_signing_key_or_iv_or_tag_or_r_field
  2. n khớp HTTP method
  3. k khớp pathname canonical (vd. /api/...)
  4. q khớp SHA256 body thực tế nhận được
  5. d / u khớp session / JWT
  6. t không lệch quá xa server time (ts_drift_ms)
  7. r khớp lại công thức digest

Endpoint debug hữu ích:

POST /api/security/echo

Response có block gauth mô tả lỗi decode / match.


8. Ví dụ end-to-end (GET jobs)

Request

GET /api/advertising/publishers/instagram/jobs?instagram_account_id=966624&data=null
Authorization: Bearer <jwt>
g-device-id: 32484704-8a4e-4909-9d42-866773b321d6
g-username: vinhhacker
g-auth: Zmo3WFa5lp2X...
t: VFZSak5FMTZhekJPUkZGNVQwRTlQUT09

Payload đã giải mã (thực tế từ browser)

{
  "t": 1783944428398,
  "x": "z7Yv5E5ClYSc0gyyjllQ2w",
  "d": "32484704-8a4e-4909-9d42-866773b321d6",
  "u": 639111,
  "n": "GET",
  "k": "/api/advertising/publishers/instagram/jobs",
  "q": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
  "r": "286c4f5bd68ec1c4"
}

Tính lại qr

q = SHA256("")
  = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

r = SHA256(
      "1783944428398"
      + ":" + "32484704-8a4e-4909-9d42-866773b321d6"
      + ":" + q
      + ":" + "glk-gauth-v3-2026q3"
    )[:16]
  = 286c4f5bd68ec1c4

9. Header t (không nằm trong AES)

t = btoa(btoa(btoa(String(unix_seconds))))

Ví dụ:

unix = 1783944424
→ btoa × 3 → "VFZSak5FMTZhekJPUkZGNVQwRTlQUT09"

Đây là timestamp phụ (giây), tách biệt field t (ms) bên trong g-auth.


10. Pseudocode Python

import base64, hashlib, json, secrets, time
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
from cryptography.hazmat.primitives import hashes

SALT = "glk-gauth-v3-2026q3"
INFO = "aes-gcm-key"

def b64url(data: bytes) -> str:
    return base64.urlsafe_b64encode(data).decode().rstrip("=")

def sha256_hex(s: str) -> str:
    return hashlib.sha256(s.encode()).hexdigest()

def derive_key(signing_key_b64: str) -> bytes:
    ikm = base64.b64decode(signing_key_b64)
    return HKDF(
        algorithm=hashes.SHA256(),
        length=32,
        salt=SALT.encode(),
        info=INFO.encode(),
    ).derive(ikm)

def encrypt_g_auth(method, path, body, signing_key, device_id, user_id) -> str:
    key = derive_key(signing_key)
    iv = secrets.token_bytes(12)
    t = int(time.time() * 1000)
    q = sha256_hex(body if body is not None else "")
    r = sha256_hex(f"{t}:{device_id}:{q}:{SALT}")[:16]
    payload = {
        "t": t,
        "x": b64url(secrets.token_bytes(16)),
        "d": device_id,
        "u": user_id,
        "n": method.upper(),
        "k": path,
        "q": q,
        "r": r,
    }
    pt = json.dumps(payload, separators=(",", ":")).encode()
    ct = AESGCM(key).encrypt(iv, pt, None)  # ct + tag
    return b64url(iv + ct)

def decrypt_g_auth(token: str, signing_key: str) -> dict:
    key = derive_key(signing_key)
    pad = "=" * (-len(token) % 4)
    raw = base64.urlsafe_b64decode(token.replace("-", "+").replace("_", "/") + pad)
    iv, ct = raw[:12], raw[12:]
    pt = AESGCM(key).decrypt(iv, ct, None)
    return json.loads(pt)

11. Lỗi thường gặp

Triệu chứng Nguyên nhân
decrypt_fail_... Sai signing_key, hỏng token, hoặc không đúng thuật toán HKDF/AES
AUTH_MISSING Không gửi g-auth (và/hoặc header bắt buộc khác)
403 “cập nhật phiên bản…” Token thiếu/sai trên endpoint jobs; server từ chối client “cũ/không ký”
200 ở browser, 403 ở script Reuse g-auth cũ; hoặc path/body hash khác (space trong JSON, thiếu /api, …)
Decode local OK nhưng server fail Key local ≠ key server đang expect; lấy lại từ store.state.signing_key

12. Checklist implement đúng

  1. signing_key = store browser, decode ra đúng 32 bytes
  2. HKDF salt = glk-gauth-v3-2026q3, info = aes-gcm-key
  3. Path ký = pathname có prefix /api/..., không query
  4. GET body ký = ""
  5. POST body ký = cùng bytes body gửi đi (JSON compact nếu stringify)
  6. Payload JSON không space, đúng thứ tự key t,x,d,u,n,k,q,r
  7. AES-GCM IV 12 bytes, output Base64URL(IV || CT||TAG)
  8. Mỗi request tạo g-auth mới

13. Tóm tắt một dòng

g-auth = Base64URL( IV₁₂ ‖ AES-256-GCMHKDF(signing_key)( JSON{method, path, bodyHash, device, user, time, nonce, digest} ) )

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

golike_gauth-0.1.6.tar.gz (29.1 kB view details)

Uploaded Source

Built Distribution

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

golike_gauth-0.1.6-py3-none-any.whl (19.8 kB view details)

Uploaded Python 3

File details

Details for the file golike_gauth-0.1.6.tar.gz.

File metadata

  • Download URL: golike_gauth-0.1.6.tar.gz
  • Upload date:
  • Size: 29.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for golike_gauth-0.1.6.tar.gz
Algorithm Hash digest
SHA256 749c087ad61c743f94a4a42045b656b62b08a991f74c6eadbc5f108ef52c4182
MD5 62c286e13cf561e16264e35b4d0b7161
BLAKE2b-256 4f35627b1f4335f50fdc156064130ea2844ec7998729c43ef4cb04fbbfdd0448

See more details on using hashes here.

File details

Details for the file golike_gauth-0.1.6-py3-none-any.whl.

File metadata

  • Download URL: golike_gauth-0.1.6-py3-none-any.whl
  • Upload date:
  • Size: 19.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for golike_gauth-0.1.6-py3-none-any.whl
Algorithm Hash digest
SHA256 4f1915b97e60a858c3a9db394d86f6cde6b1b379844810be0523166f61aa1b78
MD5 2c6719dbc0de295e71fbcfc8dc049101
BLAKE2b-256 36bc3d1a1844ac4208f5154ce079428eebc3fc00077f05c8a32a89c8abc5f959

See more details on using hashes here.

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