Python模拟微博登陆,亲测有效!
作者 l 上海小胖
来源 l Python专栏(ID:xpchuiit)
转载请联系授权(微信ID:pythonzhuanlan)
今天想做一个微博爬个人页面的工具,满足一些不可告人的秘密。那么首先就要做那件必做之事!模拟登陆……
代码是参考了:https://www.douban.com/note/201767245/,我对代码进行了优化,重构成了Python 3.6 版本,并且加入了大量注释方便大家学习。
PC 登录新浪微博时, 在客户端用JS预先对用户名、密码都进行了加密,而且在POST之前会GET 一组参数,这也将作为POST_DATA 的一部分。这样,就不能用通常的那种简单方法来模拟POST 登录( 比如人人网 )。
在提交POST请求之前,需要GET 获取两个参数。地址是:http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.18)。
得到的数据中有 servertime 和 nonce 的值, 是随机的,其他值貌似没什么用。
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'
# 返回出来的是一个Response对象,无法直接获取,text后,可以通过正则匹配到
# 大概长这样子的:sinaSSOController.preloginCallBack({"retcode":0,"servertime":1545606770, ...})
data = requests.request('GET', url).text
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('获取 severtime 失败!')
return None
通过 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 算一次。
def get_pwd(pwd, servertime, nonce):
# 第一次计算,注意Python3 的加密需要encode,使用bytes
pwd1 = hashlib.sha1(pwd.encode()).hexdigest()
# 使用pwd1的结果在计算第二次
pwd2 = hashlib.sha1(pwd1.encode()).hexdigest()
# 使用第二次的结果再加上之前计算好的servertime和nonce值,hash一次
pwd3_ = pwd2 + servertime + nonce
pwd3 = hashlib.sha1(pwd3_.encode()).hexdigest()
return pwd3
def get_user(username):
# 将@符号转换成url中能够识别的字符
_username = urllib.request.quote(username)
# Python3中的base64计算也是要字节
# base64出来后,最后有一个换行符,所以用了切片去了最后一个字符
username = base64.encodebytes(_username.encode())[:-1]
return username
将参数组织好,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 缓存。
作者简介:上海小胖,四大咨询的Tech Lead,MongoDB Professional获得者。「Python专栏」专注Python领域的各种技术:爬虫、DevOps、人工智能、Web开发等。还有「大航海计划」,各种内推活动。
公开课预告
◆
强化学习
◆
本课程是一次理论+实战的结合,将重点介绍强化学习的模型原理以及A3C模型原理,最后通过实践落实强化学习在游戏中的应用。
推荐阅读
Google AI骗过了Google,工程师竟无计可施?
重磅 | 阿里巴巴7亿元收购Flink商业公司,人和技术都有了
Istio调用链埋点原理剖析—是否真的“零修改”分享实录
微软自证开源决心:GitHub 私有库免费无限开放!
程序员有话说 | 同一起点的程序员,有人累到要猝死,有人清闲得要命
2019八大科技趋势,指引你走向技术下一站
重磅 | GitHub私有仓库从此免费,微软要赢开发者的心
刚刚!程序员集体荣获2个冠军,这份2018 IT报告还说这些!
Python 2.7退休倒计时,Python 3必须学起来了(附入门学习资源)
相关文章:

Ruby调用shell命令
原来发在diandian的几篇旧闻,也一并转到iteye上来吧。 1. exec exec echo "hello $HOSTNAME" 用echo命令来取代当前进程,无法知道命令是否成功 2. system system(echo "hello $HOSTNAME") 运行一个子shell来避免覆盖当前进程&a…

mac os下valgrind的安装
valgrind是一款性能分析工具,功能强大。 在mac os下的安装略有不同,特写此文以记之。 现在最新的版本是3.8.1 tar jxvf valgrind-3.8.1.tar.bz2 cd valgrind-3.8.1 ./configure sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer m…

Google Voice开始发送邀请函
今天收到了Google Voice的邀请函,标题为“Youve been invited to Google Voice”。最近关于Google Voice 的新闻不少,出于好奇登录http://www.google.com/voice 递交了申请,没有想到这么快得到了邀请函。邮件特别强调“ Please note that Goo…

Python开发(基础):字符串
字符串常用方法说明 #!/usr/bin/env python # -*- coding:utf-8 -*- # class str(basestring): # """ # str(object) -> string # # Return a nice string representation of the object. # If the argument is a string, the return value …

Linux与Windows文件共享命令 rz,sz
一般来说,linux服务器大多是通过ssh客户端来进行远程的登陆和管理的,使用ssh登陆linux主机以后,如何能够快速的和本地机器进行文件的交互呢,也就是上传和下载文件到服务器和本地; 与ssh有关的两个命令可以提供很方便的…

Python爬虫小偏方:如何用robots.txt快速抓取网站?
作者 | 王平,一个IT老码农,写Python十年有余,喜欢分享通过爬虫技术挣钱和Python开发经验。来源 | 猿人学Python在我抓取网站遇到瓶颈,想剑走偏锋去解决时,常常会先去看下该网站的robots.txt文件,有时会给你…

八百客与51CTO结了梁子?
转载于:https://blog.51cto.com/simon/171348

特斯拉“撞死”机器人,是炒作还是事故?
作者 | 若名出品 | AI科技大本营科幻片里机器人大战的剧情可能离人类还很遥远,但设想一下,现实中机器人不受控制的打起架来...1 月 6 日,一辆处于自动驾驶模式的特斯拉 Model S “撞死”了一辆掉队 Promobot 的机器人。本次撞击事件发生在当地…

网页解析:如何获得网页源码中嵌套的标签。
一:前言:网页源码中有很多嵌套的标签 例如div标签嵌套如:bUTP<DIV>finally<div>aurora</div>126.com</div><div class\"Cited1\">ggff</div> 我们的网页解析工作中有时候需要解嵌套。通俗的讲…
36.intellij idea 如何一键清除所有断点
转自:https://www.cnblogs.com/austinspark-jessylu/p/7799212.html 1.在idea左下方找到"View Breakpoints"按钮,点击打开. 2.点击"Java Line Breakpoints"前方的全选框,取消全选. 3.点击上方"-"即"Remove"按钮,即可取消所…

Ruby与vim
介绍一点vim下使用Ruby的技巧。 1. vim命令行模式下输入 !ruby % 可以直接运行Ruby程序,并返回到vim编辑 2. vim Ruby关键字及自定义变量补全 拷贝附录中的ruby-macros.vim至机器某处,然后修改~/.vimrc,添加一行: source ROOT(…

NLP技术落地为何这么难?里面有哪些坑?
AI 很火,但是 AI 的门槛也很高,普通的开发者想要搭上这波 AI 红利依然困难。近期,人工智能公司推出了新一代智能 Bot 开放平台,它整合了小i机器人 Chatting Bot、FAQ Bot、Discovery Bot 三大核心能力,为企业和开发者提…

开源工具之valgrind
首先对源文件进行编译:Preparing your programCompile your program with -g to include debugging information so that Memchecks error messages include exact line numbers.-O0 a good idea if you can tolerate the slowdown-O1 line number in error message…

存储过程定义语法
CREATE PROCEDURE addTicket(in vipsql VARCHAR(255),in ordersql VARCHAR(255),in detailkey varchar(255),in detailsql VARCHAR(255)) comment 挂单(售药窗口) BEGIN DECLARE CONTINUE HANDLER FOR SQLEXCEPTION ,NOT FOUND rollback; start transac…

.NET : 针对Oracle的LOB数据访问
参考资料:来自Oracle官方网站 在 .NET 中使用 Oracle 数据库事务作者:Jason Price http://www.oracle.com/technology/global/cn/pub/articles/price_dbtrans_dotnet.html 在 .NET 中使用大对象作者:Jason Price http://www.oracle.com/techn…

MySQL数据类型--------浮点类型实战
1. 背景 * MySQL支持的浮点类型中有单精度类型(float), 双精度类型(double),和高精度类型(decimal),在数字货币类型中推荐使用高精度类型(decimal)来进行应用. * MySQL浮点型和定点型可以用类型名称后加(M,D)来表示&am…

山寨上网本溃败的两点教训
不是马后炮。08年11月份,笔者写过一篇《上网本难以复制山寨机的辉煌》(以下简称《辉煌》),从消费取向和价格两个方面着手,分析认为山寨上网本市场有限,难以复制山寨手机的市场奇迹。现在看来,笔…

分享一个expect的脚本
分享一个expect的脚本,可以用于Linux机器之间远程执行命令: #!/usr/bin/expect -fset ipaddress [lindex $argv 0] set user [lindex $argv 1] set passwd [lindex $argv 2] set cmd [lindex $argv 3] set timeout [lindex $argv 4]spawn -noecho ssh $u…

今晚直播 | 深入浅出理解A3C强化学习
强化学习是一种比较传统的人工智能手段,在近年来随着深度学习的发展,强化学习和深度学习逐渐结合在了一起。这种结合使得很多原来无法想象的工作有了可能,最令我们瞩目的莫过于AlphaGo战胜李世石,以及OpenAI团队的机器人可以在团战…

正则表达式口诀及教程(推荐)
正则其实也势利,削尖头来把钱揣; (指开始符号^和结尾符号$)特殊符号认不了,弄个倒杠来引路; (指\. \*等特殊符号)倒杠后面跟小w, 数字字母来表示; ࿰…

ssh其他机器的Expect脚本
ssh登陆其他机器的Expect脚本 #!/usr/bin/expect -fset user [lindex $argv 0] set ipaddr [lindex $argv 1] set passwd [lindex $argv 2]spawn ssh -l $user $ipaddrexpect "password:" send "$passwd\r" interact或者: #!/usr/bin/expect -f…

今晚8点直播 | 深入浅出理解A3C强化学习
强化学习是一种比较传统的人工智能手段,在近年来随着深度学习的发展,强化学习和深度学习逐渐结合在了一起。这种结合使得很多原来无法想象的工作有了可能,最令我们瞩目的莫过于AlphaGo战胜李世石,以及OpenAI团队的机器人可以在团战…

40.lombok在IntelliJ IDEA下的使用
转自:https://www.cnblogs.com/yjmyzz/p/lombok-with-intellij-idea.html lombok是一款可以精减java代码、提升开发人员生产效率的辅助工具,利用注解在编译期自动生成setter/getter/toString()/constructor之类的代码。代码越少,意味着出bug的…

C++之Boost使用
1. Get & Build & Install Boost download boost from http://www.boost.org/ 进入boost目录,使用命令: ./bootstrap.sh --prefixpath/to/installation ./b2 install 如此之后: leave Boost binaries in the lib/ subdirectory…

这就是芬兰:先让全国1%的人学起AI!
译者 | 大鱼责编 | 琥珀出品 | AI科技大本营【AI科技大本营导语】全球最大的手机制造商诺基亚、著名游戏《愤怒的小鸟》的开发商 Rovio,这两大曾名噪一时的科技公司都来自同一个国家——芬兰。很多人会问:在如此激烈的竞争环境下,为什么如此小…

Linux 裸设备基础知识(转)
1、裸设备定义:一块没有分区的硬盘,称为原始设备(RAW DEVICE)或者是一个分区,但是没有用EXT3,OCFS等文件系统格式化,称为原始分区(RAW PARTITION)以上两者都是裸设备 2、裸设备的绑定有文件系统的分区是采用mount的方式挂载到某一个挂载点的…

吴恩达与LG握手合作!
图片来自LG官网作者 | 琥珀出品 | AI科技大本营在近日举办的 CES 大会上,人工智能领域知名科学家、Landing.ai 创始人兼 CEO 吴恩达(Andrew Ng)与 LG(LG Electronics)总裁兼 CTO IP. Park 在拉斯维加斯签署了战略合作伙…

linux上安装mysql,tomcat,jdk
Linux 上安装 1 安装jdk 检测是否安装了jdk 运行 java –version若有 需要将其卸载a) 查看安装哪些jdk rmp –qa |grep java b) 先卸载openjdk 1.7 c) 在卸载openjdk 1.6 使用rpm –e - -nodeps 卸载的包 安装jdka) 上传jdk到linux 使用Xftp5…

现代人的无知什么样
以前没有知识的人就是无知! 但现在变了!一个博士却不会用他的知识挣钱养家糊口算不算无知,一个人大学毕业却不会学习算不算无知,一个经理在自己的电脑上找不到自己存的东西算不算无知,有知识却不会表达的人算不算无知…

zz Expect的安装
转载一篇靠谱的文章,按照文章所述方法一次成功。只不过我的expect二进制文件最后实在tcl的bin目录下,而不是expect的bin目录下,这个令我有些疑惑,whatever,不算什么大问题,注意一下就好了。A. Tcl 安装 主页…