程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何使用 Dart 登录网站 (vk.com)?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何使用 Dart 登录网站 (vk.com)??

开发过程中遇到如何使用 Dart 登录网站 (vk.com)?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何使用 Dart 登录网站 (vk.com)?的解决方法建议,希望对你解决如何使用 Dart 登录网站 (vk.com)?有所启发或帮助;

我想登录 https://vk.com 并保存 cookie 以再次使用它。我如何进行身份验证???

import 'package:http/http.dart' as http;
import 'dart:async';

Future<voID> login() async {
  String url = 'https://vk.com';
  Map<String,String> body = {'email': 'PHONE_numbER','pass': 'passworD'};

  http.ClIEnt clIEnt = http.ClIEnt();
  http.request request = http.request('POST',Uri.parse(url));
  request.bodyFIElds = body;
  request.headers.addAll({
    'User-Agent':
        'Mozilla/5.0 (windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/61.0.3163.100 Safari/537.36','Accept': 'text/HTML,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3','Accept-EnCoding': 'gzip,deflate','Connection': 'keep-alive','DNT': '1'
  });

  var future = clIEnt.send(request).then((responsE) {
    print('status code: ' + response.statusCode.toString());
    return response.stream.bytesToString().then((value) {
      return print(value.toString());
    });
  }).catchError((error) {
    return print(error.toString());
  });
}

此代码返回:status code: 200 FormatException: Missing extension byte (at offset 630) 我需要 Python 中的 requests.session() 之类的东西

解决方法

Все оказалось проще... Неделя была потрачена не зря))))

Необходимы были библиотеки:dio、dio_cookie_manager、cookie_jar。

Одной из главных и самых глупых ошибок было использование обычного Map вместо FormData для отправки POST.заправки

import 'dart:collection';
import 'package:dio/dio.dart';
import 'package:dio_cookie_manager/dio_cookie_manager.dart';
import 'package:cookie_jar/cookie_jar.dart';

Future login() async {
  var dio = Dio();
  var cookieJar = CookieJar();
  dio.interceptors.add(CookieManager(cookieJar));
  dio.options.followRedirects = true;

  const String phone = 'PHONE';
  const String password = 'passworD';

  Map<String,String> headers = HashMap();
  headers.addAll({
    'User-Agent':
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/61.0.3163.100 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3','Accept-Encoding': 'gzip,deflate','Connection': 'keep-alive','DNT': '1',});

  String url = 'https://vk.com/';
  dio.options.headers = headers;
  cookieJar.loadForrequest(Uri.parse('https://login.vk.com/'));
  Response response = await dio.get(url);

  String remixstid = response.headers['set-cookie'].toString();
  remixstid = remixstid
      .subString(remixstid.indexOf('remixstid') + 'remixstid'.length + 1);
  remixstid = remixstid.subString(0,remixstid.indexOf(';'));

  String remixlgk = response.headers['set-cookie'].toString();
  remixlgk =
      remixlgk.subString(remixlgk.indexOf('remixlgk') + 'remixlgk'.length + 1);
  remixlgk = remixlgk.subString(0,remixlgk.indexOf(';'));

  String remixsid = response.headers['set-cookie'].toString();
  remixsid =
      remixsid.subString(remixsid.indexOf('remixsid') + 'remixsid'.length + 1);
  remixsid = remixsid.subString(0,remixsid.indexOf(';'));

  String remixusid = response.headers['set-cookie'].toString();
  remixusid = remixusid.subString(remixusid.indexOf('remixusid')+'remixusid'.length+1);
  remixusid=remixusid.subString(0,remixusid.indexOf(';'));

  String html = response.data;
  html = html.subString(html.indexOf('id="quick_login_form"'));
  html = html.subString(0,html.indexOf('</form>'));

  String start = 'action="',end = '"';
  String action = html.subString(html.indexOf(start) + start.length);
  html = action.subString(action.indexOf(end) + end.length);
  action = action.subString(0,action.indexOf(end));

  List<String> parts = html.split('<input type="');
  Map<String,String> forms = HashMap();
  parts.removeAt(0);
  String name,value;
  parts.forEach((E) {
    if (e.startsWith('hidden')) {
      start = 'name="';
      end = '"';
      name = e.subString(e.indexOf(start) + start.length);
      name = name.subString(0,name.indexOf(end));
      start = 'value="';
      value = e.subString(e.indexOf(start) + start.length);
      value = value.subString(0,value.indexOf(end));
      forms[name] = value;
    } else if (e.contains('name="')) {
      start = 'name="';
      end = '"';
      name = e.subString(e.indexOf(start) + start.length);
      name = name.subString(0,name.indexOf(end));
      if (name == 'email') {
        value = phone;
        forms[name] = value;
      } else if (name == 'pass') {
        value = password;
        forms[name] = value;
      } else
        print('No such constant!');
    }
  });

  forms['to'] = 'bG9naW4/bT0xJmVtYWlsPWFzJnRvPWFXNWtaWGd1Y0dodw--';

  var forms2 = FormData.fromMap(forms);
  response = await dio.post(
    'https://login.vk.com/',queryParameters: {'act': 'login'},data: forms2,options: Options(
      followRedirects: true,validateStatus: (status) {
        return status < 500;
      },),);

  List<String> lst = [
    'remixbdr=0','remixsid=$remixsid','remixusid=$remixusid','remixstid=$remixstid','remixflash=0.0.0','remixscreen_width=1920','remixscreen_height=1080','remixscreen_dpr=1','remixscreen_depth=24','remixscreen_orient=1','remixscreen_winzoom=1','remixseenads=0','remixlang=0','remixlhk=$remixlgk',];

  response.headers.forEach((name,values) {
    if (name.contains('remixq')) {
      lst.add(name + '=' + values.join());
    }
  });

  dio.options.headers['cookie'] = lst.join('; ');

  String LOCATIOn = response.headers['LOCATIOn'].toString();
  int length = LOCATIOn.length - 1;
  LOCATIOn = LOCATIOn.subString(1,length);

  Map<String,String> queryParams = {};

  String tmp = LOCATIOn.subString(LOCATIOn.indexOf('?') + 1);
  LOCATIOn = LOCATIOn.subString(0,LOCATIOn.indexOf('?'));

  List<String> params = tmp.split('&');
  params.forEach((element) {
    List<String> kv = element.split('=');
    queryParams.putIfAbsent(kv[0],() => kv[1]);
  });

  queryParams['to'] = 'aW5kZXgucGhw';

  response = await dio.get(LOCATIOn,queryParameters: queryParams);
  print('LOGIN : '+response.data.toString().contains('onLoginDone').toString());
}

大佬总结

以上是大佬教程为你收集整理的如何使用 Dart 登录网站 (vk.com)?全部内容,希望文章能够帮你解决如何使用 Dart 登录网站 (vk.com)?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:如何使用