关于饭否的两个小脚本

2

Comments

前几天因为某些原因,我把饭否上所有的好友和关注者全部清空了。当然,如果没有程序的帮忙,估计还不等我删完我也就后悔了。

我没有那么狠心的把饭否的消息给清空,因为消息是不可恢复的(而且也太多了),但好友和关注者是可以的。做事情都给自己留后路显然是我一贯的风格,不然的话,我大概早从我家阳台跳下去了……

两段脚本都不长,第一段是备份饭否的好友列表和关注者列表的,做的毫无泛用性,因为 bash 编程我并不很熟,只知道可以用 wget 来抓取。本来这种事情其实可以直接用 API 抓的,不过我想抓下我能直接看的东西,所以最终还是导出了 Cookie 抓网页。

第一段代码如下:

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
#!/bin/bash
 
mkdir friends
for i in {1..11}
do
    wget -k -e robots=off --load-cookies cookies.txt -P friends/ \
        http://fanfou.com/friends/upsuper/p.$i
    sed -i -e "s/http:\/\/fanfou\.com\/friends\/upsuper\///g" \
        "friends/p.$i"
    sed -i -e "s/http:\/\/fanfou\.com\/friends/p.1/g" \
        "friends/p.$i"
    sed -i -e "s/http:\/\/fanfou\.com\/followers/..\/followers\/p.1/g" \
        "friends/p.$i"
done
 
mkdir followers
for i in {1..8}
do
    wget -k -e robots=off --load-cookies cookies.txt -P followers/ \
        http://fanfou.com/followers/upsuper/p.$i
    sed -i -e "s/http:\/\/fanfou\.com\/followers\/upsuper\///g" \
        "followers/p.$i"
    sed -i -e "s/http:\/\/fanfou\.com\/friends/..\/friends\/p.1/g" \
        "followers/p.$i"
    sed -i -e "s/http:\/\/fanfou\.com\/followers/p.1/g" \
        "followers/p.$i"
done
 
for f in friends/* followers/*
do
    sed -i -e "s/http:\/\/fanfou\.com\/friends/..\/friends/g" \
        "followers/p.$i"
    sed -i -e "s/http:\/\/fanfou\.com\/followers/..\/followers/g" \
        "friends/p.$i"
done

想用的话,其中前两个 for 循环的数字必须改成自己的实际情况,里面的 upsuper 也要全数替换为自己的饭否ID,还有一个 cookies.txt 文件,可以用 Firefox 的 Cookie Exporter 插件从浏览器导出。

这个脚本非常值得赞美的一点是自动修复了所有的链接,使得在本地的页面全部可以通过链接进入,不在本地的页面也可以链接到饭否。这也是我调了很长世间的东西……

第二段脚本就是颇具破坏性的了:

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
47
48
49
50
51
52
53
#!/usr/bin/env python
# - * - coding: utf8 - * -
 
import sys
import json
 
from socket import timeout
from urllib import urlencode
from base64 import b64encode
from getpass import getpass
from httplib2 import Http
 
username = raw_input('Username: ')
password = getpass('Password: ')
auth = 'Basic ' + b64encode('%s:%s' % (username, password))
headers = { 'Authorization': auth }
 
h = Http(timeout=1)
sys.stdout = sys.stderr
 
# Delete friends
print 'Delete friends:'
resp, content = h.request('http://api.fanfou.com/friends/ids.json', headers=headers)
friends = json.loads(content)
for friend in friends:
    query_str = urlencode({ 'id': friend.encode('utf8') })
    print friend.encode('utf8'),
    try:
        resp, content = h.request('http://api.fanfou.com/friendships/destroy.json?' + query_str, 'POST', headers=headers)
    except timeout:
        print 'timeout'
    else:
        print resp.status
 
# Delete followers
print 'Delete followers:'
resp, content = h.request('http://api.fanfou.com/followers/ids.json', headers=headers)
followers = json.loads(content)
for follower in followers:
    query_str = urlencode({ 'id': follower.encode('utf8') })
    print follower.encode('utf8'),
    try:
        resp, content = h.request('http://api.fanfou.com/blocks/create.xml?' + query_str, 'POST', headers=headers)
    except timeout:
        print 'timeout',
    else:
        print resp.status,
    try:
        resp, content = h.request('http://api.fanfou.com/blocks/destroy.xml?' + query_str, 'POST', headers=headers)
    except timeout:
        print 'timeout'
    else:
        print resp.status

这段 Python 脚本其实颇具我写饭否应用的风格。这段脚本还是比较有泛用性的,进入的时候会提示输入饭否id和密码,然后他也会自动备份一个 JSON 格式的饭否好友列表和关注者列表。只是处于周全我才做的这一步,其实是完全没有必要的,因为我已经备份过了,而且我也不准备让程序帮我全部还原……

正好清理一下两个列表……

原理就不多做介绍了。第二段脚本在运行开始清理好友的时候,可能会连续出现 timeout 的情况不必在意,因为饭否似乎会在这个 API 执行的时候处理 timeline 的缓存。不过据我观察,脚本运行结束后,似乎会有部分好友留下,数量对我来说少于十个,可以快速手动清除……

出于观察输出的考虑,我没有用多线程。脚本删除关注者的原理是加入黑名单再取消黑名单,如果加入了黑名单在取消的时候没有成功,那就意味着误加了,这是找不到的,因为黑名单的列表似乎无法察看……

就这样了……我现在已经逐渐的开始恢复饭否活动了……不过还不准备完全回到过去……以上

突然觉得,第一段脚本可以用 make 实现?

2 Responses to “关于饭否的两个小脚本”

  1. Robot Says:
    2011年2月2日 15:22 回复

    soga…

    话说第一个脚本可真是brute & ugly…呵呵~那个修复链接,wget的-k不能直接自动实现么(我之前抓站的时候就是那样啊)?为何还需要sed?

    • upsuper Says:
      2011年2月3日 11:49 回复

      因为我是部分链接本地部分链接远程,而且本地文件不是用wget一次性抓取的……因为研究了半天没研究出如何白名单抓取……
      于是就用这种方法了……

Leave a Reply