搜索
有爱,有技术,有你^_^)y
╱人◕‿‿◕人╲订下契约(注册新用户)

合作站点账号登陆

QQ登录

只需一步,快速开始

快捷导航
查看: 4636|回复: 8
收起左侧

姬宅百度贴吧的自动签到菜鸟脚本教程(三)gae篇

[复制链接]

该用户从未签到

30

主题

127

好友

2万

积分

技术宅认证程序员

重度中二患者

积分
28325
发表于 2012-11-23 00:28:30 | 显示全部楼层 |阅读模式

╱人◕‿‿◕人╲定下契约

您需要 登录 才可以下载或查看,没有账号?╱人◕‿‿◕人╲订下契约(注册新用户)

x
本帖最后由 foodszhu 于 2012-11-23 00:28 编辑

经过上两篇姬宅百度贴吧的自动签到菜鸟脚本教程(一)登陆篇,[url=姬宅百度贴吧的自动签到菜鸟脚本教程(二)签到篇 https://www.gn00.com/t-162458-1-1.html]姬宅百度贴吧的自动签到菜鸟脚本教程(二)签到篇[/url]。基本的脚本我们已经彻底完成了,也完成了一键签到的功能,
但是如果我们有一段时间不能用电脑,或者晚上懒得12点才睡去抢签怎么办?这里简单介绍一下如何将程序部署到google app engine上并使用cron job计划任务帮我们自动执行。
当然大家可以直接去看google给的教程,比我讲的好很多,不过中文教程还是python2.5的。。如果要用2.7还是看英文的


首先我们需要去google申请一个账户,并登陆appengine.google.com来创建自己的第一个应用,一旦创建好我们就有一个免费的二级域名来对我们的应用进行访问。申请好后去GAE 的SDK下载页面下载最新的SDKhttps://developers.google.com/appengine/downloads#Google_App_Engine_SDK_for_Python,然后配置下环境变量就可以开始了。。
对于我们这种几乎几乎全后台的脚本。。如果不写前端的话还是很容易的。。
先写app.yaml,对于我而言,我的应用名叫autologin-foodszhu.
[mw_shl_code=text,true]application: autologin-foodszhu
version: 2
runtime: python27
api_version: 1
threadsafe: false

handlers:
- url: /all
  script: loginAll.py[/mw_shl_code]
这个loginAll.py就是我们写的一键签到的脚本
然后再完成cron.yaml来完成定时任务[mw_shl_code=text,true]
cron:
- description: daily login job
  url: /all
  schedule: every 1 mins from 0:00 to 0:20
  timezone: Asia/Shanghai
- description: every mouth clear job
  timezone: Asia/Shanghai[/mw_shl_code]
这个cron我们在schedule种定义每天0:00到0:20每过一分钟,都运行一次loginAll的脚本。因为害怕如果只在0:00运行一次,很容易超时,而gae每个响应至多只能有30s时间,超过就会错误。。所以我们在这段时间内多次运行。
然后用appcfg.py将自己的应用部署上去即可

这就算简单的完成了,如果没什么特殊要求。。这样做一般可以保证每日都会签到。。
但是如果你要签到的贴吧数较多,而百度每日只允许签到100个贴吧,但是你用程序签到并不管你这个真的签到成功与否,反正执行一次,便多记录你你签到贴吧数目一个。这样,在0:00至0:20中多达20次的请求很容易将100个名额用完。这时我们便要将已经签到过的贴吧保存下来,下次签到时不再签到。。这也是为什么qiandaoAll方法会有一个except_list的原因。
由于GAE不允许本地文件的写入,所以我们必须用它给的数据存储区功能,好吧。。。其实我也只是照着写。。。没有仔细研究过。。
首先引入数据存储区的模块[mw_shl_code=python,true]from google.appengine.ext import db[/mw_shl_code]
在qiandao模块中,我们加入一个数据存储模型
[mw_shl_code=python,true]class QiandaoResult(db.Expando):
    name=db.StringProperty()
    no=db.IntegerProperty()
    isQiandao=db.BooleanProperty()
    time=db.DateTimeProperty()[/mw_shl_code]
提供了几个简单的属性,name为名字,no为返回代码,isQidandao记录是否签到成功,time记录本次签到的时间。因为我们不希望只记录下这几个信息,所以我们从db.Expando
DateTimeProperty 属性类支持tzinfo来对时区进行转换,数据存储区的数据自动转换为UTC时区,但是我们毕竟还是Asia/Shanghai的时区,所以我们要自己转换。
datetime模块中的tzinfo只是一个抽象类,并没有具体实现,所有我们可以采用一个第三方模块pytz,来帮我们转换,不过第三方模块部署时要一并附在应用目录下。pytz只有2mb大小,不算大,如果实在嫌大,可将pytz下zoneinfo中无关文件全部删掉。。只留我们需要的时区。
这时可以对我们的analyseQiandaoResult方法进行一定修改
[mw_shl_code=applescript,true]def analyseQiandaoResult(self,tieba_name,response):
        now=datetime.datetime.now(pytz.timezone('Asia/Shanghai'))
        result=json.loads(response)
        no=result['no']
        error=result['error']
        if no == 0:
            result=result['data']['uinfo']
            result[u'tieba_name']=tieba_name.decode('utf-8')
            dataStore=QiandaoResult(name=self.name,no=no,isQiandao=True,time=now)
            for key,value in result.iteritems():
                dataStore.__setattr__(key,value)
        else:
            result=tieba_name,error
            dataStore=QiandaoResult(name=self.name,no=no,isQiandao=False,time=now)
            dataStore.error=error
            dataStore.tieba_name=tieba_name
            if no == 1101 or no == 1007:
                dataStore.isQiandao=True
        dataStore.put()
        return no,result[/mw_shl_code]
[mw_shl_code=python,true]now=datetime.datetime.now(pytz.timezone('Asia/Shanghai'))[/mw_shl_code]
来申明一个datetime对象记录在'Asia/Shanghai下的当前时间
[mw_shl_code=python,true]dataStore=QiandaoResult(name=self.name,no=no,isQiandao=True,time=now)
for key,value in result.iteritems():
dataStore.__setattr__(key,value)[/mw_shl_code]
初始化实体并添加动态属性方便我们日后提取调用。。
[mw_shl_code=python,true]dataStore.put()[/mw_shl_code]
提交实体。。
在loginAll里对已存储的实体进行查询
[mw_shl_code=applescript,true]today=datetime.datetime.combine(datetime.date.today(),datetime.time(tzinfo=pytz.timezone('Asia/Shanghai')))
    jishuzhai=qiandao.JishuzhaiQiandao()
    jishuzhai.login()
    if not db.GqlQuery("SELECT * FROM QiandaoResult WHERE name = :1 AND isQiandao = True",jishuzhai.name).get():
        jishuzhai.qiandao()
    baidu=qiandao.TiebaQiandao()
    baidu.login()
    qbaidu=list(db.GqlQuery("SELECT * FROM QiandaoResult WHERE name = :1 AND isQiandao = True AND time >= :2",baidu.name,today))
    response_list=baidu.qiandaoAll(*[item.tieba_name for item in qbaidu])[/mw_shl_code]
定义一个每天0:00的datetime对象,通过对这个对象的不等式查询,来确定今天的已签到的贴吧,最后对未签到的贴吧进行签到。。可以减少签到次数

但是实际应用对签到速度的提升并不明显。。。关键在于每晚gae对百度登陆都很卡。。姬宅的完全无压力。。。贴吧签到就只能慢慢跑了。。
最后放上自己在gae部署的程序,大家自己改下appid和用户名密码什么就可以用了。。 autologin.zip (54.26 KB, 下载次数: 11)

autologin.zip(54.27KB)

评分

参与人数 1宅币 +16 贡献 +2 收起 理由
风音洛洛 + 16 + 2 o(* ̄▽ ̄*)ブ 发糖

查看全部评分

签名被小宅喵吞掉了~~~~(>_<)~~~~
回复

使用道具 举报

该用户从未签到

258

主题

314

好友

3万

积分

第二章

积分
35715
发表于 2012-11-24 12:30:07 | 显示全部楼层
得找个机会学下GAE怎么用
博客什么的求人气 http://bimania.org
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

15

好友

4804

积分

序章

积分
4804
发表于 2012-11-24 12:34:33 | 显示全部楼层
我还属于没看懂的行列。。。打酱油去。。。
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

234

主题

966

好友

1万

积分

第一章

积分
12398
发表于 2013-8-5 09:05:02 | 显示全部楼层
下下来不会用……
只是论坛发帖没有强力的说说功能怎么涨粉?
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

40

好友

5387

积分

序章

积分
5387
发表于 2013-8-23 13:21:57 | 显示全部楼层
那个GAE签到现在还可以继续使用吗?我试了貌似百度对GAEIP有限制了
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

30

主题

127

好友

2万

积分

技术宅认证程序员

重度中二患者

积分
28325
 楼主| 发表于 2013-8-23 15:30:10 | 显示全部楼层
等死星人
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

7

好友

2704

积分

Continue

积分
2704
发表于 2014-3-13 13:46:16 | 显示全部楼层
本论坛也有签到功能  做个本论坛的自动签到GAE版本可否?
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

9

好友

2482

积分

Continue

积分
2482
发表于 2014-5-6 14:05:52 | 显示全部楼层
可以回复了么?
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

26

好友

4134

积分

序章

积分
4134
发表于 2014-5-13 18:06:17 | 显示全部楼层
涨姿势涨姿势
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

本版积分规则

小黑屋|手机版|技术宅(Z站|基宅) ( 粤ICP备18082987号-1 )

GMT+8, 2025-7-15 09:47 , Processed in 0.116977 second(s), 36 queries , Redis On.

Copyright © 2018 技术宅社区

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表