科学玩推特(1):自动过滤 foers 脚本

因为宅在家里实在是太无聊,也没有能找到工作,所以就天天推上泡着。之前我一度以为自己是推上的大V,光凭 foers 数而言我随随便便就有 16,500+ 可以秒杀不少人了。脚本现在终于快运行完了(每个 foers 都查了一遍。。。),然后这个数字急剧缩减到这样:

1-20-16-blog-1.PNG

粗略算一下,7,100 个用户就这样蒸发了。你说我不惊讶才是有假的。(就算我知道我 foers 水分挺大的但也不至于大到这个地步吧。。。)

言归正传,这篇文是讲脚本如何实现的,等它查完剩下的一千人以后我会试着分析一下用户行为。其实脚本并不难写,tweepy 还是 does its job 的(但是我很想吐槽他们的官方说明文档,长期不更新是怎样经常按说明叫了一个 method 然后编译器狂报错说没有这个东西,我:= =)。我是很想扔到 Github 上,不幸的是现在在墙内下 Setup file 太慢,只能回去再说了。有兴趣想要一试的同学可留言或 email。已经搞好了 OAuth 所以不需要去专门注册 Twitter developer 账户嗯。。。但是基本的硬件环境还是要有的,具体请参见 README~

更新:@wx0 提示了我推特有 rules and agreements,然后我去查了一下,发现了这个 https://support.twitter.com/articles/76915?lang=en#following-unfollowing

Automated following and unfollowing

You may not use or develop any application that allows for the following or unfollowing of user accounts in a bulk or automated manner. Using block as a means to unfollow users is also not allowed. Accounts and applications that engage in this practice will be suspended. Please also review our Following rules and best practices to ensure you are in compliance. Also note that applications that claim to get users more followers are prohibited under the Twitter Rules.

所以这个只能是不公开的 side project 了。。。(我说怎么很难搜到类似的脚本。。。

起源

自从我 foers 数过三千还是四千以后我就再也没有像以前那样一个个看过去B掉蛋头了。然后也一直不锁推,就懒的管,反正自认为也没说什么不合适的内容。但后来看 @kuroikk 说起又要查 foers 了,然后那天推上也有人说 foers > 2000 的一般都有备案也会被国宝盯上,有点怕怕的我就决定让程序帮我过筛掉蛋头(当然这两天的小粉红也让大家见识到了升级版五毛,现在不再是蛋头0foer不发推的监视型了)。又和 @kuroikk 聊了一下大概符合什么样的条件的 foers 是我们会想要B掉的,熟悉了一下 Tweepy,就开始玩啦。

功能简述

用户只需要下载压缩包,按 README 里说的那样配置好环境并执行文件,基本上就可以跑一边不管了。一开始脚本会先要求推特授权(其实我大可以空掉 token 那些鬼东西让用户自己去申请开发者账户的但是我果然还是……不知道我为啥要这样做OTZ),授权成功以后会问你要从哪里获取 foers 信息(直接问官方服务器要/本地已保存文档 -> 第二个选项是怎么回事我接下来会解释),拿到信息以后就开始运行啦。目前符合以下四条规则的 foers 会被自动解除好友关系(i.e. 先被B然后被解B,所以那边看到你的账户就是没有 fo 的状态,有可能未来还是会 fo 上你。。。):

  1. 蛋头,followings 显著多于 foers (差距达到100以上)
  2. 从未发过推的蛋头
  3. 没有在 fo 的加锁账户,最后一次发推是在 2012-8-16 以前
  4. 发推少于 10 条的用户,最后一次发推是在 2013-1-1 以前

其中第四条延伸出的一条就是如果某个用户从未发过推(不管是不是蛋头),都会被解除关系。

其实这样想想还蛮严格的哦……但是我对我的 foers 要求真的没太多,你换个头像发条推就不会被查到了啊!但即便是这样,也还是查出了七千多个注水 foers,我也是有点怕怕的。

查完以后程序正常退出,会在 working directory 下创建一个 csv 文档,里面有这次检查解除关系的人的详细资料。具体来说就是储存了被解除关系的推特用户的 ID、屏幕显示名(就是@后面跟的那串东西啦),资料链接(可直接复制粘贴到浏览器中查看)和评论(根据上面四条里哪个范畴被解除关系的)。文档名称格式是 foers_removed_list_日期.csv。(这个我又要疯狂吐槽了,当然我只是在吐槽脑残的自己)当然了自动查还是有风险的,我正努力的降低错误率(false positive: 明明不是可疑用户却被强制 unfo 你了,false negative: 明明是可疑用户但是查完居然还 fo 着你),但是这又是一个经典的 classification trade-off 问题,怪就怪这四条过滤规则写的不好吧!(众:咦,那这是谁先写出来的

目前存在的问题

我用了 try-except loop,这个结构可以处理 tweepy 莫名其妙的报错(之前你说 rate limit 我也就算了。今天突然说什么 connection abort 是怎样啊!)。因为推特官方API有流量限制,所以程序默认收到错误提示后会睡五分钟的觉(会在屏幕上显示这五分钟在睡觉的,放心)。然后我发现:就算不睡觉效率也有点低啊,大概一分钟只能查一个用户这样子?(程序:尼玛是你让我按上面四条规则去仔细查看每一个用户的你还嫌我慢。。。)拿我自己来当例子吧,16,500 个用户我跑了九天多点,每天跑三到五个小时。我的第一位客户 @iadnab 有大概一千两百个 foers,大概也要花一两个小时查。效率问题我只能表示:半路出家的苦孩子不会编程,凑合用吧。(众:我们也没说要用啊)

try-except loop 的另一个问题是:iterate 到某一个对象的时候如果恰好遇到报错,等程序醒过来后会直接查下一个就放过这个了。我还是觉得是因为我结构没写对,本来按理来说是报错睡觉后起来继续查这一个的。目前我规避的办法就是多运行几次(……)尽量做到不挂一漏万~

如果你有一万多个 foers 要查,相信我,你不会每次都要想连推特服务器拉最新的 foers list 的。这也就是为什么我提供了选项让用户能中途终止程序并存下还未查的 foer list,保存已经删除的嫌疑人。注意,如果程序同一天内运行两次,第二次写出来的嫌疑人文档会覆盖之前的那一个。我刚刚就是遭遇了这样的悲剧,昨天查出来的三四千个 foers 瞬间被覆盖,我对着电脑表示内牛心伤不能言语。(就算保存在 Google Drive 里也无果——我这几天压根没开同步,别问我为什么!!!)可能接下来会想办法让每次 output file 的名字结尾都是随机字符串吧这样就不会有覆盖和遗失的问题了……

另外先前有个 bug,感谢小白鼠 @iadnab 勇于献身尝试让我发现了。第一条说如果某个用户是【蛋头且 foing-foers > 100】会被解除关系。我不知为什么当时算那个差值的时候用上了绝对值。然后老公鸡用完后把 output file 发给我,我发现张师傅 @tifan 被强制 unfo 了。后来才知道张师傅是蛋头,但是他是 foers – foing > 100。所以我是不该放上绝对值的!!!(张师傅:怪我咯 -_,-)因为这个被老公鸡骂了。。。呃。。。我真不是故意的 orz

其他

嘛……其实我最终的梦想是弄一个GUI出来,可以让人勾选特定的领域(如:0 foer, 蛋头,etc)然后按照标准B/强制解除关系的。这个大概真的只能拖到以后再说了。

上一个写出来的文件界面:

1-20-16-blog-2

真的都是在监视我吗我好怕(((

Advertisements

One thought on “科学玩推特(1):自动过滤 foers 脚本”

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s