превращение моего сеанса python в сеанс флаттера

#python #flutter #session #cookies #get

Вопрос:

Я пытался получить доступ к словам, которые я выучил на duolingo, используя api https://www.duolingo.com/vocabulary/overview. проблема в том, что для использования этого api мне пришлось бы уже войти в duolingo (аутентифицированный). Я придумал решение на python, используя requests.sessions (), чтобы сначала опубликовать свои учетные данные на странице входа, а затем перенаправить их на страницу словаря в том же сеансе. Тем не менее, я столкнулся с множеством проблем, пытаясь реализовать это в Flutter. Я смог успешно разместить свои учетные данные на странице входа в систему (и получил ответ «успешно 200»), но я не смог понять, как использовать файлы cookie/токены из запроса на публикацию, чтобы успешно перейти на страницу словаря. ниже приведен мой рабочий код на python (с удаленными именем пользователя и паролем для безопасности)

 import requests
import json
import ast
headers = {'content-type': 'application/json'}

data = {
    'identifier': 'username',
    'password': 'password',
    }

with requests.Session() as s:
    url = "https://www.duolingo.com/2017-06-30/login?fields="
    # use json.dumps to convert dict to serialized json string
    s.post(url, headers=headers, data=json.dumps(data))
    r = s.get("https://www.duolingo.com/vocabulary/overview")
    cont = r.content.decode('utf-8')
    print(cont)
 

а вот код флаттера с запросом post и нерабочим запросом get

 
final response = await http.post(
      Uri.parse('https://www.duolingo.com/2017-06-30/login?fields='),
      headers: <String, String>{
        'Content-Type': 'application/json',
      },
      body: jsonEncode(<String, String>{
        'identifier': 'username',
        'password': 'password',
      }),
    ); // the post returns a success 200 message

    if (response.statusCode == 200) {
      print("success");

      final resp2 = await http.get(
          Uri.parse("https://www.duolingo.com/vocabulary/overview"),
          ); //the get request is supposed to return a json with all my learned words but is instead returning html of the "404 error page)
      }
 

вот результат запроса get

 <!doctype html><html dir="ltr"><head><title>Duolingo</title><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no"><meta name="robots" content="NOODP"><meta name="theme-color" content="#eeeeee"><noscript><meta http-equiv="refresh" content="0; url=/nojs/splash"></noscript><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><meta name="apple-mobile-web-app-title" content="Duolingo"><meta name="google" content="notranslate"><meta name="mobile-web-app-capable" content="yes"><meta name="apple-itunes-app" content="app-id=570060128"><meta name="facebook-domain-verification" content="mwudgypvvgl4fekxjk5rpk3eqg7ykt"><link rel="apple-touch-icon" href="//d35aaqx5ub95lt.cloudfront.net/images/duolingo-touch-icon2.png"><link rel="shortcut icon" type="image/x-icon" href="//d35aaqx5ub95lt.cloudfront.net/favicon.ico"><script src="https://cdn.cookielaw.org/scripttemplates/otSDKStub.js" data-document-langua
 

Я очень новичок в flutter и никогда не вникал в то, как работают сеансы и файлы cookie, поэтому прошу прощения, если мой вопрос звучит тривиально.

Ответ №1:

для тех, кто посещает этот вопрос в поисках ответа, в конце концов мне удалось его найти. Это было действительно очень просто, так как все, что мне нужно было сделать, это сохранить токен из запроса post и снова передать его в заголовке запроса get

вот рабочий код:

     var header
    final response = await http.post(
          Uri.parse('https://www.duolingo.com/2017-06-30/login?fields='),
          headers: <String, String>{
            'Content-Type': 'application/json',
          },
          body: jsonEncode(<String, String>{
             'identifier': 'username',
             'password': 'password',
    
    
       
          }),
        );

 if (response.statusCode == 200) {

      header = response.headers;
    }

final resp2 = await http.get(
        Uri.parse("https://www.duolingo.com/vocabulary/overview"),
        headers: {
          HttpHeaders.authorizationHeader: header['jwt'],
        });