diff --git a/src/apiutils.nim b/src/apiutils.nim index 65dcc29..9f28f7f 100644 --- a/src/apiutils.nim +++ b/src/apiutils.nim @@ -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 diff --git a/src/experimental/parser/session.nim b/src/experimental/parser/session.nim index ee9c93e..0eea787 100644 --- a/src/experimental/parser/session.nim +++ b/src/experimental/parser/session.nim @@ -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 + ) diff --git a/src/experimental/types/session.nim b/src/experimental/types/session.nim index 4165204..c1588cf 100644 --- a/src/experimental/types/session.nim +++ b/src/experimental/types/session.nim @@ -1,4 +1,8 @@ type RawSession* = object + kind*: string oauthToken*: string oauthTokenSecret*: string + ct0*: string + authToken*: string + diff --git a/src/types.nim b/src/types.nim index 4e565ee..a99c23a 100644 --- a/src/types.nim +++ b/src/types.nim @@ -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