Support both web and Android sessions

This commit is contained in:
Zed 2025-02-25 05:46:18 +00:00
parent 4f9ba9c7d6
commit 661be438ec
4 changed files with 47 additions and 18 deletions

View file

@ -1,5 +1,5 @@
# SPDX-License-Identifier: AGPL-3.0-only
import httpclient, asyncdispatch, options, strutils, uri, times, math, tables
import httpclient, asyncdispatch, options, strformat, strutils, uri, times, math, tables
import jsony, packedjson, zippy, oauth1
import types, auth, consts, parserutils, http_pool
import experimental/types/common
@ -28,21 +28,27 @@ proc getOauthHeader(url, oauthToken, oauthTokenSecret: string): string =
return getOauth1RequestHeader(params)["authorization"]
proc genHeaders*(url, oauthToken, oauthTokenSecret: string): HttpHeaders =
let header = getOauthHeader(url, oauthToken, oauthTokenSecret)
proc genHeaders*(url: string; session: Session): HttpHeaders =
result = newHttpHeaders({
"connection": "keep-alive",
"authorization": header,
"content-type": "application/json",
"x-twitter-active-user": "yes",
"authority": "api.x.com",
"accept-encoding": "gzip",
"accept-language": "en-US,en;q=0.9",
"accept": "*/*",
"DNT": "1"
"DNT": "1",
})
case session.kind
of oauth:
result["authorization"] = getOauthHeader(url, session.oauthToken, session.oauthSecret)
of cookie:
result["authorization"] = "Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA"
result["x-twitter-auth-type"] = "OAuth2Session"
result["x-csrf-token"] = session.ct0
result["cookie"] = &"ct0={session.ct0}; auth_token={session.authToken}"
template fetchImpl(result, fetchBody) {.dirty.} =
once:
pool = HttpPool()
@ -54,7 +60,7 @@ template fetchImpl(result, fetchBody) {.dirty.} =
try:
var resp: AsyncResponse
pool.use(genHeaders($url, session.oauthToken, session.oauthSecret)):
pool.use(genHeaders($url, session)):
template getContent =
resp = await c.get($url)
result = await resp.body

View file

@ -1,15 +1,24 @@
import std/strutils
import jsony
import ../types/session
from ../../types import Session
from ../../types import Session, SessionKind
proc parseSession*(raw: string): Session =
let
session = raw.fromJson(RawSession)
id = session.oauthToken[0 ..< session.oauthToken.find('-')]
let session = raw.fromJson(RawSession)
result = Session(
id: parseBiggestInt(id),
oauthToken: session.oauthToken,
oauthSecret: session.oauthTokenSecret
)
case session.kind
of "oauth":
let id = session.oauthToken[0 ..< session.oauthToken.find('-')]
result = Session(
kind: oauth,
id: parseBiggestInt(id),
oauthToken: session.oauthToken,
oauthSecret: session.oauthTokenSecret
)
of "cookie":
result = Session(
kind: cookie,
id: 999,
ct0: session.ct0,
authToken: session.authToken
)

View file

@ -1,4 +1,8 @@
type
RawSession* = object
kind*: string
oauthToken*: string
oauthTokenSecret*: string
ct0*: string
authToken*: string

View file

@ -31,10 +31,20 @@ type
remaining*: int
reset*: int
SessionKind* = enum
oauth
cookie
Session* = ref object
case kind*: SessionKind
of oauth:
oauthToken*: string
oauthSecret*: string
of cookie:
ct0*: string
authToken*: string
id*: int64
oauthToken*: string
oauthSecret*: string
pending*: int
limited*: bool
limitedAt*: int