instagram_web_api/endpoints/
utils.rs1use percent_encoding::{percent_encode, AsciiSet, NON_ALPHANUMERIC};
2use serde_json::{Map, Value};
3
4use crate::endpoints::URL_BASE;
5
6pub const GRAPHQL_QUERY_URL_PERCENT_ENCODE_ASCII_SET: &AsciiSet =
7 &NON_ALPHANUMERIC.remove(b'_').remove(b'-');
8
9pub fn gen_graphql_query_url(
10 query_hash: impl AsRef<str>,
11 variables: Map<String, Value>,
12) -> Result<String, String> {
13 let mut query_pairs = vec![("query_hash", query_hash.as_ref().to_owned())];
14
15 let variables = serde_json::to_string(&Value::Object(variables))
16 .map_err(|err| format!("to variables failed {}", err))?;
17 query_pairs.push((
18 "variables",
19 percent_encode(
20 variables.as_bytes(),
21 GRAPHQL_QUERY_URL_PERCENT_ENCODE_ASCII_SET,
22 )
23 .to_string(),
24 ));
25
26 Ok(format!(
27 "{}/graphql/query/?{}",
28 URL_BASE,
29 query_pairs
30 .into_iter()
31 .map(|x| format!("{}={}", x.0, x.1))
32 .collect::<Vec<String>>()
33 .join("&"),
34 ))
35}