模拟登陆知乎

简介: 同其他登陆的过程一样,均需要识别参数、构造参数,结合session使用来完成登陆状态的保存,便可以模拟登陆了。


信息收集阶段:


       信息收集阶段的主要内容有:

       1、了解正常登陆的流程

       2、了解正常登陆时用到的参数

       3、理顺出登陆流程,识别登陆时所需要的参数

  • 了解正常登陆的流程、参数 -可结合burp查看
  • 识别参数

     打开浏览器自带的调试器(查看Network-All),填写好帐号和密码、验证码后,点击登陆,查看调试器中的内容。

    7416e457ff8187d8ff3718858aa87b6b6dcede85

   查看加载的内容,可以看到captcha.gif?r=3562789056789字样(很明显加载的是验证码)、email字样,email数据包中的内容为:

   验证码的URL:https://www.zhihu.com/captcha.gif?r=3562789056789

   登陆时请求的URL:https://www.zhihu.com/login/email

   登陆时post的参数为:_xsrf、password、captcha、captcha_type、email

   参数意义如下:

       _xsrf:了解csrf漏洞的同学肯定会理解_xsrf参数的意义,它是为了给提交的表单添加个随机值,用来防止恶意构造的请求被触发后成功执行

      password:没错猜对了,就是登陆密码

      capcha:验证码

      captcha_type:验证码的类型,这个可以在网页源代码,或者是数据包中看到,这里是固定值cn

      email:没错又猜对了,是登陆帐号

准备阶段:

   post数据包中的password、captcha_type、email参数可控,那么我们接下来要解决的问题就是获得_xsrf以及capcha的值。

   1)获取xsrf值:

      想要定位到一个参数,那么我们就需要从最初开始访问这个URL开始,找到其第一次出现的位置。

     从下图中我们可以看到,在第一次请求网站时,响应包中的cookies中设有_xsrf参数,结合burp我们可以观察到,在接下来的流程中,_xsrf的值固定为初始请求回来的值(即图中cookies中_xsrf字段的值),接下来我们把这个值获取到就可以了。

    dcbcd6f26f28b78e6df5f336d213540f5d0ab964

  获取xsrf参数值代码如下:


import re
import requests

r = requests.get(url="https://www.zhihu.com",headers = headers,verify =False)

s= str(r.cookies) pattern = r'_xsrf=(.*?) for' _xsrf = re.findall(pattern,s,re.S|re.I) xsrf = _xsrf[0]

  2)获取captcha的值:

      在浏览器中(下图)可以看到captcha图片的地址https://www.zhihu.com/captcha.gif?r=xxxxxxxx&type=login&lang=cn,我们知道r后面的一串数字为时间戳(别问我怎么知道的,在网页源代码中看到的)。

    b127e75b2001c087b3ea91bef96a9782726c9f5e

  • 获取验证码链接:为了避免本地获取的时间与服务器端的时间不同步,所以此处时间戳timestamp的值取网页中的值,将其与获取captcha的链接连接在一起,便获取到了验证码链接。

   b6f58b4c584820bf738171d92abaa058c77f3f51

获取验证码URL的代码如下:

import re
import requests

r = requests.get(url="https://www.zhihu.com",headers = headers,verify =False)

pattern_captcha_timestmp =r'<script type="text/json" class="json-inline" data-name="ga_vars">{"user_created":0,"now":(.*?),'
ss = r.content
_captcha_timestmp = re.findall(pattern_captcha_timestmp,ss,re.S|re.I)
timestamp =  _captcha_timestmp[0]
captcha_url =base_url + '/captcha.gif?r=' +timestamp + "&type=login&lang=cn"
print "captcha_url:%s" %captcha_url

  • 验证码写入到本地:获取到captcha的地址后,接下来要把验证码图片读取出来,然后手工输入验证码便可以完成模拟登陆。读取验证码,首先要将验证码请求回来后写入本地文件,然后输入验证码的值:

验证码写入到本地的代码如下:

session =requests.session()
captcha_f = session.get(captcha_url,headers=headers)
with open ('captcha.jpg','wb') as f:
    f.write(captcha_f.content)
    f.close
877a7e37ae73d9dd5fc0c41273c7b472101543de

  • 分析验证码的特征:

     将验证码中的所有汉字选中,在请求数据包中观察验证码的值,可以看到每个汉字是根据其所在的水平方向和垂直方向的相对位置定位的,这里就不展示了。验证码传输的方式是,输入倒立汉字所在的位置,将选中的相对位置做为参数就行传输。

     代码实现思路:输入倒立汉字所在的位置(1-7),程序计算其相对坐标。

def location(a,b):
    a = 20 * int(a) +2
    b = 20 * int(b) +2
    if b != 0 :
        captcha = "{\"img_size\":[200,44],\"input_points\":[[%s,26.45],[%s,29.45]]}" %(int(a),int(b))
    else:
        captcha = "{\"img_size\":[200,44],\"input_points\":[[%s,26.45]]}" % (a)
    return  captcha

模拟登陆阶段

   将以上获取到的参数同登陆帐号、密码一同发向服务端做登陆认证,为了维持用户登陆后的状态,此处我们结合使用session,完成整个模拟登陆过程。

完整的代码如下:

#!/usr/bin/python
#-*-coding:UTF-8-*-

‘’‘
#coding:gooyii
#date:20170606
’‘’

import requests
import re

#base information
base_url = "https://www.zhihu.com"
login_email = '/login/email'
email = "xxxx"
password = "xxxx"
#base header
headers_base = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Encoding': 'gzip, deflate, sdch',
    'Accept-Language': 'en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4,zh-TW;q=0.2',
    'Connection': 'keep-alive',
    'Host': 'www.zhihu.com',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36',
    'Referer': 'http://www.zhihu.com/',
}


r = requests.get(url=base_url,headers = headers_base,verify =False)
#get_xsrf
s= str(r.cookies)
pattern = r'_xsrf=(.*?) for'
_xsrf = re.findall(pattern,s,re.S|re.I)
xsrf = _xsrf[0]

#new headers with xsrftoken
headers_base['X-Xsrftoken'] = '%s' %(xsrf)
headers = headers_base

#get captcha_url
pattern_captcha_timestmp =r'<script type="text/json" class="json-inline" data-name="ga_vars">{"user_created":0,"now":(.*?),'
ss = r.content
_captcha_timestmp = re.findall(pattern_captcha_timestmp,ss,re.S|re.I)
timestamp =  _captcha_timestmp[0]
captcha_url =base_url + '/captcha.gif?r=' +timestamp + "&type=login&lang=cn"
print "captcha_url:%s" %captcha_url

#write captcha as captcha.jpg
session =requests.session()
captcha_f = session.get(captcha_url,headers=headers)
with open ('captcha.jpg','wb') as f:
    f.write(captcha_f.content)
    f.close

def location(a,b):
    a = 20 * int(a) +2
    b = 20 * int(b) +2
    if b != 0 :
        captcha = "{\"img_size\":[200,44],\"input_points\":[[%s,26.45],[%s,29.45]]}" %(int(a),int(b))
    else:
        captcha = "{\"img_size\":[200,44],\"input_points\":[[%s,26.45]]}" % (a)
    return  captcha

#input captcha relate_location
locationa = raw_input("input captcha location 1:")
locationb = raw_input("input captcha location 2:")
captcha = location(locationa,locationb)


url = base_url + "/login/email"
data = {'_xsrf':xsrf,'password':password,'captcha':captcha,'captcha_type':'cn','email':email}
#requests 的session登录,以post方式,参数分别为url、headers、data
content = session.post(url= url,headers =headers,data=data)
print content.text

if "\u767b\u5f55\u6210\u529f" in content.text:
    print "login successful !"

目录
相关文章
|
JavaScript PHP 数据安全/隐私保护
Python模拟登陆 —— 征服验证码 9 微博weibo.com
登录界面 抓包分析可以使用Http Analyzer,Filders,但是看起来很复杂,还是使用火狐好(chrome远远没有火狐好用)。 首先,在输入用户名后,会进行预登录,网址为:http://login.
1484 0
|
10月前
|
数据采集 Java Maven
Java爬虫第二篇:模拟登录CSDN
Java爬虫第二篇:模拟登录CSDN
170 0
|
数据采集 JSON 数据格式
Python爬虫入门教程 35-100 知乎网全站用户爬虫 scrapy
爬前叨叨 全站爬虫有时候做起来其实比较容易,因为规则相对容易建立起来,只需要做好反爬就可以了,今天咱们爬取知乎。继续使用scrapy当然对于这个小需求来说,使用scrapy确实用了牛刀,不过毕竟本博客这个系列到这个阶段需要不断使用scrapy进行过度,so,我写了一会就写完了。
1347 0
|
数据采集 API Python
Python爬虫入门教程 25-100 知乎文章图片爬取器之一
1. 知乎文章图片爬取器之一写在前面 今天开始尝试爬取一下知乎,看一下这个网站都有什么好玩的内容可以爬取到,可能断断续续会写几篇文章,今天首先爬取最简单的,单一文章的所有回答,爬取这个没有什么难度。
1396 0
|
数据采集 Python 数据库管理
Python爬虫入门教程 26-100 知乎文章图片爬取器之二
1. 知乎文章图片爬取器之二博客背景 昨天写了知乎文章图片爬取器的一部分代码,针对知乎问题的答案json进行了数据抓取,博客中出现了部分写死的内容,今天把那部分信息调整完毕,并且将图片下载完善到代码中去。
2580 0
|
BI
除了知乎点赞知乎刷赞,站内关键词布局的3种方法
大家好,如需知乎点赞或交流,请加我的微信号 : keepku 可提供业务,也可切磋交流 一、获取自己相关的长尾关键词  现在的电商竞争越来越大,想要提高自己网站的转化率,加大力度挖掘长尾关键词势在必行。
1479 0
|
数据采集 Web App开发 iOS开发
Python爬虫-爬取贴吧中每个帖子内的楼主图片
1.根据输入的关键字筛选贴吧 2.获得贴吧内的帖子,支持分页爬取 3.爬取并下载帖子内仅和楼主相关的图片
2707 0
|
Web App开发 数据采集 前端开发
|
数据采集 Java 数据安全/隐私保护
Java爬虫——模拟登录知乎
  登录界面,首先随意输入一个账号,登录查看发送表单的请求    可以发现请求是Post : https://www.zhihu.com/login/phone_num 发送的表单是 _xsrf: password: 密码 无需加密captcha: 验证码 无需验证码时为不用此...
1510 0
|
Web App开发 iOS开发 Python
Python模拟登陆 —— 征服验证码 10 知乎(倒立文字验证码)
知乎的倒立文字验证码 # 登录知乎,通过保存验证图片方式 import urllib.request import urllib.parse import time import http.
1188 0