<My own facebook network (2014/10/23の情報)>
2014年4月頃?からAPIのversionが上がり,新しいGraph APIでは友達ネットワークが取得出来なくなった.すなわち,me/mutualfriends/【(友達の)ID(数字)】と入力し,Submitしても
{
"error": {
"message": "(#100) The global id 【(友達の)ID(数字)】 is not allowed for this call",
"type": "OAuthException",
"code": 100
}
}
となる.従って,R等の言語で情報にアクセスする場合の,
https://graph.facebook.com/me/mutualfriends/【(友達の)ID(数字)】?access_token=【自分のaccess token】
でも取得出来ない.しかし,旧VersionのAPIを使えばアクセス可能である(Ver. 1の時に登録していなければ無理).すなわち,
https://graph.facebook.com/v1.0/me/mutualfriends/【(友達の)ID(数字)】?access_token=【自分のaccess token】
にアクセスすればよい.従って,R言語でfriendの名前とIDの一覧及びfriend networkを得るには,以下のcodeで得られる.
#必要なpackage
require(RCurl)
require(rjson)
#APIにアクセス&データ取得関数
facebook <- function( path = "me", access_token = token, options){
if( !missing(options) ){
options <- sprintf(
"?%s&",
paste(
names(options), "=", unlist(options),
collapse = "&", sep = "" ) ) } else { options <- "?" } urlTemplate <- "https://graph.facebook.com/v1.0/%s%saccess_token=%s" data <- getURL( sprintf( urlTemplate, path, options, access_token ) ) fromJSON( data ) } token<- "【自分のaccess token】"# scrape the list of friends friends <- facebook( path="me/friends" , access_token=token)# extract Facebook IDs friends.id <- sapply(friends$data, function(x) x$id)# extract names friends.name <- sapply(friends$data, function(x) iconv(x$name,"UTF-8","ASCII//TRANSLIT"))# short names to initials initials <- function(x) paste(substr(x,1,1), collapse="") friends.initial <- sapply(strsplit(friends.name," "), initials)# friendship relation matrix N <- length(friends.id) friendship.matrix <- matrix(0,N,N) for (i in 1:N) { tmp <- facebook( path=paste("me/mutualfriends", friends.id[i], sep="/") , access_token=token) mutualfriends <- sapply(tmp$data, function(x) x$id) friendship.matrix[i,friends.id %in% mutualfriends] <- 1 } また,networkを視覚化する際にfriendの画像が欲しい場合は,上記のcodeに続けて以下を実行すれば良い.
# download small profile picture of each friend
dir.create("photos")
for(i in 1:length(friends.id)){
tmp <- fromJSON(getURL(paste("http://graph.facebook.com", friends.id[i], "picture?redirect=false", sep="/")))
download(tmp$data$url,
destfile=paste("photos/",friends.id[i],".jpg",sep=""))
}
#Rで扱いやすいpnm形式に変換 system('for i in `ls photos/*.jpg`; do j=${i%.*}; convert $j.jpg $j.pnm; done', wait=TRUE)その後,plot.graphとaddlogoを用いればgraphをplotする際に各頂点が対応するFBの画像となる.
良い.
library(igraph)
library(pixmap)
myfbg <- graph.adjacency(friendship.matrix)
#imageのリスト作成
IMGL <- rep( list(0), N )
for(i in 1:N){
IMGL[[i]] <- read.pnm(paste("~/photos/",friends.id[i],".pnm",sep=""))
}
#Kamada and Kawaiのアルゴリズムによる座標KK.X<- layout.kamada.kawai(graph=myfbg, niter=10000, dim=2)#plot sizeを適切に決める関数xylim <- function(X){ r1 <- range(X[,1]) r2 <- range(X[,2]) r <- max(r1[2]-r1[1],r2[2]-r2[1])*1.05 t1 <- r-(r1[2]-r1[1]) t2 <- r-(r2[2]-r2[1]) xlim <-r1 + c(-t1/2,t1/2) ylim <- r2+ c(-t2/2,t2/2) return(list(xlim=xlim,ylim=ylim)) }xy.KK <- xylim(KK.X)#plot.igraphを使ってpathを描画plot(myfbg,layout=KK.X, rescale=FALSE,mark.border=NA, vertex.size=0,vertex.color=NA, vertex.frame.color =NA,vertex.label=NA, edge.arrow.size=0,edge.width=1,xlim=xy.KK$xlim,ylim=xy.KK$ylim)X<-KK.Xisize <- (xy.KK$xlim[2]-xy.KK$xlim[1])/50#imageの追加for(i in (1:N)){ addlogo(IMGL[[i]], px=c(X[i,1]-isize, X[i,1]+isize), py=c(X[i,2]-isize, X[i,2]+isize),asp=1)}