View difference between Paste ID: V6NUbGNS and YN80cSEt
SHOW: | | - or go back to the newest paste.
1
#!/bin/bash
2
3
MENTION_COUNT=10000
4
COMPONENTS="0-1000"
5
OUTPUT_SIZE=100
6-
STREAM_URL=http://stream.twitter.com/1/statuses/sample.json
6+
STREAM_URL=https://stream.twitter.com/1/statuses/sample.json
7
CURL_OPTIONS=
8
MENTIONS=`mktemp -t mentions`
9
SCRIPT=`mktemp -t script`
10
11
function Usage {
12
	echo Usage: `basename $0` -u username [-p password] [-n num] [-s size] [-q] [-v] [-o]
13
	exit 1
14
}
15
16
function Dependencies {
17
	echo `basename $0` requires that Graphviz and Python be installed and on your PATH
18
	exit 2
19
}
20
21
test `which python` || Dependencies
22
test `which sfdp` || Dependencies
23
24
while getopts ":n:u:p:s:qvo" opt; do
25
	case $opt in
26
		n)
27
			MENTION_COUNT=$OPTARG
28
			;;
29
		o)
30
			OPEN=yes
31
			;;
32
		u)
33
			TWITTER_USERNAME=$OPTARG
34
			;;
35
		p)
36
			TWITTER_PASSWORD=$OPTARG
37
			;;
38
		q)
39
			QUIET=yes
40
			;;
41
		s)
42
			OUTPUT_SIZE=$OPTARG
43
			;;
44
		v)
45
			PROGRESS=-v
46
			;;
47
		\?)
48
			Usage
49
			;;
50
		:)
51
			Usage
52
			;;
53
	esac
54
done
55
56
if [ "${TWITTER_USERNAME}" == "" ]; then Usage; fi
57
58
if [ "${TWITTER_PASSWORD}" == "" ]; then
59
	stty -echo
60
	read -p "Twitter password:" TWITTER_PASSWORD; echo
61
	stty echo
62
fi
63
64
test $QUIET || echo Collecting ~${MENTION_COUNT} mentions from ${STREAM_URL} at ${MENTIONS}
65
66
cat > ${SCRIPT} <<EOF
67
import os
68
import sys
69
import json
70
import time
71
import base64
72
import urllib2
73
from optparse import OptionParser
74
75
parser = OptionParser()
76
parser.add_option('-u', action='store', dest='username')
77
parser.add_option('-p', action='store', dest='password')
78
parser.add_option('-n', action='store', dest='target', default=1000, type=int)
79
parser.add_option('-v', action='store_true', dest='verbose', default=False)
80
(options, args) = parser.parse_args()
81
82-
request = urllib2.Request("http://stream.twitter.com/1/statuses/sample.json")
82+
request = urllib2.Request("https://stream.twitter.com/1/statuses/sample.json")
83
request.add_header("Authorization", "Basic %s" % base64.encodestring('%s:%s' % (options.username, options.password)).replace('\n',''))
84
stream = urllib2.urlopen(request)
85
86
count=0
87
start=time.time()
88
89
for line in stream:
90
	if len(line) == 0:
91
		continue
92
		
93
	message = json.loads(line)
94
	if (message.get("entities") == None):
95
		continue
96
	user = message["user"]["screen_name"]
97
	for mentionee in message.get("entities").get("user_mentions"):
98
		print "\"%s\" -> \"%s\"" % (user.lower(), mentionee["screen_name"].lower())
99
		count += 1
100
		if (options.verbose) and (time.time() - start > 5):
101
			start = time.time()
102
			print >> sys.stderr, "\r%s mentions collected" % count,
103
	if (count > options.target):
104
		print >> sys.stderr, "\r%s mentions collected" % count
105
		break
106
EOF
107
108
python -u ${SCRIPT} -u ${TWITTER_USERNAME} -p ${TWITTER_PASSWORD} -n ${MENTION_COUNT} ${PROGRESS} > ${MENTIONS}
109
110
test $QUIET || echo Done collecting mentions
111
112
test $QUIET || echo Rendering graph
113
114
sort ${MENTIONS} \
115
	| uniq \
116
	| cat <(echo "digraph mentions {") - <(echo "}") \
117
	| ccomps -zX#${COMPONENTS} \
118
	| grep "-" \
119
	| cat <(echo "digraph mentions {") - <(echo "}") \
120
	| tee $0.gv \
121
	| sfdp \
122
		-Gbgcolor=black \
123
		-Ncolor=white \
124
		-Ecolor=white \
125
		-Nwidth=0.02 \
126
		-Nheight=0.02 \
127
		-Nfixedsize=true \
128
		-Nlabel='' \
129
		-Earrowsize=0.4 \
130
		-Gsize=${OUTPUT_SIZE} \
131
		-Gratio=fill \
132
	| neato -s -n2 -Nlabel='' -Tpng \
133
	> $0.png
134
	
135
test $OPEN && open $0.png
136
137
test $QUIET || echo Done
138
139
rm ${SCRIPT}