Skip to content
This repository was archived by the owner on Dec 6, 2023. It is now read-only.

Latest commit

 

History

History
223 lines (149 loc) · 7.82 KB

File metadata and controls

223 lines (149 loc) · 7.82 KB

各站点登陆实现思路

01 weibo-新浪微博

  1. 登陆前有个预登陆请求,用于请求获取本次登录账号的加密信息;

  2. 用户名和密码均进行了加密后提交;

    • 用户名:先进行URL编码后再进行base64编码

    • 密码:采用了rsa的对称加密,每次的加密信息包括混合的字符串,公钥等信息需要请求ssologin.js来获取

    def _get_s_password(self, server_time, nonce, pubkey):
        """
        获取将密码加密后用于登录的字符串
        :return:
        """
        encode_password = (str(server_time) + "\t" + str(nonce) + "\n" + str(self.password)).encode("utf-8")
        public_key = rsa.PublicKey(int(pubkey, 16), int('10001', 16))
        encry_password = rsa.encrypt(encode_password, public_key)
        password = binascii.b2a_hex(encry_password)
        return password.decode()
  1. 验证码:五位字母+数字的带干扰线验证码。

    • 提供了一个新浪的验证码识别接口

      # 新浪微博验证码识别接口,可在线测试
      # 识别准确率98%以上,可用于训练原始数据模型
      - API: http://captcha.faceme.site/sina
      - Method: POST (multipart/form-data)
    • 验证码使用示例脚本

      import requests
      
      img_path = 'fake-path/captcha.png'  # 验证码图片地址
      file = {"captcha": ("captcha.png", open(img_path, 'rb'), "image/png")}
      resp = requests.post(url='http://captcha.faceme.site/sina', files=file)
      # print(resp.json())
      print(resp.text)

02 toutiao-今日头条

  1. Web页面中,PC版登录存在滑动验证码。由于在本例程中避免使用Selenium进行操作,所以更换User-Agent采用移动端Web页面可以避免出现滑动验证码,与之代替的是图形验证码;

    'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1'
  2. 用户名和密码均未进行任何加密;

  3. 通过移动端Web页面登录生成的Cookies信息可以直接在PC-Web页面上使用。


03 sohu-搜狐新闻

  1. 搜狐新闻在PC-Web页面中进行登录时会出现验证码,而切换至移动端Web页面时不会产生验证码,所以可以通过移动Web界面进行登录完美的绕过验证码;

  2. 用户名未加密,密码采用md5进行加密后提交。

        def _get_password_md5(password):
            """
            密码的md5字符串
            :return:
            """
            return md5(password.encode(encoding='UTF-8')).hexdigest()

04 ifeng-凤凰新闻

  1. 采用PC-Web页面完成,账号密码均未做加密处理;

  2. 登陆需要验证码,验证码为4位数由字母+数字组成。

    验证码链接:https://id.ifeng.com/public/authcode

05 douban-豆瓣

  1. 账号密码均未做任何加密处理,并且无验证码出现。

06 itouchtv-触电新闻媒体平台

  1. 采用PC-Web页面完成,账号密码均未做加密处理;

  2. 出这个站点的原因是因为在登录之后,进行其它操作时需要生成sign值需要进行两次加密,并且GETPOST请求生成sign方式不一致。

    • sign是由登录后获取的tokenuseId以及当前的13位毫米时间戳组合后,先经过md5加密后生成的32位字符串,再经过sha1加密生成40位字符串;

    • 如果是POST请求需要将form-data的数据转换成字典类型后根据key值排正序后,所有key+value拼接成字符串,一起混入进行加密生成sign

      from hashlib import md5, sha1
      
      
      def get_sign(token, user_id, timestamp_ms):
          """
          GET请求时sign的生成方式
          :param token: 登录获取的token
          :param user_id: 登录可获取的userId
          :param timestamp_ms: 13位毫秒时间戳
          :return:
          """
          # get请求时明文字符串组成
          get_method_clear_text_format = '{token}{user_id}{timestamp_ms}'
          clear_text = get_method_clear_text_format.format(token=token, user_id=user_id, timestamp_ms=timestamp_ms)
          md5_text = md5(clear_text.encode(encoding='UTF-8')).hexdigest()
          sha1_text = sha1(md5_text.encode('utf-8')).hexdigest()
          return sha1_text
      
      
      def post_sign(token, user_id, timestamp_ms, post_form_data):
          """
          POST请求时sign的生成方式
          :param token: 登录获取的token
          :param user_id: 登录可获取的userId
          :param timestamp_ms: 13位毫秒时间戳
          :param post_form_data: POST请求时提交的表单数据
          :return:
          """
          # POST请求时明文字符串组成
          post_method_clear_text_format = '{token}{user_id}{content_str}{timestamp_ms}'
          # 将表单数据按key排序之后再组合成字符串
          sorted_items = sorted(post_form_data.items(), key=lambda t: t[0], reverse=False)
          content_str = ''.join([str(k) + str(v) for k, v in sorted_items])
          clear_text = post_method_clear_text_format.format(token=token, user_id=user_id, content_str=content_str, timestamp_ms=timestamp_ms)
          md5_text = md5(clear_text.encode(encoding='UTF-8')).hexdigest()
          sha1_text = sha1(md5_text.encode('utf-8')).hexdigest()
          return sha1_text

07 github-GitHub

  1. 采用PC-Web页面完成,账号密码均未做加密处理,且不需要验证码;

  2. 登录需要提取隐藏表单中的authenticity_token

    <form action="/session" accept-charset="UTF-8" method="post">
        <input name="utf8" type="hidden" value="&#x2713;"/>
        <input type="hidden" name="authenticity_token" value="rzuceXctjkBoZGUcxGwtNJsgd8bor3GSVHO3GsBMMNpfVNHRAassqVO6rUETWiaiFqW0EUdMBgl1qJAp3ppWlw=="/>
        <div class="auth-form-header p-0">
            <h1>Sign in to GitHub</h1>
        </div>
        <div id="js-flash-container"></div>
        <div class="auth-form-body mt-3">
            <label for="login_field">Username or email address
            </label>
            <input type="text" name="login" id="login_field" class="form-control input-block" tabindex="1" autocapitalize="off" autocorrect="off" autofocus="autofocus"/>
            <label for="password">
                Password <a class="label-link" href="/password_reset">Forgot password?</a>
            </label>
            <input type="password" name="password" id="password" class="form-control form-control input-block" tabindex="2"/>
            <input type="hidden" class="js-webauthn-support" name="webauthn-support" value="unknown">
            <input type="submit" name="commit" value="Sign in" tabindex="3" class="btn btn-primary btn-block" data-disable-with="Signing in…"/>
        </div>
    </form>

08 zhongguancun-中关村在线

  1. 采用PC-Web登陆,其中密码拼接了字符串进行了md5加密摘要;

    login_js
    from hashlib import md5
    # 将密码明文+字符串zol拼接后进行md5加密生成32位摘要
    password = md5((password_text + 'zol').encode(encoding='UTF-8')).hexdigest()
    1. 登录时需要携带Cookie才能登陆,否则会响应账号密码错误的信息
    • 诸多Cookieip_ck为必需的cookie,非本地生成,请求http://js.zol.com.cn/pvn/pv.ht得到

      import time
      import requests
      
      # 获取cookies中的ip_ck,经测试该字段为提交登录时的必需字段
      resp = requests.get(url=f'http://js.zol.com.cn/pvn/pv.ht?&t={int(time.time() / 1000)}&c=')
      if resp.status_code == 200:
          ip_ck = resp.json().get('ipck')