广州城乡建设部网站首页wordpress更换ssl证书
- 作者: 五速梦信息网
- 时间: 2026年04月20日 11:04
当前位置: 首页 > news >正文
广州城乡建设部网站首页,wordpress更换ssl证书,帮企业外卖网站做推,wordpress通过小工具添加百度统计转自#xff1a;http://blog.csdn.net/pipisorry/article/details/47904355 如果要想获取微博中的数据#xff0c;最重要的第一步就是模拟登录了。这里讲解一下微博登录的流程#xff0c;有助于用代码实现。 Sina CAS的登陆过程 其实sina的sso实现了yale-CAS并且添加一丁点… 转自http://blog.csdn.net/pipisorry/article/details/47904355 如果要想获取微博中的数据最重要的第一步就是模拟登录了。这里讲解一下微博登录的流程有助于用代码实现。 Sina CAS的登陆过程 其实sina的sso实现了yale-CAS并且添加一丁点新的东西基本认证过程交互流程仍然未变。其独创的一点是实现了Ajax单点登陆比较牛。实现原理是iframe JavaScript回调函数。 初级SSO 初级的SSO就是在同一个顶级域名下通过种入顶级域名的Cookie来实现统一登陆。例如 单点登陆地址sso.xxx.com/login.jsp 应用1 web1.xxx.com/login.jsp 应用2 web2.xxx.com/login.jsp 应用3 web3.xxx.com/login.jsp 登陆流程 情况一用户从未登陆 1 用户访问web1.xxx.com/login.jspweb1重定向到sso.xxx.com/login.jsp 2 用户输入验证成功。sso.xxx.com种入.xxx.com域Cookie的tokenid重定向到web1.xxx.com/login.jspweb1.xxx.com访问.xxx.com域Cookie的tokenid判断出已经登陆系统登陆完成。 情况二用户已经登陆 直接登陆。 Sina SSO Sina实现了跨域名的统一登陆本质也是基于Cookie的。如果用户禁用Cookie那么无论如何也是登陆不了的。 Sina SSO服务器是login.sina.com.cn/sso/login.PHP微博登陆地址为weibo.com/login.php。 通过回调函数和iframe实现了跨一级域名的登陆。 皮皮Blog 认证过程具体流程用户从未登陆过 1 用户进入weibo.com/login.php 2 用户输入用户名称。输入完毕后当用户名输入框焦点失去的时候页码通过ajax向服务器login.sina.com.cn/sso/prelogin.php发送请求参数为user刚刚输入的用户名[通过抓包lz发现实际发送信息的地址为http://login.sina.com.cn/sso/prelogin.php?entryweibocallbacksinaSSOController.preloginCallBacksu*******rsaktmodcheckpin1clientssologin.js(v1.4.18)_1441503921772 **就是你输入并经过js加密处理的用户名]。服务返回server time 和nonce 认证等postdata通过回调函数写入到javascript变量中。 3 用户输入密码点击登陆页面POST 请求注意是ajax请求并不是login.php发送的http://login.sina.com.cn/sso/login.php?clientssologin.js(v1.4.18)请求的发起的页面是weibo.com/login.php中的一个不可见iframe页面参数为第二步得到的servertime 、nonce 、用户名称和加密的密码。返回种入Cookie tgt在login.sina.com.cn下。同时修改iframe地址为http://passport.weibo.com/wbsso/login?ssosavestate1472919508urlhttp%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack%26sudaref%3Dweibo.comticketretcode0。 Note: 1. 产生请求的原因signin.php文件中的OnReady()函数添加了表单的OnSumbit处理函数 $(vForm).onsubmit function(){return login();}; login()调用sinaSSOController.login()-sinaSSOController.loginMethodCheck()-sinaSSOController.loginByConfig() -sinaSSOController.loginByIframe()在loginByIframe()函数中新建了一个隐藏的loginForm通过表单的Submit方法产生上述请求。 2. lz发现http://login.sina.com.cn/sso/login.php?clientssologin.js(v1.4.18)返回的内容是 …script charsetutf-8 srchttp://i.sso.sina.com.cn/js/ssologin.js/script Signing in … script try{sinaSSOController.setCrossDomainUrlList({retcode:0,arrURL:[http:\/\/crosdom.weicaifu.com\/sso\/crosdom?actionloginsavestate1473040530,http:\/\/passport.97973.com\/sso\/crossdomain?actionloginsavestate1473040530,http:\/\/passport.weibo.cn\/sso\/crossdomain?actionloginsavestate1]});}catch(e){}try{sinaSSOController.crossDomainAction(login,function(){location.replace(http://passport.weibo.com/wbsso/login?ssosavestate1473040530urlhttp%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack%26sudaref%3Dweibo.comticketST--1441504530-gz-618D3C7ABA8F37A5BEE36BADAB7A88DFretcode0);});}catch(e){} /script…注意到这里面有4个返回地址crosdom.weicaifu.com…、passport.97973.com…、passport.weibo.cn…、passport.weibo.com…其中passport.weibo.com…才是我们要的地址中还带有ticket其它3个lz真不知道干嘛用的。 4 iframe 访问http://passport.weibo.com/wbsso/login?ssosavestate1472919508urlhttp%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack%26sudaref%3Dweibo.comticket**retcode0用户登陆返回种入cookie在.weibo.com下记录用户登陆信息。 5 通过js再次访问weibo.com/login.php因为cookie已经写入登陆成功服务器发送302重定向到用户主页面。Weibo.com/userid。 6 至此登陆过程完成。 可以看到上面所说的页面请求都可以通过fiddler2抓包得到 交互过程和密码加密算法分析 1 在提交POST请求之前 需要GET 获取两个参数。 地址是http://login.sina.com.cn/sso/login.php?clientssologin.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请求。[Sina微博 SSO登陆过程分析] Note: 后来新浪微博的加密方式改成两次SHA1加密再来一次RSA加密了。再后来新浪登录过程变为了RSA。 以后可能还会变化但是各种加密算法在Python中都有对应的实现只要发现它的加密方式程序比较易于实现。 [新浪网站登录过程分析] 皮皮Blog 使用httpfox解析新浪微博的登录过程 新浪微博的认证流程 1、这里在火狐下使用HttpFox工具抓取登陆的数据交互打开HttpFox用户进入weibo.com/login.php登陆页面抓取得到数据如下 我们用浏览器登陆weibo.com/login.php网页时服务器在不断地跳转从不同的位置给客户端返回所需的资源及稍后登陆所需的数据。我们需要找到对我们登陆所需要的信息重要的交互记录如下 选中的部分从http://login.sina.com.cn/sso/prelogin.php?entryweibocallbacksinaSSOController.preloginCallBacksursaktmodclientssologin.js(v1.4.18)站点位置GET得到的内容会在Content窗口显示格式为Text/html即 sinaSSOController.preloginCallBack({retcode:0,servertime:1387782050,pcid:xd-62049b61eeb94c62c92e4c4d10db7dcb4c7d,nonce:DF8VR6,pubkey:EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443,rsakv:1330428213,exectime:0}) servertime、nonce 就是登录时候需要使用的用于POST信息的加密。 2、输入用户名后当用户名输入框焦点失去的时候页面将再次访问http://login.sina.com.cn/sso/prelogin.php得到上步中类似的消息 这些数据都是登录时要提交的postdata其中新的servertime、nonce 等值用于稍后用户登录时使用的是这些数的最新值。 3、输入密码点击登陆页面POST请求如下 分析向http://login.sina.com.cn/sso/login.php?clientssologin.js(v1.4.11)提交的参数POST Data entry weibo
gateway 1
from
savestate 7
useticket 1
pagerefer
vsnf 1
su aG91YW5kbGlob21lJTQwZ21haWwuY29t
service miniblog
servertime 1387784432
nonce PH653N
pwencode rsa2
rsakv 1330428213
sp 04b4568a21646afc2418e86c99958ec09d3cf45c624404a96dd63a4f13a09384148af1b727d046ff17727f307460ff0b90db2a4d6c9d3ad1e1809b4756a002cf93129dcb0480b349dba2439db7874d0f32a7c0770d0f80360f6fa139d4e3f09bb2b50099b329cb2de5d59fdafc199dc7b3b2d731b43c5dd0948149fc6df4d624
encoding UTF-8
prelt 101
url http://weibo.com/ajaxlogin.php?framelogin1callbackparent.sinaSSOController.feedBackUrlCallBack
returntype META su表示POST的账号username经过了BASE64加密password 经过了三次rsa加密 且其中加入了 servertime 和 nonce 的值来干扰sp为加密后的密码。 再看服务器的返回值Typetext/html (NS_BINDING_ABORTED)而Result(Aborted)Content窗口为Error loading content (NS_ERROR_DOCUMENT_NOT_CACHED)因为网页发生了重定向跳转原网页中止HttpFox没有捕获到返回值。通过Python程序可以得到返回值如下 html
…
title新浪通行证/title
…
script typetext/javascript languagejavascript
location.replace(http://weibo.com/ajaxlogin.php?framelogin1callbackparent.sinaSSOController.feedBackUrlCallBackssosavestate1390380654ticketST-MzQ4NzQ5NTYyMA-1387788654-xd-FED0CAF6BC574B4DE353DF875F9DB6AFretcode0);/script
… 我们关心的返回结果是script部分location.replace(http://weibo.com/ajaxlogin.php?framelogin1callbackparent.sinaSSOController.feedBackUrlCallBackssosavestate1390380654ticketST-MzQ4NzQ5NTYyMA-1387788654-xd-FED0CAF6BC574B4DE353DF875F9DB6AFretcode0); 因为HttpFox检测到随后两步的跳转网址为 蓝色http://weibo.com/sso/login.php?ssosavestate1390381500urlhttp%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack%2 6sudaref%3Dweibo.comticketST-MzQ4NzQ5NTYyMA-1387789500-xd-710FAD84CC8AF2EE75FE5D197CD76234retcode0 这一步上传url的值即为script部分这里由于不是同一次登录值不同但结构相同retcode0表示登陆成功然后打开url跳转到下一步。 第二步http://weibo.com/ajaxlogin.php?framelogin1callbackparent.sinaSSOController.feedBackUrlCallBacksudarefweibo.com 用户登陆成功返回weibo.com的信息到客户端cookie中记录了用户登陆信息。 4、接下来就是新浪的SSOSingle Sign-on登陆了就是在同一个顶级域名下通过载入顶级域名的Cookie来实现统一登陆。服务器会自动再次访问weibo.com上图第四行因为cookie已经写入登陆成功服务器返回302重定向到用户主页面。此后再访问微博中其他人的主页或使用微博的其他应用服务器便可以通过cookie来检测用户的状态了。 当然新浪的登陆方式未来可能发生改动。[解析新浪微博的登录过程]
from:
http://blog.csdn.net/pipisorry/article/details/47904355 ref:scrapy模拟登录微博 网站常见的反爬虫和应对方法 现代浏览器的工作原理 http://blog.csdn.net/pipisorry/article/details/47008981 这篇文章是介绍使用scrapy模拟登录微博并爬取微博相关内容。关于登录流程为嘛如此设置请参考[微博登录过程分析]。 截包分析 下载软件Fiddler for .NET2查看相关登录流程信息。运行Python程序访问和直接在浏览器中刷新页面都可以在fiddler中找到网络包的相关信息。 Note: fiddler是抓包用的是独立的工具。类似这种前端登录动作也可以用casperjs。还可以用浏览器嵌入工具HttpWatch截包工具如Firefox的插件httpfox。 获取登录入口 微博的登录入口有好几个,其实只要登录的逻辑不变, 其它的入口也是可以的。在微博登录界面分析html源码获得其登录界面为http://weibo.com/login.php 查看需要的postdata 登录微博前我们要先post相关数据。打开fiddler2再登录微博并查看fiddler2的内容变化 图中webForms所有数据就是我们在模拟登录时需要填入的数据.这些数据中除了su、sp、rsakv、servertime、nonce是经过js处理动态生成的,其它都是个固定值(其实需要的也就只有pubkey、url、pwencode和nonce、pubkey、retcode、exectime、pcid其它的不用加入postdata甚至和后面的有些可以不用添加lz未验证),可以在代码中写死。所以你的postdata只要提交su、sp、servertime、nonce、url、pwencode和pubkey、retcode、exectime、pcid。 Note: su是js处理后的用户名sp是js处理后的密码servertime、nonce 、pubkey都是登录时候需要使用的用于post信息sp的加密pwnencodersa2是weibo登录对密码的加密方式。 获得postdata 当然上面的信息可以用抓包工具抓到但是我们要在程序中获得这些post信息。 1. 在浏览器登录后fiddler2会抓到另一个login.sina.com.cn下的js文件http://login.sina.com.cn/sso/prelogin.PHP?entryweibocallbacksinaSSOController.preloginCallBacksursaktmodclientssologin.js(v1.4.18)这个js文件就是当用户输入用户名时网页发送用户名到js文件中js文件处理用户名并返回su、servertime、nonce、url、pwencode和rsakv、retcode、exectime、pcid这些post数据用于后面的密码加密并提交到后续网站在下面的textview中可以看到 Note:1. 上面的js地址是在未登录的情况下抓包得到并且后面的_1441377653804%20HTTP/1.1已经被lz省略了后面的数字实际上是str(time.time()).replace(., )这个东西对于获取postdata没用。
- 上面url的su部分, 这里的su是经过js处理后的用户名,在后面加入js处理后的用户名js处理后的用户名当然是登录后得到的 2. 其实手动在浏览器中输入上面的js地址也会得到相应的post数据输出 可以看到 如果su-为空得到 sinaSSOController.preloginCallBack({retcode:0,servertime:1441379724,pcid:gz-ca74a2cf2705a177abe404a62a1140d71d09,nonce:89VNFB,pubkey:EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443,rsakv:1330428213,uid:2835992634,exectime:4}) 填入js处理后的用户名得到 sinaSSOController.preloginCallBack({retcode:0,servertime:1441380255,pcid:gz-3ab638aed06967c056296dca13e50a4a6333,nonce:TCEW1Y,pubkey:EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443,rsakv:1330428213,exectime:3}) Note: 登录后的结果仅仅是少了一个uid同时所有人的pubkey是一样的因为是公钥嘛。 皮皮Blog 模拟js处理用户名及密码 浏览器中输入http://login.sina.com.cn/js/sso/ssologin.js得到这个js文件复制内容到js编辑器中lz是在pycharm中创建js文件格式化后查阅的查看。 Note: 在未登录状态浏览器中刷新登录界面http://login.sina.com.cn/signup/signin.php?entrysso这个页面fiddler2就可以抓到那个ssologin.js文件 查看ssologin.js的makeRequest函数 var makeRequest function (username, password, savestate) { var request { entry: me.getEntry(), gateway: 1, from: me.from, savestate: savestate, useticket: me.useTicket ? 1 : 0 }; if (me.failRedirect) { me.loginExtraQuery.frd 1 } request objMerge(request, {pagerefer: document.referrer || }); request objMerge(request, me.loginExtraFlag); request objMerge(request, me.loginExtraQuery); request.su sinaSSOEncoder.base64.encode(urlencode(username)); if (me.service) { request.service me.service } if ((me.loginType rsa) me.servertime sinaSSOEncoder sinaSSOEncoder.RSAKey) { request.servertime me.servertime; request.nonce me.nonce; request.pwencode rsa2; request.rsakv me.rsakv; var RSAKey new sinaSSOEncoder.RSAKey(); RSAKey.setPublic(me.rsaPubkey, 10001); password RSAKey.encrypt([me.servertime, me.nonce].join(\t) \n password) } else { if ((me.loginType wsse) me.servertime sinaSSOEncoder sinaSSOEncoder.hex_sha1) { request.servertime me.servertime; request.nonce me.nonce; request.pwencode wsse; password sinaSSOEncoder.hex_sha1( sinaSSOEncoder.hex_sha1(sinaSSOEncoder.hex_sha1(password)) me.servertime me.nonce) } } request.sp password; try { request.sr window.screen.width * window.screen.height } catch (e) { } return request };
用户名加密 从代码中我们可以知道su就是经过html字符转义再转成base64编码 python中我们可以这样转化: def get_su(self, username):对用户名加密username urllib.quote(username) # html字符转义return base64.encodestring(username)[:-1] 密码加密 weibo登录对密码有两种加密方式:rsa2与wsse,我们从上面的密码加密方式pwnencodersa2可知, js处理走的是这一部分逻辑。(wsse逻辑是通过一个if else判断得到但我们登录一般是rsa2wsse是干嘛的没深究) 并且servertime, nonce, pubkey都被用上了我们只要把这部分js在python中转义就行了。 def get_sp_rsa(self, password, pubkey, servertime, nonce):对密码加密http://login.sina.com.cn/js/sso/ssologin.js中makeRequest的python实现# 公钥pubkey在prelogin得到,固定值key rsa.PublicKey(int(pubkey, 16), 65537) # 10001对应的10进制创建公钥message (\t).join([str(servertime), str(nonce)]) \n passwordencropy_pwd rsa.encrypt(message, key)return binascii.b2a_hex(encropy_pwd) # 将加密信息转换为16进制 Note: 1. 0x10001要转化成10进制的65537, 还有要经过servertime \t nonce \n passwd拼接字符串再进行Rsa加密, 最后转成16进制即得到sp. 2. 使用rsa加密要安装rsa拓展包 pip install rsa 皮皮Blog 模拟登录微博 以上我们分析了如何获取post值知道哪些数据是需要提交的也知道怎么处理用户名和密码来获取su、sp下面讲解如何利用这些信息模拟登录新浪微博。 1. 请求http://login.sina.com.cn/sso/prelogin.php?entryweibocallbacksinaSSOController.preloginCallBacksursaktmodclientssologin.js(v1.4.18)这个相当于登录前请求相关postdata的地址在返回的response中获取servertime,nonce,pubkey等值 def get_prelogin_data(self):登录前获得之后要提交的数据:return:prelogin_url globleOptions.prelogin_urlpost_ori_text requests.get(prelogin_url).textjson_data re.search(r((.*?)), post_ori_text).group(1)json_data json.loads(json_data)prelogin_data dict(json_data)for key, value in prelogin_data.items():prelogin_data[key] str(value)# print(prelogin_data)return prelogin_data - 模拟js计算加密后的用户名su、模拟js计算加密后的密码sp加上上一步获取的pubkey、servertime、nonce 3. 把1中得到的所有postdata与其它固定值su、sp一起提交到http://login.sina.com.cn/sso/login.php?clientssologin.js(v1.4.18)这个是请求登录的地址 Note: postdata要手动添加这两个数据它们是1中返回时解析不到的只有在抓包中看到。
post_data.update({pwencode: rsa2, url: rhttp://weibo.com/ajaxlogin.php?framelogin1callbackparent.sinaSSOController.feedBackUrlCallBack}) 这个地址会跳转到passport.weibo.com/wbsso/login/,response会返回我们需要的地址,用正则表达式取出这个地址并请求, 得到如下正则表达式结果则登录成功 http://passport.weibo.com/wbsso/login?ssosavestate1472919508urlhttp%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack%26sudaref%3Dweibo.comticket*****retcode0 retcode101则表示登录失败 def start_requests(self):获取postdata并提交到登录地址login_url globleOptions.login_urlusername globleOptions.usernamepassword globleOptions.passwordpost_data self.get_postdata(username, password)# headers可以不用添加headers globleOptions.headers# 将数据提交到登录地址return [scrapy.http.FormRequest(urllogin_url, formdatapost_data, callbackself.access_new_loginurl)] - 还要请求上面得到的这个长地址实际中的新登录地址也就是得到重定位信息后解析得到最终跳转到的新登录URL打开该URL后服务器才会自动将用户登陆信息写入cookie登陆成功。只有写入了cookie后面的登录才会顺利。 def access_new_loginurl(self, response):获取新的登录地址并提交request访问, 自动写入cookie 下次就可以直接访问其它网站了# print(response.body.decode(gb2312))new_login_url re.search(rlocation.replace((.*?)), response.body).group(1)# print(new_login_url : %s % new_login_url)request scrapy.http.Request(new_login_url) # 如果没有callback就默认为parse方法return request
- 这时cookie已经写入我们再访问微博相关的网页就可以直接得到登录后的页面数据了 def parse(self, response):登录后的爬虫parse方法会自动request遍历start_urls中的urlfor url in self.start_urls:request scrapy.http.Request(urlurl, callbackself.parse_item)# request response.request.replace(urlglobleOptions.redir_url, callbackself.parse_item)yield request def parse_item(self, response):处理itemsfilename re.split(//|\?, response.url)[1]# print(filename)filename re.sub(/|\?, ., filename) .htmlwith open(os.path.join(./TmpFiles, filename), wb) as html_file:html_page response.bodyhtml_file.write(html_page) Note :至于代码实现可以用scrapy也可以用python自带的urllib当然这个明显爬取速度更快 保存请求的cookie 只要把保存的cookie持久化到文件, scrapy每次请求时带上这个cookie就可以了。 from:http://blog.csdn.net/pipisorry/article/details/47008981
- 上一篇: 广州车陂网站建设公司某企业网站网页设计模板
- 下一篇: 广州大型网站建设公司排名企业网站seo方案案例
相关文章
-
广州车陂网站建设公司某企业网站网页设计模板
广州车陂网站建设公司某企业网站网页设计模板
- 技术栈
- 2026年04月20日
-
广州白云手机网站建设直播源码下载
广州白云手机网站建设直播源码下载
- 技术栈
- 2026年04月20日
-
广州wap网站建设网络广告推广服务
- 技术栈
- 2026年04月20日
-
广州大型网站建设公司排名企业网站seo方案案例
广州大型网站建设公司排名企业网站seo方案案例
- 技术栈
- 2026年04月20日
-
广州地址设计网站公司简介模板范文大全
广州地址设计网站公司简介模板范文大全
- 技术栈
- 2026年04月20日
-
广州电商网站建设郑州建站推广公司
广州电商网站建设郑州建站推广公司
- 技术栈
- 2026年04月20日
