python - 如何使用 python 请求登录 instagram?

标签 python python-requests instagram

您好,我正在尝试使用 python requests 库登录 instagram,但是当我尝试时,instagram 将我变成了“错误请求”。有谁知道我该如何解决这个问题?

我试图找到解决这个问题的方法,但我没有找到任何东西。请帮忙,谢谢!

它正在工作,但过了一段时间,它开始变成“错误的请求”

这是我的代码:

import os
import requests
import getpass
import json
import io
import time

X_SECOND = 60
BASE_URL = "https://www.instagram.com/"
LOGIN_URL = BASE_URL + "accounts/login/ajax/"
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; ) Gecko/20100101 Firefox/65.0"
CHANGE_URL = "https://www.instagram.com/accounts/web_change_profile_picture/"
CHNAGE_DATA = {"Content-Disposition": "form-data", "name": "profile_pic",
               "filename": "profilepic.jpg", "Content-Type": "image/jpeg"}
headers = {
    "Host": "www.instagram.com",
    "Accept": "*/*",
    "Accept-Language": "en-US,en;q=0.5",
    "Accept-Encoding": "gzip, deflate, br",
    "Referer": "https://www.instagram.com/accounts/edit/",
    "X-IG-App-ID": "936619743392459",
    "X-Requested-With": "XMLHttpRequest",
    "DNT": "1",
    "Connection": "keep-alive",
}
session = requests.Session()
session.headers = {'user-agent': USER_AGENT, 'Referer': BASE_URL}


def login():
    USERNAME = str(input('Username > '))
    PASSWD = getpass.getpass('Password > ')
    resp = session.get(BASE_URL)
    session.headers.update({'X-CSRFToken': resp.cookies['csrftoken']})
    login_data = {'username': USERNAME, 'password': PASSWD}
    login_resp = session.post(LOGIN_URL, data=login_data, allow_redirects=True)
    print(login_resp.text)  # it turns "bad request"
    time.sleep(100)
    if login_resp.json()['authenticated']:
        print("Login successful")
    else:
        print("Login failed!")
        login()
    # print(login.json())
    session.headers.update({'X-CSRFToken': login_resp.cookies['csrftoken']})


def save():
    with open('cookies.txt', 'w+') as f:
        json.dump(session.cookies.get_dict(), f)
    with open('headers.txt', 'w+') as f:
        json.dump(session.headers, f)


def load():
    with open('cookies.txt', 'r') as f:
        session.cookies.update(json.load(f))
    with open('headers.txt', 'r') as f:
        session.headers = json.load(f)


def change():
    session.headers.update(headers)
    try:
        print("wow"+str(i))
        with open("./data/wow"+str(i)+".png", "rb") as resp:
            f = resp.read()
        print("1")
        p_pic = bytes(f)
        print("2")
        p_pic_s = len(f)
        print("3")
        session.headers.update({'Content-Length': str(p_pic_s)})
        print("4")
        files = {'profile_pic': p_pic}
        print("5")
        r = session.post(CHANGE_URL, files=files, data=CHNAGE_DATA)
        print("6")
        if r.json()['changed_profile']:
            print("Profile picture changed!")
        else:
            print("Something went wrong")
        time.sleep(X_SECOND)
    except Exception as e:
        print(e)
        pass
        time.sleep(10)


if __name__ == "__main__":
    i = 0
    try:
        load()
    except:
        login()
        save()
    while True:
        if i == 12:
            i = 0
        i += 1
        change()


更新

instaloader 用户现在也遇到了同样的问题
https://github.com/instaloader/instaloader/issues/615

最佳答案

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

time = int(datetime.now().timestamp())
response = requests.get(link)
csrf = response.cookies['csrftoken']

payload = {
    'username': username,
    'enc_password': f'#PWD_INSTAGRAM_BROWSER:0:{time}:{password}',
    'queryParams': {},
    'optIntoOneTap': 'false'
}

login_header = {
    "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
}

login_response = requests.post(login_url, data=payload, headers=login_header)
json_data = json.loads(login_response.text)

if json_data["authenticated"]:

    print("login successful")
    cookies = login_response.cookies
    cookie_jar = cookies.get_dict()
    csrf_token = cookie_jar['csrftoken']
    print("csrf_token: ", csrf_token)
    session_id = cookie_jar['sessionid']
    print("session_id: ", session_id)
else:
    print("login failed ", login_response.text)
您可以在此处找到完整指南:
Share a post into your Instagram account using the requests library.

关于python - 如何使用 python 请求登录 instagram?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61819842/

相关文章:

python - 在 python 上按路径上传视频文件不起作用

python - 如何在不发出示例请求的情况下检查 requests.Session 是否已通过身份验证?

javascript - 如何从 Instagram 获取基于用户和基于标签的照片

ios - Instagram/tags/\(hashtag)/media/recent 端点不返回分页?

ios - Swift:垂直滚动内水平滚动内垂直滚动

python - 如何让 flycheck 使用 virtualenv

python - 如何在 Mac OSX 上安装 flask-mysqldb?

python - requests.exceptions.HTTPError 与 requests.HTTPError

python - Pytest 在一个函数中两次使用相同的 fixture

python - SQL 中的 KD 树实现