Prechádzať zdrojové kódy

Switch back to old user search endpoint

Zed 3 rokov pred
rodič
commit
8df5256c1d

+ 12 - 16
src/api.nim

@@ -112,29 +112,25 @@ proc getGraphTweetSearch*(query: Query; after=""): Future[Timeline] {.async.} =
   if after.len > 0:
     variables["cursor"] = % after
   let url = graphSearchTimeline ? {"variables": $variables, "features": gqlFeatures}
-  result = parseGraphSearch[Tweets](await fetch(url, Api.search), after)
+  result = parseGraphSearch(await fetch(url, Api.search), after)
   result.query = query
 
-proc getGraphUserSearch*(query: Query; after=""): Future[Result[User]] {.async.} =
+proc getUserSearch*(query: Query; page="1"): Future[Result[User]] {.async.} =
   if query.text.len == 0:
     return Result[User](query: query, beginning: true)
 
-  var
-    variables = %*{
-      "rawQuery": query.text,
-      "count": 20,
-      "product": "People",
-      "withDownvotePerspective": false,
-      "withReactionsMetadata": false,
-      "withReactionsPerspective": false
-    }
-  if after.len > 0:
-    variables["cursor"] = % after
-    result.beginning = false
+  let
+    page = if page.len == 0: "1" else: page
+    url = userSearch ? genParams({"q": query.text, "skip_status": "1", "page": page})
+    js = await fetchRaw(url, Api.userSearch)
+
+  result = parseUsers(js)
 
-  let url = graphSearchTimeline ? {"variables": $variables, "features": gqlFeatures}
-  result = parseGraphSearch[User](await fetch(url, Api.search), after)
   result.query = query
+  if page.len == 0:
+    result.bottom = "2"
+  elif page.allCharsInSet(Digits):
+    result.bottom = $(parseInt(page) + 1)
 
 proc getPhotoRail*(name: string): Future[PhotoRail] {.async.} =
   if name.len == 0: return

+ 2 - 0
src/consts.nim

@@ -9,6 +9,7 @@ const
   activate* = $(api / "1.1/guest/activate.json")
 
   photoRail* = api / "1.1/statuses/media_timeline.json"
+  userSearch* = api / "1.1/users/search.json"
 
   graphql = api / "graphql"
   graphUser* = graphql / "u7wQyGi6oExe8_TRWGMq4Q/UserResultByScreenNameQuery"
@@ -34,6 +35,7 @@ const
     "include_user_entities": "1",
     "include_ext_reply_count": "1",
     "include_ext_is_blue_verified": "1",
+    #"include_ext_verified_type": "1",
     "include_ext_media_color": "0",
     "cards_platform": "Web-13",
     "tweet_mode": "extended",

+ 1 - 1
src/experimental/parser/user.nim

@@ -56,7 +56,7 @@ proc toUser*(raw: RawUser): User =
     tweets: raw.statusesCount,
     likes: raw.favouritesCount,
     media: raw.mediaCount,
-    verified: raw.verified,
+    verified: raw.verified or raw.extIsBlueVerified,
     protected: raw.protected,
     joinDate: parseTwitterDate(raw.createdAt),
     banner: getBanner(raw),

+ 1 - 0
src/experimental/types/user.nim

@@ -16,6 +16,7 @@ type
     statusesCount*: int
     mediaCount*: int
     verified*: bool
+    extIsBlueVerified*: bool
     protected*: bool
     profileLinkColor*: string
     profileBannerUrl*: string

+ 10 - 16
src/parser.nim

@@ -1,5 +1,5 @@
 # SPDX-License-Identifier: AGPL-3.0-only
-import strutils, options, times, math, tables
+import strutils, options, times, math
 import packedjson, packedjson/deserialiser
 import types, parserutils, utils
 import experimental/parser/unifiedcard
@@ -436,8 +436,8 @@ proc parseGraphTimeline*(js: JsonNode; root: string; after=""): Profile =
             tweet.id = parseBiggestInt(entryId)
         result.pinned = some tweet
 
-proc parseGraphSearch*[T: User | Tweets](js: JsonNode; after=""): Result[T] =
-  result = Result[T](beginning: after.len == 0)
+proc parseGraphSearch*(js: JsonNode; after=""): Timeline =
+  result = Timeline(beginning: after.len == 0)
 
   let instructions = js{"data", "search_by_raw_query", "search_timeline", "timeline", "instructions"}
   if instructions.len == 0:
@@ -448,19 +448,13 @@ proc parseGraphSearch*[T: User | Tweets](js: JsonNode; after=""): Result[T] =
     if typ == "TimelineAddEntries":
       for e in instruction{"entries"}:
         let entryId = e{"entryId"}.getStr
-        when T is Tweets:
-          if entryId.startsWith("tweet"):
-            with tweetRes, e{"content", "itemContent", "tweet_results", "result"}:
-              let tweet = parseGraphTweet(tweetRes)
-              if not tweet.available:
-                tweet.id = parseBiggestInt(entryId.getId())
-              result.content.add tweet
-        elif T is User:
-          if entryId.startsWith("user"):
-            with userRes, e{"content", "itemContent"}:
-              result.content.add parseGraphUser(userRes)
-
-        if entryId.startsWith("cursor-bottom"):
+        if entryId.startsWith("tweet"):
+          with tweetRes, e{"content", "itemContent", "tweet_results", "result"}:
+            let tweet = parseGraphTweet(tweetRes)
+            if not tweet.available:
+              tweet.id = parseBiggestInt(entryId.getId())
+            result.content.add tweet
+        elif entryId.startsWith("cursor-bottom"):
           result.bottom = e{"content", "value"}.getStr
     elif typ == "TimelineReplaceEntry":
       if instruction{"entry_id_to_replace"}.getStr.startsWith("cursor-bottom"):

+ 1 - 1
src/routes/search.nim

@@ -29,7 +29,7 @@ proc createSearchRouter*(cfg: Config) =
           redirect("/" & q)
         var users: Result[User]
         try:
-          users = await getGraphUserSearch(query, getCursor())
+          users = await getUserSearch(query, getCursor())
         except InternalError:
           users = Result[User](beginning: true, query: query)
         resp renderMain(renderUserSearch(users, prefs), request, cfg, prefs, title)

+ 1 - 0
src/types.nim

@@ -19,6 +19,7 @@ type
     tweetResult
     photoRail
     search
+    userSearch
     list
     listBySlug
     listMembers