Не могу войти в Instagram с помощью запросов - PullRequest
5 голосов
/ 17 июня 2020

Я пытаюсь войти в Instagram, используя библиотеку requests. Мне удалось использовать следующий сценарий, но он больше не работает. Поле пароля становится зашифрованным (проверял инструменты разработчика при входе в систему вручную).

Я пробовал:

import re
import requests
from bs4 import BeautifulSoup

link = 'https://www.instagram.com/accounts/login/'
login_url = 'https://www.instagram.com/accounts/login/ajax/'

payload = {
    'username': 'someusername',
    'password': 'somepassword',
    'enc_password': '',
    'queryParams': {},
    'optIntoOneTap': 'false'
}

with requests.Session() as s:
    r = s.get(link)
    csrf = re.findall(r"csrf_token\":\"(.*?)\"",r.text)[0]
    r = s.post(login_url,data=payload,headers={
        "user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36",
        "x-requested-with": "XMLHttpRequest",
        "referer": "https://www.instagram.com/accounts/login/",
        "x-csrftoken":csrf
    })
    print(r.status_code)
    print(r.url)

Я нашел с помощью инструментов разработчика:

username: someusername
enc_password: #PWD_INSTAGRAM_BROWSER:10:1592421027:ARpQAAm7pp/etjy2dMjVtPRdJFRPu8FAGILBRyupINxLckJ3QO0u0RLmU5NaONYK2G0jQt+78BBDBxR9nrUsufbZgR02YvR8BLcHS4uN8Gu88O2Z2mQU9AH3C0Z2NpDPpS22uqUYhxDKcYS5cA==
queryParams: {"oneTapUsers":"[\"36990119985\"]"}
optIntoOneTap: false

Как мне войти в Instagram с помощью запросов?

Ответы [ 3 ]

6 голосов
/ 23 июня 2020

Вы можете использовать версию аутентификации 0 - простой пароль, без шифрования:

import re
import requests
from bs4 import BeautifulSoup

from datetime import datetime

link = 'https://www.instagram.com/accounts/login/'
login_url = 'https://www.instagram.com/accounts/login/ajax/'

time = int(datetime.now().timestamp())

payload = {
    'username': '<USERNAME HERE>',
    'enc_password': f'#PWD_INSTAGRAM_BROWSER:0:{time}:<PLAIN PASSWORD HERE>',  # <-- note the '0' - that means we want to use plain passwords
    'queryParams': {},
    'optIntoOneTap': 'false'
}

with requests.Session() as s:
    r = s.get(link)
    csrf = re.findall(r"csrf_token\":\"(.*?)\"",r.text)[0]
    r = s.post(login_url,data=payload,headers={
        "user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36",
        "x-requested-with": "XMLHttpRequest",
        "referer": "https://www.instagram.com/accounts/login/",
        "x-csrftoken":csrf
    })
    print(r.status_code)
    print(r.url)
    print(r.text)

Выводит:

200
https://www.instagram.com/accounts/login/ajax/
{"authenticated": true, "user": true, "userId": "XXXXXXXX", "oneTapPrompt": true, "reactivated": true, "status": "ok"}
2 голосов
/ 21 июня 2020

Для этого вам нужно провести расследование на их javascript.

После небольшого исследования я понял, что они используют AES-GCM с длиной ключа 256 бит, у них есть префикс из 100 байт, который я до сих пор не знаю, что это, затем они присоединяют к нему пароль и шифруют все сообщение 100 + len(password).

Вы можете прочитать о AES-GCM , получить ключ, iv и дополнительные данные из их кода и завершить работу самостоятельно.

Надеюсь, что помог, Удачи :)

0 голосов
/ 21 июня 2020

Вы не можете. Instagram шифрует пароль при отправке запроса. Если вы не поймете, как они его шифруют, и не сможете сделать то же самое с отправляемым паролем, вы не сможете войти в Instagram с запросами.

...