Python 简单instagram bot的环境变量
我下载了这个机器人(为了教育目的,如果它使它更好), 现在的问题是,当我试图运行程序时,它会说Python 简单instagram bot的环境变量,python,python-3.x,pycharm,instagram,Python,Python 3.x,Pycharm,Instagram,我下载了这个机器人(为了教育目的,如果它使它更好), 现在的问题是,当我试图运行程序时,它会说 please provide USERNAME and PASSWORD environement variables. Abording... 当然,这一行只是代码的一部分,但我不确定如何或在何处输入我的帐户详细信息(在pycharm内部或外部) 我试着把它放在写着“用户名”或“密码”的地方——在大写字母或其他字母之间切换,但什么也没发生 post_data = { 'user
please provide USERNAME and PASSWORD environement variables. Abording...
当然,这一行只是代码的一部分,但我不确定如何或在何处输入我的帐户详细信息(在pycharm内部或外部)
我试着把它放在写着“用户名”或“密码”的地方——在大写字母或其他字母之间切换,但什么也没发生
post_data = {
'username': os.environ.get('USERNAME'),
'password': os.environ.get('PASSWORD')
}
主要代码:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import time
import random
import requests
import json
import re
instagram_url = 'https://www.instagram.com'
login_route = '%s/accounts/login/ajax/' % (instagram_url)
logout_route = '%s/accounts/logout/' % (instagram_url)
profile_route = '%s/%s/'
query_route = '%s/graphql/query/' % (instagram_url)
unfollow_route = '%s/web/friendships/%s/unfollow/'
session = requests.Session()
def login():
session.headers.update({
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'en-US,en;q=0.8',
'Connection': 'keep-alive',
'Content-Length': '0',
'Host': 'www.instagram.com',
'Origin': 'https://www.instagram.com',
'Referer': 'https://www.instagram.com/',
'User-Agent': ('Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 \
(KHTML, like Gecko) Chrome/48.0.2564.103 Safari/537.36'),
'X-Instagram-AJAX': '1',
'X-Requested-With': 'XMLHttpRequest'
})
session.cookies.update({
'ig_pr': '1',
'ig_vw': '1920',
})
reponse = session.get(instagram_url)
session.headers.update({
'X-CSRFToken': reponse.cookies['csrftoken']
})
time.sleep(random.randint(2, 6))
post_data = {
'username': os.environ.get('USERNAME'),
'password': os.environ.get('PASSWORD')
}
response = session.post(login_route, data=post_data, allow_redirects=True)
response_data = json.loads(response.text)
if response_data['authenticated']:
session.headers.update({
'X-CSRFToken': response.cookies['csrftoken']
})
return response_data['authenticated']
# Not so useful, it's just to simulate human actions better
def get_user_profile(username):
response = session.get(profile_route % (instagram_url, username))
extract = re.search(r'window._sharedData = (.+);</script>', str(response.text))
response = json.loads(extract.group(1))
return response['entry_data']['ProfilePage'][0]['graphql']['user']
def get_followers_list():
followers_list = []
query_hash = '56066f031e6239f35a904ac20c9f37d9'
variables = {
"id":session.cookies['ds_user_id'],
"include_reel":False,
"fetch_mutual":False,
"first":50
}
response = session.get(query_route, params={'query_hash': query_hash, 'variables': json.dumps(variables)})
while response.status_code != 200:
time.sleep(600) # querying too much, sleeping a bit before querying again
response = session.get(query_route, params={'query_hash': query_hash, 'variables': json.dumps(variables)})
print('.', end='', flush=True)
response = json.loads(response.text)
for edge in response['data']['user']['edge_followed_by']['edges']:
followers_list.append(edge['node'])
while response['data']['user']['edge_followed_by']['page_info']['has_next_page']:
variables['after'] = response['data']['user']['edge_followed_by']['page_info']['end_cursor']
time.sleep(2)
response = session.get(query_route, params={'query_hash': query_hash, 'variables': json.dumps(variables)})
while response.status_code != 200:
time.sleep(600) # querying too much, sleeping a bit before querying again
response = session.get(query_route, params={'query_hash': query_hash, 'variables': json.dumps(variables)})
print('.', end='', flush=True)
response = json.loads(response.text)
for edge in response['data']['user']['edge_followed_by']['edges']:
followers_list.append(edge['node'])
return followers_list
def get_following_list():
follows_list = []
query_hash = 'c56ee0ae1f89cdbd1c89e2bc6b8f3d18'
variables = {
"id":session.cookies['ds_user_id'],
"include_reel":False,
"fetch_mutual":False,
"first":50
}
response = session.get(query_route, params={'query_hash': query_hash, 'variables': json.dumps(variables)})
while response.status_code != 200:
time.sleep(600) # querying too much, sleeping a bit before querying again
response = session.get(query_route, params={'query_hash': query_hash, 'variables': json.dumps(variables)})
print('.', end='', flush=True)
response = json.loads(response.text)
for edge in response['data']['user']['edge_follow']['edges']:
follows_list.append(edge['node'])
while response['data']['user']['edge_follow']['page_info']['has_next_page']:
variables['after'] = response['data']['user']['edge_follow']['page_info']['end_cursor']
time.sleep(2)
response = session.get(query_route, params={'query_hash': query_hash, 'variables': json.dumps(variables)})
while response.status_code != 200:
time.sleep(600) # querying too much, sleeping a bit before querying again
response = session.get(query_route, params={'query_hash': query_hash, 'variables': json.dumps(variables)})
print('.', end='', flush=True)
response = json.loads(response.text)
for edge in response['data']['user']['edge_follow']['edges']:
follows_list.append(edge['node'])
return follows_list
def unfollow(user):
response = session.get(profile_route % (instagram_url, user['username']))
time.sleep(random.randint(2, 4))
# update header again, idk why it changed
session.headers.update({
'X-CSRFToken': response.cookies['csrftoken']
})
response = session.post(unfollow_route % (instagram_url, user['id']))
response = json.loads(response.text)
if response['status'] != 'ok':
print('Error while trying to unfollow {}. Retrying in a bit...'.format(user['username']))
print('ERROR: {}'.format(unfollow.text))
return False
return True
def logout():
post_data = {
'csrfmiddlewaretoken': session.cookies['csrftoken']
}
logout = session.post(logout_route, data=post_data)
if logout.status_code != 200:
return False
return True
def main():
if not os.environ.get('USERNAME') or not os.environ.get('PASSWORD'):
sys.exit('please provide USERNAME and PASSWORD environement variables. Abording...')
is_logged = login()
if is_logged == False:
sys.exit('login failed, verify user/password combination')
time.sleep(random.randint(2, 4))
connected_user = get_user_profile(os.environ.get('USERNAME'))
print('You\'re now logged as {} ({} followers, {} following)'.format(connected_user['username'], connected_user['edge_followed_by']['count'], connected_user['edge_follow']['count']))
time.sleep(random.randint(2, 4))
print('building followers list...', end='', flush=True)
followers_list = get_followers_list()
print(' done')
print('building following list...', end='', flush=True)
following_list = get_following_list()
print(' done')
unfollow_users_list = [user for user in following_list if user not in followers_list]
print('you are following {} user(s) who aren\'t following you.'.format(len(unfollow_users_list)))
if len(unfollow_users_list) > 0:
print('Begin to unfollow users...')
for user in unfollow_users_list:
if not os.environ.get('UNFOLLOW_VERIFIED') and user['is_verified'] == True:
continue
time.sleep(random.randint(2, 4))
print('unfollowing {}'.format(user['username']))
while unfollow(user) == False:
time.sleep(random.randint(1, 3) * 1000) # High number on purpose
is_logged_out = logout()
if is_logged_out:
sys.exit(0)
if __name__ == "__main__":
main()
#/usr/bin/env python
#-*-编码:utf-8-*-
导入操作系统
导入系统
导入时间
随机输入
导入请求
导入json
进口稀土
instagramhttps://www.instagram.com'
登录路径=“%s/accounts/login/ajax/”%(instagram\u url)
注销路径='%s/帐户/注销/'%(instagram\u url)
配置文件\路由='%s/%s/'
查询路径=“%s/graphql/query/”%(instagram\u url)
取消跟随路径=“%s/web/friendships/%s/unfollow/”
会话=请求。会话()
def login():
session.headers.update({
“接受编码”:“gzip,deflate”,
‘接受语言’:‘en-US,en;q=0.8’,
“连接”:“保持活动状态”,
“内容长度”:“0”,
“主机”:“www.instagram.com”,
“来源”:https://www.instagram.com',
“Referer”:https://www.instagram.com/',
“用户代理”:(Mozilla/5.0(Windows NT 10.0;WOW64)AppleWebKit/537.36\
(KHTML,如壁虎)铬/48.0.2564.103狩猎/537.36’,
“X-Instagram-AJAX”:“1”,
“X-request-With':“XMLHttpRequest”
})
session.cookies.update({
“ig_pr”:“1”,
"ig_vw":"1920",,
})
response=session.get(instagram\u url)
session.headers.update({
“X-CSRFToken”:reponse.cookies['CSRFToken']
})
时间.睡眠(random.randint(2,6))
post_数据={
“用户名”:os.environ.get('username'),
“密码”:os.environ.get('password')
}
response=session.post(登录路径,数据=post\u数据,允许重定向=True)
response\u data=json.load(response.text)
如果响应_数据['authenticated']:
session.headers.update({
“X-CSRFToken”:响应.cookies['CSRFToken']
})
返回响应_数据['authenticated']
#没什么用,只是为了更好地模拟人类的行为
def get_user_配置文件(用户名):
response=session.get(profile\u route%(instagram\u url,用户名))
extract=re.search(r'window.\u sharedData=(.+);”,str(response.text))
response=json.load(extract.group(1))
返回响应['entry_data']['ProfilePage'][0]['graphql']['user']
def get_followers_list():
追随者列表=[]
查询_散列='56066f031e6239f35a904ac20c9f37d9'
变量={
“id”:session.cookies['ds\u user\u id'],
“包含卷盘”:错误,
“fetch_mutual”:False,
“第一”:50
}
response=session.get(查询路径,参数={'query\u hash':查询散列'variables':json.dumps(variables)})
while response.status_code!=200:
时间。睡眠(600)#查询太多,在再次查询之前先睡一会儿
response=session.get(查询路径,参数={'query\u hash':查询散列'variables':json.dumps(variables)})
打印('.',结束='',刷新=真)
response=json.load(response.text)
对于响应中的边缘['data']['user']['edge\u后跟']['edges']:
followers\u list.append(边['node'])
当响应['data']['user']['edge\u后跟']['page\u info']['has\u next\u page']时:
变量['after']=响应['data']['user']['edge\u后跟']['page\u info']['end\u cursor']
时间。睡眠(2)
response=session.get(查询路径,参数={'query\u hash':查询散列'variables':json.dumps(variables)})
while response.status_code!=200:
时间。睡眠(600)#查询太多,在再次查询之前先睡一会儿
response=session.get(查询路径,参数={'query\u hash':查询散列'variables':json.dumps(variables)})
打印('.',结束='',刷新=真)
response=json.load(response.text)
对于响应中的边缘['data']['user']['edge\u后跟']['edges']:
followers\u list.append(边['node'])
返回追随者列表
def get_以下_列表():
以下是_列表=[]
查询_散列='c56ee0ae1f89cdbd1c89e2bc6b8f3d18'
变量={
“id”:session.cookies['ds\u user\u id'],
“包含卷盘”:错误,
“fetch_mutual”:False,
“第一”:50
}
response=session.get(查询路径,参数={'query\u hash':查询散列'variables':json.dumps(variables)})
while response.status_code!=200:
时间。睡眠(600)#查询太多,在再次查询之前先睡一会儿
response=session.get(查询路径,参数={'query\u hash':查询散列'variables':json.dumps(variables)})
打印('.',结束='',刷新=真)
response=json.load(response.text)
对于响应中的边缘['data']['user']['edge\u follow']['edges']:
跟随列表。追加(边['node'])
当响应['data']['user']['edge\u follow']['page\u info']['has\u next\u page']时:
变量['after']=响应['data']['user']['edge\u follow']['page\u info']['end\u cursor']
时间。睡眠(2)
response=session.get(查询路径,参数={'query\u hash':查询散列'variables':json.dumps(variables)})
while response.status_code!=200:
时间。睡眠(600)#查询太多,在再次查询之前先睡一会儿
response=session.get(查询路径,参数={'query\u hash':查询散列'variables':json.dumps(variables)})
打印('.',结束='',刷新=真)
response=json.load(response.text)
对于响应中的边缘['data']['user']['edge\u follow']['edges']:
跟随列表。追加(边['node'])
返回以下列表
def取消跟踪(用户):
response=session.get(profile\u route%(instagram\u url,用户['username']))
时间。睡眠(random.randint(2,4))
#再次更新标题,idk更改原因
session.headers.update({
“X-CSRFToken”:响应.cookies['CSRFToken']
})
响应=会话。