文档章节

腾讯微博关系链计算

彼得
 彼得
发布于 2014/02/06 15:40
字数 993
阅读 5922
收藏 178
点赞 31
评论 16

目标1:后台发微博,查看关系链等

第一步

成为开发者 http://dev.t.qq.com/ 需要填入一些基本的信息,如身份证号码等。

第二步:

创建应用,选择站内应用-非托管 ,主要是为了拿到appkey和app secret

第三步:

下载SDK http://wiki.open.t.qq.com/index.php/SDK%E4%B8%8B%E8%BD%BD

python SDK在这里 https://github.com/wbopenplatform/PY-SDK

第四步:

编写脚本,只运行 get_access_token()函数,获取到一个url,打开url,授权后获得新的url,获得ACCESS_TOKEN和OPENID的值。

第五步:

运行脚本的tweibo_test()函数,即可操作你的微博发消息或者查看你的粉丝,查看你关注的人。

# -*- coding:utf-8 -*- #
#! /usr/bin/env python

import time
import urllib  
import urllib2  
from tweibo import *

#首先要创建自己的应用,换成你的 APPKEY http://dev.t.qq.com/
APP_KEY = "801475XXX"  
APP_SECRET = "e52f7267447c3ccbcf7884809dbdXXXX"
CALLBACK_URL = "my.oschina.net/sanpeterguo"

#你的应用会去得到某个微博t.qq.com/peterguo的授权,获得方法即执行get_access_token即可获得一个url,这个url用浏览器打开,授权后连接地址中会增加ACESS_TOKEN参数,拿出来。

ACCESS_TOKEN = "06611ad81a58d8f517f614426f2XXXXX";
OPENID="30A1ACF2E94E5835A83D57CB80XXXXXX"

IMG_EXAMPLE = "example.png"

#调用API只需要上面的五个参数  APP_KEY APP_SECRET CALLBACK_URL  ACCESS_TOKEN OPENID

# 返回text是unicode,设置默认编码为utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')

def get_access_token():
    oauth = OAuth2Handler()
    oauth.set_app_key_secret(APP_KEY, APP_SECRET, CALLBACK_URL)
    print oauth.get_access_token_url()
    
def tweibo_test():
    oauth = OAuth2Handler()
    oauth.set_app_key_secret(APP_KEY, APP_SECRET, CALLBACK_URL)
    oauth.set_access_token(ACCESS_TOKEN)
    oauth.set_openid(OPENID)
    
    api = API(oauth)    
    if False:
        #获取t.qq.com/qqfarm 的三条微博
        ret = api.get.statuses__user_timeline(format="json", name="qqfarm", reqnum=3, pageflag=0, lastid=0, pagetime=0, type=3, contenttype=0)
        print ret.data.info[0]['text']
    
    #获取自己的信息 http://test.open.t.qq.com/#friends/idollist

    if False:
        #知道微博id,获取自己的某条微博内容,查看该微博的id,打开源码找: <ul id="talkList" class="LC"><li  id="338597029252485" rel
        #view-source:http://t.qq.com/peterguo/mine
        api.get.t__show(format="json", id=338597029252485).data.text
        api.get.t__list(ids=[338597029252485, 338597029252485])
    
    if False:
        #获取peterguo的粉丝
        ret = api.get.friends__user_fanslist(name='peterguo')
        #print ret.data.info[0]['name']
        print "Peterguo s fans......"
        for dItem in ret.data.info:
            print dItem['name']    
 
    if False:
        #获取自己的偶像列表
        print "Peterguo s idols ......"
        ret = api.get.friends__idollist(name="peterguo", reqnum=20, pageflag=2)
        #print ret.data.info[5]['name']
        for dItem in ret.data.info:
            print dItem['name']
        
    if False:    
        #发微博 
        api.post.t__add(content='hi python')
        
        #发带图的微博,先上传图,获取到图片url,再发微博
        # UPLOAD /t/upload_pic
        pic1 = api.upload.t__upload_pic(format="json", pic_type=2, pic=open(IMG_EXAMPLE, "rb"))
        print ">> IMG: %s" % (pic1.data.imgurl)

        # POST /t/add_pic_url
        content_str2 = "哈哈哈 demo: %s, time %s" % (IMG_EXAMPLE, time.time())
        pic_urls = "%s" % (pic1.data.imgurl)
        tweet_pic1 = api.post.t__add_pic_url(format="json", content=content_str2, pic_url=pic_urls)
        print ">> time=%s, http://t.qq.com/p/t/%s" % (tweet_pic1.data.time, tweet_pic1.data.id)


    #双向收听的
    
    nCount = 0
    lCrawNames = ["waxjwaxj", "peterguo", "joliexu"]
    if len(sys.argv) != 1:
        lCrawNames = sys.argv[1:]
    for craw_name in lCrawNames:
        nIdx = 0
        while True:
            time.sleep(3)
            try:
                ret = api.get.friends__mutual_list(name=craw_name, reqnum=10, pageflag=1, startindex=nIdx)
            except tweibo.TWeiboError:
                break     
            for dItem in ret.data.info:
                nCount += 1
                try:
                    print nCount, dItem['name'], " -> ", dItem['nick']
                    fp = file("src.txt", "at")
                    fp.write("%s:%s:%s\n" %(craw_name, dItem['name'], dItem['nick']))
                    fp.close()
                except Exception,e:
                    print e

            nIdx += 10       
          

if __name__ == "__main__":    
    tweibo_test()


目标2:生成的数据如果配合networkx 进行计算绘图:

如下是计算笔者,笔者妻子和一个同事的微博互粉关系图:

  代码:

#-*- coding:utf8-*-

import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()


#G.add_nodes_from([3,4,5,6])
#G.add_edges_from([(3,5),(3,6),(6,7)])

def loadFile2List(strFilename):
    '''
    load a file and return content as list, every item is a line, except "#"
    '''
    retLst = []
    try:
        fp = file(strFilename, "rt")
    except IOError:
        assert(False)
        return retLst
    while True:
        line = fp.readline()
        if len(line) == 0:
            break;
        if line.startswith('#') or line == '\r\n' or line == '\n':
            continue
        line = line.strip()
        retLst.append(line)
    return retLst
    
srcLst = loadFile2List("src.txt")
dName2ListFriends = {}
for strLine in srcLst:
    lSptLine = strLine.split(":")
    if lSptLine == "":
        continue
    if not (lSptLine[0] in dName2ListFriends.keys()):
        dName2ListFriends[lSptLine[0]] = []
    dName2ListFriends[lSptLine[0]].append(lSptLine[1])

print dName2ListFriends     

lNodes = []
lEdges = []
for strKeyName in dName2ListFriends.keys():
    lNodes.append(strKeyName)
    for strName in dName2ListFriends[strKeyName]:
        lNodes.append(strName)
        lEdges.append((strKeyName, strName))

lNodes = list(set(lNodes))
lEdges = list(set(lEdges))
print lEdges
#raw_input("pause")
G.add_nodes_from(lNodes)
G.add_edges_from(lEdges)

nx.draw(G)
plt.savefig("wuxiangtu.png")
plt.show()


参考1:https://github.com/upbit/tweibo-pysdk/wiki/demo.py%E8%AF%A6%E8%A7%A3 

参考2:https://github.com/upbit/tweibo-pysdk/wiki/OAuth2Handler

© 著作权归作者所有

共有 人打赏支持
彼得

彼得

粉丝 39
博文 121
码字总数 38726
作品 0
深圳
程序员
加载中

评论(16)

LastRitter
LastRitter
谢谢分享,我文章!!!!
konakona
konakona

引用来自“彼得”的评论

引用来自“konakona”的评论

不错的好文!
想问下楼主,腾讯微博有什么办法删除自己的微博内容吗?像新浪卧槽123那个APP那样! 2

http://test.open.t.qq.com/ 里面有删除微博的接口。

好!看到了,我打算弄一个。
彼得
彼得

引用来自“中山野鬼”的评论

引用来自“lazyphp”的评论

不错!这个貌似只是分析2 - 3层关系链。

层数多了,量上去了哈。另外,不知道博主对环怎么处理的。

环的处理,networkx中都有现成的函数可以调用。
参考http://my.oschina.net/sanpeterguo/blog/195390
彼得
彼得

引用来自“huangjacky”的评论

代码感觉看过的,而且有本书专门介绍这个,不过例子用的是twitter的。

对,是有本书《社交网站的数据挖掘与分析》 http://book.douban.com/subject/10344930/ 看了一阵子,很多API都过时了,所以决定搞腾讯微博的。用自己的帐号做试验,比较有趣。
彼得
彼得

引用来自“Manhattan”的评论

看圖之後整個人都不舒服了。。

关系链计算,重点不在图。不过图形看起来更直观,这只是一个真是的小例子。
彼得
彼得

引用来自“konakona”的评论

不错的好文!
想问下楼主,腾讯微博有什么办法删除自己的微博内容吗?像新浪卧槽123那个APP那样! 2

http://test.open.t.qq.com/ 里面有删除微博的接口。
彼得
彼得

引用来自“阳光灿烂的日子”的评论

我有密集恐惧症 看到你的图 一天都不舒服

这个只是举例入门而已,重点不在绘图,重点在计算。13
huangjacky
huangjacky
代码感觉看过的,而且有本书专门介绍这个,不过例子用的是twitter的。
中山野鬼
中山野鬼

引用来自“lazyphp”的评论

不错!这个貌似只是分析2 - 3层关系链。

层数多了,量上去了哈。另外,不知道博主对环怎么处理的。
itfanr
itfanr
看圖之後整個人都不舒服了。。
腾讯微博java(android) api

由于现在腾讯微博提供的java(android) sdk功能过弱,自己搞了个java sdk包,同样适用于android。包含腾讯微博目前提供的95%的api,几乎所有主要功能api,用法简单。 下面介绍源码地址和jar包...

鉴客 ⋅ 2011/12/15 ⋅ 1

AppCan 携手腾讯微博开放平台共推跨平台开发工具

日前,腾讯微博开放平台与国内首个基于HTML5移动应用开发平台AppCan达成战略合作。腾讯微博开放平台将率先引入专门定制的AppCan-SDK(SDK即软件开发工具包),这一举措将简化腾讯微博分享流程...

ruihe124724903 ⋅ 2012/05/10 ⋅ 0

揭秘腾讯开放的底线

【中国企业家网】(记者 袁茵)两周后的6月15日,腾讯将召开开发者大会。此后,马化腾就要实践他在《中国企业家》年会上的宣言,腾讯进行全面开放。 截止目前,腾讯开放计划已经初露端倪。刚...

戴威 ⋅ 2011/05/28 ⋅ 12

腾讯下月推行实名制 你准备好了么

QQ突然弹出了个邀请框,邀请我体验2010bate3版本,点开发现,新版本的试用要求有点怪异,要求开通了“腾讯朋友”,且头像通过审核,并且好友数在20以上。这不难让人联想到腾讯经常提出的实名...

红薯 ⋅ 2011/05/27 ⋅ 24

Chrome有了直接调用QQ微博官方API的扩展

相信有很多网友都喜欢使用QQ微博和Chrome浏览器。但每次发微博,都是要先登录QQ微博点多次才能搞定一条微博信息。有没有想过一键微博?甚至懒人的鼠标只希望选中一段话,都不想复制粘贴怎么办...

红薯 ⋅ 2010/11/23 ⋅ 6

联通 wo+ 的大战略:做平台的平台

今年 12 月 8 日,中国联通发布 wo+ 开放战略,随后又在当月 20 日推出 wo+ 体系的四大开放平台,包括了“ wo+全媒体开放平台”、“ wo+智能通信开放平台”、“ wo+ 分享传播开放平台”、“ ...

红薯 ⋅ 2011/12/22 ⋅ 19

消息称腾讯数千万美元收购康盛打响站长争夺战

马化腾终于决定出手了。 “腾讯收购康盛创想,已经谈成,不是传言中的入股、战略投资,而是通过现金加股权的方式达成收购,价格也比传言中的1000万美元高,大约在几 千万美元,具体数额不方便...

红薯 ⋅ 2010/06/17 ⋅ 7

如何利用新媒体平台,优化个人网站!

现阶段你如果和一些新入行的营销人员谈论SEO,他们可能并不了解,虽然SEO有着悠久的历史,但当你与他们谈论新媒体的时候,几乎每个人都会有独到的见解。 随着新媒体的不断崛起与影响力的不断...

蝙蝠侠it ⋅ 01/10 ⋅ 0

大家有没有兴趣讨论下新浪微博 或 腾讯微博 的数据库存储结构?

大家有没有兴趣讨论下新浪微博 或 腾讯微博 的数据库存储结构? 包括: 1. 用户表、微博信息主表、follower、following关系表、关注数、收听数、广播数、话题表、投票表等 2. 微博检索功能,...

山哥 ⋅ 2012/06/18 ⋅ 16

微信的三条进攻路线

腾讯(港交所代码:0700)的股价在9月14日创下历史新高,报收于每股255.60港币。腾讯的总市值也因此超过4700亿港元,甚至超过了当天深圳创业板350家上市公司流通市值的总和。 腾讯这个巨无霸...

陈学飞 ⋅ 2012/09/27 ⋅ 6

没有更多内容

加载失败,请刷新页面

加载更多

下一页

HiSDP —— 高效的C++软件开发平台

目前阿里集团每天有近1000PB的数据是通过LogAgent采集的,为了让LogAgent做到资源占用节省和高效采集,背后是基于HiSDP去构建的。 缘由 当决定采用C++编程语言去开发一个软件时,紧接着所面临...

阿里云云栖社区 ⋅ 18分钟前 ⋅ 0

zookeeper-3.4.12 下载与安装教程

一、zookeeper下载地址 http://mirrors.hust.edu.cn/apache/zookeeper/ 二、启动教程 把压缩包放在指定目录下 第三: 进入 conf文件夹底下 zoo_sample.cfg 文件名改成 zoo.cfg 第四步: 进入b...

泉天下 ⋅ 20分钟前 ⋅ 0

Oracle 中文日期转换

SELECT TO_date('2011年11月11日', 'yy"年"mm"月"dd"日"') FROM DUAL; 1. Oracle无法识别中文格式,所以添加双引号。 2. 后面的格式是指字符串在转换前的格式,而不是指转换后的格式。...

江戸川 ⋅ 21分钟前 ⋅ 0

MySell:API Spring Boot

起步 类目 商品 订单

BeanHo ⋅ 24分钟前 ⋅ 0

Spring方法拦截器MethodInterceptor

参考资料 1、Spring方法拦截器MethodInterceptor 2、Sharding JDBC源码分析-JdbcMethodInvocation类的作用

哎小艾 ⋅ 27分钟前 ⋅ 0

正则表达式

元字符 元字符,又叫字符集,就是用一些特殊符号表示特定种类的字符或位置。 匹配字符 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d 匹配数字 匹配...

wangchen1999 ⋅ 27分钟前 ⋅ 0

数据库数据导入Elasticsearch案例分享

基于bboss持久层和bboss elasticsearch客户端实现数据库数据导入es案例分享(支持各种数据库和各种es版本) 1.案例对应的源码 https://gitee.com/bboss/bboss-elastic/blob/master/bboss-el...

bboss ⋅ 28分钟前 ⋅ 0

动手---sbt(2)

参考 https://blog.csdn.net/leishangwen/article/details/46225587 建立一个chisel_max目录,文件内容如后面所述,现在开始执行命令: joe@joe-Aspire-Z3730:/media/sdb4/download/scala$ c......

whoisliang ⋅ 34分钟前 ⋅ 0

纯js实现最简单的文件上传(后台使用MultipartFile)

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>XMLHttpRequest上传文件</title> <script type="text/javascript"> //图片上传 var xhr......

孟飞阳 ⋅ 39分钟前 ⋅ 0

iOS宇宙大战游戏、调试工具、各种动画、AR相册、相机图片编辑等源码

iOS精选源码 日期时间选择器,swift Space Battle 宇宙大战 SpriteKit游戏源码 LLDebugTool - 便捷的IOS调试工具(新增截屏功能) 相机扫描or长按识别二维码、FMDB、键盘动态高度、定位等 动画...

sunnyaigd ⋅ 40分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部