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} |