Python脚本实现虾米网签到功能


Posted in Python onApril 12, 2016

本文实例讲述了Python脚本实现虾米网签到功能的方法。分享给大家供大家参考,具体如下:

概述

这个脚本完成了自动登录虾米网、签到的功能。

大致要用到urllib、urllib2、cookielib这几个模块。其实就是用python实现向指定的url去post数据。

至于我怎么知道在浏览器里面登录和签到时浏览器都向服务器post了什么数据的问题,可以用强大的chrome:F12->Network里面可以看得到。有的服务器登录成功后会让客户端浏览器跳转或者立即刷新一次页面等等,会把登录时向服务器post的数据刷没掉,那么就要用到强大的抓包软件——WireShark来分析。比如用chrome:

Python脚本实现虾米网签到功能

然后就可以写了,构造Request Headers和要Post的Data(就是Chrome里的Form Data),ID和Pwd是明文传输,呵呵。

代码

下面是代码:

# -*- coding: cp936 -*-
'''''
Created on 2012-11-15
@author: liushuai
'''
import urllib, urllib2, cookielib, sys
class LoginXiami:
  login_header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4'}
  signin_header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4', 'X-Requested-With':'XMLHttpRequest', 'Content-Length':0, 'Origin':'http://www.xiami.com', 'Referer':'http://www.xiami.com/'}
  email = ''
  password = ''
  cookie = None
  cookieFile = './cookie.dat'
  def __init__(self, email, pwd):
    self.email = email
    self.password = pwd
    self.cookie = cookielib.LWPCookieJar()
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie))
    urllib2.install_opener(opener)
  def login(self):
    postdata = {'email':self.email, 'password':self.password, 'done':'http://www.xiami.com', 'submit':'%E7%99%BB+%E5%BD%95'}
    postdata = urllib.urlencode(postdata)
    print 'Logining...'
    req = urllib2.Request(url='http://www.xiami.com/member/login', data=postdata, headers=self.login_header)
    result = urllib2.urlopen(req).read()
    self.cookie.save(self.cookieFile)
    result = str(result).decode('utf-8').encode('gbk')
    if 'Email 或者密码错误' in result:
      print 'Login failed due to Email or Password error...'
      sys.exit()
    else :
      print 'Login successfully!'
  def signIn(self):
    postdata = {}
    postdata = urllib.urlencode(postdata)
    print 'signing...'
    req = urllib2.Request(url='http://www.xiami.com/task/signin', data=postdata, headers=self.signin_header)
    result = urllib2.urlopen(req).read()
    result = str(result).decode('utf-8').encode('gbk')
    self.cookie.save(self.cookieFile)
    try:
      result = int(result)
    except ValueError:
      print 'signing failed...'
      sys.exit()
    except:
      print 'signing failed due to unknown reasons ...'
      sys.exit()
    print 'signing successfully!'
    print self.email,'have signed', result, 'days continuously...'
if __name__ == '__main__':
  user = LoginXiami('你的登录邮箱', '你的密码')
  user.login()
  user.signIn()

然后运行一下脚本就可以登录、签到了。

Python脚本实现虾米网签到功能

后记

有的Discuz!论坛据说是为了防止用户用网页之外的途径向服务器post数据,服务器在每个用户每次登录成功后生成一个叫formhash的值,作为表单的隐藏域返回给客户端(服务端也有保存)。

Python脚本实现虾米网签到功能

客户端在向服务器post数据的时候,这个值会作为表单的一项数据“神不知鬼不觉”(因为是表单的隐藏域)地一同post过去,服务端收到客户端的post请求后,和服务端的formhash值作对比,就能知道是否是通过浏览器页面的方式post的数据了。

不过如果真的是为了防止这,这个做法真的有用吗?我试了一下,只需用简单的正则分析下登录成功返回的html,找到formhash值,再用上述方法和理论post过去即可,成功的完成了签到的功能。

反正不管怎么说,就是用脚本“假装”地完成了一下用浏览器登录并签到的过程。
:由于网站可能进行改版或升级,那么向服务器中post的数据可能会有变化,那么就要对代码进行相应调整,故代码仅供研究和学习参考之用。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python中的defaultdict模块和namedtuple模块的简单入门指南
Apr 01 Python
Python遍历指定文件及文件夹的方法
May 09 Python
python中nan与inf转为特定数字方法示例
May 11 Python
Python网络编程详解
Oct 31 Python
windows下pycharm安装、创建文件、配置默认模板
Jul 31 Python
漂亮的Django Markdown富文本app插件的实现
Jan 02 Python
Python实现的大数据分析操作系统日志功能示例
Feb 11 Python
Python实现的排列组合、破解密码算法示例
Apr 12 Python
Python3 使用pillow库生成随机验证码
Aug 26 Python
python3实现微型的web服务器
Sep 03 Python
python中栈的原理及实现方法示例
Nov 27 Python
用Python提取PDF表格的方法
Apr 11 Python
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
Apr 12 #Python
用Python写冒泡排序代码
Apr 12 #Python
详解Python的Django框架中manage命令的使用与扩展
Apr 11 #Python
对Python的Django框架中的项目进行单元测试的方法
Apr 11 #Python
使用Python的Django框架结合jQuery实现AJAX购物车页面
Apr 11 #Python
Python的Django REST框架中的序列化及请求和返回
Apr 11 #Python
python中的错误处理
Apr 10 #Python
You might like
php die()与exit()的区别实例详解
2016/12/03 PHP
使用ThinkPHP生成缩略图及显示
2017/04/27 PHP
PDO::quote讲解
2019/01/29 PHP
TNC vs BOOM BO3 第二场2.13
2021/03/10 DOTA
在js中单选框和复选框获取值的方式
2009/11/06 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
简洁Ajax函数处理(示例代码)
2013/11/15 Javascript
火狐下input焦点无法重复获取问题的解决方法
2014/06/16 Javascript
jQuery中append()方法用法实例
2015/01/08 Javascript
jQuery内容过滤选择器用法分析
2015/02/10 Javascript
动态加载jQuery的方法
2015/06/16 Javascript
CSS javascript 结合实现悬浮固定菜单效果
2015/08/23 Javascript
jQuery实现的表格展开伸缩效果实例
2016/09/07 Javascript
javascript图片预览和上传(兼容IE)
2017/03/15 Javascript
js手机号4位显示空格,银行卡每4位显示空格效果
2017/03/23 Javascript
基于Vue实例生命周期(全面解析)
2017/08/16 Javascript
360doc网站不登录就无法复制内容的解决方法
2018/01/27 Javascript
Bootstrap 中data-[*] 属性的整理
2018/03/13 Javascript
解决Mac下安装nmp的淘宝镜像失败问题
2018/05/16 Javascript
详解小程序之简单登录注册表单验证
2019/05/13 Javascript
微信小程序JS加载esmap地图的实例详解
2019/09/04 Javascript
echarts实现折线图的拖拽效果
2019/12/19 Javascript
vue 导航锚点_点击平滑滚动,导航栏对应变化详解
2020/08/10 Javascript
[46:14]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第一场 12.11
2020/12/16 DOTA
python编码最佳实践之总结
2016/02/14 Python
python实现手机通讯录搜索功能
2018/02/22 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
解决python 自动安装缺少模块的问题
2018/10/22 Python
python torch.utils.data.DataLoader使用方法
2020/04/02 Python
美国领先的家庭健康检测试剂盒提供商:LetsGetChecked
2019/03/18 全球购物
便利店促销方案
2014/02/20 职场文书
爱心捐款感谢信
2015/01/20 职场文书
2015年酒店工作总结范文
2015/04/07 职场文书
创业计划书之酒吧
2019/12/02 职场文书
vue使用echarts实现折线图
2022/03/21 Vue.js
你真的会用Mysql的explain吗
2022/03/31 MySQL