python 模拟微博登录

微博参数是动态变化的,附上代码

#coding=utf8
__author__ = 'z'


# -*- coding: utf-8 -*-
########################
#author:z
#date:2016/6/19
#login weibo
########################
import sys
import urllib
import urllib2
import cookielib
import base64
import re
import json
import rsa
import binascii
#import requests
#from bs4 import BeautifulSoup

#新浪微博的模拟登陆
class weiboLogin:
    def enableCookies(self):
            #获取一个保存cookies的对象
            cj = cookielib.CookieJar()
            #将一个保存cookies对象和一个HTTP的cookie的处理器绑定
            cookie_support = urllib2.HTTPCookieProcessor(cj)
            #创建一个opener,设置一个handler用于处理http的url打开
            opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
            #安装opener,此后调用urlopen()时会使用安装过的opener对象
            urllib2.install_opener(opener)

    #预登陆获得 servertime, nonce, pubkey, rsakv
    def getServerData(self):
            url = 'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=ZW5nbGFuZHNldSU0MDE2My5jb20%3D&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.18)&_=1442991685270'
            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']
                    pubkey = data['pubkey']
                    rsakv = data['rsakv']
                    return servertime, nonce, pubkey, rsakv
            except:
                    print 'Get severtime error!'
                    return None


    #获取加密的密码
    def getPassword(self, password, servertime, nonce, pubkey):
            rsaPublickey = int(pubkey, 16)
            key = rsa.PublicKey(rsaPublickey, 65537) #创建公钥
            message = str(servertime) + '\t' + str(nonce) + '\n' + str(password) #拼接明文js加密文件中得到
            passwd = rsa.encrypt(message, key) #加密
            passwd = binascii.b2a_hex(passwd) #将加密信息转换为16进制。
            return passwd

    #获取加密的用户名
    def getUsername(self, username):
            username_ = urllib.quote(username)
            username = base64.encodestring(username_)[:-1]
            return username

     #获取需要提交的表单数据
    def getFormData(self,userName,password,servertime,nonce,pubkey,rsakv):
        userName = self.getUsername(userName)
        psw = self.getPassword(password,servertime,nonce,pubkey)

        form_data = {
            'entry':'weibo',
            'gateway':'1',
            'from':'',
            'savestate':'7',
            'useticket':'1',
            'pagerefer':'http://weibo.com/p/1005052679342531/home?from=page_100505&mod=TAB&pids=plc_main',
            'vsnf':'1',
            'su':userName,
            'service':'miniblog',
            'servertime':servertime,
            'nonce':nonce,
            'pwencode':'rsa2',
            'rsakv':rsakv,
            'sp':psw,
            'sr':'1366*768',
            'encoding':'UTF-8',
            'prelt':'115',
            'url':'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
            'returntype':'META'
            }
        formData = urllib.urlencode(form_data)
        return formData

    #登陆函数
    def login(self,username,psw):
            self.enableCookies()
            url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)'
            servertime,nonce,pubkey,rsakv = self.getServerData()
            formData = self.getFormData(username,psw,servertime,nonce,pubkey,rsakv)
            headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0'}
            req  = urllib2.Request(
                    url = url,
                    data = formData,
                    headers = headers
            )
            result = urllib2.urlopen(req)
            text = result.read()
            print text
            #还没完!!!这边有一个重定位网址,包含在脚本中,获取到之后才能真正地登陆
            p = re.compile('location\.replace\([\'"](.*?)[\'"]\)')
            try:
                    login_url = p.search(text).group(1)
                    print login_url
                    #由于之前的绑定,cookies信息会直接写入
                    urllib2.urlopen(login_url).read()
                    print "Login success!"
            except:
                    print 'Login error!'
                    return 0

            #访问主页,把主页写入到文件中
            url = "http://weibo.com/u/3292397255/home?wvr=5"#本人的微博主页
            # url = 'http://weibo.com/u/2679342531/home?topnav=1&wvr=6'
            open_url(url)
            request = urllib2.Request(url)
            response = urllib2.urlopen(request)
            text = response.read()
            fp_raw = open("weibo.html","w+")
            fp_raw.write(text)
            fp_raw.close()
            #print text

wblogin = weiboLogin()
print '新浪微博模拟登陆:'
username = raw_input('用户名:')
password = raw_input('密码:')
wblogin.login(username,password)


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 以下是Python模拟微博登录的示例代码: ```python import requests from bs4 import BeautifulSoup # 构造请求头部 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} # 登录页面URL login_url = 'https://passport.weibo.cn/signin/login' # 构造登录请求表单数据 data = { 'username': 'your_username', # 替换为你的微博账号 'password': 'your_password', # 替换为你的微博密码 'savestate': '1', 'r': '', 'ec': '0', 'pagerefer': 'https://passport.weibo.cn/signin/welcome?entry=mweibo&r=https%3A%2F%2Fm.weibo.cn%2F', 'entry': 'mweibo' } # 发送登录请求 session = requests.session() response = session.post(login_url, headers=headers, data=data) # 获取登录后的首页内容 home_url = 'https://m.weibo.cn/' response = session.get(home_url, headers=headers) soup = BeautifulSoup(response.content, 'html.parser') print(soup) ``` 请注意,微博登录需要输入验证码,上述示例代码并未处理验证码。如果出现验证码,需要手动输入或者使用第三方库进行识别。此外,微博登录也可能需要进行短信验证等额外步骤。 ### 回答2: Python可以使用Selenium库来模拟微博登录。 Selenium是一个自动化测试工具,可以模拟用户在浏览器中的操作。首先,我们需要安装Selenium库和一个浏览器驱动,比如ChromeDriver。 接下来,我们可以使用以下代码来模拟微博登录: ```python from selenium import webdriver from selenium.webdriver.common.keys import Keys import time # 创建一个Chrome浏览器的实例 driver = webdriver.Chrome() # 打开微博登录页面 driver.get("https://weibo.com/login.php") # 定位到用户名和密码的输入框,并输入相应的值 username_input = driver.find_element_by_name("username") username_input.send_keys("your_username") password_input = driver.find_element_by_name("password") password_input.send_keys("your_password") # 提交登录信息 password_input.send_keys(Keys.ENTER) # 等待登录成功并跳转到首页 time.sleep(5) # 打印登录成功后的页面标题 print(driver.title) # 关闭浏览器 driver.quit() ``` 上述代码首先创建一个Chrome浏览器实例,然后打开微博登录页面。接着,通过`find_element_by_name`方法定位到用户名和密码的输入框,并使用`send_keys`方法输入相应的值。 然后,通过`send_keys(Keys.ENTER)`方法提交登录信息。登录成功后,等待5秒钟,然后打印登录成功后的页面标题。 最后,关闭浏览器。 通过这样的方式,我们可以使用Python模拟微博登录,实现自动化登录功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值