一个用于百度贴吧自动签到的python脚本

2013年9月21日 分类: Python (844 个脚步)

百度贴吧签到送经验,但是有时候稍微忙点就忘记去签到导致签到不连续了,所以就想到用python脚本挂在服务器,让他自动帮签到,免去了忘记去签到而断掉连续签到的尴尬。

首先要在脚本的相同路径下新建一个config文件。一行一个帐号,cookie需要自己手动记录下来。

保存了config文件后,下面就是要让系统自动的去执行这个脚本。

将脚本和config文件都放在用户的主目录下面,然后输入命令crontab -e新加一条计划任务

0 0 * * * 就是每天的0点让系统自动执行后面的语句

>> /var/log/baiduautocheckin.log 这个就是将执行脚本的输入记录在文件内,以在文件末尾添加新的数据。

0 0 * * * /usr/bin/python /home/shiniv/BaiduAutoCheckin.py >> /home/shiniv/log/baiduautocheckin.log 2>&1

保存退出,这样系统就能每天帮你去签到,就不会让这个签到数断掉了。smiley

下面就是主要代码

#!/usr/bin/python
#coding=utf-8
 
#
#   Author: 柠之漠然 <shiniv.ning@gmail.com>
#
# 使用说明:
#	   1.安装python 2.x
#	   2.在脚本当前目录下建立'config'文件
#		   config文件中,一行一个账号,格式为
#			   ID1,email1,cookie1
#		   不希望收到邮件提醒的email写'x'  (邮件提醒在网络不好时可能引起错误导致崩溃)
#			   ID2,x,cookie2   
#		   cookie可以在贴吧页面ctrl+shift+k执行alert(document.cookie);得到
#			   *最好是手机版贴吧的cookie
#			   *如果要获得多个账号的cookie,切换账号时要直接'清除cookie'不能'注销'
#	   3.执行 python BaiduAutoCheckin.py
#
 
import os
import re
import urllib
import urllib2
import smtplib
import threading
from email.mime.text import MIMEText
 
# getBars
def getBars(cookie,again=10):
	req=urllib2.Request(
		url='http://wapp.baidu.com/m?tn=bdFBW&tab=favorite',
		headers={
			'cookie':cookie,
			'User-Agent':'mozilla firefox'
		}
	)
	if again>0:
		try:
			res=urllib2.urlopen(req,timeout=15).read()
		except:
			return getBars(cookie,again-1)
		barList=re.findall(r'(?:\d+\.<a data-cke-saved-href="[^" href="[^" ]+"="">)([^<]+)(?:)',res)
		if barList:
			return barList
		else:
			return None
	else:
		return None
	 
# 签到函数
def sign(bar,cookie,again=20):
	req=urllib2.Request(
		url='http://wapp.baidu.com/f/?kw='+urllib.quote(bar),
		headers={
			'cookie':cookie,
			'User-Agent':'mozilla firefox'
		}
	)
	try:
		res=urllib2.urlopen(req,timeout=10).read()
	except:
		return sign(bar,cookie)
	# 得到地址
	addr=re.search(r'(?<=<a href=")[^"]+(?=">签到)',res)
	# 不能签到或者签到过
	if not addr:
		return '0'
	# 替换'amp;'
	addr=re.sub(r'amp;','',addr.group())
	req=urllib2.Request(
		url='http://wapp.baidu.com'+addr,
		headers={
			'cookie':cookie,
			'User-Agetn':'mozilla firefox'
		}
	)
	try:
		res=urllib2.urlopen(req,timeout=10).read()
	except:
		# 超时
		return sign(bar,cookie)
	success=re.search(r'(?<="light">)\d(?=<\/span>)',res)
	if not success:
		if again:
			return sign(bar,cookie,again-1)
		return '-1'
	return success.group()
 
# sendmail
def sendMail(usr,email,text):
	if email=='x':
		return
	msg=MIMEText(text,'plain','utf-8')
	msg['Subject']=usr+'百度贴吧签到结果'
	msg['From']='shiniv'
	msg['To']=email+';'
	try:
		smtp=smtplib.SMTP_SSL('smtp.gmail.com','25')
		smtp.login('邮箱地址','密码')
		smtp.sendmail('发件人邮箱',email+';',msg.as_string())
		print '发送成功'
	except Exception ,e:
		print '发送失败'
		print e
	finally:
		smtp.quit()
 
# 每个ID的线程
class thread(threading.Thread):
	def __init__(self,usr,email,cookie):
		self.usr=usr
		self.email=email
		self.cookie=cookie
		self.logs=""
		threading.Thread.__init__(self)
	# run
	def run(self):
		bars=getBars(self.cookie)
		if not bars:
			print '%s 获取贴吧列表失败!\n' % self.usr
			return
		print '%s 共有%d个吧需要签到\n' % (self.usr,len(bars))
		self.logs+='======>'+self.usr+' 开始签到!\n'
		for bar in bars:
			res=sign(bar,self.cookie)
			if res=='0':
				self.logs+=bar+'吧今天已经签到!\n'
			elif res=='-1':
				self.logs+=bar+'吧\t###\t签到失败!请自己补签\n'
			else:
				self.logs+=bar+'吧签到成功,经验+'+res+'\n'
		self.logs+='======>'+self.usr+' 签到完成!\n\n'
		print self.logs 
		return sendMail(self.usr,self.email,self.logs)
 
# 启动,读配置文件
def init():
	path = os.path.dirname(os.path.abspath(__file__))
	if os.path.exists(path+'/config'):
		f=open('config')
		# 开线程
		for line in f:
			args=line.split(',')
			thread(args[0],args[1],args[2]).start()
		f.close()
	else:
		print '%s没有配置文件!' % path
		os._exit(-1)
 
init()

一个用于百度贴吧自动签到的python脚本 【声明】本文 一个用于百度贴吧自动签到的python脚本 为柠之漠然原创文章,转载请注明出自 枫之落叶
并保留本文有效链接:https://blog.shiniv.com/2013/09/a-python-script-for-xiami-autosign/ , 转载请保留本声明!

标签: , , ,
14 条评论
  • 问下我把BaiduAutoCheckin.py和配置文件(命名为config.sys)一起放在F:checktieba下 运行时为什么显示
    F:没有配置文件! 哪里不对了?
    我把这句path = os.path.dirname(os.path.abspath(__file__))改成path = os.path.dirname(os.path.abspath(‘F:checktieba’))了

  • 现在提示获取列表失败

    • 你再试试从手机版那里取得一遍cookie
      隐身模式进去http://tieba.baidu.com/mo

      • 依然无效。。。

        • 我刚复制你的那段配置到我那里试了下,可以用
          你试一下将getbars改成下面的
          def getBars(cookie,again=10):
          req=urllib2.Request(
          url=’http://wapp.baidu.com/m?tn=bdFBW&tab=favorite‘,
          headers={
          ‘cookie’:cookie,
          ‘User-Agent’:’mozilla firefox’
          }
          )
          if again>0:
          try:
          res=urllib2.urlopen(req,timeout=15).read()
          except:
          return getBars(cookie,again-1)
          barList=re.findall(r'(?:d+.<a href="[^"]+">)([^<]+)(?:</a>)’,res)
          if barList:
          return barList
          else:
          return None
          else:
          return None

          • 找到原因了,应该是useragent设置的过长了,短了反而好了

  • 多说登陆后自动跳转到404,请检查设置

    • 我修改过后台登陆地址。。没注意到多说插件也有原来的登陆地址

      • 为什么我用这个脚本没反应呢?

        • 这个我之前脚本是放在root目录下的,没注意到config路径问题

          • 我已经改了路径了,OS.CHDIR

  • 赶紧给我妹子,没妹子用了。

    • 水资源缺乏 请到浙江境内领取。。。预计抽水时间为20几号

  • 换多说了?赶紧给我A点分,没PBB用了。

你必须要启用 Javascript