无法使用请求登录 Instagram

Can't login to Instagram using requests

我正在尝试使用 requests 库登录 Instagram。我成功地使用了以下脚本,但是它不再起作用了。密码字段被加密(手动登录时检查了开发工具)。

我试过了:

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?

你不能。发送请求时,Instagram 会加密密码。除非你能弄清楚他们加密它的方式并且能够用你发送的密码做同样的事情,否则你无法通过请求登录 instagram。

为此,您需要对他们的 javascript 做一些调查工作。

经过一番研究,我得知他们使用的是 256 位密钥长度的 AES-GCM,他们有一些 100 字节的前缀,我仍然不知道它是什么,然后他们将密码连接到它并加密整个消息 100 + len(password).

您可以阅读 AES-GCM,从他们的代码中获取密钥、iv 和其他数据,然后自己完成工作。

希望对您有所帮助,祝您好运:)

您可以使用身份验证版本 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"}

@Andrej Kesely 提供的上述代码对我来说失败了。但我通过在第一个获取“s.get(link)”请求中设置 header(user-agent 和 Referer) 对代码进行了一些更改。 如果你也遇到和我一样的错误。

csrf = re.findall(r"csrf_token\":\"(.*?)\"",r.text)[0]
IndexError: list index out of range

那么这就是我上面告诉你的解决方案。

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/'
userAgent= "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"

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

payload = {
'username': '<Your_Username>',
'enc_password': f'#PWD_INSTAGRAM_BROWSER:0:{time}:<Your_Password>',
'queryParams': {},
'optIntoOneTap': 'false'
}

with requests.Session() as s:
    s.headers= {"user-agent":userAgent}
    s.headers.update({"Referer":link})
    r = s.get(link)
    print(r)
    csrf = re.findall(r"csrf_token\":\"(.*?)\"",r.text)[0]
    r = s.post(login_url,data=payload,headers={
    "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 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)

请使用 python3 版本来 运行 此脚本。否则你会得到更多关于“格式化字符串文字”和“AttributeError: 'datetime.datetime' object has no attribute 'timestamp'”的错误。

运行 脚本是这样的。

python3 <your_script_name.py>

希望这能解决您的问题。