Статьи

Автоматический код для извлечения твитов (и создания обзора «Где-то еще»)

Несколько недель назад я задал (  пост  ) простой вопрос: «Дорогой читатель, кто ты?» просто чтобы узнать больше о читателях моего блога. Я нашел это чрезвычайно интересным (даже если — честно говоря — я ожидал большего количества ответов, чтобы начать более серьезное социологическое исследование читателей моего блога). И интересным моментом было то, что многие читатели моего блога приходят, чтобы прочитать « где-то еще».«посты, которые представляют собой обзор интересных постов и статей, найденных в Интернете. Эти ссылки, которыми я делюсь, на самом деле берутся из моих твитов. У меня в блоге есть резервная копия моих твитов, и, как правило, я отправляюсь туда, если хочу найти какую-то статью, или какой-то график, или какую-то карту, которую я имею в виду, которую я где-то видел (но обычно не могу вспомнить, где). Но в большинстве случаев мне скучно, потому что в этом нет ничего нового: просто скопируйте и вставьте из моих твитов.

А сегодня днем  @tomroud  спросил, как были написаны эти посты: была ли автоматическая процедура или я делал это вручную? До вечера я делал это вручную. Но поскольку это была какая-то глупая задача, я попытался создать код, который сгенерирует простой список моих твитов, которые я могу использовать для создания поста.

Тем не менее, есть еще две проблемы, которые я не могу исправить с помощью кода:

  • в моих постах » где-то еще » было различие по языку, причем посты и статьи сначала были на английском, а затем на французском. К сожалению, я не смог найти функцию, которая определяет язык твита. Я помню, что мы пытались с помощью  @ 3wen  написать такой код, но я не смог его найти … Я думаю, у  @ 3wen  был первый черновик, поэтому, если мы сможем его найти, я выложу его в свой блог (или он загрузит его на  свой )
  • в свои посты я включаю картинку, если есть. Эта часть все еще будет выполняться вручную, потому что это намного сложнее (но я думаю, что это возможно …)

Теперь, прежде чем начать, нам понадобятся функции из  старого поста , чтобы преобразовать сокращенный URL твиттера в реальный,

extraire <- function(entree,motif){
res <- regexec(motif,entree)
if(length(res[[1]])==2){
 debut <- (res[[1]])[2]
 fin <- debut+(attr(res[[1]],"match.length"))[2]-1
return(substr(entree,debut,fin))
}else return(NA)}
unshorten <- function(url){
uri <- getURL(url, header=TRUE, nobody=TRUE, followlocation=FALSE, 
cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl"))
res <- try(extraire(uri,"\r\nlocation: (.*?)\r\nserver"))
return(res)}

Теперь давайте рассмотрим следующий код. Первый шаг, конечно, это запустить несколько строк, которые позволят мне использовать API Twitter,

require(twitteR)
reqURL <- "https://api.twitter.com/oauth/request_token"
accessURL <- "https://api.twitter.com/oauth/access_token"
authURL <- "https://api.twitter.com/oauth/authorize"
apiKey <- "yourAPIkey"
apiSecret <- "yourAPIsecret"

twitCred <- OAuthFactory$new(consumerKey=apiKey,consumerSecret=apiSecret,requestURL=reqURL,accessURL=accessURL,authURL=authURL)

twitCred$handshake(cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl"))

registerTwitterOAuth(twitCred)

Затем мне нужно быть осторожным, потому что некоторые из моих твитов написаны на французском, и могут появиться странные символы,

Sys.setlocale("LC_CTYPE","fr_FR.UTF-8")

Теперь я могу написать свою функцию

somewhere_else <- function(){

tweets_freak <- searchTwitter("from:@freakonometrics", n = 500)

save(tweets_freak, file="somewhere_else.RData")

tweets_freak_df <- do.call("rbind", lapply(tweets_freak, as.data.frame))

text_tweets_freak <- tweets_freak_df$text

tweets_freak_message <- text_tweets_freak[which(substr(text_tweets_freak,1,1)!="@")]

SE <- which(substr(tweets_freak_message,1,15)=="\"Somewhere else")
first_SE <- SE[1]

tweets_freak <- tweets_freak_message[1:(first_SE-1)]

substitute_id <- function(x){
split_x <- strsplit(x,"@")[[1]]
x_id <- paste(split_x,collapse="http://twitter.com/",sep="")
split_x_id <- strsplit(x_id,"http")
n <- length(split_x_id[[1]])
tweet_x <- strsplit(split_x_id[[1]]," ")

if(n==1) rt <- x_id
if(n>1){
for(i in 2:n){
url <- tweet_x[[i]][1]
split=FALSE
if(substr(url,nchar(url),nchar(url))%in%c(":",",",";",")","(")) split <- TRUE
if(split==FALSE) unshort_url <- unshorten(paste("http",url,sep=""))
if(split==TRUE) unshort_url <- unshorten(paste("http",substr(url,1,nchar(url)-1),sep=""))
tweet=FALSE
if(substr(url,4,10)=="twitter") tweet=TRUE
if((split==FALSE)&(tweet==FALSE)) tweet_x_2 <- c("<a href=\"",unshort_url,"\">",unshort_url,"</a>")
if((split==TRUE)&(tweet==FALSE)) tweet_x_2 <- c("<a href=\"",unshort_url,"\">",unshort_url,"</a>",substr(url,nchar(url),nchar(url)))
if((split==FALSE)&(tweet==TRUE)) tweet_x_2 <- c("<a href=\"",unshort_url,"\">@",substr(unshort_url,21,nchar(unshort_url)),"</a>")
if((split==TRUE)&(tweet==TRUE)) tweet_x_2 <- c("<a href=\"",unshort_url,"\">@",substr(unshort_url,21,nchar(unshort_url))
,"</a>",substr(url,nchar(url),nchar(url)))
tweet_x[[i]] <- c(tweet_x_2,tweet_x[[i]][-1])
}
rt <- paste("<li>",paste(unlist(tweet_x),collapse=" "),"</li>",sep="")
}
return(rt)
}

tweets_freak_sub <- lapply(tweets_freak, substitute_id)
write.table(unlist(tweets_freak_sub),file="tweets_somewhere_else.txt",quote=FALSE,row.names=FALSE)

cat("Number of tweets.....",length(tweets_freak_sub),"\n")
cat("File.................",paste(getwd(),"tweets_somewhere_else.txt",sep="/"),"\n")
cat("Done\n")
}

Первой сложной задачей было распознать имена, упомянутые в моих твиттах (так как некоторые из них — ретвиты). Вторым было создание html-ссылки каждый раз, когда есть ссылка (здесь я не учел hastags). Если я запускаю его, получаю

> somewhere_else()
Number of tweets..... 72 
File.... /home/arthur/tweets_somewhere_else.txt 
Done
Warning message:
In doRppAPICall("search/tweets", n, params = params, retryOnRateLimit = retryOnRateLimit,  :
  500 tweets were requested but the API can only return 191

Если я сделаю копию и вставлю из текстового файла, у меня есть

что имеет смысл, потому что это действительно мои последние посты,

и т. д. Мне придется потратить некоторое время, чтобы добавить картинки, графики, карты, видео и т. д., но эта функция должна сэкономить мне время!