
Github每日精选(第47期): Instagram开源情报工具Osintgram
是 Instagram 上的开源情报工具。它提供了一个交互式外壳,可以通过其昵称对任何用户的。提供了一个交互式外壳,可以通过其昵称对任何用户的。命令为您填充此文件。
·
Osintgram
Osintgram
是 Instagram 上的开源情报工具。它提供了一个交互式外壳,可以通过其昵称对任何用户的 Instagram
帐户进行分析。
工具和命令
Osintgram
提供了一个交互式外壳,可以通过其昵称对任何用户的 Instagram
帐户进行分析。你可以得到:
- addrs Get all registered addressed by target photos
- captions Get user's photos captions
- comments Get total comments of target's posts
- followers Get target followers
- followings Get users followed by target
- fwersemail Get email of target followers
- fwingsemail Get email of users followed by target
- fwersnumber Get phone number of target followers
- fwingsnumber Get phone number of users followed by target
- hashtags Get hashtags used by target
- info Get target info
- likes Get total likes of target's posts
- mediatype Get user's posts type (photo or video)
- photodes Get description of target's photos
- photos Download user's photos in output folder
- propic Download user's profile picture
- stories Download user's stories
- tagged Get list of users tagged by target
- wcommented Get a list of user who commented target's photos
- wtagged Get a list of user who tagged target
安装
- clone 下载这个 repo
git clone https://github.com/Datalux/Osintgram.git
- 导航到目录
cd Osintgram
- 为这个项目创建一个虚拟环境
python3 -m venv venv
- 加载虚拟环境
- 在
Windows Powershell
上:.\venv\Scripts\activate.ps1
- 在
Linux
和Git Bash
上:source venv/bin/activate
- 执行
pip install -r requirements.txt
- 打开
credentials.ini
文件config
夹中的文件,并在相应字段中写入您的Instagram
帐户用户名和密码
或者,您可以运行make setup
命令为您填充此文件。
- 以两种方式之一运行 main.py 脚本
- 作为交互式提示
python3 main.py <target username>
- 或立即执行您的命令
python3 main.py <target username> --command <command>
代码分析
获取用户的关注:
def get_followings(self):
if self.check_private_profile():
return
pc.printout("Searching for target followings...\n")
_followings = []
followings = []
rank_token = AppClient.generate_uuid()
data = self.api.user_following(str(self.target_id), rank_token=rank_token)
_followings.extend(data.get('users', []))
next_max_id = data.get('next_max_id')
while next_max_id:
sys.stdout.write("\rCatched %i followings" % len(_followings))
sys.stdout.flush()
results = self.api.user_following(str(self.target_id), rank_token=rank_token, max_id=next_max_id)
_followings.extend(results.get('users', []))
next_max_id = results.get('next_max_id')
print("\n")
for user in _followings:
u = {
'id': user['pk'],
'username': user['username'],
'full_name': user['full_name']
}
followings.append(u)
t = PrettyTable(['ID', 'Username', 'Full Name'])
t.align["ID"] = "l"
t.align["Username"] = "l"
t.align["Full Name"] = "l"
json_data = {}
followings_list = []
for node in followings:
t.add_row([str(node['id']), node['username'], node['full_name']])
if self.jsonDump:
follow = {
'id': node['id'],
'username': node['username'],
'full_name': node['full_name']
}
followings_list.append(follow)
if self.writeFile:
file_name = self.output_dir + "/" + self.target + "_followings.txt"
file = open(file_name, "w")
file.write(str(t))
file.close()
if self.jsonDump:
json_data['followings'] = followings_list
json_file_name = self.output_dir + "/" + self.target + "_followings.json"
with open(json_file_name, 'w') as f:
json.dump(json_data, f)
print(t)
获取用户信息:
def get_user_info(self):
try:
endpoint = 'users/{user_id!s}/full_detail_info/'.format(**{'user_id': self.target_id})
content = self.api._call_api(endpoint)
data = content['user_detail']['user']
pc.printout("[ID] ", pc.GREEN)
pc.printout(str(data['pk']) + '\n')
pc.printout("[FULL NAME] ", pc.RED)
pc.printout(str(data['full_name']) + '\n')
pc.printout("[BIOGRAPHY] ", pc.CYAN)
pc.printout(str(data['biography']) + '\n')
pc.printout("[FOLLOWED] ", pc.BLUE)
pc.printout(str(data['follower_count']) + '\n')
pc.printout("[FOLLOW] ", pc.GREEN)
pc.printout(str(data['following_count']) + '\n')
pc.printout("[BUSINESS ACCOUNT] ", pc.RED)
pc.printout(str(data['is_business']) + '\n')
if data['is_business']:
if not data['can_hide_category']:
pc.printout("[BUSINESS CATEGORY] ")
pc.printout(str(data['category']) + '\n')
pc.printout("[VERIFIED ACCOUNT] ", pc.CYAN)
pc.printout(str(data['is_verified']) + '\n')
if 'public_email' in data and data['public_email']:
pc.printout("[EMAIL] ", pc.BLUE)
pc.printout(str(data['public_email']) + '\n')
pc.printout("[HD PROFILE PIC] ", pc.GREEN)
pc.printout(str(data['hd_profile_pic_url_info']['url']) + '\n')
if 'fb_page_call_to_action_id' in data and data['fb_page_call_to_action_id']:
pc.printout("[FB PAGE] ", pc.RED)
pc.printout(str(data['connected_fb_page']) + '\n')
if 'whatsapp_number' in data and data['whatsapp_number']:
pc.printout("[WHATSAPP NUMBER] ", pc.GREEN)
pc.printout(str(data['whatsapp_number']) + '\n')
if 'city_name' in data and data['city_name']:
pc.printout("[CITY] ", pc.YELLOW)
pc.printout(str(data['city_name']) + '\n')
if 'address_street' in data and data['address_street']:
pc.printout("[ADDRESS STREET] ", pc.RED)
pc.printout(str(data['address_street']) + '\n')
if 'contact_phone_number' in data and data['contact_phone_number']:
pc.printout("[CONTACT PHONE NUMBER] ", pc.CYAN)
pc.printout(str(data['contact_phone_number']) + '\n')
if self.jsonDump:
user = {
'id': data['pk'],
'full_name': data['full_name'],
'biography': data['biography'],
'edge_followed_by': data['follower_count'],
'edge_follow': data['following_count'],
'is_business_account': data['is_business'],
'is_verified': data['is_verified'],
'profile_pic_url_hd': data['hd_profile_pic_url_info']['url']
}
if 'public_email' in data and data['public_email']:
user['email'] = data['public_email']
if 'fb_page_call_to_action_id' in data and data['fb_page_call_to_action_id']:
user['connected_fb_page'] = data['fb_page_call_to_action_id']
if 'whatsapp_number' in data and data['whatsapp_number']:
user['whatsapp_number'] = data['whatsapp_number']
if 'city_name' in data and data['city_name']:
user['city_name'] = data['city_name']
if 'address_street' in data and data['address_street']:
user['address_street'] = data['address_street']
if 'contact_phone_number' in data and data['contact_phone_number']:
user['contact_phone_number'] = data['contact_phone_number']
json_file_name = self.output_dir + "/" + self.target + "_info.json"
with open(json_file_name, 'w') as f:
json.dump(user, f)
except ClientError as e:
print(e)
pc.printout("Oops... " + str(self.target) + " non exist, please enter a valid username.", pc.RED)
pc.printout("\n")
exit(2)
更多推荐
所有评论(0)