前些日,利用手动登入后浏览器获取cookie的方法登入发现诸多弊端。其中,追严重的是将cookie复制到另一ip下的设备时,一定概率会被封号。所以最稳妥的还是,在对应主机上模拟登陆。
我在网上查阅了大量资料:
参考了Python使用Curl模拟登入新浪微博的方法后,我写了一个可行的R语言登入微博脚本。
希望能对正在研究的提供帮助。
参考文献:
http://www.phperz.com/article/14/1010/14635.html
http://www.cnblogs.com/loveyouyou616/p/4238230.html
特别感谢:
新浪客服妹子:感谢您适当的回答让我多花费不少时间,研究新浪的发爬虫机制。也感谢您,在无数次帮我解封帐号
源码如下:
######加载必要的工具#####
library(RCurl)
library(rjson)
library(stringr)
library(XML)
library(PKI)
#########进入新浪登入页面########
####h用于获取反馈头信息########
h <- basicHeaderGatherer()
####基本头信息,向服务器说明当前浏览网页的设备信息,可以根据自己情况设置#######
header <- c(
"Connection" = "keep-alive",
"Host" = "login.sina.com.cn",
"User-Agent" = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36",
"Accept" = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Content-Length"=523,
"Content-Type"="application/x-www-form-urlencoded",
"Origin" = "http://login.sina.com.cn",
"Referer"="http://login.sina.com.cn/?r=/member/my.php?entry=sso"
)
#########输入账号密码登入##############
######下面的url用于获得预登入信息(服务器时间戳,RSA公钥,等加密信息),并生成一个时间戳跟在需要get的url后面
prelogin_url<-paste("http://login.sina.com.cn/sso/prelogin.php?entry=account&callback=sinaSSOController.preloginCallBack&su=&rsakt=mod&client=ssologin.js(v1.4.15)&_=",floor(as.numeric(Sys.time())*1000),sep="")
text<-getURL(prelogin_url)
########获取预登入信息后,解析信息##########
tmp <- fromJSON(gsub("sinaSSOController.preloginCallBack\\(\\{(.*)\\}\\)","\\{\\1\\}",text))
########引入用户名、密码#########
######注意用户名中'@'等特殊符号,应转化为对应码值('@'对应'% 40'中间的空格是多余的)########
#########所以我的邮箱libingfei@sina.com,应转为如下#######
########请将邮箱密码换为自己的
u<-"libingfei% 40sina.com"#########中间的空格是多余的
##########密码请换成自己帐号的
pw<-"sad*****"
##########对用户名进行编码
su<-base64Encode(u)
###############下面是一套通过新浪js抽取出的加密算法,目前(2015/6/28)测试依然可用######
key_p<-tmp$pubkey
key_p_p<-""
for(i in 1:(str_length(key_p)/2)){
key_p_p[i]<-unclass(as.hexmode(tolower(str_sub(key_p,(2*i-1),(2*i)))))
}
as.raw(key_p_p)
pubkey_p<-PKI.mkRSApubkey(as.raw(key_p_p), exponent=65537L,format = "key")#c("DER", "PEM", "key")
keyword<-paste(tmp$servertime,"\t",tmp$nonce,"\n",pw,sep="")
passwd<-PKI.encrypt(charToRaw(keyword),pubkey_p)
passwd<-paste(as.character(passwd),sep="",collapse="")
############生成登入url##############
loginurl<-paste("http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_=",floor(as.numeric(Sys.time())*1000),sep="")
######################生成登入post参数#########
loginData<-c(
"entry"<-"sso",
"gateway"<-"1",
'from' = "null",
"savestate" = "30",
"useticket" = "0",
"pagerefer" = "",
"vsnf" = "1",
"su" = su,
"service" = "sso",
"servertime"=tmp$servertime,
"nonce"=tmp$nonce,
"pwencode"="rsa2",
"rsakv"=tmp$rsakv,
"sp" = passwd,
"sr" = "1366*768",
"encoding" = "UTF-8",
"cdult" = "3",
"domain" = "sina.com.cn",
"prelt" = "100",
"returntype" = "TEXT"
)
##设定post规则
#verbose:输出连接信息
#headerfunction:更新反馈头信息
ch1<-getCurlHandle(verbose = TRUE, headerfunction = h$update)
####post获取认证url#########
text2<-postForm(loginurl,.params = loginData,.encoding = "utf-8",style = "post",curl=ch1)#,curl=ch1
######抽取认证url#########
text3<-fromJSON(text2)
#############通过认证url更新头信息#########
text4<-getURL(text3$crossDomainUrlList[1], headerfunction = h$update,.encoding="utf-8")
############获取登入cookie###########
rhead<-h$value()
cookies<-rhead[names(rhead)=="Set-Cookie"]
cookie<-paste(lapply(str_split(cookies,pattern = ";"),function(v) v[1]),collapse = ";",sep = ";")
:cry: :cry: :cry: