<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>校园时光 - Aber's BLOG</title><link>https://aber.sh/corpus/%E6%A0%A1%E5%9B%AD%E6%97%B6%E5%85%89/</link><description>知不知，上；不知知，病。夫唯病病，是以不病。圣人不病，以其病病，是以不病。</description><atom:link href="http://aber.sh/corpus/%E6%A0%A1%E5%9B%AD%E6%97%B6%E5%85%89/feed.xml" rel="self"></atom:link><language>zh-hans</language><lastBuildDate>Mon, 26 Aug 2019 12:36:04 +0000</lastBuildDate><item><title>从腾讯离职后的想法</title><link>http://aber.sh/articles/2019-08-26-0/</link><description>&lt;p&gt;今天从腾讯办完了所有的离职手续。&lt;/p&gt;
&lt;p&gt;从归还电脑到退工卡、token，最后开实习证明。全程不超过20分钟，第一次感受到腾讯办事如此的高效。&lt;/p&gt;
&lt;p&gt;不知不觉就过了好几个月，我从开心的收到Offer到现在毅然从腾讯云的运营开发岗离职的转变也不过短短一个多月而已。&lt;/p&gt;
&lt;p&gt;入职之后，第一个正式的需求(在这之前还有零碎的工作)，需要我从UI图、设计文档开始做起，前端后端代码一手包办，做一个很简单的东西。其难度约等于我大一暑假第一次踏入Web开发世界的第一个项目。但我花了大概十天。&lt;/p&gt;
&lt;p&gt;为什么？&lt;/p&gt;
&lt;p&gt;因为我不会画图，我问组里其他人，他们也不能给什么帮助。最后还是我自己去谷歌，找到了 ANTD 的设计软件去使用。嗯，然后导师让我把这个的使用经验写成文档分享给组里。&lt;/p&gt;
&lt;p&gt;也因为我并不喜欢写前端代码。前端对我来说，仅仅是一个会写的东西。我会在有必要的时候自己写一些前端代码，但前后端都自己包，我只在给女朋友的网站上这么干过。我能写前端代码，但我不喜欢日复一日的写前端代码。&lt;strong&gt;我的预期发展里从来没有专业前端开发的分支。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个需求完成之后，接的第二个需求依旧是类似的东西。再加上我那段时间又是发烧感冒，前端写的更加昏昏沉沉，终于，思考之后提了离职。&lt;/p&gt;
&lt;p&gt;我毅然离职的原因是既不能学到东西，还是做不喜欢的事情的廉价劳动力。实习工作，薪酬跟前途至少有一个才能接着干下去。恰好，我当时两者都没有。&lt;/p&gt;
&lt;p&gt;最后，我已经离职了，买的月饼还没到。看来花出去的钱白费了。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;此栈已远，江湖再见。&lt;/p&gt;
&lt;/blockquote&gt;</description><pubDate>Mon, 26 Aug 2019 11:57:59 +0000</pubDate><guid>http://aber.sh/articles/2019-08-26-0/</guid></item><item><title>暑假实习笔试的反思</title><link>http://aber.sh/articles/shu-jia-shi-xi-bi-shi-de-fan-si/</link><description>&lt;p&gt;报了今年腾讯暑假实习，提前批笔试只做出来三题。第四题本来应该能做出来却没有，值得反思。&lt;/p&gt;
&lt;p&gt;第四题大致意思是，给一个数组，求数组中包含所有非零数字最小子串长度。&lt;/p&gt;
&lt;p&gt;这一题，我第一反应是利用集合去重。时间复杂度在O(n²)。TimeOut之后，我想到了另一个方法。&lt;/p&gt;
&lt;p&gt;假设最短长度为K，那只需要从K=1开始进行试探。想法很好，时间复杂度O(n×m)。但是！内存超限了！当时我不知道为什么，认为是算法问题，就重新思考新的算法。&lt;/p&gt;
&lt;p&gt;直到我今天无意中看到滑动窗口算法的变种，发现我的思路是对的。再仔细回想，发现内存超限的重要原因在于生成子串。&lt;/p&gt;
&lt;p&gt;我一次性生成了全部长度为k的子串，那么当然超限。其实这在Python里很好解决，只需要一个yield，就可以了。&lt;/p&gt;
&lt;p&gt;而我当时偏偏没想到，不该不刷题啊！&lt;/p&gt;
&lt;p&gt;立下一个Flag，校招前在LeetCode-Cn刷题满999题。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;但是我过了！所以不刷题了，安心接着造轮子。&lt;/p&gt;
&lt;p&gt;七月深圳腾讯见!&lt;/p&gt;</description><pubDate>Tue, 12 Mar 2019 04:28:18 +0000</pubDate><guid>http://aber.sh/articles/shu-jia-shi-xi-bi-shi-de-fan-si/</guid></item><item><title>开发易班的血泪史</title><link>http://aber.sh/articles/Fuck-Yiban-Document/</link><description>&lt;p&gt;老师让我基于易班开发一个体测成绩查询的功能。易班垃圾文档毁我青春，记下此文，以供后来者观之。（不断更新中）&lt;/p&gt;
&lt;h2 id="_1"&gt;机构号&lt;/h2&gt;
&lt;p&gt;机构号的ACCESS_TOKEN获取的文档有大问题。&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/upload/TIM截图20180511092722.png" /&gt;&lt;/p&gt;
&lt;p&gt;它的文档如是说，post到&lt;code&gt;http://mp.yiban.cn/cgibin/oauth/token?grant_type=client_credentials&amp;amp;appid=APPID&amp;amp;secret=APPSECRET&lt;/code&gt;， 然而经过我的实验，并不是如此。&lt;/p&gt;
&lt;p&gt;应该把&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;grant_type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;client_credentials&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;appid&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;APPID&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;secret&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;APPSECRET&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;作为Post方法的Body发到&lt;code&gt;http://mp.yiban.cn/cgibin/oauth/token&lt;/code&gt;。当我成功的那一刻，我的心里只有五个字，五个字——易班操你妈。&lt;/p&gt;
&lt;p&gt;机构号那个OAuth2都是假的，全都是假的。我打电话问客服，他们说是没有这个权限的。&lt;/p&gt;
&lt;h2 id="oauth20"&gt;OAuth2.0网页授权&lt;/h2&gt;
&lt;p&gt;经过我的不断实验，发现mp.yiban.cn里面的文档都是假的，要想OAuth2.0授权，只能去o.yiban.cn申请网站/应用等等来授权。&lt;/p&gt;
&lt;h2 id="_2"&gt;获取用户信息&lt;/h2&gt;
&lt;p&gt;领导要求，每个人都只能查到自己的成绩。那么问题来了，我该如何认证身份？&lt;/p&gt;
&lt;p&gt;仔细的查看过易班的文档，只在校级权限里提到了，使用用户的access_token去请求&lt;code&gt;https://openapi.yiban.cn/user/verify_me&lt;/code&gt;就能获取到学校认证信息。然而我此时连授权都没有搞出来，只好另寻它途。&lt;/p&gt;
&lt;p&gt;在机构号后台我找到了一个有用的地方——信息查询。我能从这里直接用用户的OpenID拿到用户的所有信息。这样一来事情解决了。当用户对机构号发送消息的时候，机构号能够获取到发送者的OpenID，然后从后台抓取对应的个人信息，再从数据库里查询，就可以完成领导要求的任务。&lt;/p&gt;</description><pubDate>Fri, 11 May 2018 00:00:00 +0000</pubDate><guid>http://aber.sh/articles/Fuck-Yiban-Document/</guid></item><item><title>绕开校园网计费</title><link>http://aber.sh/articles/Fuck-Campus-Network/</link><description>&lt;p&gt;最近我以合法手段要到了学校一台服务器的使用权限，就打算尝试一下绕过校园网计费。于是研究了一下&lt;/p&gt;
&lt;p&gt;作为中国的程序员，“代理”这两个字应该是十分熟悉的。所谓代理，就是让自己的网络流量通过服务器流向网站。但之前我一直没有详细了解过它们的实现，趁这个机会学习了一下。&lt;/p&gt;
&lt;p&gt;代理有多种&lt;code&gt;HTTP&lt;/code&gt;，&lt;code&gt;SSL&lt;/code&gt;，&lt;code&gt;Socks5&lt;/code&gt;，&lt;code&gt;FTP&lt;/code&gt;等等。但常用的一般是&lt;code&gt;HTTP&lt;/code&gt;和&lt;code&gt;Socks5&lt;/code&gt;两种代理。为了达到我使用校园网的目的，我优先尝试了&lt;code&gt;Socks5&lt;/code&gt;代理。&lt;/p&gt;
&lt;h2 id="socks5"&gt;Socks5&lt;/h2&gt;
&lt;p&gt;Socks5代理因为是直接建立双方连接，所以不关心流量走的是什么协议。无论是HTTPS还是HTTP都可以走Socks5代理。以下是来自&lt;a href="https://zh.wikipedia.org/wiki/SOCKS"&gt;Wiki&lt;/a&gt;的说明&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;SOCKS是一种网络传输协议，主要用于客户端与外网服务器之间通讯的中间传递。。&lt;br /&gt;
当防火墙后的客户端要访问外部的服务器时，就跟SOCKS代理服务器连接。这个代理服务器控制客户端访问外网的资格，允许的话，就将客户端的请求发往外部的服务器。&lt;br /&gt;
这个协议最初由David Koblas开发，而后由NEC的Ying-Da Lee将其扩展到版本4。最新协议是版本5，与前一版本相比，增加支持UDP、验证，以及IPv6。&lt;br /&gt;
根据OSI模型，SOCKS是会话层的协议，位于表示层与传输层之间。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;然后按照&lt;a href="https://www.ietf.org/rfc/rfc1928.txt"&gt;RFC1928&lt;/a&gt;我实现了一个&lt;a href="https://github.com/AberSheeran/Socks5"&gt;Socks5代理服务器&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;Socks5代理启动！然后......连接失败&lt;/p&gt;
&lt;p&gt;在尝试向外发送了几个UDP包和TCP请求之后，我推断，学校分这个服务器的时候，肯定没有给服务器网络，只是在网关做了映射。查看了一下IE的配置，找到了学校分配给服务器的代理服务器。用socks这个第三方库使用了一下代理。然而......问题又来了，无法访问HTTP网站是什么操作？？？看了日志，说是只支持CONNENT HTTP Proxy。&lt;/p&gt;
&lt;blockquote&gt;
&lt;h4 id="socks"&gt;socks&lt;/h4&gt;
&lt;p&gt;这个第三方库支持三种代理 &lt;code&gt;Socks4&lt;/code&gt;, &lt;code&gt;Socks5&lt;/code&gt;和&lt;code&gt;HTTP&lt;/code&gt;。安装方式是&lt;code&gt;pip install pysocks&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="http"&gt;HTTP代理&lt;/h2&gt;
&lt;p&gt;通过谷歌得知，HTTP代理分两种。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在HTTPS技术还没出来的时候，人们代理网站，只需要把请求的URI带上完整的网址就行了。代理服务器会代替你访问这个网站，然后把结果回馈给你。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在HTTPS普及之后，这种操作已经不行了，因为证书对不上。所以有了新的操作：CONNECT 方法。&lt;br /&gt;
  用户向代理服务器发送&lt;code&gt;CONNECT (domain|IPV4|IPV6):Port (HTTP/1.1 | HTTP/1.0 | HTTP/2.0)&lt;/code&gt;的数据包，代理服务器视情况返回一个状态。当客户端接收到200状态的时候就意味着代理服务器与目标服务器建立了TCP连接，可以直接发送普通的请求过去。此时数据包会由一个TCP连接发送到代理服务器，代理服务器原封不动的将数据包转发给目标服务器。&lt;br /&gt;
  这种方法就像是Socks5代理的阉割版，代理服务器不关心你们使用的是什么交互方式，它只需要把两个TCP连接拼在一起就行了。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;那么，我们上面提到的不支持的HTTP代理就是第一种代理了。看了看socks的源代码，嗯，只支持第二种代理。&lt;/p&gt;
&lt;p&gt;但学校这台代理服务器的逻辑是什么？我想搞清楚。发送了一个错误的包过去，果然从错误页面拿到了这台代理服务器的信息—— squid2.6。一番谷歌，squid的默认配置就是只允许向443端口使用CONNECT方法。&lt;/p&gt;
&lt;h2 id="_1"&gt;解决&lt;/h2&gt;
&lt;p&gt;自己手写了一个Socks代理转HTTP代理的代码，发现怎么搞都没用。因为普通的HTTP代理帮你发个包接个包就直接切断连接了！&lt;strong&gt;然而我是不会这样轻易的狗带的。&lt;/strong&gt;&lt;br /&gt;
一通电话打到了网管老师那里，一番&lt;del&gt;解释&lt;/del&gt;之下，老师开启了所有端口的CONNECT方法。&lt;/p&gt;
&lt;p&gt;社会工程学万岁！&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="_2"&gt;后续&lt;/h2&gt;
&lt;p&gt;所谓生命不息，折腾不止。当我使用&lt;a href="https://drive.google.com/open?id=1GUrYXmHKiebLCPTCpFPOJUW2k2hd1Tfd"&gt;SSTap&lt;/a&gt;将我的所有TCP流量走代理之后，我便想UDP也能走代理了(有点无耻)。&lt;/p&gt;
&lt;p&gt;我想，只要将一个UDP包要传递的数据解析出来，通过TCP转发给云服务器，让云服务器替学校那台服务器转发UDP(秘技: 双重转发)，虽然可能导致延迟略高，但至少能用了！毕竟我不是一个游戏党，对UDP的延迟没有要求。&lt;/p&gt;</description><pubDate>Thu, 03 May 2018 00:00:00 +0000</pubDate><guid>http://aber.sh/articles/Fuck-Campus-Network/</guid></item><item><title>如何从教务系统抢到课</title><link>http://aber.sh/articles/Hack-school-lesson/</link><description>&lt;p&gt;又到了一学期一次的抢课时节，由于我校规定必须在四个分类下各修一门选修课，所以不用上课不用课本的网课往往供不应求。而有趣的是，选课时间是整整一天。也就是说，这期间拥有已经修过的分类下的网课的人可以找别人进行换课。这让网课更加供不应求。&lt;/p&gt;
&lt;p&gt;作为一个码农，我当然不会去手动抢课。再说了，学校那个垃圾教务系统设计，刷不刷得进去全靠运气，并发支持不过百。我一个非酋不跟欧皇比运气。&lt;/p&gt;
&lt;h2 id="hacking"&gt;Hacking&lt;/h2&gt;
&lt;p&gt;查看学校选课页面的Js代码，在一堆前端验证+&lt;strong&gt;拼音缩写&lt;/strong&gt;之中找到了这个&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;xkkh&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ajax&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/xk/xxk/savexxk?action=ok&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;dataType&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;xkkh&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;xkkh&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;success&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reload&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;delxkkh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;xkkh&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ajax&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/xk/xxk/delxxk?action=ok&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;dataType&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;xkkh&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;xkkh&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;success&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reload&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;结合页面内其他Js代码，我大致理解了学校的这个选课页面代码的逻辑如下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;检查完课程的剩余量之后，将{"xkkh": lesson_coding}这样的json信息发送到对应网址来选课。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;但由于选课没有开始，我并不能看到选课按钮会实际执行什么代码(没错，选课不开始，就没有选课按钮)。&lt;br /&gt;
第二天一看，我的思路没问题，但lesson_coding不是显示在页面源码的coding，而是在页面源码的coding基础上，在代表学年学期的字符串上加一个括号！&lt;/p&gt;
&lt;p&gt;也就是说，通过审查元素你可能会看到这样的&lt;code&gt;2017-2018-1-07492110-0101224-1&lt;/code&gt;。但你应该发到教务系统的应该是&lt;code&gt;(2017-2018-1)-07492110-0101224-1&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;小小的修改之后，成功抢到了两门网课(当然是截胡了别人的交易)。脚本见&lt;a href="https://github.com/AberSheeran/Ahnu"&gt;Github&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;最后......隔壁的欧皇凭运气一开局就抢到了两门网课！我***&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;时过经年，学弟找我要脚本，而原来的脚本已经失效。我也懒怠去破解验证码，他一语惊醒我。如果只是给自己选课不一定要自己写代码，完全可以在页面里执行JS代码。&lt;/p&gt;
&lt;p&gt;例如我想抢课程代码为&lt;code&gt;2017-2018-1-07492110-0101224-1&lt;/code&gt;的课，我只需要打开浏览器的控制台，在里面执行&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ajax&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/xk/xxk/savexxk?action=ok&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;dataType&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;xkkh&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;(2017-2018-1)-07492110-0101224-1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;success&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;选课成功！&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;然后等着选课成功就好。&lt;/p&gt;</description><pubDate>Wed, 13 Dec 2017 00:00:00 +0000</pubDate><guid>http://aber.sh/articles/Hack-school-lesson/</guid></item></channel></rss>