Guest User

mention-graph

a guest
Aug 19th, 2011
307
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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
  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")
  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}
RAW Paste Data