新浪微博登录

转载自:http://www.douban.com/note/201767245/

 PC 登录新浪微博时, 在客户端用js预先对用户名、密码都进行了加密, 而且在POST之前会GET 一组参数,这也将作为POST_DATA 的一部分。 这样, 就不能用通常的那种简单方法来模拟POST 登录( 比如 人人网 )。

由于要用的一部分微博数据用API获取不方便, 所以还是要自己写个小爬虫, 模拟登录是必不可少的。琢磨了一下这个东西,最终登录成功。

1, 在提交POST请求之前, 需要GET 获取两个参数。
       地址是:http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.18)
       得到的数据中有 "servertime" 和 "nonce" 的值, 是随机的,其他值貌似没什么用。

2, 通过httpfox 观察POST 的数据, 参数较复杂,其中 “su" 是加密后的username, "sp"是加密后的password。"servertime" 和 ”nonce" 是上一步得到的。其他参数是不变的。

    username 经过了BASE64 计算: username = base64.encodestring( urllib.quote(username) )[:-1];
    password 经过了三次SHA1 加密, 且其中加入了 servertime 和 nonce 的值来干扰。
    即: 两次SHA1加密后, 将结果加上 servertime 和 nonce 的值, 再SHA1 算一次。

    将参数组织好, POST请求。 这之后还没有登录成功。
    POST后得到的内容中包含一句 location.replace("http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&retcode=101&reason=%B5%C7%C2%BC%C3%FB%BB%F2%C3%DC%C2%EB%B4%ED%CE%F3");

这是登录失败时的结果, 登录成功后结果与之类似, 不过retcode 的值是0 。接下来再请求这个URL,这样就成功登录到微博了。
记得要提前build 缓存。

下面是完整代码(没加注释,凑合看吧):



#! /usr/bin/env python
#coding=utf8
import urllib
import urllib2
import cookielib
import base64
import re
import json
import time
import hashlib

cj = cookielib.LWPCookieJar()
cookie_support = urllib2.HTTPCookieProcessor(cj)
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)
postdata = {
    'entry': 'weibo',
    'gateway': '1',
    'from': '',
    'savestate': '7',
    'userticket': '1',
    'ssosimplelogin': '1',
    'vsnf': '1',
    'vsnval': '',
    'su': '',
    'service': 'miniblog',
    'servertime': '',
    'nonce': '',
    'pwencode': 'wsse',
    'sp': '',
    'encoding': 'UTF-8',
    'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
    'returntype': 'META'
}

def get_servertime():
    url = 'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=dW5kZWZpbmVk&client=ssologin.js(v1.3.18)&_=1329806375939'
    data = urllib2.urlopen(url).read()
    p = re.compile('\((.*)\)')
    try:
        json_data = p.search(data).group(1)
        data = json.loads(json_data)
        servertime = str(data['servertime'])
        nonce = data['nonce']
        return servertime, nonce
    except:
        print 'Get severtime error!'
        return None


def get_pwd(pwd, servertime, nonce):
    pwd1 = hashlib.sha1(pwd).hexdigest()
    pwd2 = hashlib.sha1(pwd1).hexdigest()
    pwd3_ = pwd2 + servertime + nonce
    pwd3 = hashlib.sha1(pwd3_).hexdigest()
    return pwd3


def get_user(username):
    username_ = urllib.quote(username)
    username = base64.encodestring(username_)[:-1]
    return username


def login():
    username = '@qq.com'
    pwd = ''
    url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.5)'
    try:
        servertime, nonce = get_servertime()
    except:
        return
    global postdata
    postdata['servertime'] = servertime
    postdata['nonce'] = nonce
    postdata['su'] = get_user(username)
    postdata['sp'] = get_pwd(pwd, servertime, nonce)
    postdata = urllib.urlencode(postdata)
    headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0'}
    req = urllib2.Request(
        url=url,
        data=postdata,
        headers=headers
    )
    result = urllib2.urlopen(req)
    text = result.read()
    p = re.compile('location\.replace\(\"(.*?)\"\)')
    try:
        login_url = p.findall(text)[0]
        print login_url
        urllib2.urlopen(login_url)
        print "登录成功!"
    except Exception, ex:
        print 'Login error!' + ex.message


if __name__ == '__main__':
    login()
    url = "http://weibo.com/u/"
    precode = urllib2.urlopen(url)
    while True:
        time.sleep(10);
        nowcode = urllib2.urlopen(url)
        if precode == nowcode:
            pass
        else:
            print "happy " + url
            precode = nowcode



各种NC,居然想到这种东西。。。我要吐血了。。。不过以后我能发展到各种自动提醒业务哦。嘿嘿。。。

先把新浪登录记下一笔。

话说新浪的登录可真是麻烦哦,幸好直接百度代码了,不然也不知道要研究到什么时候呢!

看到上面的解释就各种头疼了。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!要使用 WebDriver 登录新浪微博,您可以按照以下步骤进行操作: 1. 首先,您需要下载相应浏览器的 WebDriver。根据您使用的浏览器类型,可以选择下载 ChromeDriver(Google Chrome 浏览器)、GeckoDriver(Mozilla Firefox 浏览器)或者其他对应的驱动程序。 2. 安装 WebDriver,并确保将其添加到系统的 PATH 环境变量中,以便可以在命令行或脚本中直接调用。 3. 导入相应的库,例如 Selenium WebDriver,以便在代码中使用。 4. 创建一个 WebDriver 的实例,指定浏览器类型和 WebDriver 的路径。例如,在 Python 中,您可以使用以下代码创建一个 Chrome WebDriver 的实例: ```python from selenium import webdriver driver = webdriver.Chrome('path_to_chromedriver') ``` 5. 使用 WebDriver 打开新浪微博登录页面。例如,在 Python 中,您可以使用以下代码打开登录页面: ```python driver.get('https://weibo.com') ``` 6. 找到登录表单的用户名和密码输入框,并使用 `send_keys()` 方法输入相应的用户名和密码。例如,在 Python 中,可以使用以下代码找到并填写用户名和密码: ```python username_input = driver.find_element_by_name('username') password_input = driver.find_element_by_name('password') username_input.send_keys('your_username') password_input.send_keys('your_password') ``` 7. 找到登录按钮,并使用 `click()` 方法点击登录。例如,在 Python 中,可以使用以下代码找到并点击登录按钮: ```python login_button = driver.find_element_by_xpath('//button[contains(text(), "登录")]') login_button.click() ``` 8. 等待页面加载完成,可以使用 `time.sleep()` 方法暂停一段时间,或者使用 WebDriver 的等待机制来等待特定的元素出现。 9. 登录完成后,您可以执行其他操作,例如访问其他页面或执行特定的操作。 请注意,这只是一个简单的示例,并且具体的代码实现可能因不同的编程语言和环境而有所不同。您可能需要根据自己的实际情况和需求进行适当的调整。 希望对您有所帮助!如有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值