list.nim 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import httpclient, asyncdispatch, htmlparser
  2. import sequtils, strutils, json, uri
  3. import ".."/[types, parser, parserutils, query]
  4. import utils, consts, timeline, search
  5. proc getListTimeline*(username, list, agent, after: string): Future[Timeline] {.async.} =
  6. let url = base / (listUrl % [username, list])
  7. var params = toSeq({
  8. "include_available_features": "1",
  9. "include_entities": "1",
  10. "reset_error_state": "false"
  11. })
  12. if after.len > 0:
  13. params.add {"max_position": after}
  14. let json = await fetchJson(url ? params, genHeaders(agent, url))
  15. result = await finishTimeline(json, Query(), after, agent)
  16. if result.content.len == 0:
  17. return
  18. let last = result.content[^1]
  19. result.minId =
  20. if last.retweet.isNone: $last.id
  21. else: $(get(last.retweet).id)
  22. proc getListMembers*(username, list, agent: string): Future[Result[Profile]] {.async.} =
  23. let
  24. url = base / (listMembersUrl % [username, list])
  25. html = await fetchHtml(url, genHeaders(agent, url))
  26. result = Result[Profile](
  27. minId: html.selectAttr(".stream-container", "data-min-position"),
  28. hasMore: html.select(".has-more-items") != nil,
  29. beginning: true,
  30. query: Query(kind: userList),
  31. content: html.selectAll(".account").map(parseListProfile)
  32. )
  33. proc getListMembersSearch*(username, list, agent, after: string): Future[Result[Profile]] {.async.} =
  34. let
  35. referer = base / (listMembersUrl % [username, list])
  36. url = referer / "timeline"
  37. headers = genHeaders({"x-push-with": "XMLHttpRequest"}, agent, referer, xml=true)
  38. var params = toSeq({
  39. "include_available_features": "1",
  40. "include_entities": "1",
  41. "reset_error_state": "false"
  42. })
  43. if after.len > 0:
  44. params.add {"max_position": after}
  45. let json = await fetchJson(url ? params, headers)
  46. result = getResult[Profile](json, Query(kind: userList), after)
  47. if json == nil or not json.hasKey("items_html"): return
  48. let html = json["items_html"].to(string)
  49. result.hasMore = html != "\n"
  50. for p in parseHtml(html).selectAll(".account"):
  51. result.content.add parseListProfile(p)