Instagram 僵尸清理记

Instagram 被老毛子盗窃了,邮箱都被篡改了,好在最终找回了帐号。登录帐号发现,多了几百个粉丝(Followers),两千多个关注(Followings),更要命的是,Instagram 并没有提供批量移除的功能,总不可能人肉一个个干,万幸的是程序员不怕折腾。
Tags: 批量移除 Instagram 内容、关注、粉丝,Remove Instagram media, followers, followings.

Instagram API Platform

第一个能想到的办法是看看 Instagram Open API,但官宣老版的 API Platform 已经关闭了,全部迁移到 Facebook 图谱 API 的子项目 Instagram Graph API

https://i.imgur.com/FTASMl6.png

Instagram Graph API

图谱 API 是读取和写入 Facebook 社交关系图谱的主要途径。我们所有的 SDK 和产品都能以某种方式与图谱 API 互动,我们其他的 API 都是图谱 API 的扩展,因此了解图谱 API 的工作方式至关重要。

图谱 API 得名于“社交关系图谱”理念 — Facebook 上的一种信息表示形式。它由以下部分组成:

  • 节点 — 用户、照片、主页或评论等基本的个体对象
  • 连线 — 对象集合与单个对象之间的联系,如主页上的照片或照片的评论
  • 字段 — 关于对象的数据,如用户的生日或主页的名称

更多关于图谱 API 的概念和架构,可参考 https://developers.facebook.com/docs/graph-api/overview/

再来看看 Instagram Graph API 的文档 https://developers.facebook.com/docs/instagram-api

https://i.imgur.com/4O2ou8B.png

大致浏览了目前已开放的接口,并未找到 Relationship 相关的接口!用不了。

Instagram SDK

Github 上有 Instagram 官方提供的 SDK,见:https://github.com/facebookarchive/python-instagram

安装

1
pip install python-instagram

测试

1
2
3
4
5
6
from instagram.client import InstagramAPI

access_token = "XXXXXXXX"
client_secret = "XXXXXXXX"
api = InstagramAPI(access_token=access_token, client_secret=client_secret)
follows, next_ = api.user_follows()

如何获取 access token 请参考文档 https://www.instagram.com/developer/authentication/

结果

1
2
3
4
5
6
7
8
9
10
Traceback (most recent call last):
File "./in.py", line 6, in <module>
follows, next_ = api.user_follows()
File "/usr/lib/python2.7/site-packages/instagram/bind.py", line 197, in _call
return method.execute()
File "/usr/lib/python2.7/site-packages/instagram/bind.py", line 189, in execute
content, next = self._do_api_request(url, method, body, headers)
File "/usr/lib/python2.7/site-packages/instagram/bind.py", line 163, in _do_api_request
raise InstagramAPIError(status_code, content_obj['meta']['error_type'], content_obj['meta']['error_message'])
instagram.bind.InstagramAPIError: (400) APINotAllowedError-This endpoint has been retired

这套 SDK 背后就是 Instagram API Platform,证实其确实已经关闭!不能用。

Instagram Private API

API Platform 关闭以后,有网友通过逆向工程研究公开了 Instagram Private API, 并提供了 SDK, 列举几个 Github Repo

mgp25 的 PHP 的 SDK 亲测可用!我将代码放在了 Github 上。
https://github.com/yangzhyo/clean-instagram

安装

1
composer require mgp25/instagram-php

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
require __DIR__.'/../vendor/autoload.php';

$ig = new \InstagramAPI\Instagram();
$ig->setProxy('socks5://127.0.0.1:1086'); // 这个代理设置,你懂的
$ig->login('test','test');

// 移除关注
$followings = $ig->people->getSelfFollowing('123e4567-e89b-12d3-a456-426655440000');
print_r('Totally '.count($followings->getUsers())." followings\n");
foreach ($followings->getUsers() as $user) {
print_r('Remove '.$user->getPk()."\n");
$ig->people->unfollow($user->getPk());
sleep(5); // 防止触发频控策略
}

// 移除粉丝
$followers = $ig->people->getSelfFollowers('123e4567-e89b-12d3-a456-426655440000');
print_r('Totally '.count($followers->getUsers())." followers\n");
foreach ($followers->getUsers() as $user) {
print_r('Remove '.$user->getPk()."\n");
$ig->people->removeFollower($user->getPk());
sleep(5);
}

// 移除媒体
$userFeeds = $ig->timeline->getSelfUserFeed();
print_r('Totally '.count($userFeeds->getItems())." media\n");
foreach ($userFeeds->getItems() as $item) {
print_r('Delete '.$item->getPk()."\n");
$ig->media->delete($item->getPk());
sleep(5);
}

// 移除点赞。俄罗斯人用我的帐号给大量的俄罗斯帐号点了赞,现在系统给我推荐的好友大多是俄罗斯人,[摊手]。
$maxId = null;
do {
$likedFeeds = $ig->media->getLikedFeed();
print_r('Retrieved '.count($likedFeeds->getItems())." liked media\n");
foreach ($likedFeeds->getItems() as $item) {
print_r('Unlike '.$item->getPk()."\n");
$ig->media->unlike($item->getPk());
sleep(5);
}
$maxId = $likedFeeds->getNextMaxId();
} while ($maxId !== null);

结果

运行成功,虽然操作之间加入了等待,但还是有可能触发频控,只需要等待重试即可。