相同的请求在 Fiddler 中有效,但在 Request 中无效
Same request works in Fiddler but not in Requets
我正在尝试使用请求从 Python 编辑我的 Instagram 个人资料。我可以轻松登录并执行 follows/etc,但我无法编辑个人资料。我不断收到 403 错误或 400 错误。当我漂亮地打印我的 Python 原始请求时,它看起来像这样(这些是我的虚拟帐户的 cookie):
POST https://www.instagram.com/accounts/edit/
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101
Firefox/58.0
Accept-Encoding: gzip, deflate, br
Accept: */*
Connection: keep-alive
Host: www.instagram.com
Content-Length: 131
Origin: https://www.instagram.com
Content-Type: application/x-www-form-urlencoded
X-Requested-With: XMLHttpRequest
X-CSRFToken: buJOTJT8lR2XcTL6WU5G9Rviq3mjmhaa
X-Instagram-AJAX: 314b21580dde
DNT: 1
Referer: https://www.instagram.com/accounts/edit/
Accept-Language: et-EE,et;q=0.9,en-US;q=0.8,en;q=0.7,ar;q=0.6
Cookie: mid=W1WlVQALAAEfLNtIlXn2CtR3XAUF; ig_cb=1; mcd=3;
ds_user_id=8271265936;
sessionid=IGSCad223c2888974f0472cea36f3
16b1d3caab2feaa3bf519fa3652da183dca2446%3
ARItc316HmDIUvwjI8BOJCzyvuFkHbeXd%3A%7B%
22_auth_user_id%22%3A8271265936%2C%22_aut
h_user_backend%22%3A%22accounts.backends.
CaseInsensitiveModelBackend%22%2C%22_auth_user_hash%
22%3A%22%22%2C%22_platform%
22%3A4%2C%22_token_ver%22%3A2%2C%22_tok
en%22%3A%228271265936%3AXMCx3bjvUtWEy3A37
cDnQiQ9ysQBaGw9%3A5aaef5c33915c937439a14292
048d8ae0555d5bf949befcd5a9a8a209808e7c9%22%2C%22
last_refreshed%22%3A1532306445.48
36139679%7D; rur=PRN; urlgen="{"time": 1532295222, "88.196.120.23": 3249,
"2001:7d0:8b1b:d80:59ac:b6fd:fc77:754f":
3249}:1fhOwz:lMzBvH8bTYwoOqWauglUMXbkGCU
我的 POST 数据正文:
first_name=888&email=ml162uju%40email.org&
username=6relvwyv&phone_number=&gender=1&biography
=&external_url=&chaining_enabled=on400
当我通过 fiddler 发送这个确切的请求时它有效,我得到 200,但是通过 Python 我得到 403 或 400。我尝试将数据作为原始字符串和字典发送,但两者都 return 错误。
代码:
self.s = requests.Session()
self.s.cookies.clear()
self.s.headers.update({'Host': 'www.instagram.com',
'Connection': 'keep-alive',
'Content-Length': '136',
'Origin': 'https://www.instagram.com',
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': '*/*',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0',
'X-CSRFToken': 'buJOTJT8lR2XcTL6WU5G9Rviq3mjmhaa',
'X-Instagram-AJAX': '314b21580dde',
'DNT': '1',
'Referer': 'https://www.instagram.com/accounts/edit/',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'et-EE,et;q=0.9,en-US;q=0.8,en;q=0.7,ar;q=0.6',
'Cookie': """mid=W1WlVQALAAEfLNtIlXn2CtR3XAUF; ig_cb=1; mcd=3; ds_user_id=8271265936; sessionid=IGSCad223c2888974f0472cea36f316b1d3caab2feaa3bf519fa3652da183dca2446%3ARItc316HmDIUvwjI8BOJCzyvuFkHbeXd%3A%7B%22_auth_user_id%22%3A8271265936%2C%22_auth_user_backend%22%3A%22accounts.backends.CaseInsensitiveModelBackend%22%2C%22_auth_user_hash%22%3A%22%22%2C%22_platform%22%3A4%2C%22_token_ver%22%3A2%2C%22_token%22%3A%228271265936%3AXMCx3bjvUtWEy3A37cDnQiQ9ysQBaGw9%3A5aaef5c33915c937439a14292048d8ae0555d5bf949befcd5a9a8a209808e7c9%22%2C%22last_refreshed%22%3A1532306445.4836139679%7D; rur=PRN; urlgen="{\"time\": 15322952224 \"88.196.120.23\": 32494 \"2001:7d0:8b1b:d80:59ac:b6fd:fc77:754f\": 3249}:1fhOwz:lMzBvH8bTYwoOqWauglUMXbkGCU"""
})
r = self.s.get('https://www.instagram.com/accounts/edit/?__a=1')
data = r.json()
self.form = data['form_data']
data_x = {'first_name': self.check(first_name, 'first_name'),
'email': self.check(email, 'email'),
'username': self.check(username, 'username'),
'phone_number': self.check(phone_number, 'phone_number'),
'gender': '3',
'biography': self.check(biography, 'biography'),
'external_url': self.check(external_url, 'external_url'),
'chaining_enabled': 'on'
}
r = self.s.post('https://www.instagram.com/accounts/edit/', data=data_x)
print(r.status_code)
尝试将 cookie 传递给请求模块以及 headers(尝试使用和不使用)
import http.cookies
str_cookies = """mid=W1WlVQALAAEfLNtIlXn2CtR3XAUF; ig_cb=1; mcd=3; ds_user_id=8271265936; sessionid=IGSCad223c2888974f0472cea36f316b1d3caab2feaa3bf519fa3652da183dca2446%3ARItc316HmDIUvwjI8BOJCzyvuFkHbeXd%3A%7B%22_auth_user_id%22%3A8271265936%2C%22_auth_user_backend%22%3A%22accounts.backends.CaseInsensitiveModelBackend%22%2C%22_auth_user_hash%22%3A%22%22%2C%22_platform%22%3A4%2C%22_token_ver%22%3A2%2C%22_token%22%3A%228271265936%3AXMCx3bjvUtWEy3A37cDnQiQ9ysQBaGw9%3A5aaef5c33915c937439a14292048d8ae0555d5bf949befcd5a9a8a209808e7c9%22%2C%22last_refreshed%22%3A1532306445.4836139679%7D; rur=PRN; urlgen="{\"time\": 15322952224 \"88.196.120.23\": 32494 \"2001:7d0:8b1b:d80:59ac:b6fd:fc77:754f\": 3249}:1fhOwz:lMzBvH8bTYwoOqWauglUMXbkGCU"""\
cookie_object = http.cookies.SimpleCookie(str_cookies)
cookies = {}
for key, morsel in cookie_object.items():
cookies[key] = morsel.value
requests.post(.... , cookies=cookies)
我建议您使用这个 instagram_private_api python 模块,它已经实现了您可能需要的大部分方法,而不是您自己构建它
我正在尝试使用请求从 Python 编辑我的 Instagram 个人资料。我可以轻松登录并执行 follows/etc,但我无法编辑个人资料。我不断收到 403 错误或 400 错误。当我漂亮地打印我的 Python 原始请求时,它看起来像这样(这些是我的虚拟帐户的 cookie):
POST https://www.instagram.com/accounts/edit/
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101
Firefox/58.0
Accept-Encoding: gzip, deflate, br
Accept: */*
Connection: keep-alive
Host: www.instagram.com
Content-Length: 131
Origin: https://www.instagram.com
Content-Type: application/x-www-form-urlencoded
X-Requested-With: XMLHttpRequest
X-CSRFToken: buJOTJT8lR2XcTL6WU5G9Rviq3mjmhaa
X-Instagram-AJAX: 314b21580dde
DNT: 1
Referer: https://www.instagram.com/accounts/edit/
Accept-Language: et-EE,et;q=0.9,en-US;q=0.8,en;q=0.7,ar;q=0.6
Cookie: mid=W1WlVQALAAEfLNtIlXn2CtR3XAUF; ig_cb=1; mcd=3;
ds_user_id=8271265936;
sessionid=IGSCad223c2888974f0472cea36f3
16b1d3caab2feaa3bf519fa3652da183dca2446%3
ARItc316HmDIUvwjI8BOJCzyvuFkHbeXd%3A%7B%
22_auth_user_id%22%3A8271265936%2C%22_aut
h_user_backend%22%3A%22accounts.backends.
CaseInsensitiveModelBackend%22%2C%22_auth_user_hash%
22%3A%22%22%2C%22_platform%
22%3A4%2C%22_token_ver%22%3A2%2C%22_tok
en%22%3A%228271265936%3AXMCx3bjvUtWEy3A37
cDnQiQ9ysQBaGw9%3A5aaef5c33915c937439a14292
048d8ae0555d5bf949befcd5a9a8a209808e7c9%22%2C%22
last_refreshed%22%3A1532306445.48
36139679%7D; rur=PRN; urlgen="{"time": 1532295222, "88.196.120.23": 3249,
"2001:7d0:8b1b:d80:59ac:b6fd:fc77:754f":
3249}:1fhOwz:lMzBvH8bTYwoOqWauglUMXbkGCU
我的 POST 数据正文:
first_name=888&email=ml162uju%40email.org&
username=6relvwyv&phone_number=&gender=1&biography
=&external_url=&chaining_enabled=on400
当我通过 fiddler 发送这个确切的请求时它有效,我得到 200,但是通过 Python 我得到 403 或 400。我尝试将数据作为原始字符串和字典发送,但两者都 return 错误。
代码:
self.s = requests.Session()
self.s.cookies.clear()
self.s.headers.update({'Host': 'www.instagram.com',
'Connection': 'keep-alive',
'Content-Length': '136',
'Origin': 'https://www.instagram.com',
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': '*/*',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0',
'X-CSRFToken': 'buJOTJT8lR2XcTL6WU5G9Rviq3mjmhaa',
'X-Instagram-AJAX': '314b21580dde',
'DNT': '1',
'Referer': 'https://www.instagram.com/accounts/edit/',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'et-EE,et;q=0.9,en-US;q=0.8,en;q=0.7,ar;q=0.6',
'Cookie': """mid=W1WlVQALAAEfLNtIlXn2CtR3XAUF; ig_cb=1; mcd=3; ds_user_id=8271265936; sessionid=IGSCad223c2888974f0472cea36f316b1d3caab2feaa3bf519fa3652da183dca2446%3ARItc316HmDIUvwjI8BOJCzyvuFkHbeXd%3A%7B%22_auth_user_id%22%3A8271265936%2C%22_auth_user_backend%22%3A%22accounts.backends.CaseInsensitiveModelBackend%22%2C%22_auth_user_hash%22%3A%22%22%2C%22_platform%22%3A4%2C%22_token_ver%22%3A2%2C%22_token%22%3A%228271265936%3AXMCx3bjvUtWEy3A37cDnQiQ9ysQBaGw9%3A5aaef5c33915c937439a14292048d8ae0555d5bf949befcd5a9a8a209808e7c9%22%2C%22last_refreshed%22%3A1532306445.4836139679%7D; rur=PRN; urlgen="{\"time\": 15322952224 \"88.196.120.23\": 32494 \"2001:7d0:8b1b:d80:59ac:b6fd:fc77:754f\": 3249}:1fhOwz:lMzBvH8bTYwoOqWauglUMXbkGCU"""
})
r = self.s.get('https://www.instagram.com/accounts/edit/?__a=1')
data = r.json()
self.form = data['form_data']
data_x = {'first_name': self.check(first_name, 'first_name'),
'email': self.check(email, 'email'),
'username': self.check(username, 'username'),
'phone_number': self.check(phone_number, 'phone_number'),
'gender': '3',
'biography': self.check(biography, 'biography'),
'external_url': self.check(external_url, 'external_url'),
'chaining_enabled': 'on'
}
r = self.s.post('https://www.instagram.com/accounts/edit/', data=data_x)
print(r.status_code)
尝试将 cookie 传递给请求模块以及 headers(尝试使用和不使用)
import http.cookies
str_cookies = """mid=W1WlVQALAAEfLNtIlXn2CtR3XAUF; ig_cb=1; mcd=3; ds_user_id=8271265936; sessionid=IGSCad223c2888974f0472cea36f316b1d3caab2feaa3bf519fa3652da183dca2446%3ARItc316HmDIUvwjI8BOJCzyvuFkHbeXd%3A%7B%22_auth_user_id%22%3A8271265936%2C%22_auth_user_backend%22%3A%22accounts.backends.CaseInsensitiveModelBackend%22%2C%22_auth_user_hash%22%3A%22%22%2C%22_platform%22%3A4%2C%22_token_ver%22%3A2%2C%22_token%22%3A%228271265936%3AXMCx3bjvUtWEy3A37cDnQiQ9ysQBaGw9%3A5aaef5c33915c937439a14292048d8ae0555d5bf949befcd5a9a8a209808e7c9%22%2C%22last_refreshed%22%3A1532306445.4836139679%7D; rur=PRN; urlgen="{\"time\": 15322952224 \"88.196.120.23\": 32494 \"2001:7d0:8b1b:d80:59ac:b6fd:fc77:754f\": 3249}:1fhOwz:lMzBvH8bTYwoOqWauglUMXbkGCU"""\
cookie_object = http.cookies.SimpleCookie(str_cookies)
cookies = {}
for key, morsel in cookie_object.items():
cookies[key] = morsel.value
requests.post(.... , cookies=cookies)
我建议您使用这个 instagram_private_api python 模块,它已经实现了您可能需要的大部分方法,而不是您自己构建它