python新浪微博的登录协助,可以处理验证码所需的情况。(新浪微博登录实现,包含验证码解析)(代码片段)

author author     2022-12-29     372

关键词:

# coding=utf8
import base64
import binascii
import cookielib
import json
import os
import random
import re
import rsa
import time
import urllib
import urllib2
import urlparse
from pprint import pprint


__client_js_ver__ = 'ssologin.js(v1.4.18)'


class Weibo(object):

    """"Login assist for Sina weibo."""

    def __init__(self, username, password):
        self.username = self.__encode_username(username).rstrip()
        self.password = password

        cj = cookielib.LWPCookieJar()
        self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

    @staticmethod
    def __encode_username(username):
        return base64.encodestring(urllib2.quote(username))

    @staticmethod
    def __encode_password(password, info):
        key = rsa.PublicKey(int(info['pubkey'], 16), 65537)
        msg = ''.join([
            str(info['servertime']),
            '\t',
            str(info['nonce']),
            '\n',
            str(password)
        ])
        return binascii.b2a_hex(rsa.encrypt(msg, key))

    def __prelogin(self):
        url = ('http://login.sina.com.cn/sso/prelogin.php?'
               'entry=weibo&callback=sinaSSOController.preloginCallBack&rsakt=mod&checkpin=1&'
               'su=username&_=timestamp&client=client'
               ).format(username=self.username, timestamp=int(time.time() * 1000), client=__client_js_ver__)

        resp = urllib2.urlopen(url).read()
        return self.__prelogin_parse(resp)

    @staticmethod
    def __prelogin_parse(resp):
        p = re.compile('preloginCallBack\((.+)\)')
        data = json.loads(p.search(resp).group(1))
        return data

    @staticmethod
    def __process_verify_code(pcid):
        url = 'http://login.sina.com.cn/cgi/pin.php?r=randint&s=0&p=pcid'.format(
            randint=int(random.random() * 1e8), pcid=pcid)
        filename = 'pin.png'
        if os.path.isfile(filename):
            os.remove(filename)

        urllib.urlretrieve(url, filename)
        if os.path.isfile(filename):  # get verify code successfully
            #  display the code and require to input
            from PIL import Image
            import subprocess
            proc = subprocess.Popen(['display', filename])
            code = raw_input('请输入验证码:')
            os.remove(filename)
            proc.kill()
            return dict(pcid=pcid, door=code)
        else:
            return dict()

    def login(self):
        info = self.__prelogin()

        login_data = 
            'entry': 'weibo',
            'gateway': '1',
            'from': '',
            'savestate': '7',
            'useticket': '1',
            'pagerefer': '',
            'pcid': '',
            'door': '',
            'vsnf': '1',
            'su': '',
            'service': 'miniblog',
            'servertime': '',
            'nonce': '',
            'pwencode': 'rsa2',
            'rsakv': '',
            'sp': '',
            'sr': '',
            'encoding': 'UTF-8',
            'prelt': '115',
            'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
            'returntype': 'META'
        
        if 'showpin' in info and info['showpin']:  # need to input verify code
            login_data.update(self.__process_verify_code(info['pcid']))
        login_data['servertime'] = info['servertime']
        login_data['nonce'] = info['nonce']
        login_data['rsakv'] = info['rsakv']
        login_data['su'] = self.username
        login_data['sp'] = self.__encode_password(self.password, info)

        return self.__do_login(login_data)

    def __do_login(self, data):
        url = 'http://login.sina.com.cn/sso/login.php?client=%s' % __client_js_ver__
        headers = 
            'User-Agent': 'Weibo Assist'
        
        req = urllib2.Request(
            url=url, data=urllib.urlencode(data), headers=headers)
        resp = urllib2.urlopen(req).read()

        return self.__parse_real_login_and_do(resp)

    def __parse_real_login_and_do(self, resp):
        p = re.compile('replace\(["\'](.+)["\']\)')
        url = p.search(resp).group(1)

        # parse url to check whether login successfully
        query = urlparse.parse_qs(urlparse.urlparse(url).query)
        if int(query['retcode'][0]) == 0:  # successful
            self.opener.open(url)  # log in and get cookies
            print u'登录成功!'
            return True
        else:  # fail
            print u'错误代码:', query['retcode'][0]
            print u'错误提示:', query['reason'][0].decode('gbk')
            return False

    def urlopen(self, url):
        return self.opener.open(url)


if __name__ == '__main__':
    weibo = Weibo('user@example.com', 'password')
    if weibo.login():
        print weibo.urlopen('http://weibo.com').read()
        # with open('weibo.html', 'w') as f:
        # print >> f, weibo.urlopen('http://weibo.com/kaifulee').read()

如何通过python调用新浪微博的api

1.下载SDK使用python调用API的话,首先要去下一个Python的SDK,sinaweibopy连接地址在此:http://michaelliao.github.com/sinaweibopy/可以使用pip很快的导入,github连接里的wiki也有入门的使用方法,很容易看懂。2.理解新浪微博的授权机制在调用AP... 查看详情

登陆新浪微博

登录新浪微薄时我忘了密码怎么办啊?请问我在登录新浪微薄时忘了用户名和密码怎么办呢?我在重复一篇:我在登录新浪微薄时不知道如何找回用户名和密码了。我有几个新浪邮箱,在登陆新浪微博时,还是提供不正确。请问... 查看详情

求真正有效的可以模拟登录新浪微博的java代码,后续可以用jsoup进行抓取。急急!!登录成功马上给分!

求真正有效的可以模拟登录新浪微博的java代码,给分。最好是基于Jsoup的登录代码。网上找了很多都是不能运行,哪位大神有真正可以实现登陆的代码,急求!参考技术Apackage jsoupTest;import java.io.IOException;import java.util.... 查看详情

python如何抓取新浪微博的微博内容

参考技术A基于文本文档(Markdown)设想好需要的基本需要的表、字段、类型;使用RailsMigration随着功能的开发逐步创建表;随着细节功能的开发、需求,逐步增加字段,删除字段,或者调整字段类型;第一个Release的时候清理Migrations... 查看详情

如何用python调用新浪微博的api

请问一下我如何用python调用新浪微博的api,本人菜鸟,会C++,python不会。最好给我举个调用的例子,例如users/show是根据用户ID获取用户信息,但是如何调用?官方的api没说明,而且实例也只给了Json的。请高手给我详细说明,谢... 查看详情

如何通过python调用新浪微博的api来爬取数据

1:安装python(这个不多说啦)2:下载新浪微博SDK的python包,解压为weibopy目录3:申请AppKey,流程:1:通过oAuth认证按我的理解简化如下:用户在新浪微博给的页面输入账号密码,然后微博给应用一个PIN码,这样应用通过PIN码才有权... 查看详情

如何使用 Bottle 和新浪微博 API 进行 Web 登录

...试用瓶子写一个新浪微博的第三方应用程序。但是他们为Python提供的SDK似乎没有“网页登录”的功能。我已经看过他们的PHPSDK,它具有weboauthlogin的功能。我试过自己写一个,但唯一的问题是,瓶子没有会话 查看详情

基于新浪微博的⽇志数据分析

["beCommentWeiboId":"","beForwardWeiboId":"","catchTime":"1387159495","commentCount":"1419","content":"分享图片","create 查看详情

图形解锁验证码破解(附python代码)(代码片段)

前言:爬虫开源死得快,新浪微博又改策略了。在去年的这个时候,微博还是没什么限制的。2016年12月我将新浪微博爬虫的代码作了一次更新,并将文章转到了知乎,爬微博的人似乎从那个时候开始多了许多... 查看详情

javascript实例学习之二——类新浪微博的输入框

该案例实现如下效果,具体可见新浪微博网站的微博发布框实现以下效果效果1:当光标移入文本框时,文本框上方的文字发生变化,显示剩余可以输入的字数,当光标移出文本框,并且文本框中没有任何输入时,恢复最初默认... 查看详情

基于新浪微博的⽇志数据分析(代码片段)

["beCommentWeiboId":"","beForwardWeiboId":"","catchTime":"1387159495","commentCount":"1419","content":"分享图片","creat 查看详情

如何将新浪微博登录集成到wordpress中? [关闭]

】如何将新浪微博登录集成到wordpress中?[关闭]【英文标题】:HowtointegrateSinaWeibologinintowordpress?[closed]【发布时间】:2015-10-0904:01:42【问题描述】:如何在我的wordpress网站中集成使用新浪微博的登录信息,就像我们在facebook和twitte... 查看详情

新浪微博怎么用用户名登录

以新浪微博电脑版、win7系统为例,新浪微博用用户名登录的方法如下:1、在百度搜索框中输入新浪微博四个字,等网页跳转(选第一个关注新浪微博-随时随地发现新鲜事-官方这个进行点击)2、点击打开之后,是这样一个页面... 查看详情

高分求助,php新浪微博接口api如果获取某一地区下所有用户的微博列表。。我在新浪微博的ap帮助里没有找到

某一地区所有用户列表,这个肯定要自己实现的啊!给个提示搜索用户根据地区搜索用户搜索你目标地区的用户这样就可以实现你的效果了参考技术A6 查看详情

空气质量数据网页爬虫加数据处理

Python这门语言因其简单强大已经火了很久了,但我接触的比较晚,前几个月因为一篇博客开始初步了解这门语言,并且之后模仿某位北邮的前辈的微博写了一个新浪微博的爬虫 这里给出链接:python编写的新浪微博爬虫 当... 查看详情

新浪微博mid是啥?

mid为该条微博/评论/私信在web系统中的id值。例如一条微博的地址为:http://t.sina.com.cn/1649394251/3z4efAo4lk则其mid=3z4efAo4lk参考技术A新浪微博的mid是什么 查看详情

openid和oauth区别

...个),然后用户登录的时候,选择一个URL进行登录(比如微博),跳转到微博OpenID登录页面,用户输入微博的账号和密码,微博验证成功之后,按照用户的选择,返回用户的一些信息。依赖方不需要做什么事情,只需要给url,让... 查看详情

wordpress如何建立一个滚动式的留言板,类似新浪微博的大家正在说~~

单独一个网页显示这个部分。。。类似新浪微博首页,糗事百科首页。。。个插件叫做DMSGuestBook,一步到位,傻瓜操作。下面是链接参考技术A个插件叫做DMSGuestBook,一步到位,傻瓜操作。下面是链接 查看详情