V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
nivan
V2EX  ›  分享创造

撸了个 V2EX 自动签到脚本

  •  1
     
  •   nivan · 2016-05-17 19:28:50 +08:00 · 5154 次点击
    这是一个创建于 3137 天前的主题,其中的信息可能已经有所发展或是发生改变。

    casperjs 写签到脚本真是简单直观!!! http://i-ai.org/v2ex-autosign/

    45 条回复    2016-05-26 10:30:16 +08:00
    ColinWei
        1
    ColinWei  
       2016-05-17 20:16:25 +08:00
    简单的同时 健壮性为 0
    atnoot
        2
    atnoot  
       2016-05-17 20:23:38 +08:00
    我也撸了个签到脚本
    atnoot
        3
    atnoot  
       2016-05-17 20:24:34 +08:00
    python 版的
    nivan
        4
    nivan  
    OP
       2016-05-17 20:31:52 +08:00
    @ColinWei 初学 casperjs,代码写的不好请多见谅!求分享稳定的 v 站签到脚本!学习学习!
    Gua
        5
    Gua  
       2016-05-17 20:38:54 +08:00
    30 秒了,链接都没打开~
    wex
        6
    wex  
       2016-05-17 20:47:11 +08:00
    @atnoot 你好,问下,为什么我可以登录成功,但是签到的时候提示:<div class="message" onclick="$(this).slideUp('fast');">请重新点击一次以领取每日登录奖励</div>
    我是这样弄的: url = re.search(r'/mission/daily/redeem\?once=\d+', login.text).group()
    url = 'http://v2ex.com' + url
    login = session.get(url, headers=header).text
    nivan
        7
    nivan  
    OP
       2016-05-17 20:49:05 +08:00
    @Gua 加了个 CDN ,比较费时的是 disqus 加载,看来国内还是用多说好!
    EchoWhale
        8
    EchoWhale  
       2016-05-17 23:28:52 +08:00   ❤️ 1
    ruby 写了一个,遇到意外签到不成功会发邮件提醒
    https://github.com/WunderEye/v2ex_auto_sign
    winterbells
        9
    winterbells  
       2016-05-17 23:42:14 +08:00 via Android
    我都是用 Chrome 的扩展。。。
    kevinroot
        10
    kevinroot  
       2016-05-17 23:54:56 +08:00
    你确定可以登录成功?
    casper.start('http://v2ex.com/signin', function() {
    this.fillSelectors('form[action="/signin"]', {
    'input[type="text"]': username,
    'input[type="password"]': password
    }, false);
    })
    我这里显示 v 大登录时候已经加了防 xss , input name 已经变成 64 位的十六进制了
    nivan
        11
    nivan  
    OP
       2016-05-18 06:31:56 +08:00
    @kevinroot 这里用到了 casperjs 1.1 的 api fillSelectors 根据 input 的 type 进行 填充
    zhangyi2099
        12
    zhangyi2099  
       2016-05-18 06:37:49 +08:00 via iPhone
    这是模拟浏览器登录吗?我记得我写的时候还要提取网页中 once 码
    nivan
        13
    nivan  
    OP
       2016-05-18 06:43:10 +08:00
    @zhangyi2099 对,casperjs 是基于 phantomjs 或者 SlimerJS,前者使用 WebKit,后者使用 Gecko
    nivan
        14
    nivan  
    OP
       2016-05-18 06:54:05 +08:00
    @EchoWhale 😄感谢分享! ruby 代码真是直观!👍
    liyvhg
        15
    liyvhg  
       2016-05-18 08:30:48 +08:00 via Android
    @winterbells 求扩展名
    atnoot
        16
    atnoot  
       2016-05-18 08:41:20 +08:00
    @wex github.com/davisqi/me.git 中 V2EX 可以参考一下
    weer0026
        17
    weer0026  
       2016-05-18 08:42:41 +08:00
    @EchoWhale ruby 大法好啊!
    EchoWhale
        18
    EchoWhale  
       2016-05-18 09:29:38 +08:00 via Android
    @weer0026 Ruby 虽好,不能当饭吃哦
    winterbells
        19
    winterbells  
       2016-05-18 09:48:40 +08:00 via Android   ❤️ 1
    weer0026
        20
    weer0026  
       2016-05-18 10:51:35 +08:00
    @EchoWhale 之前呆的日企倒是要求用 ruby ,可惜没学完就转去 php 了。
    EchoWhale
        21
    EchoWhale  
       2016-05-18 11:29:52 +08:00
    @weer0026 还是对 Ruby 念念不忘吧?(*^__^*)
    写起来真的很舒服,对人脑太友好了
    wq2016
        22
    wq2016  
       2016-05-18 14:29:16 +08:00
    我是用 CasperJS 写的
    inmyfree
        23
    inmyfree  
       2016-05-18 14:55:13 +08:00
    前天快 200 天刚断了。。。
    gogobody
        24
    gogobody  
       2016-05-18 15:11:50 +08:00 via Android
    @atnoot 求 python 版分享!
    bearqq
        25
    bearqq  
       2016-05-18 16:11:44 +08:00
    @gogobody python , 2.7 依赖 mechanize 。

    """
    def make_br():
    br = mechanize.Browser(history=NoHistory())
    #cj = cookielib.LWPCookieJar()
    #br.set_cookiejar(cj)
    br.set_handle_equiv(True)
    br.set_handle_gzip(True)
    br.set_handle_redirect(True)
    br.set_handle_referer(True)
    br.set_handle_robots(False)

    br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
    br.set_debug_http(False)
    br.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0')]
    #br.set_proxies({"http":"username:[email protected]:8888"})
    return br

    class v2ex(object):
    def __init__(self,v2expara,useproxy=0,proxyaddr='http://127.0.0.1:8580'):
    self.name='v2ex'
    self.br=make_br()
    self.v2expara=v2expara #('name','pass')

    def sign(self):
    br=self.br
    br.open('https://www.v2ex.com/signin')
    #for f in br.forms():
    br.select_form(nr=1)

    for i in br.form.__dict__['controls']:
    #print i.name,i.type
    if i.type=='text':
    br.form[i.name]=self.v2expara[0]
    elif i.type=='password':
    br.form[i.name]=self.v2expara[1]
    br.submit()

    br.open('https://www.v2ex.com/mission/daily')
    if u'每日登录奖励已领取' in br.response().read():
    return 1
    else:
    br.open(re.search(r'/mission/daily/redeem\?once=\d+', br.response().read()).group())
    if u'请重新点击一次以领取每日登录' in response:
    return 0
    elif br.response().read():
    return 1
    return 0
    """
    bearqq
        26
    bearqq  
       2016-05-18 16:15:03 +08:00
    suspended
        27
    suspended  
       2016-05-18 16:38:12 +08:00   ❤️ 1
    @EchoWhale 不能这么说吧。去年做了个 300K 的小项目(一个数据归档系统),除了直接和磁带机打交道的部分是 C ,其余的执行器,调度,空间管理,管理界面,全部都是用 ruby 写的。
    EchoWhale
        28
    EchoWhale  
       2016-05-18 17:56:38 +08:00
    @suspended 个人开发者?那的确可以选任何语言。或者你能影响到公司新项目采用的技术栈。
    ruby 的就业范围很窄是个不争的事实,所以我才说 Ruby 不能当饭吃
    atnoot
        29
    atnoot  
       2016-05-18 19:22:07 +08:00
    @gogobody github.com/davisqi/me.git 中 V2EX 可以参考一下
    audi
        30
    audi  
       2016-05-18 19:22:30 +08:00   ❤️ 1
    签到有什么用
    xiaomayi0323
        31
    xiaomayi0323  
       2016-05-18 23:42:50 +08:00
    @atnoot Python 版的来一发
    gogobody
        32
    gogobody  
       2016-05-19 08:27:27 +08:00 via Android
    gogobody
        33
    gogobody  
       2016-05-19 08:27:49 +08:00 via Android
    @bearqq @atnoot 感谢 2 位!
    Clarencep
        34
    Clarencep  
       2016-05-19 09:21:24 +08:00
    @wex 你也遇到啦~ 原来不是我一个人遇到这个问题 我还以为出现幻觉了,后来就没再遇到过
    suspended
        35
    suspended  
       2016-05-19 11:06:18 +08:00
    @EchoWhale 国内不流行 Ruby ,哪怕在国外似乎也都局限于 Rails? 蛮可惜的。我个人从没用过 Rails 。
    shulen
        36
    shulen  
       2016-05-20 08:35:52 +08:00
    https://github.com/ForestCho/node-v2ex 之前也弄过一个,现在还挂着签到
    nivan
        37
    nivan  
    OP
       2016-05-20 10:11:12 +08:00
    @shulen 谢谢分享!
    v2ex.js
    62: console.log('登录中...\n 此过程你有被封 IP 的危险...');
    话说 v 站会封 IP 的吗?
    shulen
        38
    shulen  
       2016-05-20 13:05:38 +08:00
    @nivan 多次错误登录会封 ip
    nivan
        39
    nivan  
    OP
       2016-05-20 14:55:59 +08:00
    @shulen 哦~好像很厉害,试试去.
    nivan
        40
    nivan  
    OP
       2016-05-20 15:04:22 +08:00
    @shulen 试了下!!!😳封 172800 秒
    shulen
        41
    shulen  
       2016-05-20 17:08:54 +08:00
    @nivan 哭去吧
    moogle
        42
    moogle  
       2016-05-25 14:37:52 +08:00
    @atnoot
    请问 balance 是一个字符串,这里跑出异常,该如何处理?
    if balance not in result:
    TypeError: a bytes-like object is required, not 'str'
    atnoot
        43
    atnoot  
       2016-05-25 19:52:03 +08:00
    @mgoole 你可以把 balance 内容打印出来,看一下。或者参看楼上代码,自行修改。
    moogle
        44
    moogle  
       2016-05-26 00:02:01 +08:00
    @atnoot 初学,犯很多错误。
    result = s.get(url2, headers=headers).content
    balance = "location.href = '/balance'"
    我之前是用 python3 运行,所以 result 是 byte 。改为用 python2 运行, result 是字符串,这样就正常了。
    从 if balance not in result:还是有很多内容没看懂:
    1 、 location.href = '/balance'的用途。
    2 、 misurl 的用途
    atnoot
        45
    atnoot  
       2016-05-26 10:30:16 +08:00
    @moogle misurl 这个其实是抓取 location.href = '/mission/daily/redeem?once=\d+'的信息,现在看看也没必要 直接可以在内容里搜索就可以。/balance 这个主要是判断是否出现这个 url ,如果出现了 就表示签到成功了,没有签到,后面就进行签到的步骤。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1002 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:35 · PVG 05:35 · LAX 13:35 · JFK 16:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.