最近在学习 scala ,用 v 站签到来练练手。 这个签到脚本主要是参考 https://github.com/lqccan/v2ex-sign/blob/master/v2ex.py 这位 v 友写的签到脚本,自己用 scala 实现了一下,登录是没问题的,但是到最后一步 /mission/daily/redeem?once=xxx 时却失败了,返回 302 ,跳转回 /mission/daily 页面。 以下是代码:
import java.net.HttpCookie
import scalaj.http.{Http, HttpResponse}
object V2Sigin2 {
def main(args: Array[String]): Unit = {
val signPage: HttpResponse[String] = Http("http://www.v2ex.com/signin").asString
val html = signPage.body
val cookieMap: scala.collection.mutable.Map[String, HttpCookie] = scala.collection.mutable.Map[String, HttpCookie]()
signPage.cookies.foreach(f => cookieMap.put(f.getName, f))
val nameMatch = "type=\"text\" class=\"sl\" name=\"([a-f0-9]{64,64})\"".r findFirstMatchIn html
val pwdMatch = "type=\"password\" class=\"sl\" name=\"([a-f0-9]{64,64})\"".r findFirstMatchIn html
val onceMatch = "value=\"(\\d+)\" name=\"once\"".r findFirstMatchIn html
val nameName = if (nameMatch.isEmpty) "" else nameMatch.get.group(1)
val pwdName = if (pwdMatch.isEmpty) "" else pwdMatch.get.group(1)
val once = if (onceMatch.isEmpty) "" else onceMatch.get.group(1)
val next = "/"
val loginResult = Http("http://www.v2ex.com/signin").postForm(
Seq(nameName -> "username",
pwdName -> "password",
"once" -> once,
"next" -> next
)
).headers(Seq("Referer" -> "http://www.v2ex.com/signin",
"User-Agent" -> "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0"
))
// .cookies(signPage.cookies)
.cookies(cookieMap.values.toSeq)
.asString
loginResult.cookies.foreach(f => cookieMap.put(f.getName, f))
if (loginResult.code == 302) {
val dailyResult = Http("http://www.v2ex.com/mission/daily")
// .cookies(loginResult.cookies)
.cookies(cookieMap.values.toSeq)
.asString
dailyResult.cookies.foreach(f => cookieMap.put(f.getName, f))
if (dailyResult.code != 200) {
println("没有登录无法签到!")
return
}
if (dailyResult.body.indexOf("fa-ok-sign") > -1) {
println("本日已签到!")
} else {
val dailyMatch = "(/mission/daily/redeem\\?once=\\d+)".r findFirstMatchIn dailyResult.body
val daily = if (dailyMatch.isEmpty) "" else dailyMatch.get.group(1)
val signResult = Http("http://www.v2ex.com" + daily)
.cookies(cookieMap.values.toSeq)
// .cookies(loginResult.cookies)
// .cookies(dailyResult.cookies)
.headers(
Seq("Referer" -> "http://www.v2ex.com/mission/daily",
"User-Agent" -> "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0",
"Host" -> "www.v2ex.com",
"Connection" -> "keep-alive"
)
).asString
println(signResult.code)
signResult.cookies.foreach(f => cookieMap.put(f.getName, f))
println("签到成功!")
}
} else {
println("登录失败!")
}
println("============")
println(cookieMap)
}
}
一开始以为是 cookie 问题,因为那位 v 友用的 python 的 requests.Session()是能自动管理 cookie 的,而我用的 http 包没有管理上下文的功能,但是不管我怎么设置 cookie ,最终都是返回 302 ,问题出在哪里呢? 代码写的不是很好,大家轻拍。。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.