nitter/src/api/utils.nim

65 lines
1.6 KiB
Nim
Raw Normal View History

2019-10-26 13:34:30 +00:00
import httpclient, asyncdispatch, htmlparser, options
2019-09-06 01:37:12 +00:00
import strutils, json, xmltree, uri
import ../types
2020-01-22 13:01:27 +00:00
import consts
2019-10-02 08:13:17 +00:00
proc genHeaders*(headers: openArray[tuple[key: string, val: string]];
agent: string; referer: Uri; lang=true;
2020-01-22 13:01:27 +00:00
auth=false; xml=false): HttpHeaders =
2019-10-02 08:13:17 +00:00
result = newHttpHeaders({
"referer": $referer,
"user-agent": agent,
"x-twitter-active-user": "yes",
})
if auth: result["authority"] = "twitter.com"
if lang: result["accept-language"] = consts.lang
if xml: result["x-requested-with"] = "XMLHttpRequest"
for (key, val) in headers:
result[key] = val
proc genHeaders*(agent: string; referer: Uri; lang=true;
2020-01-22 13:01:27 +00:00
auth=false; xml=false): HttpHeaders =
genHeaders([], agent, referer, lang, auth, xml)
2019-10-02 08:13:17 +00:00
2019-09-06 01:37:12 +00:00
template newClient*() {.dirty.} =
var client = newAsyncHttpClient()
defer:
try: client.close()
except: discard
2019-09-06 01:37:12 +00:00
client.headers = headers
proc fetchHtml*(url: Uri; headers: HttpHeaders; jsonKey = ""): Future[XmlNode] {.async.} =
2019-10-02 08:13:17 +00:00
headers["accept"] = htmlAccept
2019-09-06 01:37:12 +00:00
newClient()
var resp = ""
try:
resp = await client.getContent($url)
except:
return nil
if jsonKey.len > 0:
2019-10-02 08:13:17 +00:00
resp = parseJson(resp)[jsonKey].str
return parseHtml(resp)
2019-09-06 01:37:12 +00:00
proc fetchJson*(url: Uri; headers: HttpHeaders): Future[JsonNode] {.async.} =
2019-10-02 08:13:17 +00:00
headers["accept"] = jsonAccept
2019-09-06 01:37:12 +00:00
newClient()
try:
let resp = await client.getContent($url)
2019-09-06 01:37:12 +00:00
result = parseJson(resp)
except:
return nil
proc getLastId*(tweets: Result[Tweet]): string =
if tweets.content.len == 0: return
let last = tweets.content[^1]
if last.retweet.isNone:
$last.id
else:
$(get(last.retweet).id)