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之禅》中对于Python编程过程中的一些建议
Apr 03 Python
介绍Python中的文档测试模块
Apr 28 Python
在Python的Django框架的视图中使用Session的方法
Jul 23 Python
Python学习笔记之解析json的方法分析
Apr 21 Python
pandas全表查询定位某个值所在行列的方法
Apr 12 Python
Python单向链表和双向链表原理与用法实例详解
Aug 31 Python
详解Python3除法之真除法、截断除法和下取整对比
May 23 Python
利用anaconda保证64位和32位的python共存
Mar 09 Python
python安装读取grib库总结(推荐)
Jun 24 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
Sep 23 Python
如何用 Python 处理不平衡数据集
Jan 04 Python
pytorch显存一直变大的解决方案
Apr 08 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静态文件生成类实例
2014/11/29 PHP
PHP中把有符号整型转换为无符号整型方法
2015/05/27 PHP
非常好的js代码
2006/06/27 Javascript
做网页的一些技巧(续)
2007/02/01 Javascript
Knockoutjs的环境搭建教程
2012/11/26 Javascript
JavaScript的漂亮的代码片段
2013/06/05 Javascript
JavaScript拆分字符串时产生空字符的解决方案
2014/09/26 Javascript
jQuery使用正则表达式替换dom元素标签用法示例
2017/01/16 Javascript
nodejs读写json文件的简单方法(必看)
2017/03/09 NodeJs
Ionic3 UI组件之Gallery Modal详解
2017/06/07 Javascript
jQuery 实现图片的依次加载图片功能
2017/07/06 jQuery
详解 vue.js用法和特性
2017/10/15 Javascript
vue轮播图插件vue-awesome-swiper
2017/11/27 Javascript
Vue实现todolist删除功能
2018/06/26 Javascript
Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖
2018/11/25 Javascript
vue实现下拉加载其实没那么复杂
2019/08/13 Javascript
JS实现盒子拖拽效果
2020/02/06 Javascript
python抓取网页图片示例(python爬虫)
2014/04/27 Python
在Django中创建第一个静态视图
2015/07/15 Python
python 删除大文件中的某一行(最有效率的方法)
2017/08/19 Python
Python基于回溯法子集树模板解决全排列问题示例
2017/09/07 Python
python pycurl验证basic和digest认证的方法
2018/05/02 Python
django基础学习之send_mail功能
2019/08/07 Python
PyTorch 解决Dataset和Dataloader遇到的问题
2020/01/08 Python
Python判断字符串是否为空和null方法实例
2020/04/26 Python
python3 sleep 延时秒 毫秒实例
2020/05/04 Python
Python实现加密接口测试方法步骤详解
2020/06/05 Python
详解HTML5 Canvas绘制不规则图形时的非零环绕原则
2016/03/21 HTML / CSS
高级3D打印市场:Gambody
2019/12/26 全球购物
extern在函数声明中是什么意思
2014/01/19 面试题
会议邀请书范文
2014/02/02 职场文书
简历中自我评价范文
2015/03/11 职场文书
校园安全学习心得体会
2016/01/18 职场文书
大学生创业计划书
2019/06/24 职场文书
教你怎么用Python生成九宫格照片
2021/05/20 Python
Java死锁的排查
2022/05/11 Java/Android