Code是什么lfy战队是中国的吗么

同人大触聚居地
查看: 409|回复: 4
69什么队伍好
主题帖子积分
lv1.清水小虾, 积分 86, 距离下一级还需 15 积分
lv1.清水小虾, 积分 86, 距离下一级还需 15 积分
发表于 5&天前
马上注册,结交更多好友,享用更多功能,让你轻松玩转梦幻手游社区。
才可以下载或查看,没有帐号?
我想弄一个队伍不知道什么搭配好,平民玩家都是,现在刚刚成型了一个地府,半成品的月宫,现在还缺三个位置,不PK就是日常的所有活动,另外给点实际的建议,
主题帖子积分
发表于 5&天前
三辅助2输出吧
主题帖子积分
lv1.清水小虾, 积分 86, 距离下一级还需 15 积分
lv1.清水小虾, 积分 86, 距离下一级还需 15 积分
发表于 5&天前
三辅助2输出吧
大奶半奶一封一物一法?
主题帖子积分
lv2.江边小龟, 积分 167, 距离下一级还需 334 积分
lv2.江边小龟, 积分 167, 距离下一级还需 334 积分
发表于 5&天前
你所说的日常涵盖多大的范围
主题帖子积分
lv1.清水小虾, 积分 99, 距离下一级还需 2 积分
lv1.清水小虾, 积分 99, 距离下一级还需 2 积分
发表于 5&天前
物理法系封系化生要的吧,剩下的地府和普陀不知道哪个好。
呆萌泡泡团
呆萌泡泡团成员专属勋章
西游太史令
签约作者专属
积分(≥300分)消耗300积分即可领取
发布主题(≥80个)消耗500积分即可领取
在线时间(≥50小时)消耗400积分即可领取
发帖量(≥100个)消耗积分300点即可领取
注册论坛满30天
人气(≥100)消耗10人品即可领取
国民手游,人人都玩,不玩才怪
网易公司版权所有&
浙网文[4号战队图标和印花问题还没解决么?求帮忙呀 - 《星际争霸2》论坛
新建了战队可是图标和印花都不能设置,显示与发布的服务器无法连接,试了扫描与修复和删除文件都不行呀,求帮忙,谢谢谢谢谢!!!
我也是这样无限加载死循环
亲爱的玩家,建议您可以重启调制解调器(也就是猫),然后使用电脑直接连接调制解调器,不要使用路由器链接游戏改善一下。
想说点什么吗?登录即可加入讨论。&figure&&img src=&https://pic2.zhimg.com/v2-0ade82c52c776da48f4bec58_b.jpg& data-rawwidth=&750& data-rawheight=&340& class=&origin_image zh-lightbox-thumb& width=&750& data-original=&https://pic2.zhimg.com/v2-0ade82c52c776da48f4bec58_r.jpg&&&/figure&&blockquote&&p&英文:java-success&/p&&p&译文:朱伟杰 &/p&&p&链接:&a href=&https://link.zhihu.com/?target=http%3A//www.importnew.com/1796.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java 面试题问与答:编译时与运行时&/a&&/p&&/blockquote&&br&&p&在开发和设计的时候,我们需要考虑编译时,运行时以及构建时这三个概念。理解这几个概念可以更好地帮助你去了解一些基本的原理。下面是初学者晋级中级水平需要知道的一些问题。&/p&&br&&p&Q.下面的代码片段中,行A和行B所标识的代码有什么区别呢?&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&public class ConstantFolding {
static final
int number1 = 5;
static final
int number2 = 6;
static int number3 = 5;
static int number4= 6;
public static void main(String[ ] args) {
int product1 = number1 * number2;
int product2 = number3 * number4;
&/code&&/pre&&/div&&p&A.在行A的代码中,product的值是在编译期计算的,行B则是在运行时计算的。如果你使用Java反编译器(例如,jd-gui)来反编译ConstantFolding.class文件的话,那么你就会从下面的结果里得到答案。&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&public class ConstantFolding
static final int number1 = 5;
static final int number2 = 6;
static int number3 = 5;
static int number4 = 6;
public static void main(String[ ] args)
int product1 = 30;
int product2 = number3 * number4;
&/code&&/pre&&/div&&p&常量折叠是一种Java编译器使用的优化技术。由于final变量的值不会改变,因此就可以对它们优化。Java反编译器和javap命令都是查看编译后的代码(例如,字节码)的利器。&/p&&br&&p&Q.你能想出除了代码优化外,在什么情况下,查看编译过的代码是很有帮助的?&/p&&br&&p&A.Java里的泛型是在编译时构造的,可以通过查看编译后的class文件来理解泛型,也可以通过查看它来解决泛型相关的问题。&/p&&br&&p&Q.下面哪些是发生在编译时,运行时,或者两者都有?&/p&&p&方法重载:这个是发生在编译时的。方法重载也被称为编译时多态,因为编译器可以根据参数的类型来选择使用哪个方法。&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&public class {
public static void evaluate(String param1);
// method #1
public static void evaluate(int param1);
// method #2}
&/code&&/pre&&/div&&p&如果编译器要编译下面的语句的话:&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&evaluate(“My Test Argument passed to param1”);
&/code&&/pre&&/div&&p&它会根据传入的参数是字符串常量,生成调用#1方法的字节码&/p&&br&&p&方法覆盖:这个是在运行时发生的。方法重载被称为运行时多态,因为在编译期编译器不知道并且没法知道该去调用哪个方法。JVM会在代码运行的时候做出决定。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&public class A {
public int compute(int input) {
//method #3
return 3 *
public class B extends A {
public int compute(int input) {
//method #4
return 4 *
&/code&&/pre&&/div&&p&子类B中的compute(..)方法重写了父类的compute(..)方法。如果编译器遇到下面的代码:&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&public int evaluate(A reference, int arg2)
int result = reference.compute(arg2);
&/code&&/pre&&/div&&p&编译器是没法知道传入的参数reference的类型是A还是B。因此,只能够在运行时,根据赋给输入变量“reference”的对象的类型(例如,A或者B的实例)来决定调用方法#3还是方法#4.&/p&&br&&p&泛型(又称类型检验):这个是发生在编译期的。编译器负责检查程序中类型的正确性,然后把使用了泛型的代码翻译或者重写成可以执行在当前JVM上的非泛型代码。这个技术被称为“类型擦除“。换句话来说,编译器会擦除所有在尖括号里的类型信息,来保证和版本1.4.0或者更早版本的JRE的兼容性。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&List&String& myList = new ArrayList&String&(10);
&/code&&/pre&&/div&&p&编译后成为了:&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&List myList = new ArrayList(10);
&/code&&/pre&&/div&&p&注解(Annotation):你可以使用运行时或者编译时的注解。&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&public class B extends A {
public int compute(int input){
//method #4
return 4 *
&/code&&/pre&&/div&&p&@Override是一个简单的编译时注解,它可以用来捕获类似于在子类中把toString()写成tostring()这样的错误。在Java 5中,用户自定义的注解可以用注解处理工具(Anotation Process Tool ——APT)在编译时进行处理。到了Java 6,这个功能已经是编译器的一部分了。&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&public class MyTest{
public void testEmptyness( ){
org.junit.Assert.assertTrue(getList( ).isEmpty( ));
private List getList( ){
//implemenation goes here
&/code&&/pre&&/div&&p&@Test是JUnit框架用来在运行时通过反射来决定调用测试类的哪个(些)方法的注解。&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&@Test (timeout=100)
public void testTimeout( ) {
while(true);
//infinite loop
&/code&&/pre&&/div&&p&如果运行时间超过100ms的话,上面的测试用例就会失败。&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&@Test (expected=IndexOutOfBoundsException.class)
public void testOutOfBounds( ) {
new ArrayList&Object&( ).get(1);
&/code&&/pre&&/div&&p&如果上面的代码在运行时没有抛出IndexOutOfBoundsException或者抛出的是其他的异常的话,那么这个用例就会失败。用户自定义的注解可以在运行时通过Java反射API里新增的AnnotatedElement和”Annotation”元素接口来处理。&/p&&br&&p&异常(Exception):你可以使用运行时异常或者编译时异常。&/p&&br&&p&运行时异常(RuntimeException)也称作未检测的异常(unchecked exception),这表示这种异常不需要编译器来检测。RuntimeException是所有可以在运行时抛出的异常的父类。一个方法除要捕获异常外,如果它执行的时候可能会抛出RuntimeException的子类,那么它就不需要用throw语句来声明抛出的异常。&/p&&br&&p&例如:NullPointerException,ArrayIndexOutOfBoundsException,等等&/p&&br&&p&受检查异常(checked exception)都是编译器在编译时进行校验的,通过throws语句或者try{}cathch{} 语句块来处理检测异常。编译器会分析哪些异常会在执行一个方法或者构造函数的时候抛出。&/p&&br&&p&面向切面的编程(Aspect Oriented Programming-AOP):切面可以在编译时,运行时或,加载时或者运行时织入。&/p&&br&&p&1.编译期:编译期织入是最简单的方式。如果你拥有应用的代码,你可以使用AOP编译器(例如,ajc – AspectJ编译器)对源码进行编译,然后输出织入完成的class文件。AOP编译的过程包含了waver的调用。切面的形式可以是源码的形式也可以是二进制的形式。如果切面需要针对受影响的类进行编译,那么你就需要在编译期织入了。&/p&&br&&br&&p&2.编译后:这种方式有时候也被称为二进制织入,它被用来织入已有的class文件和jar文件。和编译时织入方式相同,用来织入的切面可以是源码也可以是二进制的形式,并且它们自己也可以被织入切面。&/p&&br&&br&&p&3.装载期:这种织入是一种二进制织入,它被延迟到JVM加载class文件和定义类的时候。为了支持这种织入方式,需要显式地由运行时环境或者通过一种“织入代理(weaving agent)“来提供一个或者多个“织入类加载器(weaving class loader)”。&/p&&br&&br&&p&4.运行时:对已经加载到JVM里的类进行织入&br&&/p&&br&&p&继承 – 发生在编译时,因为它是静态的&/p&&br&&p&代理或者组合 – 发生在运行时,因为它更加具有动态性和灵活性。&/p&&br&&p&Q.你有没有听说过“组合优于继承”这样的说法呢?如果听说过的话,那么你是怎么理解的呢?&/p&&br&&p&A.继承是一种多态工具,而不是一种代码复用工具。有些开发者喜欢用继承的方式来实现代码复用,即使是在没有多态关系的情况下。是否使用继承的规则是继承只能用在类之间有“父子”关系的情况下。&/p&&br&&p&1.不要仅仅为了代码复用而继承。当你使用组合来实现代码复用的时候,是不会产生继承关系的。过度使用继承(通过“extends”关键字)的话,如果修改了父类,会损坏所有的子类。这是因为子类和父类的紧耦合关系是在编译期产生的。&/p&&p&2.不要仅仅为了多态而继承。如果你的类之间没有继承关系,并且你想要实现多态,那么你可以通过接口和组合的方式来实现,这样不仅可以实现代码重用,同时也可以实现运行时的灵活性。&br&&/p&&br&&p&这就是为什么(Gang of Four)的设计模式里更倾向于使用组合而不是继承的原因。面试者会在你的答案里着重关注这几个词语——“耦合”,“静态还是动态”,以及“发生在编译期还是运行时”。运行时的灵活性可以通过组合来实现,因为类可以在运行时动态地根据一个结果有条件或者无条件地进行组合。但是继承却是静态的。&/p&&p&Q.你能够通过实例来区别编译期继承和运行时继承,以及指出Java支持哪种吗?&/p&&br&&p&A.“继承”表示动作和属性从一个对象传递到另外一个对象的场景。Java语言本身只支持编译期继承,它是通过“extends”关键字来产生子类的方式实现的,如下所示:&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&public class Parent {
public String saySomething( ) {
return “Parent is called”;
public class Child extends Parent {
public String saySomething( ) {
return super.saySomething( ) +
“, Child is called”;
&/code&&/pre&&/div&&p&“Child”类的saySomething()方法的调用会返回“Parent is called,Child is Called”,因为,子类的调用继承了父类的“Parenet is called”。关键字“super”是用来调用“Parent”类的方法。运行时继承表示在运行时构建父/子类关系。Java语言本身不支持运行时继承,但是有一种替代的方案叫做“代理”或者“组合”,它表示在运行时组件一个层次对象的子类。这样可以模拟运行时继承的实现。在Java里,代理的典型实现方式如下:&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&public class Parent {
public String saySomething( ) {
return “Parent is called”;
public class Child
public String saySomething( ) {
return new Parent( ).saySomething( ) +
“, Child is called”;
&/code&&/pre&&/div&&p&子类代理了父类的调用。组合可以按照下面的方式来实现:&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&public class Child
private Parent parent =
public Child( ){
this.parent = new Parent( );
public String saySomething( ) {
return this.parent.saySomething( ) +
“, Child is called”;
&/code&&/pre&&/div&&figure&&img src=&https://pic2.zhimg.com/v2-18bbdf95c25bca_b.jpg& data-rawwidth=&900& data-rawheight=&500& class=&origin_image zh-lightbox-thumb& width=&900& data-original=&https://pic2.zhimg.com/v2-18bbdf95c25bca_r.jpg&&&/figure&
英文:java-success译文:朱伟杰 链接: 在开发和设计的时候,我们需要考虑编译时,运行时以及构建时这三个概念。理解这几个概念可以更好地帮助你去了解一些基本的原理。下面是初学者晋级中级水平需要知道的一些问题。 Q.…
&figure&&img src=&https://pic2.zhimg.com/v2-dda5d0fecb223_b.jpg& data-rawwidth=&489& data-rawheight=&150& class=&origin_image zh-lightbox-thumb& width=&489& data-original=&https://pic2.zhimg.com/v2-dda5d0fecb223_r.jpg&&&/figure&&p&更新:上个版本利用了一些自用框架PSpider的函数,更新后的版本只用到了requests库,并改写为Class的形式,方便大家运行调试。&/p&&p&--------------------------------------------------------------------------------------------------------&/p&&p&干货来啦,如果你想学习Python模拟登陆,如果你想知道如何利用抓包工具一步步获得网站登陆流程,如果你想破解网站登陆加密算法,那么这篇文章绝对对得起你!&/p&&p&标题随便起的,不喜勿喷,但这篇文章确实很详细的解析了新浪微博登录流程,包括各种加密算法解析、验证码解析、跳转解析等等。另外还有登录的代码供参考,代码在文章最后给出,同时也上传到了GitHub,大家可以参考一下。&/p&&p&登录代码地址:&a href=&http://link.zhihu.com/?target=https%3A//github.com/xianhu/LearnPython& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub - xianhu/LearnPython: 以撸代码的形式学习Python&/a&。&/p&&p&代码中用到了爬虫框架PSpider中的一些函数,框架见:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&一个极为简洁的Python爬虫框架&/a&。&/p&&p&需要学习一下爬虫基础的,请移步:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&一个很“水”的Python爬虫入门代码文件&/a&。&/p&&p&如果你想用Python模拟登陆新浪微博,首先肯定要去百度一些相关的知识,了解各位前辈们已经做得一些工作。这里通过搜索可以知道,新浪微博在登录时,对用户名、密码进行了加密处理,也知道了加密算法(b64encode、rsa等等)。这里先有个大体印象,我会一步步交给大家怎么自己去发现新浪微博的加密算法,毕竟授人以鱼不如授人以渔嘛!&/p&&p&这里用到的工具是Charles,是Mac下的一个抓包工具。Windows下对应的是Fiddler。如果你不会用,或者不熟悉,建议先安装一个,自己动手熟悉一下软件的用法。&/p&&p&好了,准备工作完成了,废话不多说,开始干货!&/p&&p&(1)开启Charles后,打开新浪微博的登录页面,并输入用户名、密码、验证码后登录一遍,这时候会在Charles留下整个登录的流程,后边慢慢分析。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-f5de057e7b2c225f9d95d7b38b489689_b.jpg& data-rawwidth=&2040& data-rawheight=&1120& class=&origin_image zh-lightbox-thumb& width=&2040& data-original=&https://pic3.zhimg.com/v2-f5de057e7b2c225f9d95d7b38b489689_r.jpg&&&/figure&&p&(2)分析的第一步,要知道用户名如何加密。在Charles中搜索“username”。为什么这么搜?你如果是做网站的,估计90%的可能都会把用户名变量命名为username吧!搜索后看到只有文件loginLayers.js中包含username,该文件的命名也说明跟文件相关,根据经验应该能判断出这个文件很重要。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-466fde74c279fe2bdab515e977f1d96d_b.jpg& data-rawwidth=&2642& data-rawheight=&1722& class=&origin_image zh-lightbox-thumb& width=&2642& data-original=&https://pic3.zhimg.com/v2-466fde74c279fe2bdab515e977f1d96d_r.jpg&&&/figure&&p&(3)将这个文件的内容复制出来,放到一个文本文件中,搜索username,会找到下边图示中的这么几行代码,从而得知用户名的加密方式。用户名加密方法很简单,encode之后紧跟一个base64即可。具体用Python怎么写,自己看代码。&/p&&p&&figure&&img src=&https://pic4.zhimg.com/v2-d30f0f8f41c46f4dd871fb_b.jpg& data-rawwidth=&1160& data-rawheight=&434& class=&origin_image zh-lightbox-thumb& width=&1160& data-original=&https://pic4.zhimg.com/v2-d30f0f8f41c46f4dd871fb_r.jpg&&&/figure&(4)用户名加密完了,应该要加密密码了。继续在这个文件中搜索password,得到:&/p&&p&&figure&&img src=&https://pic2.zhimg.com/v2-985cca6b9f59a75e08231e_b.jpg& data-rawwidth=&2462& data-rawheight=&976& class=&origin_image zh-lightbox-thumb& width=&2462& data-original=&https://pic2.zhimg.com/v2-985cca6b9f59a75e08231e_r.jpg&&&/figure&这里可以推测出this.login中的参数b应该就是password。查看login函数,可以得到:&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-d6aa2eed_b.jpg& data-rawwidth=&2318& data-rawheight=&850& class=&origin_image zh-lightbox-thumb& width=&2318& data-original=&https://pic4.zhimg.com/v2-d6aa2eed_r.jpg&&&/figure&&p&这里调用了loginByXMLHttpRequest函数,并传入参数b,即password。所以我们继续搜索loginByXMLHttpRequest,得到:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-f2bb15e7cce2dd92e83d634_b.jpg& data-rawwidth=&2148& data-rawheight=&942& class=&origin_image zh-lightbox-thumb& width=&2148& data-original=&https://pic3.zhimg.com/v2-f2bb15e7cce2dd92e83d634_r.jpg&&&/figure&&p&这里调用了makeXMLRequestQuery函数,并传入参数b,即password。所以我们继续搜索makeXMLRequestQuery,得到:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-71a3d29b7be99fcf718ac56e2d071148_b.jpg& data-rawwidth=&2230& data-rawheight=&920& class=&origin_image zh-lightbox-thumb& width=&2230& data-original=&https://pic4.zhimg.com/v2-71a3d29b7be99fcf718ac56e2d071148_r.jpg&&&/figure&&p&这里调用了makeRequest函数,并传入参数b,即password。所以我们继续搜索makeRequest,得到:&/p&&p&&figure&&img src=&https://pic4.zhimg.com/v2-e2dcb105aa49eb6e7c927_b.jpg& data-rawwidth=&2194& data-rawheight=&936& class=&origin_image zh-lightbox-thumb& width=&2194& data-original=&https://pic4.zhimg.com/v2-e2dcb105aa49eb6e7c927_r.jpg&&&/figure&这里就可以清晰的看到密码加密流程。具体Python怎么实现,还是自己看代码。但是这里有个问题,密码加密的时候,会有几个参数需要传入,比如nonce、servertime、rsakv等等,这是什么鬼呢?继续往下看。&/p&&p&(5)在Charles中搜索servertime,会得到一个prelogin的请求,该请求返回servertime、nonce、pubkey等参数。这里返回的是一个json串。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-cf16fe82e9b9e10fa99fa_b.jpg& data-rawwidth=&2166& data-rawheight=&648& class=&origin_image zh-lightbox-thumb& width=&2166& data-original=&https://pic3.zhimg.com/v2-cf16fe82e9b9e10fa99fa_r.jpg&&&/figure&&p&查看该请求的request,可以看到他需要加密后的用户名su。根据这里的参数,就可以对密码进行加密了。这里稍微回想总结下整个流程:&/p&&ul&&li&根据用户名username得到加密后的用户名su&/li&&li&根据su得到一个json串,里边包含加密密码用到的各种参数,servertime、nonce等&/li&&li&根据json串和密码得到加密后的密码,然后就可以登陆了。&/li&&/ul&&p&(6)在Charles中可以找到一个login.php请求,根据经验也可以大体判断这就是登录请求,事实证明也确实如此。根据该请求的request,自己构建postdata,并发送请求即可。&figure&&img src=&https://pic2.zhimg.com/v2-09e3b5eeaa3fcc88e579b3e_b.jpg& data-rawwidth=&2642& data-rawheight=&1722& class=&origin_image zh-lightbox-thumb& width=&2642& data-original=&https://pic2.zhimg.com/v2-09e3b5eeaa3fcc88e579b3e_r.jpg&&&/figure&&/p&&p&这里需要说明下验证码问题。有些账号登录需要验证码,有些不需要,这和账号设置有关,带有登录保护的就需要输入验证码。这里也可以根据上边得到的json串中的showpin参数得知(具体见上边的图)。如果需要验证码,则只需要找到验证码的地址,得到图片:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-216c9ffeabd_b.jpg& data-rawwidth=&2312& data-rawheight=&1034& class=&origin_image zh-lightbox-thumb& width=&2312& data-original=&https://pic2.zhimg.com/v2-216c9ffeabd_r.jpg&&&/figure&&p&将这个图片保存到本地进行人工打码,或者接入打码平台,都可以获取验证码内容。在我的代码中,我原本封装了云打码平台的接口,直接调用即可,但为了方便大家测试,我改为人工打码的形式,具体见代码:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-f072da2cb1_b.jpg& data-rawwidth=&1722& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&1722& data-original=&https://pic4.zhimg.com/v2-f072da2cb1_r.jpg&&&/figure&&p&(7)构造postdata,发送请求,即便是请求成功了,其实还没登录成功。因为新浪微博还有一步跳转。是不是很麻烦?别着急,胜利马上就在眼前了。我们仔细查看Charles后,会发现在上个请求之后,有下边一个请求wbsso.login,这就是那个跳转,如下图。&/p&&p&&figure&&img src=&https://pic1.zhimg.com/v2-cc74e43e3ee32e45b93b8ca_b.jpg& data-rawwidth=&2642& data-rawheight=&1722& class=&origin_image zh-lightbox-thumb& width=&2642& data-original=&https://pic1.zhimg.com/v2-cc74e43e3ee32e45b93b8ca_r.jpg&&&/figure&该跳转请求的请求如何构建,大家看代码即可,这里就不多说了。代码如下:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-6db0a64cfb4c3b268ea36d2_b.jpg& data-rawwidth=&1704& data-rawheight=&704& class=&origin_image zh-lightbox-thumb& width=&1704& data-original=&https://pic3.zhimg.com/v2-6db0a64cfb4c3b268ea36d2_r.jpg&&&/figure&&p&代码中还检查登录是否成功,这里也不过多描述。到这为止,新浪微博就算是登录成功了。&/p&&p&这里还有一个问题没有说到,就是Cookie问题。本文中一直没有提到Cookie,是因为Python中的Cookiejar会帮我们自动处理所有的cookie问题。你只需要在模拟登陆之前,首先声明一个cookiejar和opener即可,具体这两个东西的用法,大家自行百度。代码如下:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-7a83f61c79cbd07f31be3c_b.jpg& data-rawwidth=&1348& data-rawheight=&328& class=&origin_image zh-lightbox-thumb& width=&1348& data-original=&https://pic3.zhimg.com/v2-7a83f61c79cbd07f31be3c_r.jpg&&&/figure&&p&模拟登陆微博真的很麻烦,也确实需要一定的经验,大家多多练习,熟练掌握了这个,相信你们在模拟登陆其他网站的时候,也能举一反三的去破解登录流程。有什么问题,可以在评论中指出,有时间我会帮大家解答的。&/p&&p&总的代码如下:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&c1&&# _*_ coding: utf-8 _*_&/span&
&span class=&kn&&import&/span& &span class=&nn&&re&/span&
&span class=&kn&&import&/span& &span class=&nn&&rsa&/span&
&span class=&kn&&import&/span& &span class=&nn&&time&/span&
&span class=&kn&&import&/span& &span class=&nn&&json&/span&
&span class=&kn&&import&/span& &span class=&nn&&base64&/span&
&span class=&kn&&import&/span& &span class=&nn&&logging&/span&
&span class=&kn&&import&/span& &span class=&nn&&binascii&/span&
&span class=&kn&&import&/span& &span class=&nn&&requests&/span&
&span class=&kn&&import&/span& &span class=&nn&&urllib.parse&/span&
&span class=&k&&class&/span& &span class=&nc&&WeiBoLogin&/span&&span class=&p&&(&/span&&span class=&nb&&object&/span&&span class=&p&&):&/span&
&span class=&sd&&&&&&/span&
&span class=&sd&&
class of WeiBoLogin, to login weibo.com&/span&
&span class=&sd&&
&&&&/span&
&span class=&k&&def&/span& &span class=&nf&&__init__&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&p&&):&/span&
&span class=&sd&&&&&&/span&
&span class=&sd&&
constructor&/span&
&span class=&sd&&
&&&&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&user_name&/span& &span class=&o&&=&/span& &span class=&bp&&None&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&pass_word&/span& &span class=&o&&=&/span& &span class=&bp&&None&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&user_uniqueid&/span& &span class=&o&&=&/span& &span class=&bp&&None&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&user_nick&/span& &span class=&o&&=&/span& &span class=&bp&&None&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&session&/span& &span class=&o&&=&/span& &span class=&n&&requests&/span&&span class=&o&&.&/span&&span class=&n&&Session&/span&&span class=&p&&()&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&session&/span&&span class=&o&&.&/span&&span class=&n&&headers&/span&&span class=&o&&.&/span&&span class=&n&&update&/span&&span class=&p&&({&/span&&span class=&s2&&&User-Agent&&/span&&span class=&p&&:&/span& &span class=&s2&&&Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/ Firefox/41.0&&/span&&span class=&p&&})&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&session&/span&&span class=&o&&.&/span&&span class=&n&&get&/span&&span class=&p&&(&/span&&span class=&s2&&&http://weibo.com/login.php&&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span&
&span class=&k&&def&/span& &span class=&nf&&login&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&p&&,&/span& &span class=&n&&user_name&/span&&span class=&p&&,&/span& &span class=&n&&pass_word&/span&&span class=&p&&):&/span&
&span class=&sd&&&&&&/span&
&span class=&sd&&
login weibo.com, return True or False&/span&
&span class=&sd&&
&&&&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&user_name&/span& &span class=&o&&=&/span& &span class=&n&&user_name&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&pass_word&/span& &span class=&o&&=&/span& &span class=&n&&pass_word&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&user_uniqueid&/span& &span class=&o&&=&/span& &span class=&bp&&None&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&user_nick&/span& &span class=&o&&=&/span& &span class=&bp&&None&/span&
&span class=&c1&&# get json data&/span&
&span class=&n&&s_user_name&/span& &span class=&o&&=&/span& &span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&get_username&/span&&span class=&p&&()&/span&
&span class=&n&&json_data&/span& &span class=&o&&=&/span& &span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&get_json_data&/span&&span class=&p&&(&/span&&span class=&n&&su_value&/span&&span class=&o&&=&/span&&span class=&n&&s_user_name&/span&&span class=&p&&)&/span&
&span class=&k&&if&/span& &span class=&ow&&not&/span& &span class=&n&&json_data&/span&&span class=&p&&:&/span&
&span class=&k&&return&/span& &span class=&bp&&False&/span&
&span class=&n&&s_pass_word&/span& &span class=&o&&=&/span& &span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&get_password&/span&&span class=&p&&(&/span&&span class=&n&&json_data&/span&&span class=&p&&[&/span&&span class=&s2&&&servertime&&/span&&span class=&p&&],&/span& &span class=&n&&json_data&/span&&span class=&p&&[&/span&&span class=&s2&&&nonce&&/span&&span class=&p&&],&/span& &span class=&n&&json_data&/span&&span class=&p&&[&/span&&span class=&s2&&&pubkey&&/span&&span class=&p&&])&/span&
&span class=&c1&&# make post_data&/span&
&span class=&n&&post_data&/span& &span class=&o&&=&/span& &span class=&p&&{&/span&
&span class=&s2&&&entry&&/span&&span class=&p&&:&/span& &span class=&s2&&&weibo&&/span&&span class=&p&&,&/span&
&span class=&s2&&&gateway&&/span&&span class=&p&&:&/span& &span class=&s2&&&1&&/span&&span class=&p&&,&/span&
&span class=&s2&&&from&&/span&&span class=&p&&:&/span& &span class=&s2&&&&&/span&&span class=&p&&,&/span&
&span class=&s2&&&savestate&&/span&&span class=&p&&:&/span& &span class=&s2&&&7&&/span&&span class=&p&&,&/span&
&span class=&s2&&&userticket&&/span&&span class=&p&&:&/span& &span class=&s2&&&1&&/span&&span class=&p&&,&/span&
&span class=&s2&&&vsnf&&/span&&span class=&p&&:&/span& &span class=&s2&&&1&&/span&&span class=&p&&,&/span&
&span class=&s2&&&service&&/span&&span class=&p&&:&/span& &span class=&s2&&&miniblog&&/span&&span class=&p&&,&/span&
&span class=&s2&&&encoding&&/span&&span class=&p&&:&/span& &span class=&s2&&&UTF-8&&/span&&span class=&p&&,&/span&
&span class=&s2&&&pwencode&&/span&&span class=&p&&:&/span& &span class=&s2&&&rsa2&&/span&&span class=&p&&,&/span&
&span class=&s2&&&sr&&/span&&span class=&p&&:&/span& &span class=&s2&&&&&/span&&span class=&p&&,&/span&
&span class=&s2&&&prelt&&/span&&span class=&p&&:&/span& &span class=&s2&&&529&&/span&&span class=&p&&,&/span&
&span class=&s2&&&url&&/span&&span class=&p&&:&/span& &span class=&s2&&&http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&&/span&&span class=&p&&,&/span&
&span class=&s2&&&rsakv&&/span&&span class=&p&&:&/span& &span class=&n&&json_data&/span&&span class=&p&&[&/span&&span class=&s2&&&rsakv&&/span&&span class=&p&&],&/span&
&span class=&s2&&&servertime&&/span&&span class=&p&&:&/span& &span class=&n&&json_data&/span&&span class=&p&&[&/span&&span class=&s2&&&servertime&&/span&&span class=&p&&],&/span&
&span class=&s2&&&nonce&&/span&&span class=&p&&:&/span& &span class=&n&&json_data&/span&&span class=&p&&[&/span&&span class=&s2&&&nonce&&/span&&span class=&p&&],&/span&
&span class=&s2&&&su&&/span&&span class=&p&&:&/span& &span class=&n&&s_user_name&/span&&span class=&p&&,&/span&
&span class=&s2&&&sp&&/span&&span class=&p&&:&/span& &span class=&n&&s_pass_word&/span&&span class=&p&&,&/span&
&span class=&s2&&&returntype&&/span&&span class=&p&&:&/span& &span class=&s2&&&TEXT&&/span&&span class=&p&&,&/span&
&span class=&p&&}&/span&
&span class=&c1&&# get captcha code&/span&
&span class=&k&&if&/span& &span class=&n&&json_data&/span&&span class=&p&&[&/span&&span class=&s2&&&showpin&&/span&&span class=&p&&]&/span& &span class=&o&&==&/span& &span class=&mi&&1&/span&&span class=&p&&:&/span&
&span class=&n&&url&/span& &span class=&o&&=&/span& &span class=&s2&&&http://login.sina.com.cn/cgi/pin.php?r=&/span&&span class=&si&&%d&/span&&span class=&s2&&&s=0&p=&/span&&span class=&si&&%s&/span&&span class=&s2&&&&/span& &span class=&o&&%&/span& &span class=&p&&(&/span&&span class=&nb&&int&/span&&span class=&p&&(&/span&&span class=&n&&time&/span&&span class=&o&&.&/span&&span class=&n&&time&/span&&span class=&p&&()),&/span& &span class=&n&&json_data&/span&&span class=&p&&[&/span&&span class=&s2&&&pcid&&/span&&span class=&p&&])&/span&
&span class=&k&&with&/span& &span class=&nb&&open&/span&&span class=&p&&(&/span&&span class=&s2&&&captcha.jpeg&&/span&&span class=&p&&,&/span& &span class=&s2&&&wb&&/span&&span class=&p&&)&/span& &span class=&k&&as&/span& &span class=&n&&file_out&/span&&span class=&p&&:&/span&
&span class=&n&&file_out&/span&&span class=&o&&.&/span&&span class=&n&&write&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&session&/span&&span class=&o&&.&/span&&span class=&n&&get&/span&&span class=&p&&(&/span&&span class=&n&&url&/span&&span class=&p&&)&/span&&span class=&o&&.&/span&&span class=&n&&content&/span&&span class=&p&&)&/span&
&span class=&n&&code&/span& &span class=&o&&=&/span& &span class=&nb&&input&/span&&span class=&p&&(&/span&&span class=&s2&&&请输入验证码:&&/span&&span class=&p&&)&/span&
&span class=&n&&post_data&/span&&span class=&p&&[&/span&&span class=&s2&&&pcid&&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&n&&json_data&/span&&span class=&p&&[&/span&&span class=&s2&&&pcid&&/span&&span class=&p&&]&/span&
&span class=&n&&post_data&/span&&span class=&p&&[&/span&&span class=&s2&&&door&&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&n&&code&/span&
&span class=&c1&&# login weibo.com&/span&
&span class=&n&&login_url_1&/span& &span class=&o&&=&/span& &span class=&s2&&&http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)&_=&/span&&span class=&si&&%d&/span&&span class=&s2&&&&/span& &span class=&o&&%&/span& &span class=&nb&&int&/span&&span class=&p&&(&/span&&span class=&n&&time&/span&&span class=&o&&.&/span&&span class=&n&&time&/span&&span class=&p&&())&/span&
&span class=&n&&json_data_1&/span& &span class=&o&&=&/span& &span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&session&/span&&span class=&o&&.&/span&&span class=&n&&post&/span&&span class=&p&&(&/span&&span class=&n&&login_url_1&/span&&span class=&p&&,&/span& &span class=&n&&data&/span&&span class=&o&&=&/span&&span class=&n&&post_data&/span&&span class=&p&&)&/span&&span class=&o&&.&/span&&span class=&n&&json&/span&&span class=&p&&()&/span&
&span class=&k&&if&/span& &span class=&n&&json_data_1&/span&&span class=&p&&[&/span&&span class=&s2&&&retcode&&/span&&span class=&p&&]&/span& &span class=&o&&==&/span& &span class=&s2&&&0&&/span&&span class=&p&&:&/span&
&span class=&n&&params&/span& &span class=&o&&=&/span& &span class=&p&&{&/span&
&span class=&s2&&&callback&&/span&&span class=&p&&:&/span& &span class=&s2&&&sinaSSOController.callbackLoginStatus&&/span&&span class=&p&&,&/span&
&span class=&s2&&&client&&/span&&span class=&p&&:&/span& &span class=&s2&&&ssologin.js(v1.4.18)&&/span&&span class=&p&&,&/span&
&span class=&s2&&&ticket&&/span&&span class=&p&&:&/span& &span class=&n&&json_data_1&/span&&span class=&p&&[&/span&&span class=&s2&&&ticket&&/span&&span class=&p&&],&/span&
&span class=&s2&&&ssosavestate&&/span&&span class=&p&&:&/span& &span class=&nb&&int&/span&&span class=&p&&(&/span&&span class=&n&&time&/span&&span class=&o&&.&/span&&span class=&n&&time&/span&&span class=&p&&()),&/span&
&span class=&s2&&&_&&/span&&span class=&p&&:&/span& &span class=&nb&&int&/span&&span class=&p&&(&/span&&span class=&n&&time&/span&&span class=&o&&.&/span&&span class=&n&&time&/span&&span class=&p&&()&/span&&span class=&o&&*&/span&&span class=&mi&&1000&/span&&span class=&p&&),&/span&
&span class=&p&&}&/span&
&span class=&n&&response&/span& &span class=&o&&=&/span& &span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&session&/span&&span class=&o&&.&/span&&span class=&n&&get&/span&&span class=&p&&(&/span&&span class=&s2&&&https://passport.weibo.com/wbsso/login&&/span&&span class=&p&&,&/span& &span class=&n&&params&/span&&span class=&o&&=&/span&&span class=&n&&params&/span&&span class=&p&&)&/span&
&span class=&n&&json_data_2&/span& &span class=&o&&=&/span& &span class=&n&&json&/span&&span class=&o&&.&/span&&span class=&n&&loads&/span&&span class=&p&&(&/span&&span class=&n&&re&/span&&span class=&o&&.&/span&&span class=&n&&search&/span&&span class=&p&&(&/span&&span class=&s2&&r&\((?P&result&.*)\)&&/span&&span class=&p&&,&/span& &span class=&n&&response&/span&&span class=&o&&.&/span&&span class=&n&&text&/span&&span class=&p&&)&/span&&span class=&o&&.&/span&&span class=&n&&group&/span&&span class=&p&&(&/span&&span class=&s2&&&result&&/span&&span class=&p&&))&/span&
&span class=&k&&if&/span& &span class=&n&&json_data_2&/span&&span class=&p&&[&/span&&span class=&s2&&&result&&/span&&span class=&p&&]&/span& &span class=&ow&&is&/span& &span class=&bp&&True&/span&&span class=&p&&:&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&user_uniqueid&/span& &span class=&o&&=&/span& &span class=&n&&json_data_2&/span&&span class=&p&&[&/span&&span class=&s2&&&userinfo&&/span&&span class=&p&&][&/span&&span class=&s2&&&uniqueid&&/span&&span class=&p&&]&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&user_nick&/span& &span class=&o&&=&/span& &span class=&n&&json_data_2&/span&&span class=&p&&[&/span&&span class=&s2&&&userinfo&&/span&&span class=&p&&][&/span&&span class=&s2&&&displayname&&/span&&span class=&p&&]&/span&
&span class=&n&&logging&/span&&span class=&o&&.&/span&&span class=&n&&warning&/span&&span class=&p&&(&/span&&span class=&s2&&&WeiBoLogin succeed: &/span&&span class=&si&&%s&/span&&span class=&s2&&&&/span&&span class=&p&&,&/span& &span class=&n&&json_data_2&/span&&span class=&p&&)&/span&
&span class=&k&&else&/span&&span class=&p&&:&/span&
&span class=&n&&logging&/span&&span class=&o&&.&/span&&span class=&n&&warning&/span&&span class=&p&&(&/span&&span class=&s2&&&WeiBoLogin failed: &/span&&span class=&si&&%s&/span&&span class=&s2&&&&/span&&span class=&p&&,&/span& &span class=&n&&json_data_2&/span&&span class=&p&&)&/span&
&span class=&k&&else&/span&&span class=&p&&:&/span&
&span class=&n&&logging&/span&&span class=&o&&.&/span&&span class=&n&&warning&/span&&span class=&p&&(&/span&&span class=&s2&&&WeiBoLogin failed: &/span&&span class=&si&&%s&/span&&span class=&s2&&&&/span&&span class=&p&&,&/span& &span class=&n&&json_data_1&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span& &span class=&bp&&True&/span& &span class=&k&&if&/span& &span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&user_uniqueid&/span& &span class=&ow&&and&/span& &span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&user_nick&/span& &span class=&k&&else&/span& &span class=&bp&&False&/span&
&span class=&k&&def&/span& &span class=&nf&&get_username&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&p&&):&/span&
&span class=&sd&&&&&&/span&
&span class=&sd&&
get legal username&/span&
&span class=&sd&&
&&&&/span&
&span class=&n&&username_quote&/span& &span class=&o&&=&/span& &span class=&n&&urllib&/span&&span class=&o&&.&/span&&span class=&n&&parse&/span&&span class=&o&&.&/span&&span class=&n&&quote_plus&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&user_name&/span&&span class=&p&&)&/span&
&span class=&n&&username_base64&/span& &span class=&o&&=&/span& &span class=&n&&base64&/span&&span class=&o&&.&/span&&span class=&n&&b64encode&/span&&span class=&p&&(&/span&&span class=&n&&username_quote&/span&&span class=&o&&.&/span&&span class=&n&&encode&/span&&span class=&p&&(&/span&&span class=&s2&&&utf-8&&/span&&span class=&p&&))&/span&
&span class=&k&&return&/span& &span class=&n&&username_base64&/span&&span class=&o&&.&/span&&span class=&n&&decode&/span&&span class=&p&&(&/span&&span class=&s2&&&utf-8&&/span&&span class=&p&&)&/span&
&span class=&k&&def&/span& &span class=&nf&&get_json_data&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&p&&,&/span& &span class=&n&&su_value&/span&&span class=&p&&):&/span&
&span class=&sd&&&&&&/span&
&span class=&sd&&
get the value of &servertime&, &nonce&, &pubkey&, &rsakv& and &showpin&, etc&/span&
&span class=&sd&&
&&&&/span&
&span class=&n&&params&/span& &span class=&o&&=&/span& &span class=&p&&{&/span&
&span class=&s2&&&entry&&/span&&span class=&p&&:&/span& &span class=&s2&&&weibo&&/span&&span class=&p&&,&/span&
&span class=&s2&&&callback&&/span&&span class=&p&&:&/span& &span class=&s2&&&sinaSSOController.preloginCallBack&&/span&&span class=&p&&,&/span&
&span class=&s2&&&rsakt&&/span&&span class=&p&&:&/span& &span class=&s2&&&mod&&/span&&span class=&p&&,&/span&
&span class=&s2&&&checkpin&&/span&&span class=&p&&:&/span& &span class=&s2&&&1&&/span&&span class=&p&&,&/span&
&span class=&s2&&&client&&/span&&span class=&p&&:&/span& &span class=&s2&&&ssologin.js(v1.4.18)&&/span&&span class=&p&&,&/span&
&span class=&s2&&&su&&/span&&span class=&p&&:&/span& &span class=&n&&su_value&/span&&span class=&p&&,&/span&
&span class=&s2&&&_&&/span&&span class=&p&&:&/span& &span class=&nb&&int&/span&&span class=&p&&(&/span&&span class=&n&&time&/span&&span class=&o&&.&/span&&span class=&n&&time&/span&&span class=&p&&()&/span&&span class=&o&&*&/span&&span class=&mi&&1000&/span&&span class=&p&&),&/span&
&span class=&p&&}&/span&
&span class=&k&&try&/span&&span class=&p&&:&/span&
&span class=&n&&response&/span& &span class=&o&&=&/span& &span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&session&/span&&span class=&o&&.&/span&&span class=&n&&get&/span&&span class=&p&&(&/span&&span class=&s2&&&http://login.sina.com.cn/sso/prelogin.php&&/span&&span class=&p&&,&/span& &span class=&n&&params&/span&&span class=&o&&=&/span&&span class=&n&&params&/span&&span class=&p&&)&/span&
&span class=&n&&json_data&/span& &span class=&o&&=&/span& &span class=&n&&json&/span&&span class=&o&&.&/span&&span class=&n&&loads&/span&&span class=&p&&(&/span&&span class=&n&&re&/span&&span class=&o&&.&/span&&span class=&n&&search&/span&&span class=&p&&(&/span&&span class=&s2&&r&\((?P&data&.*)\)&&/span&&span class=&p&&,&/span& &span class=&n&&response&/span&&span class=&o&&.&/span&&span class=&n&&text&/span&&span class=&p&&)&/span&&span class=&o&&.&/span&&span class=&n&&group&/span&&span class=&p&&(&/span&&span class=&s2&&&data&&/span&&span class=&p&&))&/span&
&span class=&k&&except&/span& &span class=&ne&&Exception&/span& &span class=&k&&as&/span& &span class=&n&&excep&/span&&span class=&p&&:&/span&
&span class=&n&&json_data&/span& &span class=&o&&=&/span& &span class=&p&&{}&/span&
&span class=&n&&logging&/span&&span class=&o&&.&/span&&span class=&n&&error&/span&&span class=&p&&(&/span&&span class=&s2&&&WeiBoLogin get_json_data error: &/span&&span class=&si&&%s&/span&&span class=&s2&&&&/span&&span class=&p&&,&/span& &span class=&n&&excep&/span&&span class=&p&&)&/span&
&span class=&n&&logging&/span&&span class=&o&&.&/span&&span class=&n&&debug&/span&&span class=&p&&(&/span&&span class=&s2&&&WeiBoLogin get_json_data: &/span&&span class=&si&&%s&/span&&span class=&s2&&&&/span&&span class=&p&&,&/span& &span class=&n&&json_data&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span& &span class=&n&&json_data&/span&
&span class=&k&&def&/span& &span class=&nf&&get_password&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&p&&,&/span& &span class=&n&&servertime&/span&&span class=&p&&,&/span& &span class=&n&&nonce&/span&&span class=&p&&,&/span& &span class=&n&&pubkey&/span&&span class=&p&&):&/span&
&span class=&sd&&&&&&/span&
&span class=&sd&&
get legal password&/span&
&span class=&sd&&
&&&&/span&
&span class=&n&&string&/span& &span class=&o&&=&/span& &span class=&p&&(&/span&&span class=&nb&&str&/span&&span class=&p&&(&/span&&span class=&n&&servertime&/span&&span class=&p&&)&/span& &span class=&o&&+&/span& &span class=&s2&&&&/span&&span class=&se&&\t&/span&&span class=&s2&&&&/span& &span class=&o&&+&/span& &span class=&nb&&str&/span&&span class=&p&&(&/span&&span class=&n&&nonce&/span&&span class=&p&&)&/span& &span class=&o&&+&/span& &span class=&s2&&&&/span&&span class=&se&&\n&/span&&span class=&s2&&&&/span& &span class=&o&&+&/span& &span class=&nb&&str&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&pass_word&/span&&span class=&p&&))&/span&&span class=&o&&.&/span&&span class=&n&&encode&/span&&span class=&p&&(&/span&&span class=&s2&&&utf-8&&/span&&span class=&p&&)&/span&
&span class=&n&&public_key&/span& &span class=&o&&=&/span& &span class=&n&&rsa&/span&&span class=&o&&.&/span&&span class=&n&&PublicKey&/span&&span class=&p&&(&/span&&span class=&nb&&int&/span&&span class=&p&&(&/span&&span class=&n&&pubkey&/span&&span class=&p&&,&/span& &span class=&mi&&16&/span&&span class=&p&&),&/span& &span class=&nb&&int&/span&&span class=&p&&(&/span&&span class=&s2&&&10001&&/span&&span class=&p&&,&/span& &span class=&mi&&16&/span&&span class=&p&&))&/span&
&span class=&n&&password&/span& &span class=&o&&=&/span& &span class=&n&&rsa&/span&&span class=&o&&.&/span&&span class=&n&&encrypt&/span&&span class=&p&&(&/span&&span class=&n&&string&/span&&span class=&p&&,&/span& &span class=&n&&public_key&/span&&span class=&p&&)&/span&
&span class=&n&&password&/span& &span class=&o&&=&/span& &span class=&n&&binascii&/span&&span class=&o&&.&/span&&span class=&n&&b2a_hex&/span&&span class=&p&&(&/span&&span class=&n&&password&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span& &span class=&n&&password&/span&&span class=&o&&.&/span&&span class=&n&&decode&/span&&span class=&p&&()&/span&
&span class=&k&&if&/span& &span class=&n&&__name__&/span& &span class=&o&&==&/span& &span class=&s2&&&__main__&&/span&&span class=&p&&:&/span&
&span class=&n&&logging&/span&&span class=&o&&.&/span&&span class=&n&&basicConfig&/span&&span class=&p&&(&/span&&span class=&n&&level&/span&&span class=&o&&=&/span&&span class=&n&&logging&/span&&span class=&o&&.&/span&&span class=&n&&DEBUG&/span&&span class=&p&&,&/span& &span class=&n&&format&/span&&span class=&o&&=&/span&&span class=&s2&&&&/span&&span class=&si&&%(asctime)s&/span&&span class=&se&&\t&/span&&span class=&si&&%(levelname)s&/span&&span class=&se&&\t&/span&&span class=&si&&%(message)s&/span&&span class=&s2&&&&/span&&span class=&p&&)&/span&
&span class=&n&&weibo&/span& &span class=&o&&=&/span& &span class=&n&&WeiBoLogin&/span&&span class=&p&&()&/span&
&span class=&n&&weibo&/span&&span class=&o&&.&/span&&span class=&n&&login&/span&&span class=&p&&(&/span&&span class=&s2&&&username&&/span&&span class=&p&&,&/span& &span class=&s2&&&password&&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&p&=============================================================&/p&&p&作者主页:&a href=&https://www.zhihu.com/people/xianhu& class=&internal&&笑虎(Python爱好者,关注爬虫、数据分析、数据挖掘、数据可视化等)&/a&&/p&&p&作者专栏主页:&a href=&https://zhuanlan.zhihu.com/pythoner& class=&internal&&撸代码,学知识 - 知乎专栏&/a&&/p&&p&作者GitHub主页:&a href=&http://link.zhihu.com/?target=https%3A//github.com/xianhu& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&撸代码,学知识 - GitHub&/a&&/p&&p&欢迎大家拍砖、提意见。相互交流,共同进步!&/p&&p&==============================================================&/p&
更新:上个版本利用了一些自用框架PSpider的函数,更新后的版本只用到了requests库,并改写为Class的形式,方便大家运行调试。--------------------------------------------------------------------------------------------------------干货来啦,如果你…
递归解:&br&&div class=&highlight&&&pre&&code class=&language-c&&&span class=&cp&&#include &stdio.h&&/span&
&span class=&kt&&void&/span& &span class=&nf&&f&/span&&span class=&p&&(&/span&&span class=&kt&&int&/span&&span class=&o&&*&/span& &span class=&n&&r&/span&&span class=&p&&,&/span& &span class=&kt&&int&/span&&span class=&o&&*&/span& &span class=&n&&p&/span&&span class=&p&&,&/span& &span class=&kt&&int&/span& &span class=&n&&n&/span&&span class=&p&&,&/span& &span class=&kt&&int&/span& &span class=&n&&m&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&m&/span& &span class=&o&&==&/span& &span class=&mi&&1&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&k&&for&/span& &span class=&p&&(;&/span& &span class=&n&&r&/span& &span class=&o&&!=&/span& &span class=&n&&p&/span&&span class=&p&&;&/span& &span class=&o&&++&/span&&span class=&n&&r&/span&&span class=&p&&)&/span&
&span class=&n&&printf&/span&&span class=&p&&(&/span&&span class=&s&&&%d &&/span&&span class=&p&&,&/span& &span class=&o&&*&/span&&span class=&n&&r&/span&&span class=&p&&);&/span&
&span class=&n&&printf&/span&&span class=&p&&(&/span&&span class=&s&&&%d&/span&&span class=&se&&\n&/span&&span class=&s&&&&/span&&span class=&p&&,&/span& &span class=&n&&n&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&k&&else&/span&
&span class=&k&&for&/span& &span class=&p&&(&/span&&span class=&o&&*&/span&&span class=&n&&p&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span& &span class=&o&&*&/span&&span class=&n&&p&/span& &span class=&o&&&=&/span& &span class=&n&&n&/span&&span class=&p&&;&/span& &span class=&o&&++*&/span&&span class=&n&&p&/span&&span class=&p&&)&/span&
&span class=&n&&f&/span&&span class=&p&&(&/span&&span class=&n&&r&/span&&span class=&p&&,&/span& &span class=&n&&p&/span& &span class=&o&&+&/span& &span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&n&&n&/span& &span class=&o&&-&/span& &span class=&o&&*&/span&&span class=&n&&p&/span&&span class=&p&&,&/span& &span class=&n&&m&/span& &span class=&o&&-&/span& &span class=&mi&&1&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&kt&&void&/span& &span class=&nf&&g&/span&&span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&n&/span&&span class=&p&&,&/span& &span class=&kt&&int&/span& &span class=&n&&m&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&kt&&int&/span& &span class=&n&&r&/span&&span class=&p&&[&/span&&span class=&n&&m&/span&&span class=&p&&];&/span& &span class=&c1&&// C99 VLA&/span&
&span class=&n&&f&/span&&span class=&p&&(&/span&&span class=&n&&r&/span&&span class=&p&&,&/span& &span class=&n&&r&/span&&span class=&p&&,&/span& &span class=&n&&n&/span&&span class=&p&&,&/span& &span class=&n&&m&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&kt&&int&/span& &span class=&nf&&main&/span&&span class=&p&&()&/span& &span class=&p&&{&/span&
&span class=&n&&g&/span&&span class=&p&&(&/span&&span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&mi&&5&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&r 用于记录当前的结果,p 是写入该缓存的位置。那么,f(r, p, n, m) 的意义就是把 n 个球放进 m 个盒子,如果只有1个盒子了就打印结果(最后一个盒子有 n 个球);如果有&1个盒子,就放入 0 至 n 个球至当前的盒子,把余下的球和盒子以递归调用 f()。
递归解: #include &stdio.h&
void f(int* r, int* p, int n, int m) {
if (m == 1) {
for (; r != ++r)
printf("%d ", *r);
printf("%d\n", n);
for (*p = 0; *p &= ++*p)
f(r, p + 1, n - *p, m - 1);
void g(int n, int m) {
&b&这是个很长的故事,讲述的是一名电竞玩家转行文字编辑后的程序历程与开发感悟。&/b&&br&&br&&b&&b&-----------------&/b&&/b&&br&&b&目录&/b&&br&&b&-----------------&br&&/b&&ul&&li&&b&序&/b&&/li&&li&&b&引言(一)&/b&&/li&&li&&b&引言(二)&/b&&/li&&li&&b&一,奇葩的转行&/b&&/li&&li&&b&二,第1个电商项目&/b&&/li&&li&&b&三,一个阶段小结&/b&&/li&&li&&b&四,第2个电商项目。&/b&&/li&&li&&b&五,第3个电商项目(上)&/b&&/li&&li&&b&六,第3个电商项目(下)&/b&&/li&&li&&b&七,第4个电商项目&/b&&/li&&li&&b&八,前端开发者快速升级通关的一些个人经验总结&/b&&/li&&li&&b&九,谈谈互联网项目环境对于前端开发者向高阶晋级的影响&/b&&/li&&li&&b&十,个人职业发展的超级野路子——准职业选手转编辑再转php开发再转前端开发&/b&&/li&&li&&b&十一,个人素养与coding(一)——我是如何反复“打怪”强化“代码素养”的&/b&&/li&&li&&b&十二,个人素养与coding(二)——电竞/编辑经历对开发基本功素养的影响&/b&&/li&&li&&b&十三,个人素养与coding(三)——开发者的战术素养和程序的正与邪,开发者的道不同不相为谋&/b&&/li&&li&&b&十四,个人素养与coding(四)——开发者的战略素养对职场嗅觉的影响&/b&&/li&&li&&b&&b&后记:第4个电商项目——分裂,生存,可能还有崛起。&/b&&br&&/b&&/li&&/ul&&br&&b&&b&======================&/b&&br&这里是序。&br&&/b&&b&&b&======================&/b&&/b&&br&&br&&b&这是一篇长文。&/b&&br&&b&&br&任何一篇长文或专题,都是应该有一个序。&/b&&b&这是做为一个合格的媒体编辑/记者非常重要的技能点,要反反复复地训练。我曾经训练过很多次,但时间已然有些久远,已经好久没有动笔写这样的序,借这个机会,&/b&&b&让我再次尝试做好一名编辑该做的事情。&/b&&br&&br&这篇文章主要是对我个人这两三年从事前端开发以来的“升级打怪”经历的回顾和总结,进而来回复题主对于“&b&前端开发工程师&/b&”这一职业存在怎样的发展空间,而它进入高阶之后需要具备怎样的能力以及这些技能或知识可以从哪些地方、项目或企业中获取得到的,等前端coder职业发展上存在疑惑的问题,来发表一些我的个人见解。&br&&br&然而,我是没权力也没有义务告诉任何一个人Ta未来的路该怎么走,但却可以告诉你我是如何走的,而且我的路子是很野的,真的很野,对于很多大咖来说,绝对不能说是成功的,但对于没有机会进入一流互联网项目历练的大多数程序开发从业者而言,或许我的经历会有那么一点点借鉴的意义。&br&&br&其实我曾想过,是不是要把自己这个跳跃性如此之大的从业经历写下来,是持有怀疑态度的。曾经某猎头在把我推荐给BAT某家时,建议我不要把媒体编辑的经历做太详细的描述或直接去掉,而我确实也用一些编辑手段弱化了那段经历,还是将它放在简历里面。我觉得,这不是什么问题,写文字一直是我的兴趣,并且曾经是我的谋生手段,而且还做得不算太差,只是和程序开发的关联性少了一些。&br&&br&当然了,是获得了电话面试的机会,但第一轮就被KO了,那只是1年多以前事情,但3个月等于1年的电商开发节奏,现在我已经忘记了当时的情形,只记得那个电话来到的时候我刚刚通宵完成一个项目的公关,那会儿脑子是一塌糊涂的。&br&&br&当然,那时我的能力应该达不到人家的要求,但如果现在还有从来一次的机会,我觉得自己应该有能力拿下这样的offer,但暂时没有这个必要。&br&&br&请别误会,并不是说BAT级别的offer对我没有吸引力,而是对于现阶段的我而言,暂时不能为了这样的机会离开现有的项目和团队,而且现在的项目可以让我做擅长的和感兴趣的事情,并基本都能够按照自己的意志去落实下去,而大公司一般只能是做螺丝钉,不能有太多个人意志的,而且好的机会已然被老人们占据了,只是为了去镀金而去当别人的打手或救火队员,这显然是不理性的。&br&&br&另一方面,我其实发现了程序开发者要想快速成长,不一定非要进入BAT或一线的互联网企业中进行历练,创业项目一样可以快速成长,只要你把握好机遇和机会。请相信我,这是绝对是可行的,这就是我想把自己的经历写下来的原因。&br&&br&ok,在开始之前,我觉得预先告诉各位看客,作为一个由平面媒体编辑/记者转行做互联网开发的Coder,本人的码字功底还是不错的,因此篇幅会很长,很长,很长。&br&&br&如果你确实不感兴趣,建议不用浪费时间,聊技术或开发理念终归是有些枯燥的,也可能存在我写得不够清楚而让你看不明白的地方。不过,如果你真的对一名先是由编辑大跨行转php开发,再由php转前端切图,然后是如何用2年时间从月薪8K涨到月薪35K的职业经历感兴趣的话,那就一直往下看。&br&&br&此外,如果这篇文章有幸被某个单位相中,想转载的话,那么该给这篇文章起一个怎样的标题,我就不再代劳了,标题党的功力已经退化得差不多了。还有,我是知道有不少错别字的,但已经逃离媒体行业很久,好不容易不再为错别字太多而担心稿费被扣,那么我真的不想再为这个问题而烦恼&b&。&/b&这不再是我的职责,而是你的。不砸别人的饭碗,这是做人的本分,不是吗?&br&&br&当然,我的版权意识是比较浓的,毕竟咱也做了好多年的写手、编辑、记者。我的意思——转载可以,但记得署名,只要署名(知乎的名字就可以了),永久免费。但对于不署名的,我保留追究的权利,并至少按1000字/千元(RMB)的稿费标准收取稿费。不要觉得贵,这是我当年做写手的后期可以拿到的最高稿费标准,也就是我认为我的文字值这个价,请按此执行,不谢。&br&&br&&b&再劝一次,篇幅真的很长。&/b&&br&&br&&br&=======&b&引言1&/b&=======&br&&br&一夜之间来了这么多赞,倍感欣慰。&br&&br&正好今天我们部门要搬家,正好没有发版需求和特紧急的开发任务。我打算偷懒让人帮我打理桌面,哈哈,我好抽时间,继续补充一些关于前端开发或程序开发方面的想法,希望把这个话题扩大,让更多人来关注和讨论,期待真正的前端大牛来分享职业发展的经历,会有人需要的。&br&&br&顺便说一声,我还是想求赞的。这不违法吧?&br&&br&嗯,先让我回想一下,为啥这个题目会让我愿意投入这么多精力来码字,愿意出来现身说法?&br&&br&我觉得,这肯定是一个好问题。题主想要在职业选择迷茫期获得前辈提供的经验,而决定是否要继续走前端开发这条路线。事实上,这个问题具有普遍性意义。不管是在校学生,还是工作了,但依然对前端这个工种到底有啥可玩的,它能发展到哪个位置,前端能出技术总监或CTO吗?&br&&br&男怕入错行,女怕嫁错郎。因此,任何的回复都会对题主或关注这个话题的人的职业决策带来影响。因此,我才会对意识流的高票答案用了一些刻薄的语言来回复,并不想卖弄文字技巧,先说声抱歉,但我是故意。&br&&br&职业路径选择,是一个严肃的话题。&br&&br&补充在最后,是关于个人对程序修养的看法或理解。为啥说这个?这和前端开发或各种程序员的职业发展有啥niao关系吗?我认为是有关系的,而且很大,约往高处,关系越明显。可以这么说,个人的修养好坏在很大程度上会决定一个人的职业发展高度,写代码也是一样的。这似乎很哲理化,但我的观念就是这样的。&br&&br&当然,也是个人的观点,你可以不用同意,甚至觉得我在扮高调,放屁。但我希望你回得有理有据,咱们用文字约战。&br&&br&==========引言2===========&br&&br&暂时没有看到让人满意的回复,忍不住回复。&br&&br&先对题主说:这个问题其实有很多类似的提问了,这里有一个集合前端开发知识的整理文章,&a href=&http://www.zhihu.com/question/& class=&internal&&知乎上,前端开发领域有哪些值得推荐的问答? - JavaScript&/a&,在里面可以找到很多你赶兴趣的问题与答案。&br&&br&开始之前,我要对于目前的高票答案进行吐槽。&br&&br&高票答案说的确实是有点点道理的,但对于从事前端并陷入迷茫的提问人来说,绝对是然并mei啥卵yong的。不知为何大家给高票,如果只是因为答主用了一个新鲜的说辞,而大家觉得有点意思就顺手点了个赞,那么,我认为这对于知乎的严肃性是一种伤害,当然对于知乎的娱乐化则是一种推动。也可能,大家更喜欢意识流的答案,抑或是,我太严肃了。&br&&br&好吧。我尝试用严肃又有点轻松文字表达方式来回答题主的疑惑。到底前端的路可以怎么走?&br&&br&&b&纯属个人路线,仅供参考。如有雷同,请勿代入。&/b&&br&&br&&b&==========================&/b&&br&&b&一,奇葩的转行。&/b&&br&&b&==========================&/b&&br&先var身份。&br&&br&首先,前端一枚。30++++了,算是老猿吧,年纪不小了。至今没啥拿的出手成绩,就喜欢coding,不谈天荒地老,只希望能写到写不动。&br&&br&其实,我也不知道自己的水平在什么段位,年初拿到了两个一线互联网的offer,被定位在相当于阿里P6/P7样子,也不知道怎么评的,自己觉得最多P5的水准,自感能力有限和性格不适合大公司,主要是被现在领导忽悠说那些大公司政治斗争非常厉害的,我又特担心自己EQ值太低,经不起考验被扫地出门而颜面无存也就放弃了,所以还是一起做电商创业项目比较实在,薪水别太离谱,有感兴趣的活干,说话分量也有那么一点,关键是上班能自由一点点,其实也挺好的。&br&&br&当然,不是本人逼格有多高,有些大企业还是比较向往,比如企鹅厂比如狼厂,但是人家看到我这种奇葩的半路出家的野路子和尚,就连HR初期的筛选都过不了,更别说去面谈做题什么的了。哎,说起来全是泪,伤心得一塌糊涂。不说这个,还是说开发经历吧。&br&&br&在开发人员里面,我的经历应该算是比较奇葩的。怎么个奇葩法呢?&br&&br&首先,做过几年的媒体编辑,对的,是平煤(对文字要求严格,错别字个数有严格限制的),客串过记者(采访过不少上市公司的总裁,如果说互联网的话,最牛逼的是现在京东的4个总裁之一,辛弃疾的后裔,如果他还记得我的话...),曾经写过不少IT媒体的专栏,比如电脑报、电脑商情报、电脑爱好者之类的媒体,后来看到IT媒体日薄西山,就半路出家。当然,不是去少林寺做和尚,只是转行做了另一种和尚——程序猿。&br&&br&嗯,跳跃似乎有点大,好多以前的同事不忍直视,其实自我感觉还好,因为业余就爱好博客,经常玩弄各种php开源博客系统,纯属自娱自乐,虽然没有参加过任何技术培训班(其实是因为写稿的真没几个钱可以用来交学费,都挺贵的),不过不管怎样,经过一通自我学习和努力,总算混进程序开发这一行当。&br&&br&现在每天就是T恤+牛仔+拖鞋+电脑背包,非常标准的coder。所以说,曾经是个文艺青年的我,在coder这个队伍里面,自我感觉文字控制能力还算是不错的,也不知道算不算个开发技能点?&br&&br&&b&==========================&/b&&br&&b&二,第1个电商项目。&/b&&br&&b&==========================&/b&&br&当然,奇葩的转型,那么开发的经历也就比较崎岖了。&br&&br&先干了一段时间的php+前端混合开发的外包,就是那种用开源项目套页面做简单功能的二次开发类型项目,触摸最多的如wordpress、phpcms、discuz!,drupal之类的,框架也玩弄了thinkphp、CI,不过做外包的开发累死累活也没几个钱,技术也不会有太明显提高。&br&&br&后来机缘巧合吧,前前前东家要做个电商交易平台,一时半会找到合适的负责人,感觉我还看得过去就被赶鸭子上轿转做了项目主管,负责整个项目基础设施建设,其实就是招人和分配任务等,不过干得最出色就是切图和切图,虽然当时开发方式还属于未开化的刀耕火种,于是乎将自己定位成前端是比较靠谱,而php的活就兼顾一点是一点。&br&&br&还好,虽然技术比较烂,但是那个项目发展得比较顺利,拿到了A轮(号称3000W美金,水分可能比较大,不过那也是两三年前的事情了,按互联网的3个月=1年的节奏,感觉真的好遥远),有钱之后引入了一批更牛逼的开发人员(主要是前端和php),虽然是我的手下,但那波人能力在当时来看绝对是很强,我也从来没敢把人当手下,甚至很多问题都得向人家请教,技术不行就要虚心请教,这没什么好害羞的。&br&&br&人家确实也比较牛逼,带来一些先进的前端开发理念,比如前端构建,前端MVVM,纯静态html+restful api构建web网站的开发方式。这些前端开发理念在2012年-13年那会儿绝对算是非常先进的玩意,那时nodejs还未成熟,而grunt也才出来不久,fis可能还在萌芽阶段,而各大互联网公司对于nodejs也只是内部尝试探索。&br&&br&后来,随着项目发展,前端的需求越来越复杂,需要尝试MVVM、SPA的前端开发技术了,而我作为当时项目的前端负责人,也需要对前端代码做了重构才能适应项目的发展要求,就是做类似这样的事情—— &br&&br&&a href=&http://www.zhihu.com/question/& class=&internal&&如何将一个已经上线的项目前端部分平滑过渡至组件化和工程化? - 前端开发&/a&&br&&br&这是我做的第一个的大规模的前端项目重构,当时的技术总监评估给到我的时间是10天,但我拖到了20天才基本完成,基本天天9-10的节奏。从现在的角度看,绝对是一次失败的重构经历。但是,个人从其中获得了很多有价值的经验,让我有机会尝试了许多新的前端技术,包括:&br&&br&1,构建工具使用gulp,那时才刚出来不久,之所以选择它也就是图个新鲜,这是前端开发的通病吧;&br&2,基于less预编译的css模块化,watch监控自动编译;&br&3,基于gulp.spritesmith的雪碧图自动构建,根据watch监控雪碧图目录,自动按目录生成sp图和一份less,less保存到CSS的模块中,进而自动触发less的自动编译;&br&4,js模块化是AMD方案,模块加载是用requireJS。我们只做了一点点小改进,那就是通过gulp自动生成require.config(开发和生产各一份),第三方js模块的路径根据一定规则自动构建,而不是手工配置。&br&&br&js模块按目录的方式打包,打包后的文件带上MD5戳,非覆盖式发布,解决AB版迭代和缓存问题。现在看来那种按目录整体打包方式是相当粗暴的,代码冗余非常严重,但无奈当时的水平也就这样而已。不过呢,将需要重复手工配置的有规律的前端资源调度实现自动化,其实就是前端工程化的雏形,至少是给我打开了前端工程化探索的大门。&br&&br&事实上,这种开发思维不是当时的我所能想到的,而是项目所引入的前端人才提供的开发思维。非常感谢这位同事,虽然一起共事的时间只有短短3个月,而我们也只是点头之交,甚至你现在还可能鄙视那时技术那么烂的我,但却还当着你的领导。不管怎样,感谢你让我看到了前端开发往深入发展的另一种可能。&br&&br&应该说在很多大公司的互联网公司里面,前端开发在很多年前已经有成套的而且相当成熟的前端工程化开发体系,但对我个人或那个项目的而言,这种方式在当时绝对是非常非常新鲜的,以至于我们那个团队的人逐步离开后(那波人中的前端现在基本也是前端领域的能手了,有在YY的有在VIP也有在UC的),接手的前端无力接管这种不太一样的开发模式,而又只好用原始的方式来生产新版的前端静态资源。当然,绝对不是我留了什么后手,而是交接了一个月多,也找不到能够很好理解的前端。&br&&br&大家别笑话,现在还有很多创业型项目的前端开发模式还依然停留在刀耕火种的开发模式下,包括很多已经名声在外的电商。在中国,电商从来都不是以技术为第一生产力的,技术很重要,但却没技术人想的那样重要,大家一开始都是以实现业务逻辑为前提,先把业务跑起来,领导管你用神马开发模式,老是不能按时出货就得滚蛋。&br&&br&有兴趣,大家不妨研究一下一些知名电商的前端代码,没有模块化的知名项目还不少(包括上市的项目),而甚至还有各种裸奔的代码在线上跑的,当然这些其实是创业期发展过快的后遗症,发展太快就可能没有很好的契机做基础设施建设,那么现有的业务代码过于复杂,后来的人只能在原来的基础上改改改成能满足业务需求就万事大吉了。这其实是国情决定的,业务需求的实现大于一切,电商业务发展就像高速的列车,一旦开动起来就很难停下来。&br&&br&这种情况下前端代码模块化和重构难度就非常非常大了,你见过哪个师傅敢说给一辆高速跑的列车换零件的吗?这种坑不是一般人有信心往里面挑的,谁碰谁倒霉。另一边却是代码生产和发布效率的日渐低下,可能只是改一段静态说明文字抑或是修正一个小bug,发布流程都要跑上个把星期才敢放上线,但是大家不也活的有滋有味的嘛。从业务的角度,技术真没那么重要了。&br&&br&&b&==========================&/b&&br&&b&三,一个阶段小结。&/b&&br&&b&==========================&/b&&br&扯太远了,回一下神。回归主题。前端的路该怎么走——&br&&br&我个人认为初中级前端要想快速进步,最好的方式:&br&&br&&b&①一定要在一个有多人协作的前端团队呆过。通俗地说,要和比你牛逼的人一起干过活,见过牛人长啥模样。&/b&&br&&b&②一定要找到一个在业务上对前端有较高要求的公司或项目,特别是各种奇葩甚至恶心的需求,对于技术人来说其实是快速进步的机会。&/b&&br&&br&第二点很重要。重要的事情要念3遍,不去外包公司,不去外包公司,不去外包公司。当然,第一点更加重要。但是,有牛人愿意带,在很多时候这属于小概率事件。即便有机会进入这样的项目,你也千万别期待别人会手把手教你什么。我只能告诉你,耳濡目染的能量还是非常强大的。&br&&br&因此,从两个角度看,楼主现在项目既对技术要求不高,也似乎没看到牛人,是时候换一家公司了。还是那个意思,技术的进步一定来自于业务的不停变化,当要求你必须实现各种奇葩需求,而你又把人家的需求给实现了,那么就意味着进步。&br&&br&当然,如果天赋异禀,而且非常自律自学能力也牛逼,就当我没说。至于能否偶遇牛人,这就得看个人造化了。如果你发现某项目的确有大牛存在的,薪资要求甚至可以降低以求获得快速进步的机会。技术人要明白,你能拿多少,在一定水位之前,基本和技术能力成正比关系的。&br&&br&&b&==========================&/b&&br&&b&四,第2个电商项目。&/b&&br&&b&==========================&/b&&br&似乎又跑题了。咱们继续聊程序人生。&br&&br&我的第一个电商项目的经历很不成功,但是可能由于公司管理和文化方面的原因,导致了那一拨我认为非常不错的技术开发人才来到项目后,均不到半年都另谋高就出走了。而我认为自己需要进一步提升,也就选择了离开。&br&&br&说得直白点,就是技术能力/经验都涨了,薪水还是万年不变(本来就够低的,不知道有没有人听说过给技术经理级别的薪水定位是月薪税前8K的电商项目呢?(TM)的我白痴痴的还一干就干了整整2年,虽然自己能力可能就值这么多而已,要么干脆点把我换掉要么给点点和岗位匹配的薪酬,对吧?),又没有更牛逼的人供你参考膜拜,离开是唯一的选择。你懂的。&br&&br&这个时候时间来到了2014初了,我跳槽到了一家做在线教育的电商创业项目,月薪Double,title是前端项目经理(这叫法有点点怪怪的),做的事情其实就是前端那一块的事情,我在这个项目前后只呆了半年的样子,加入这家公司只是为了看看自己到底值多少钱,其实项目并不是很感兴趣,只是给我Double的薪资,也就加入了。&br&&br&这个项目的总负责人其实是电信那边出来的,职业的资历可能比较牛逼,但对技术其实一概不通的,而我的直接上司是技术总监但感觉也不怎么懂技术,更像是个项目经理,只会催进度,而技术的细节怎么去实现,或者前后端分工协作的模式该如何界定,他并没有任何腹案。&br&&br&也正因为他们对此没有概念,而我从上一个项目重构经历得出了一些前后端分离的经验,给他们分享了一些最新的前端开发模式的信息,告诉他们前端这一块必须尽早进行模块化构建,而那时项目才刚刚开始,我正好有机会从头做起。对我来说是很好的实验机会。&br&&br&和上一版本相比,构建的流程没有太多变化,模块化只有css和js模块化,我只是对规范和文档要求严格一些,改善了一些构建工具的监控开发体验问题,比如gulp.watch监控文件编译,如果发生语法错误就自动跳出watch问题。&br&&br&如果要说一个比较大的改变,实际是项目需求带来的变化,该项目由于需要移动端开发,而移动端需要用到前端模板引擎(artTemplate),我们在维护模板引擎的时候需要反复地维护类似这样的代码:&br&&div class=&highlight&&&pre&&code class=&language-text&&&script type=&text/html& id=&adv_list&&
&div class=&adv_list&&
&div class=&swipe-wrap&&
&% for (var i in item) { %&
&div class=&item&&
&a href=&&%= item[i].url %&&&
&img src=&&%= item[i].image %&& alt=&&&
&script type=&text/html& id=&home1&&
&div class=&index_block home1&&
&% if (title) { %&
&div class=&title&&&%= title %&&/div&
&div class=&content&&
&div class=&item&&
&a href=&&%= url %&&&
&img src=&&%= image %&& alt=&&&
&/code&&/pre&&/div&html包裹在script内部,编辑器看起来不是很好看,而且多人一起搞容易冲突。于是,我就改进了前端mvc模板维护的机制,弄成这样子:&br&&figure&&img src=&https://pic3.zhimg.com/83d71e3f839e0bfc4a8f92c_b.png& data-rawwidth=&1047& data-rawheight=&797& class=&origin_image zh-lightbox-thumb& width=&1047& data-original=&https://pic3.zhimg.com/83d71e3f839e0bfc4a8f92c_r.png&&&/figure&&br&开发人员维护一份html,通过构建工具自动将html编译成AMD规范封装的js模块,模块id自动编译,比如tpl_index_flash就是tpl/index/_flash.html文件(加下划线就被编译封装在script标签内,如果不加下划线命名html文件,就直接转化为js对象),而这个文件会被编译保存在js/tpl/index.js模块中。操作模板就使用AMD模块的实例对象,但开发人维护的html比直接放在html结构中要简单多了,代码冲突也几乎没有了,而且这份模板放在js里面可以借助js压缩优化,也可以方便地实现异步调用模板,做加载上的优化。&br&&figure&&img src=&https://pic1.zhimg.com/a897fefedfd248e59a00914_b.png& data-rawwidth=&1355& data-rawheight=&796& class=&origin_image zh-lightbox-thumb& width=&1355& data-original=&https://pic1.zhimg.com/a897fefedfd248e59a00914_r.png&&&/figure&&br&&br&在这个项目中,我最大的进步就是项目需要前端mvc模式开发,使得我有机会进一步改善前端自动构建的htm模板维护机制(html模板编译js化),优化Watch即编译的前端开发体验问题。但是这时候,由于我的家庭原因,需要请长假(还少1个月),经过考虑后我办理了离职,但给这个项目的前端留下的前端工具和模式基本沿用了下来。&br&&br&&b&==========================&/b&&br&&b&五,第3个电商项目(上)。&/b&&br&&b&==========================&/b&&br&家里的事情解决后,我又得重新找工作。当然,技术和经验又涨了一点点,同时}

我要回帖

更多关于 韩国龙珠战队是中国的 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信