scrapebadger-cli 0.16.0__tar.gz → 0.18.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/PKG-INFO +1 -1
  2. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/pyproject.toml +1 -1
  3. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/facebook.py +13 -0
  4. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/google.py +39 -6
  5. scrapebadger_cli-0.18.0/src/scrapebadger_cli/commands/naver.py +984 -0
  6. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/web.py +31 -33
  7. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/main.py +2 -0
  8. scrapebadger_cli-0.18.0/tests/test_naver.py +440 -0
  9. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/uv.lock +1 -1
  10. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/.gitignore +0 -0
  11. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/README.md +0 -0
  12. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/__init__.py +0 -0
  13. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/client.py +0 -0
  14. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/__init__.py +0 -0
  15. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/airbnb.py +0 -0
  16. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/amazon.py +0 -0
  17. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/apartments.py +0 -0
  18. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/app_store.py +0 -0
  19. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/auth.py +0 -0
  20. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/baidu.py +0 -0
  21. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/bing.py +0 -0
  22. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/booking.py +0 -0
  23. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/chatgpt.py +0 -0
  24. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/depop.py +0 -0
  25. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/duckduckgo.py +0 -0
  26. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/ebay.py +0 -0
  27. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/gemini.py +0 -0
  28. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/google_play.py +0 -0
  29. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/idealista.py +0 -0
  30. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/immobiliare.py +0 -0
  31. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/instagram.py +0 -0
  32. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/leboncoin.py +0 -0
  33. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/linkedin.py +0 -0
  34. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/loopnet.py +0 -0
  35. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/perplexity.py +0 -0
  36. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/realtor.py +0 -0
  37. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/reddit.py +0 -0
  38. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/redfin.py +0 -0
  39. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/stream.py +0 -0
  40. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/tiktok.py +0 -0
  41. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/twitter.py +0 -0
  42. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/vinted.py +0 -0
  43. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/walmart.py +0 -0
  44. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/yahoo.py +0 -0
  45. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/yandex.py +0 -0
  46. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/youtube.py +0 -0
  47. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/commands/zillow.py +0 -0
  48. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/config.py +0 -0
  49. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/src/scrapebadger_cli/output.py +0 -0
  50. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/tests/test_tiktok_pagination.py +0 -0
  51. {scrapebadger_cli-0.16.0 → scrapebadger_cli-0.18.0}/tests/test_vinted_image_search.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: scrapebadger-cli
3
- Version: 0.16.0
3
+ Version: 0.18.0
4
4
  Summary: ScrapeBadger CLI — Twitter, Vinted, Google, and Web Scraping from the command line
5
5
  Author: ScrapeBadger Team
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "scrapebadger-cli"
3
- version = "0.16.0"
3
+ version = "0.18.0"
4
4
  description = "ScrapeBadger CLI — Twitter, Vinted, Google, and Web Scraping from the command line"
5
5
  requires-python = ">=3.10"
6
6
  license = {text = "MIT"}
@@ -163,6 +163,19 @@ def group(
163
163
  render(data, fmt, fields)
164
164
 
165
165
 
166
+ @app.command(name="group-posts")
167
+ def group_posts(
168
+ group_id: str = typer.Argument(..., help="Group ID or vanity slug"),
169
+ after: str | None = AFTER,
170
+ sort: str = typer.Option("newest", "--sort", help="newest, relevance"),
171
+ fmt: str = FMT,
172
+ fields: str | None = FIELDS,
173
+ ) -> None:
174
+ """Get a public Facebook group's post feed, 3 posts per page."""
175
+ data = api_get(f"/v1/facebook/groups/{group_id}/posts", {"after": after, "sort": sort})
176
+ render(data, fmt, fields)
177
+
178
+
166
179
  @app.command()
167
180
  def post(
168
181
  post_id: str = typer.Argument(..., help="Post ID"),
@@ -936,12 +936,16 @@ def lens(
936
936
  language: str | None = typer.Option(None, "--language", help="Language code (alias for --hl)"),
937
937
  gl: str | None = typer.Option(None, "--gl", help="Country code"),
938
938
  hl: str | None = typer.Option(None, "--hl", help="Language code"),
939
- product: bool = typer.Option(False, "--product", help="Bias towards shoppable matches"),
939
+ product: bool = typer.Option(
940
+ False, "--product", help="Only the tiles Google marked buyable (price + stock)"
941
+ ),
940
942
  visual_matches: bool = typer.Option(
941
- True, "--visual-matches/--no-visual-matches", help="Include visual-matches carousel"
943
+ True,
944
+ "--visual-matches/--no-visual-matches",
945
+ help="Always returned; --no-visual-matches is reported back in warnings",
942
946
  ),
943
947
  exact_matches: bool = typer.Option(
944
- False, "--exact-matches", help="Restrict to exact matches only"
948
+ False, "--exact-matches", help="Only the pages hosting this image; falls back to the grid"
945
949
  ),
946
950
  fmt: str = FMT,
947
951
  fields: str | None = FIELDS,
@@ -953,6 +957,14 @@ def lens(
953
957
  `price` ({value, currency, extracted}) and the raw `tag` chip on
954
958
  shoppable matches, and `related_searches` chips. Legacy `results`
955
959
  alias kept for backwards compat.
960
+
961
+ `--exact-matches` returns just the pages hosting the image, flagged
962
+ `exact_match`, instead of the broad grid. Available for most images;
963
+ otherwise the full grid comes back and `warnings` says so.
964
+
965
+ Also carries `warnings`: any parameter that could not be applied is named
966
+ there, including an exact-match lookup that came back empty. Note that
967
+ `--fields` filters it out unless you ask for it.
956
968
  """
957
969
  data = api_get(
958
970
  "/v1/google/lens/search",
@@ -1250,13 +1262,34 @@ def ads_creative(
1250
1262
  @app.command(name="ads-advertisers")
1251
1263
  def ads_advertisers(
1252
1264
  query: str = typer.Argument(..., help="Advertiser name or domain (min 2 chars)"),
1253
- region: str = typer.Option("US", "--region"),
1254
- num: int = typer.Option(10, "--num", help="1-20"),
1265
+ region: str = typer.Option("US", "--region", help="Echoed only; --country filters"),
1266
+ num: int = typer.Option(10, "--num", help="Advertisers, 1-3000"),
1267
+ num_domains: int = typer.Option(10, "--num-domains", help="Domain rows, 0-100"),
1268
+ country: str | None = typer.Option(
1269
+ None, "--country", help="ISO2: only advertisers registered there"
1270
+ ),
1271
+ fuzzy: bool = typer.Option(
1272
+ False,
1273
+ "--fuzzy",
1274
+ help="Also find misspelled / look-alike advertisers, ranked by similarity (15 credits)",
1275
+ ),
1276
+ cursor: str | None = typer.Option(None, "--cursor", help="next_page_token: more domains"),
1255
1277
  fmt: str = FMT,
1256
1278
  fields: str | None = FIELDS,
1257
1279
  ) -> None:
1258
1280
  """Search Ads Transparency advertisers (autocomplete)."""
1259
- data = api_get("/v1/google/ads/advertisers", {"query": query, "region": region, "num": num})
1281
+ data = api_get(
1282
+ "/v1/google/ads/advertisers",
1283
+ {
1284
+ "query": query,
1285
+ "region": region,
1286
+ "num": num,
1287
+ "num_domains": num_domains,
1288
+ "country": country,
1289
+ "fuzzy": fuzzy,
1290
+ "cursor": cursor,
1291
+ },
1292
+ )
1260
1293
  render(data, fmt, fields)
1261
1294
 
1262
1295