文档章节

腾讯微博关系链计算

彼得
 彼得
发布于 2014/02/06 15:40
字数 993
阅读 5972
收藏 178

目标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
博文 122
码字总数 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
3.2K
1
AppCan 携手腾讯微博开放平台共推跨平台开发工具

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

ruihe124724903
2012/05/10
0
0
揭秘腾讯开放的底线

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

戴威
2011/05/28
1K
12
腾讯下月推行实名制 你准备好了么

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

红薯
2011/05/27
2.8K
24
GIAC2018全球互联网架构大会

2018年6月1~2日,GIAC 全球互联网架构大会将于深圳华侨城洲际酒店举行!GIAC全球互联网架构大会是由msup和高可用架构技术社区联合举办的面向架构师、技术负责人及高端技术从业人员的技术架构...

msup
04/09
1
0

没有更多内容

加载失败,请刷新页面

加载更多

Rainbond V5.0 Beta公测公告

Rainbond支撑企业应用的开发、架构、交付和运维的全流程,通过“无侵入”架构无缝衔接各类企业应用,底层资源可以对接和管理IaaS、虚拟机和物理服务器 Rainbond V5.0即日起开启Beta版本公测,...

好雨云帮
16分钟前
2
0
Word Pattern(leetcode290)

Given a pattern and a string str, find if str follows the same pattern. Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empt......

woshixin
22分钟前
0
0
Kubernetes 1.13.1快速升级

Kubernetes 1.13.1已经正式发布,快速升级(含国内镜像快速下载链接)包括升级kubeadm/kubectl/kubelet版本、拉取镜像、升级Kubernetes集群三个主要步骤。注意Kubernetes 1.12.3版本暂时不支...

openthings
24分钟前
2
0
多线程的实现方式

多线程是指 一个程序运行时,产生或使用了不止一个线程。 线程的生命周期是怎么样的,下面这张图我们可以看出些端倪: 这章我们主要讨论多线程实现的方式,基础知识部分我们可以下来再恶补。...

搬砖大侠
37分钟前
1
0
新人千万不要在 Windows 上使用 Ruby on Rails

标题:新人千万不要在 Windows 上使用 Ruby on Rails 副标题:鼓励新人在 Linux 和 Mac 上使用 Ruby on Rails ! 原则:要走寻常路,不要学美特斯邦伟! "在 Windows上 使用 Ruby on Rails "是...

Jason909
45分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部