由于业务需要,研究了一下腾讯微博等登陆,下面分享一些经验给大家: 标题写的是腾讯微博的登陆,其实也可以隐身到腾讯旗下多个产品的登陆,比如QQ空间,webQQ等,想到这儿大伙是不是很激动呢?

表急,等我细细道来。

数据采集

有时候简单的数据不需要这么大费周折!使用某些语言自带的web工具也是可以的!下面我以Python为例:

分析登录过程

登录过程需要抓包,我是用的HttpWatch,大体步骤如下

第一步 手动登陆,抓包,记录登录过程

  1. 当输入完账号后想服务器请求验证码
  2. 等级登陆按钮后将登录信息发送至认证服务器,实现第一次认证
  3. 服务器返回登陆成功信息,其中包含最终URL
  4. 第二次认证,获取腾讯微博的cookie

第二步 伪造登录过程

  1. 获取验证码
  2. 根据验证码计算出加密后的密码以及其他信息,发送GET请求至认证服务器
  3. 根据返回URL获取最终cookie

工作难点

本文假设读者理解http协议及数据包的发送原理,以此为基础,工作的难点就集中在数据的准备上。

  • 密码的加密原理
  • cookie的处理
  • header的UA及refer的一致性

密码加密算法

以下提取自登录页面的c_login_2.js文件

function getEncryption(password, uin, vcode) {
	var str1 = hexchar2bin(md5(password));
	var str2 = md5(str1 + uin);
	var str3 = md5(str2 + vcode.toUpperCase());
	return str3
}


if (b == "login") {
	d.u = encodeURIComponent(pt.plogin.at_accout);
	d.verifycode = $("verifycode").value;
	if (pt.plogin.needShowNewVc && pt.plogin.pt_verifysession) {
		d.pt_vcode_v1 = 1;
		d.pt_verifysession_v1 = pt.plogin.pt_verifysession
	}
	if (pt.plogin.RSAKey) {
		d.p = $.Encryption.getRSAEncryption($("p").value, d.verifycode);
		d.pt_rsa = 1
	} else {
		d.p = $.Encryption.getEncryption($("p").value, pt.plogin.saltUin, d.verifycode);
		d.pt_rsa = 0
	}
}

加密方法大致如下:

  1. 判断是否RSA加密,如果不是,走getEncryption对称加密方法
  2. 对称加密用到了salt,参数分别为原密码,加密帐号和验证码 算法如下: a. 使用md5加密密码,并输出其二进制值 b. 解密验证码中的类似\x01等数字,再与第一步拼接再一次加密,输出输出32位的16进制 c. 再与验证码中类似!VXT的大写拼接加密,再输出输出32位的16进制

cookie及UA

UA和cookie数据比较基础,在此不赘述,主要需要搞清楚登录路径即可!

action和login_sig

action参数可以乱填,和登陆没关系

login_sig提取自登陆页面,需要在登陆时发送!

##代码

部分参考自 http://www.oschina.net/code/snippet_95475_11051

下载源代码

现在都不用svn了,学学git吧

git clone git://source.ffmpeg.org/ffmpeg.git

configure

在执行./configure的时候,可能会提示没有安装yasm,那么执行”yum install -y yasm“即可。

yum install -y yasm
./configure

make

执行make,就是编译整个ffmpeg项目了,会生成一些二进制文件,例如:ffplay、ffserver、ffmpeg、ffprobe!

makeinstall

执行make install时候,会把编译生成的.a归档复制到/usr/local/lib下!

mysql默认是禁用多表删除语句的,之前的做法都是先把条件缓存,然后逐条执行

delete from a where a.xxx in (123123,123123);
delete from b where b.xxxx in (123123,123123);

如果写成下面这种绝对是错误的!

delete * from a,b where xxxx in  ...

今天突然发现原来mysql也是可以一条sql删除多表数据的,下面来分析一下 多表删除其实思路还是比较简单的,首先条件就是多个表(一般就两个表,织梦的文章信息存在3个表里,删除起来很麻烦)有关联 其次,删除条件一般都是由关联的这一行组成的,也可能不是,没有关系,我们先写一个试试:

DELETE p.*, pp.* 
FROM pw_threads p, pw_tmsgs pp 
WHERE p.tid = pp.tid 
AND p.tid in(SELECT tid FROM pw_threads WHERE postdate>UNIX_TIMESTAMP('2014-06-12 00:00:00') and fid=136)

逻辑都通着,但是会报错

You can't specify target table 'A' for update in FROM clause 原因是: In general, you cannot modify a table and select from the same table in a subquery.

所以你需要把子查询改为临时表中,所以最终的查询就是

DELETE p.*, pp.* 
FROM pw_threads p, pw_tmsgs pp 
WHERE p.tid = pp.tid 
AND p.tid in(SELECT tmp.tid FROM (SELECT * FROM pw_threads) as tmp WHERE tmp.postdate>UNIX_TIMESTAMP('2014-06-12 00:00:00') and tmp.fid=136)

##下载

项目地址: https://github.com/goagent/goagent

APP配置

到https://appengine.google.com/新建一个或多个app,注意记录下app的ID!

一个appid每天只有1G的流量

上传服务器端脚本

解压至某文件夹,此处假设为d:\app\goagent318\,然后进去server,运行uploader.bat批处理

按提示输入信息即可,可能会很慢。

多个appid请用’|’隔开,即回车键上面那个

貌似现在一个帐号能创建25个app,每天25G流量,够用了吧?

只要在服务器上部署成功,以后就不用管server文件夹了 :-D ,除非你又要添加新的app才会用到!

此步骤只是把goagent的服务器端部署到你的在线APP上,等待你去调用他,所以下一步就是配置本地的文件,以实现对接。

部署成功的标志是看到这里的https://appengine.google.com/应用都在running即可!

本地配置

难点在这一步,废话比较多,我就粘贴一下官网的教程吧

编辑local\proxy.ini,把其中appid = goagent中的goagent 改成你之前申请的应用的appid (用windows的记事本也可以) 如果要使用多个appid,appid之间用|隔开,如:appid1|appid2|appid3,每个appid必须确认上传成功才能使用 格式 如下:

[gae] 
appid = app-0|app-1|app-3|app-4

运行local下的goagent.exe,测试一下配置是否成功!推荐迅雷的代理测试

高级技巧

修改goagent端口

你可以修改端口以达到分流的作用,比如,使用默认8087端口上网用,再建一个使用8089端口的goagent,然后使用这个端口下载东西或者什么的,只要端口不冲突,你就可以建立多个代理,以达到分流的目的!

怎么修改呢?

先结束goagent进程,复制一份出来命名goagent318-d,原来的那个叫goagent318-w,d means download,w means web! 还是修改那个proxy.ini,找到[listen],应该在第一行,然后修改port = 8087为port = 8089,端口就改好了 讲appid按需分配给各个端口对应的程序,如我有十个app,给迅雷分5个,web分4个,再留一个备用!

在chrome中使用goagent

这个要用到SwitchySharp,怎么使用,自己百度吧!

goagent的GUI版本

这个挺不错的,方便小白使用,推荐下载绿色版!

围观地址:https://goagent.codeplex.com/

打造自己的网页代理

这个比较酷!不适用google,而是使用自己的网站做代理!只要你的主机在香港或者美国,就可以用PHP模拟成goagent的server端,然后就可以翻越GFW了

设置方法请参考

http://www.blogfeng.com/goagent-space-into-a-proxy-server-for-php.html

2015年1月12日更新:

  1. 更新项目地址
  2. fqrouter2已经停止更新
  3. 更好的翻墙方案 shadowsocks

欢迎吐槽!

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import os,time,shutil
path = os.getcwd()
target_dir = []
cal = []
target_dir.append('/var/lib/mysql/log/')
target_dir.append('/newlogs/')
target_dir.append('/oldlogs/')
#初始化删除文件名
del_ext = ['frm','MYD','MYI']
#你要保留几天
days_before = 5
#初始化删除日期
for x in xrange(days_before+1,days_before+30):
	cal.append(time.strftime('%Y_%m_%d',time.localtime(time.time() - x*24*3600)))
#初始化删除文件名,使用笛卡尔积!
fl = map('.'.join, [[x,y] for x in cal for y in del_ext])

#以日期命名的文件夹
cal = []
for x in xrange(days_before+1,days_before+30):
	cal.append(time.strftime('%Y-%m-%d',time.localtime(time.time() - x*24*3600)))
fl += cal
#获取文件扩展名
def get_ext(filename):
	return filename.split('.')[-1]



for dirs in target_dir:
	#files = [i for i in box_list if(get_ext(i) in del_ext)]  #按扩展名筛选文件
	#修改当前工作目录
	i = 0
	print 'opening -> ' + dirs
	#判断文件夹存在
	if os.path.exists(dirs):
		#切换目录
		os.chdir(dirs)
		for files in fl:
			#判断文件夹或文件
			if(os.path.isfile(str(files))):
				i += 1
				try:
					os.remove(files)
					print files + '  deleted'
				except:
					print 'error occurs while deleting file'
			elif(os.path.isdir(str(files))):
				i += 1
				try:
				#shutil.rmtree删除非空文件夹
					shutil.rmtree(files)
					print files + '  deleted'
				except:
					print 'error occurs while deleting file'
	else:
		print 'Error on opening ' + dirs
	if i:
		print str(i) + ' files deleted'
	else:
		print 'nothing to remove'
	print 'leaving -> ' + dirs
	print '\n'

工作需要必须使用mstsc(Microsoft terminal services client)连接生产服务器,之前因为不知什么原因,mstsc开始很卡,所以用了teamviewer一段时间,感觉还是不如mstsc稳定

但是win7的mstsc问题多多,一个一个说吧

总是新建进程

每次使用保存好的密码登陆后总是和上一次显示的桌面环境不一样,就好像注销了一样,每次都要在任务管理器里切换一回,很是麻烦,原因是mstsc新建了一个进程,导致了操作环境的初始化,按照老高的方法试试:

  1. 运行mstsc时在后面加上 /admin,原理是直接接管控制台

     mstsc /admin
    
  2. 在目标机器上设置一下 这是由于远程桌面允许一个用户可以有多个远程会话,如果不想有这个效果,可以在目标机器运行gpedit.msc,然后进入组策略-计算机设置-管理模板-终端服务,设置限制终端服务用户到一个远程会话为启用即可。

3.开始-管理工具-终端服务配制-设置

连接 - RDP-TCP - 网卡 - 2个链接 服务器设置 - 限制用户使用一个会话 开始---控制面板---授权---选择“每设备或每用户”---否---确定

连接后操作很卡

原因在于从vista开始,微软在TCP/IP协议栈里新加了一个叫做Window Auto-Tuning的功能。这个功能本身的目的是为了让操作系统根据网络的实时性能(比如响应时间)来动态调整网络上传输的数据窗口的大小,从而达到实时优化网络性能的目的。但是,在某种情况下,这个功能反而会使远程桌面的响应变的非常的慢。解决办法如下:

开始-运行-输入

netsh interface tcp set global autotuninglevel=disabled

端口修改

端口3389表示亚历山大!换一个自己喜欢的数字吧,嫌麻烦的TX可以直接百度 mstsc端口修改工具

  1. 打开“开始→运行”,输入"regedit",打开注册表,进入以下路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp, 修改PortNamber值3389为3390。
  2. 打开[HKEY_LOCAL_MACHINE\SYSTEM\CurrentContro1Set\Control\Tenninal Server\WinStations\RDP\Tcp, 将PortNumber值3389为3390。
  3. 修改完毕,重启以下服务(控制面板中的服务中): Microsoft Remote Desktop Connection 和 Remote Desktop Services UserMode Port Redirector
  4. 登陆方式[IP:3390] 部分转自网络!