【转】Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE)

MYSQL错误:Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (gbk_chinese_ci,COERCIBLE) for operation ‘=’ 一个解决办法

异常的意思是:字段字符集编码不同,不合法的连接。

用show full columns from tenant;命令查看tenant表各个字段的字符编码。

再用show full columns from employees;命令查看employees表各个字段的字符编码。

发现 tenant中的unitno字段和 employee中的unitno字段的字符编码类型不一致。一个是GBK的,一个是GB2312的。

然后用

ALTER TABLE `tenant` CHANGE `unitno` `unitno` VARCHAR( 32) CHARACTER SET gb2312 COLLATE gb2312_bin NOT NULL

命令修改tenant表中的nuitno字段的字符编码为gb2312类型。保证与整个数据库的字符编码gb2312一致。

或者使用alter table tenant convert to character set gb2312;命令,把整个表的字符编码设为gb2312。

另外,值得注意的是:

[mysql]

default-character-set=gbk 或者 default-character-set=gb2312

还有一个在服务端的 default-character-set=gbk 也要改
然后重起mysql 服务器.

这个方法。本人试了,是不行的。不知道其他的什么情况。

参考文章如下:

1.http://space.itpub.net/7380741/viewspace-50854

最重要的是这个问题:

Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (gb2312_chinese_ci,IMPLICIT) for operation ‘=’

相信有很多人碰到,意思是说字符编码不一样,不能进行比较,也就是说数据库内部的编码都不一样,有的数据是

gbk_chinese_ci,有的数据是gb2312_chinese_ci,因此解决此问题的核心就是将数据库所有的编码进行统一。

进入命令行模式,

如果MySQL数据库已经安装好,可以使用下列SQL命令查看MySQL当前的字符集设置:
mysql> SHOW VARIABLES LIKE ‘character_set_%’;
+————————–+—————————-+
| Variable_name | Value |
+————————–+—————————-+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+————————–+—————————-+
7 rows in set (0.00 sec)

mysql> SHOW VARIABLES LIKE ‘collation_%’;
+———————-+——————-+
| Variable_name | Value |
+———————-+——————-+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+———————-+——————-+
3 rows in set (0.00 sec)

依次执行:

set character_set_client =gb2312;

set character_set_connection =gb2312;

set character_set_database =gb2312;

set character_set_results =gb2312;

set character_set_server =gb2312;

set character_set_system =gb2312; –此处utf-8也可以

然后执行:

SET collation_server = gb2312_chinese_ci

SET collation_database = gb2312_chinese_ci

SET collation_connection =gb2312_chinese_ci

执行完之后,请检查mysql下每个数据库,表,字段是否都是gb2312,不是则改过来,这样子就不会出现

Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (gb2312_chinese_ci,IMPLICIT) for operation ‘=’这个错误了,网上有资料说要重装,其实根本就不必,改动其编码即可

……………..

2.http://hi.baidu.com/lym0719/blog/item/54f2d43e1be218c77d1e7193.html

1.如果安装mysql的编码已不能更改,很多朋友是购买虚拟主机建立网站,无权更改MYSQL的安装编码,这一关我们可以跳过,因为只要后面的步聚正确,一样能解决乱码问题
2.修改数据库编码,如果是数据库编码不正确: 可以在phpmyadmin 执行如下命令: ALTER DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
以上命令就是将test数据库的编码设为utf8
3.修改表的编码:ALTER TABLE `category` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
以上命令就是将一个表category的编码改为utf8
4.修改字段的编码:
ALTER TABLE `test` CHANGE `dd` `dd` VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
以上命令就是将test表中 dd的字段编码改为utf8
5.如果是这种情况容易解决,只需检查下页面,修改源文件的charset即可
, //这个正确就无问题了
6.这种情况也是修改页面charset即可,
。。。。。。。

3.http://hi.baidu.com/yaolihui/blog/item/cf0ee2c48260efcd38db4945.html

查看 MySQL 数据列(column)的字符集。

mysql> show full columns from countries;

 

命令:

 

SHOW VARIABLES LIKE ‘collation%’;
SHOW VARIABLES LIKE ‘character%’;

SET collation_connection = gbk_chinese_ci;
SET collation_database = gbk_chinese_ci;
SET collation_server = gbk_chinese_ci;

SET character_set_client = gbk;
SET character_set_connection = gbk;
SET character_set_database = gbk;
SET character_set_results = gbk;
SET character_set_server = gbk;
SET character_set_system = gbk;
SHOW FULL COLUMNS FROM tb_user;
ALTER TABLE tb_user CONVERT TO CHARACTER SET gbk;

Java中Image类与ImageIcon类的区别

Image类一般尺寸过大,不适合作ImageIcon类。代码示例:

ImageIcon imageIcon = new ImageIcon(“duke.gif”);    // Icon由图片文件形成
Image image = imageIcon.getImage();                         // 但这个图片太大不适合做Icon
//    为把它缩小点,先要取出这个Icon的image ,然后缩放到合适的大小
Image smallImage = image.getScaledInstance(30,20,Image.SCALE_FAST);
//    再由修改后的Image来生成合适的Icon
ImageIcon smallIcon = new ImageIcon(smallImage);
//   最后设置它为按钮的图片
JButton iconButton = new JButton(smallIcon);

而由ImageIcon类到Image类,可以通过:

ImageIcon imageIcon = new ImageIcon(“duke.gif”);    // Icon由图片文件形成

JFrame jf=null;

jf.setImageIcon(ImageIcon.getImage());

\u4f60\u597d\u554a是什么编码,怎么解密成能看懂的文字,有解密网址或工具介绍下

是 unicode 16 编码;占两个字节
在编写jsp 国际化程序的时候,会用到这种编码
我在破解手机游戏的时候也遇到过
\u4f60\u597d\u554a 意思为 “你好啊”

请问楼主学过java 么?如果学过,以下代码可以解决(刚刚测试):

============================================
import java.io.UnsupportedEncodingException;


public class test {
 
 public test(){
  convert();
  
 }
 public void convert(){ 
  String title= "\u4f60\u597d\u554a" ;  
  System.out.println(title);   
 }
 
public static void main(String args[]){
 test ts = new test();
 
}
}
========================================

Java二进制文件的网络传输

二进制文件的读写应该依照bit流的形式进行。

在从网络(QQ服务器)接收二进制文件(例如头像图片)时,应该使用InputStream 或者DataInputStream

直接读取数据到byte数组中,并使用ByteArrayOutputStream对byte数组的数据融合存储。

InputStream is = (InputStream)(huc.getInputStream());
ByteArrayOutputStream baop = new ByteArrayOutputStream();
byte bf[] = new byte[1024];
int len = -1;
while( (len = is.read(bf))>0 )
{
baop.write(bf, 0, len);
}
is.close();

在把数据写到文件的时候:

BufferedWriter貌似不好使了。直接使用OutputStream 或者 DataOutputStream 写byte数组

DataOutputStream dos = new DataOutputStream(new FileOutputStream(“./face.jpg”));
//bw.write((baop.toByteArray()));
dos.write(baop.toByteArray());
dos.flush();
dos.close();

 

 

java下载网页内容和网络图片|Java二进制文件读写|Java二进制文件网络传输

例子如下:

 

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class UrlResource {

public static void main(String[] args){
try {
System.out.println(UrlResource.getUrlDetail(“http://www.baidu.com”,true));
saveUrlFile(“http://www.baidu.com/img/baidu_jgylogo3.gif”, “D:\\1.gif”);
} catch (Exception e) {
e.printStackTrace();
}
}

//获取网络文件,转存到fileDes中,fileDes需要带文件后缀名
public static void saveUrlFile(String fileUrl,String fileDes) throws Exception
{
File toFile = new File(fileDes);
if (toFile.exists())
{
// throw new Exception(“file exist”);
return;
}
toFile.createNewFile();
FileOutputStream outImgStream = new FileOutputStream(toFile);
outImgStream.write(getUrlFileData(fileUrl));
outImgStream.close();
}

//获取链接地址文件的byte数据
public static byte[] getUrlFileData(String fileUrl) throws Exception
{
URL url = new URL(fileUrl);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
httpConn.connect();
InputStream cin = httpConn.getInputStream();
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = cin.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
cin.close();
byte[] fileData = outStream.toByteArray();
outStream.close();
return fileData;
}

//获取链接地址的字符数据,wichSep是否换行标记
public static String getUrlDetail(String urlStr,boolean withSep) throws Exception
{
URL url = new URL(urlStr);
HttpURLConnection httpConn = (HttpURLConnection)url.openConnection();
httpConn.connect();
InputStream cin = httpConn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(cin,”UTF-8″));
StringBuffer sb = new StringBuffer();
String rl = null;
while((rl = reader.readLine()) != null)
{
if (withSep)
{
sb.append(rl).append(System.getProperty(“line.separator”));
}
else
{
sb.append(rl);
}
}
return sb.toString();
}

}

 

编程日志:webQQ的登录【已更新】

1。首先获取验证码VeriCode
抓包:
GET  http://check.ptlogin2.qq.com/check?uin=【QQNo】&appid=1003903  HTTP/1.1
(添加粗体字符,以适应2012.5.25后腾讯的变更)
说明:这个地址是用来判断您的用户名是否是正常状态,以及是否有效用户名,正常时,请求这个地址,会获得类似ptui_checkVC(‘0′,’!TDU’,’\x00\x00\x00\x00\x1d\x44\xac\x91′);
这样的返回值,这其中0是代表正常状态,不采用图片验证。
而后面的!TDU是四位,则是我们需要获得的验证码,它是由腾讯服务器随机生成的一个令牌的原始密钥。当我们正确的获得这样的四位码时,就已经完成了第一次的验证!
其后,有一点需要注意的是:腾讯的令牌是存储在cookies中的,所以请注意每次操作都必须要保存好服务器返回来的cookies。
如果返回值,类似这样:ptui_checkVC(‘1’,’ae2ae85f6ce5b416257182bf3f0bf3554e5a60ca0bdca4c1’…);
那么就要恭喜您了,那表明需要进行图片验证码验证。您获得也是令牌的原始密钥,只不过不同的是,您获得是图片验证码的原始密钥而已。
此外,0和1以外,还有可能有其他的返回数值,用来标明诸如帐号不存在,帐号状态不正确,帐号已锁定等等的。
经验:这一步的关键,就是如何避免非0的返回值?
有人说,如果短时间内这个帐号多次在不同的ip登录,那么返回值就有可能是非0值–其实不然。我在IE上,换了不同的IP,照样可得到0值,不需要图片验证。与此同时,新装的浏览器safari上,敲了n遍,还是得到1,需要图片验证。等我用safari登陆一次web.qq.com后,其后得到的返回值就是0了…这说明什么?
说明QQ服务器没有存放你的IP地址,但是在你的机器里存放cookies(而不同的浏览器或客户端,其cookies不同),然后根据cookies来判断你是否初来咋到的…
正因为是这样,对于你常用的QQ号码,成功登陆后,要把cookies存起来,以后你每次请求,都能得到0的返回值,不需要图片验证。

 

C++ (with libcurl)源程序
【抓包GET】http://check.ptlogin2.qq.com/check?uin=XXXXXXXX&appid=1003903 HTTP/1.1

Referer: http://ui.ptlogin2.qq.com/cgi-bin/login?target=self&style=5&mibao_css=m_webqq&appid=1003903&enable_qlogin=0&no_verifyimg=1&s_url=http%3A%2F%2Fweb.qq.com%2Floginproxy.html&f_url=loginerroralert&strong_login=1&login_state=10&t=20120619001
【源代码】
string WebQQ_check(string QQno)
{
string buffer;
string get_url = “http://check.ptlogin2.qq.com/check?uin=” + QQno + “&appid=1003903”;
string Ref_url = “http://ui.ptlogin2.qq.com/cgi-bin/login?target=self&style=5&mibao_css=m_webqq&appid=1003903″;
Ref_url   = Ref_url+”&enable_qlogin=0&no_verifyimg=1&s_url=http%3A%2F%2Fweb.qq.com%2Floginproxy.html&f_url=loginerroralert&strong_login=1&login_state=10”;//
// 初始化libcurl
CURLcode return_code;
return_code = curl_global_init(CURL_GLOBAL_WIN32);
if (CURLE_OK != return_code) return “”;
// 获取easy handle
CURL *easy_handle = curl_easy_init();
if (NULL == easy_handle)
{
curl_global_cleanup();
return “”;
}
// 设置easy handle属性
curl_easy_setopt(easy_handle, CURLOPT_URL, get_url.c_str());
curl_easy_setopt(easy_handle, CURLOPT_REFERER, Ref_url.c_str());
curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, writer);
curl_easy_setopt(easy_handle, CURLOPT_WRITEDATA, &buffer);
//提交第一步保存的cookie
curl_easy_setopt(easy_handle, CURLOPT_COOKIEFILE,”D:\\SparkHo\\cookie_login.txt”);
//把服务器发过来的cookie保存到cookie_open.txt
curl_easy_setopt(easy_handle, CURLOPT_COOKIEJAR, “D:\\SparkHo\\cookie_open.txt”);
// 执行数据请求
curl_easy_perform(easy_handle);
// 释放资源
curl_easy_cleanup(easy_handle);
curl_global_cleanup();

//返还QQ验证数据
return buffer;
}

返回的格式:

ptui_checkVC(‘0′,’!TDU’,’\x00\x00\x00\x00\x1d\x44\xac\x91′);

 

这包括了一组“四位验证码”,还有一组8位的UIN数字(其实就是你的QQ号转化为16进制数字)。

何用之有?用于腾讯密码的变态加密…
因为其后的登陆中,会要求你输入一个由32个字符组成的字符串,其实就是你的UIN数字,加上密码和验证码,按照某种算法得到的md5码。
腾讯已经更新了算法,具体的算法请参考源代码。

 

C++ (with OpenSSL)源程序
#include <openssl/md5.h>

string newQQMD5(string pass,string VeriCode,string UIN)
{
unsigned char md[16],hexuin[8],plus[24],md2[16],md3[16];
int i;
char tmp[3]={‘\0’};
char buf[33]={‘\0’};
char buf2[33]={‘\0’};

MD5((unsigned char *)pass.c_str(),pass.length(),md);
Hexchar2bin(UIN,hexuin);
for (i = 0; i < 16; i++)
plus[i]=md[i];
for (i = 0; i < 8; i++)
plus[16+i]=hexuin[i];

MD5(plus,24,md2);
for (i = 0; i < 16; i++)
{
sprintf(tmp,”%2.2X”,md2[i]);
strcat(buf,tmp);
}

string bufAdd = (string)buf+VeriCode;
MD5((unsigned char *)bufAdd.c_str(),bufAdd.length(),md3);
for (i = 0; i < 16; i++)
{
sprintf(tmp,”%2.2X”,md3[i]);
strcat(buf2,tmp);
}
string final=(string)buf2;
return final;
}

附:基于OpenSSL的md5算法,可参考:
http://hi.baidu.com/sparkho/blog/item/88fc9061ec6f90c58cb10dd5.html

 

2。以QQ号、PassCode、VeriCode,登录web.qq.com网页,完成验证。
【抓包GET】
http://ptlogin2.qq.com/login?u=【QQno】&p=【PassCode】&verifycode=【VeriCode】&webqq_type=10&remember_uin=1&login2qq=1&aid=1003903&u1=http%3A%2F%2Fweb.qq.com%2Floginproxy.html%3Flogin2qq%3D1%26webqq_type%3D10&h=1&ptredirect=0&ptlang=2052&from_ui=1&pttype=1&dumy=&fp=loginerroralert&action=2-6-6757&mibao_css=m_webqq&t=1&g=1HTTP/1.1
【Referer】 http://ui.ptlogin2.qq.com/cgi-bin/login?target=self&style=5&mibao_css=m_webqq&appid=1003903&enable_qlogin=0&no_verifyimg=1&s_url=http%3A%2F%2Fweb.qq.com%2Floginproxy.html&f_url=loginerroralert&strong_login=1&login_state=10&t=20120619001

登录成功后,将返回ptuiCB(‘0′,’0′,’http://web.qq.com/loginproxy.html?login2qq=1&webqq_type=10′,’0′,’登录成功!’, ‘雨顺’);
同时将会返回一些cookies值,如其中ptwebqq,skey等,libcurl可设定存放在指定的Cookies文件中。
注:如果我们直接用IE,输入上述网址,登录不会成功,原因是不能提交第一步保存的cookies…
结果将返回:ptuiCB(‘7′,’0′,”,’0′,’很遗憾,网络连接出现异常,请您稍后再试。(1138754159)’);

 

C++ (with libcurl)源程序

string WebQQ_login(string QQno,string PassCode,string VeriCode)
{
string get_url = “http://ptlogin2.qq.com/login?u=” + QQno + “&p=” + PassCode + “&verifycode=” + VeriCode;
get_url   = get_url + “&webqq_type=10&remember_uin=1&login2qq=1&aid=1003903&u1=http%3A%2F%2Fweb.qq.com%2Floginproxy.html”;
get_url   = get_url + “%3Flogin2qq%3D1%26webqq_type%3D10&h=1&ptredirect=0&ptlang=2052&from_ui=1&pttype=1&dumy=&fp=loginerroralert&mibao_css=m_webqq&t=1&g=1”;
string Ref_url = “http://ui.ptlogin2.qq.com/cgi-bin/login?target=self&style=5&mibao_css=m_webqq&appid=1003903&enable_qlogin=0″;
Ref_url   = Ref_url+”&no_verifyimg=1&s_url=http%3A%2F%2Fweb.qq.com%2Floginproxy.html&f_url=loginerroralert&strong_login=1&login_state=10”;//&t=20120619001

string buffer;
// 初始化libcurl
CURLcode return_code;
return_code = curl_global_init(CURL_GLOBAL_WIN32);
if (CURLE_OK != return_code) return “”;
// 获取easy handle
CURL *easy_handle = curl_easy_init();
if (NULL == easy_handle)
{
curl_global_cleanup();
return “”;
}
// 设置easy handle属性
curl_easy_setopt(easy_handle, CURLOPT_URL, get_url.c_str());
curl_easy_setopt(easy_handle, CURLOPT_REFERER, Ref_url.c_str());
//curl_easy_setopt(easy_handle, CURLOPT_HEADER,1);
curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, writer);
curl_easy_setopt(easy_handle, CURLOPT_WRITEDATA, &buffer);
//提交第一步保存的cookie
curl_easy_setopt(easy_handle, CURLOPT_COOKIEFILE,”D:\\SparkHo\\cookie_open.txt”);
//保存登陆后的cookie
curl_easy_setopt(easy_handle, CURLOPT_COOKIEJAR,”D:\\SparkHo\\cookie_login.txt”);

// 执行数据请求
curl_easy_perform(easy_handle);
// 释放资源
curl_easy_cleanup(easy_handle);
curl_global_cleanup();
filestatus=0;

return buffer;
}

登录成功,将返回:

ptuiCB(‘0′,’0′,’http://web.qq.com/loginproxy.html?login2qq=1&webqq_type=10′,’0′,’登录成功!’, ‘雨顺’);

这个时候,如果我们只是要发微博,调用发微博的程序即可。无需进行下面的登录。

3。登录QQ客户端。
上一步的登陆,算是登录webqq.com网页;而这次登陆,才算真正登陆webQQ客户端,成功后会把你原先登陆的QQ踢下线(如果你原先已经登陆QQ)。
抓包:
POSThttp://d.web2.qq.com/channel/login2HTTP/1.1
Referer:http://d.web2.qq.com/proxy.html
POST数据:一个json数据结构:
r={“status”:””,”ptwebqq”:”【ptwebqq】”,”passwd_sig”:””,”clientid”:”【clientid】”}

需要的参数:
1)【ptwebqq】是在第2步成功登陆后,cookie返回的,我们可在libcurl存档的Cookies文件中读取;
2)【clientid】是用户识别码,每次登录前随机产生的,但我们需要保存该用户识别码,因为以后很多的操作需要引用此唯一的用户识别码,直到再次重新登录才会更新。
如果成功,会返回一个json数据结构:
{“retcode”:0,”result”:{“uin”:QQNo,”cip”:3682615122,”index”:1073,”port”:49410,”status”:”online”,”vfwebqq”:”……..”,”psessionid”:”……..”,”user_state”:0,”f”:0}}
如果我们用buffer获取返回的信息,那么我们可以从中提取出的vfwebqqpsessionid,存放于QQLogin.txt。以后的webQQ操作,需要用到这些参数。

C++ (with libcurl)源程序
string WebQQ_login2()
{
size_t found,found2;
char buf[1024];
// 在libcurl存档的Cookies文件中,读取:ptwebqq
string ptwebqq;
ifstream QQCookiesfile(“D:\\SparkHo\\cookie_login.txt”);
if(!QQCookiesfile)
{
QQCookiesfile.close();
ptwebqq = “”;
}
else
{
QQCookiesfile.read(buf,1024);
string QQCookies = (string) buf;
QQCookiesfile.close();
found   = QQCookies.find(“ptwebqq”);
found2  = QQCookies.find(“\n”,found+8,1);
ptwebqq = QQCookies.substr(found+8,found2-found-8);
}
// clientid,在每次登陆时,自行随机产生…
int iClient;
srand ( time(NULL) );    /* initialize random seed: */
iClient = rand() % 100000000;  /* generate secret number: */
sprintf(buf, “%d”, iClient);
string clientid = (string)buf;
// 初始化libcurl
CURLcode return_code;
return_code = curl_global_init(CURL_GLOBAL_WIN32);
if (CURLE_OK != return_code) return NULL;
// 获取easy handle
CURL *easy_handle = curl_easy_init();
if (NULL == easy_handle)
{
curl_global_cleanup();
return NULL;
}
string buffer;
string post_url = “http://d.web2.qq.com/channel/login2”;
string referer_url = “http://d.web2.qq.com/proxy.html”;
string base = “{\”status\”:\”\”,\”ptwebqq\”:\””+ptwebqq+”\”,\”passwd_sig\”:\”\”,\”clientid\”:\””+clientid+”\”}”;
string urlencode = curl_easy_escape(easy_handle,base.c_str(),0);
string fields = “r=”+urlencode;
// 设置easy handle属性
curl_easy_setopt(easy_handle, CURLOPT_URL, post_url.c_str());
curl_easy_setopt(easy_handle, CURLOPT_REFERER, referer_url.c_str());
curl_easy_setopt(easy_handle, CURLOPT_POST, 1);
curl_easy_setopt(easy_handle, CURLOPT_POSTFIELDS, fields.c_str());
curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, writer);
curl_easy_setopt(easy_handle, CURLOPT_WRITEDATA, &buffer);
//提交第一步保存的cookie
curl_easy_setopt(easy_handle, CURLOPT_COOKIEFILE,”D:\\SparkHo\\cookie_login.txt”);
//保存登陆后的cookie
curl_easy_setopt(easy_handle, CURLOPT_COOKIEJAR,”D:\\SparkHo\\cookie_login.txt”);
// 执行数据请求
curl_easy_perform(easy_handle);
// 释放资源
curl_easy_cleanup(easy_handle);
curl_global_cleanup();
//从buffer中,提取vfwebqq、psessionid
found  = buffer.find(“vfwebqq”);
found2 = buffer.find(“\””,found+10,1);
string vfwebqq = buffer.substr(found+10,found2-found-10);
found  = buffer.find(“psessionid”);
found2 = buffer.find(“\””,found+13,1);
string psessionid = buffer.substr(found+13,found2-found-13);
//记录QQ登录信息,存放在指定的txt文件中:
fstream QQLoginfile(“D:\\SparkHo\\QQLogin.txt”,ios::out|ios::trunc);
QQLoginfile<<“ClientID:”<<clientid.c_str()<<“;”;
QQLoginfile<<“vfwebqq:”<<vfwebqq.c_str()<<“;”;
QQLoginfile<<“psessionid:”<<psessionid.c_str()<<“;”;
QQLoginfile.close();

return buffer;
}


4。断线重连。
Login2成功登陆后,我们得到一个Cookies文件:内含ptwebqq;还有一个存放QQ登录信息的txt文件:内含clientId和psessionid。
当网络中断、QQ离线或被踢下线,需要重新登录的时候,可以使用上述信息进行重新连接。
抓包:
POSThttp://d.web2.qq.com/channel/login2HTTP/1.1
Referer:http://d.web2.qq.com/proxy.html
POST数据:一个json数据结构:
r={“status”:”online”,”ptwebqq”:”【ptwebqq】”,”passwd_sig”:””,”clientid”:”【clientid】”,”psessionid”:”【psessionid】”}
&clientid=【clientid】&psessionid=【psessionid】
需要的参数:
1)【ptwebqq】在libcurl存档的Cookies文件中读取;
2)【clientid】是上次Login2登录的用户识别码;【psessionid】是上次Login2登录返回的;都可以从以前保存的登录信息文件QQLogin.txt里读出。

C++ (with libcurl)源程序
string WebQQ_login2_r()
{
size_t found,found2;
char buf[1024];
// 在Cookies文件中,读取:ptwebqq
string ptwebqq;
ifstream QQCookiesfile(“D:\\SparkHo\\cookie_login.txt”);
if(!QQCookiesfile)
{
QQCookiesfile.close();
ptwebqq = “”;
}
else
{
QQCookiesfile.read(buf,1024);
string QQCookies = (string) buf;
QQCookiesfile.close();
found  = QQCookies.find(“ptwebqq”);
found2 = QQCookies.find(“\n”,found+8,1);
ptwebqq = QQCookies.substr(found+8,found2-found-8);
}
// 提取QQ登录信息:
string clientid,psessionid;
ifstream QQLoginfile(“D:\\SparkHo\\QQLogin.txt”);
if(!QQLoginfile)
{
QQLoginfile.close();
clientid = “”;
psessionid = “”;
}
else
{
QQLoginfile.read(buf,1024);
string QQLogin = (string) buf;
QQLoginfile.close();
found  = QQLogin.find(“ClientID”);
found2 = QQLogin.find(“;”,found+9,1);
clientid = QQLogin.substr(found+9,found2-found-9);
found  = QQLogin.find(“psessionid”);
found2 = QQLogin.find(“;”,found+11,1);
psessionid = QQLogin.substr(found+11,found2-found-11);
}
// 初始化libcurl
CURLcode return_code;
return_code = curl_global_init(CURL_GLOBAL_WIN32);
if (CURLE_OK != return_code) return NULL;
// 获取easy handle
CURL *easy_handle = curl_easy_init();
if (NULL == easy_handle)
{
curl_global_cleanup();
return NULL;
}
string buffer;
string post_url = “http://d.web2.qq.com/channel/login2”;
string referer_url = http://d.web2.qq.com/proxy.html;
string base = “{\”status\”:\”online\”,\”ptwebqq\”:\””+ptwebqq+”\”,\”passwd_sig\”:\”\”,\”clientid\”:\””+clientid+”\”,\”psessionid\”:\””+psessionid+”\”}”;
string urlencode = curl_easy_escape(easy_handle,base.c_str(),0);
string fields = “r=”+urlencode+”&clientid=”+clientid+”&psessionid=”+psessionid;
// 设置easy handle属性
curl_easy_setopt(easy_handle, CURLOPT_URL, post_url.c_str());
curl_easy_setopt(easy_handle, CURLOPT_REFERER, referer_url.c_str());
curl_easy_setopt(easy_handle, CURLOPT_POST, 1);
curl_easy_setopt(easy_handle, CURLOPT_POSTFIELDS, fields.c_str());
curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, writer);
curl_easy_setopt(easy_handle, CURLOPT_WRITEDATA, &buffer);
//提交保存的cookie
curl_easy_setopt(easy_handle, CURLOPT_COOKIEFILE,”D:\\SparkHo\\cookie_login.txt”);
//保存登陆后的cookie
curl_easy_setopt(easy_handle, CURLOPT_COOKIEJAR,”D:\\SparkHo\\cookie_login.txt”);
// 执行数据请求
curl_easy_perform(easy_handle);
// 释放资源
curl_easy_cleanup(easy_handle);
curl_global_cleanup();
//从buffer中,提取vfwebqq、psessionid
found  = buffer.find(“vfwebqq”);
found2 = buffer.find(“\””,found+10,1);
string vfwebqq = buffer.substr(found+10,found2-found-10);
found  = buffer.find(“psessionid”);
found2 = buffer.find(“\””,found+13,1);
psessionid = buffer.substr(found+13,found2-found-13);
// 更新QQ登录信息:
fstream QQLoginwrite(“D:\\SparkHo\\QQLogin.txt”,ios::out|ios::trunc);
QQLoginwrite<<“ClientID:”<<clientid.c_str()<<“;”;
QQLoginwrite<<“vfwebqq:”<<vfwebqq.c_str()<<“;”;
QQLoginwrite<<“psessionid:”<<psessionid.c_str()<<“;”;
QQLoginwrite.close();

return buffer;

 

中国各地的骗子|防骗大全|骗招大集会

中国骗子 一、北京的骗子:如果你在北京碰到一个人,他说关系能上通中齤央领导人、下连基层派齤出所;所能办的事情大到升官发财、小到嫖娼被抓,无所不能、无所不通,你可千万别激动,别以为从此碰上了福星,因为他就是骗子。北京的骗子肯定是以某某重要领导人的亲戚或亲信的面目出现,而且办的事情都是大事,什么政府拨款、副厅要升正厅,处级不要找他,他瞧不上,专用紧俏物质的批文指标,反正是什么难弄他就有什么,而且还特牛,见面时间安排特别短,见面时还总是无精打采,说昨天晚上又和某领导人的什么弟弟打了一个晚上的麻将同时电话还不停地响,说什么浙江、福建的什么人又来找我要电煤的批文了等等,请他吃饭还要先预约,买单?当然是自己掏,他能和你吃饭已经是面子了,要求他办事?可以,但必须先付好处费,办好再付?没门,不办拉倒!但付了好处费后,想听下文?更没门!所以北京的骗子是最牛比的。 二、上海的骗子:有人问:上海还有骗子?当然有,而且多了去。上海的骗子一般是以有钱人的面目出现,西装革履、不是什么什么国际公司中国代表处的首席代表,就是什么外资企业的高级职员,上海普通话里还夹几句洋文,开口就是采购千万美金以上的定单,和你做是因为朋友关系,没有其他条件先付好处费,否则免谈,什么吃饭谁买单?肯定是你,给你那么大的定单买个单有什么了不起。所以上海骗子的素质、文化水平最高,最少还懂洋文。 三、福建的骗子:福建骗子都是农民,如果你和他见面的话,肯定是看不上眼,所以他们就避其短处,不和你见面,所以福建骗子的手段就是借用高科技手段以短信,电子邮件等,内容当然什么都有,什么中奖、走私商品、六盒彩信息等,等你上钩后你的钱就源源不断地流向他们的口袋,福建骗子的学习力最强,善于抓住人性的弱点,而且善于利用高科技手段,骗术也层出不穷,新招频出,如果突然有一天一个福建人说要和你合作,而且条件非常优惠,那么你一定要小心,肯定是陷阱。 四、深圳骗子:深圳是中国对外的前沿阵地,所以深圳的骗子的骗术一般要和外贸出口挂钩。欺骗的对象基本上是全国各地的小企业,急着想把自己的产品推销对国外的小老板,该类骗子一般都是以公司的名义出现的,而且公司的名头很大,什么国际公司中国总部,什么什么国际集团等等,办公室很高档,当然是租的,车子也很漂亮,也是租的,你一到深圳公司后一定就能让你相信他们是大公司,请你到非常豪华的餐厅吃饭,吃饭后还有其他节目,买单?不要你管,只要你先签合同,至少定单100万美金,完了以后再签,当然要履行合同的话得先交保证金等七七八八的费用,等把你欺骗得差不多的时候,公司一关门,走了,你找吧??!!这样的骗术中央电视台已经暴光了,但听说深圳当地政府还不管,说是什么合同纠纷,呸!就是这样的政府才助长了骗子的气焰,到现在为止这种骗子在深圳还有很多,有些甚至开分公司到外地了。 五、湖南骗子:湖南骗子是最低档的骗子,他们也都是农民,而且还喜欢以农民的形象出现在你面前,有一天如果突然有一个农民模样的男女出现在你面前,问到银行或邮电局怎么走的时候,他们一般都湖南人(江西也有),然后就会很神秘地拿出一些金元宝或金佛像以及一些旧钱,说:他们在工地上挖出来的,不知道能不到银行去换或能不能到邮局去寄,如果你热心地告诉他(她)的时候,你上当受骗的时候就差不多来了。这样的骗子形象越土越好,而且最好是不会说普通话,这样的话你就越容易相信。 六、川贵州骗子:那的骗子是最没有人性的骗子,而且专门是做让后代子孙不长的事情,那就是拐买妇女和儿童,而且骗完别人以后还骗熟人,他们才不会遵循兔子不吃窝边草的原则,听说现在深圳的一个小区一个月之内就有10来个小孩被骗,而且发展成为小孩骗小孩了,骗子大部分是四川口音。他们骗了小孩后就卖掉,妇女就强迫她们卖淫,如果实在骗不到妇女的话,甚至可以要自己的老婆和女朋友去卖淫,这样就是四川贵州一带的骗子。 七、湖北的骗子:俗话说“天上九头鸟,地上湖北老”,是说湖北人的聪明,但湖北的骗子却不一定高明很多,湖北骗子的骗术其实很老套,他们会以公司的名义,生产什么什么最新的高科技工业产品,然后要在全国各地找经销商,经销的条件非常优惠,并且还先把样品寄来,说他们会在全国性的广告里面把各地经销商的联系方式打上,没多久果然有一到两家的客户来电话要该产品,而且要的量还挺大,价格也很有诱惑力,所以你就会向厂家订货,这样的话,你上当受骗的时候就到了。该类骗子一般是以厂家业务员的身份出现,能说会道。 八、安徽的骗子:安徽有个佛教胜地“九华山”,所以安徽的很多骗子一般是以九华山出家人的身份出现,男人一般是装成和尚、女人当然就扮尼姑,一般他们是两人结伴而行,以化缘的目的出现,然后进到别人家里,如果有人的话就四周环顾,而后耸人听闻地说,你家最近好象有“血光之灾”或其他灾难,反正是越吓人越好,把你吓到以后他(她)就来安慰你说“没关系,他们可以化解”,只要出点钱,多少钱?那就看你家能出多少了,至少几千多的几万。如果你家没有人的话,那么就顺手牵羊把值钱的东西拿走,所以安徽的骗子有时候又是小偷。 九、河南的骗子:一说起骗子,大家就想到河南人,其实这有点冤枉,只是河南的骗子种类多点罢了,大骗小骗都有。在旅途中大家如果碰到了河南人,千万要多留个心眼,别把自己家庭或公司的电话地址留给对方,否则你家一定会马上接到一个电话,说你在某个地方出事了,出事的原因有嫖娼被抓、出车祸、被人打劫、突发疾病等,他是你的朋友,现在为你处理事情急需钱,所以要你家或单位立即汇款过去,否则就来不及了。这样的人一般都是河南人。还有一种大骗子,是以大公司的名义出现的,向外地企业采购很大的订单至少百万计算,可以先付30%订金,其他70%货到后立即支付,开始后请外地企业的领导到公司来参观,高层次的腐败待遇,并且还承诺高额的回扣,所以就可以让对方签合同发货,但等货到后他们就立即以低于市场价格抛售,然后就消失,我有好几个朋友天天在河南寻找骗他的人,河南人还有一个特点就是谈判时他们什么条件都愿意答应,很好说话,但等货或钱到他们手里时,什么话也就不好说了。 十、山西的骗子:山西的骗子主要是造假,而且假得没有道德,比如,关系到人的生命的假酒、假饮料、假食品,以及关系的工程质量的假钢材、假水泥,他们都敢做,这样的例子媒体已经暴光很多次了。 十一、东北的骗子:大家一直骂河南骗子多,其实我认为现在骗子最多的是东北。在改革开放之初,东北人是最淳朴的,但被南方的浙江人、福建人、广东人欺骗多了,开始变聪明了,而且还青出于蓝胜于蓝,骗术不但高明还人才辈出。要总结东北的骗子还真的很不容易,因为各种骗子的类型在那都可以找到原形,现在就重点突出两种吧:一种是利用东北人身体强悍的优势,手里拿着一些破手表、手机、甚至是手提电脑去和行人碰撞,然后敲诈对方的钱财,有半骗半抢的性质;还有一类就是利用色相行骗,有漂亮女人去勾引有钱人,然后出现几个男人来敲诈,最多的是男人利用色相去欺骗女人的例子现在越来越多,东北男人一般都长得比较帅,网络上的怨妇又很多,所以就有那么一群东北男人专门做这样的事情,他们也会扮成有钱人,衣着光鲜,出手大方,说做什么什么大生意,然后就一下迷惑了对方,先把色骗到手,等条件成熟后,说要做什么项目,回报很诱人,成功以后就可以送对方一套房子什么的,使该女性心动,再过几天会说该项目已经启动了非常顺利,房子马上就要送给你了,引对方进一步上钩,再过几天开始愁眉苦脸,说项目进行还差点钱,于是女人的钱就进到了他的手中。有个很厉害的东北男人同时骗了30多个女人数百万的钱,都30岁以上的女人,所以经常上网的女人、寂寞的女人,你们可是要注意。还有一种新的骗术也是东北人发明的,在此我要揭露,如果你有一天刚从银行取了几万元钱出来,突然一双小手蒙住你的眼,然后用非常迷人的声音对你说:猜猜我是谁?,那时你以为是什么艳遇来了的话,那可就是大错特错了,等你从玛丽猜到艾乌里的,就是不知道对方是谁的时候,她会突然跳到你面前,然后说:对不起,认错人了,于是就迅速消失,当你从兴奋中反映过来时候,你的几万元已经不见了。可怕的东北人!!呵呵! 十二、江苏的骗子:谁说江苏无骗子?本人一生中唯一一次上当受骗就在江苏。到江苏出差的XDJM一定要注意,如果在火车站买票的话,千万不要相信票贩子,因为他们都是骗子,他们骗人的手法有两类,一是用可以以假乱真的假票来卖,这样的票基本是用旧票剪辑而成,还有一类就是穿着铁路服装,冒充铁路工作人员说可以买到内部票,但收了你的钱后就逃之夭夭。 十三、浙江的骗子:浙江是中国经济最活跃的地区之一,所以那生产骗子也挺多,有大中小骗,其中一类都是以投资者的身份出现在内地的小城市,说可以在当地投资多少多少,骗得当地政府官员把他当成亲爷爷招待,规格绝对是超标腐化,吃完后还要找齤小姐,说考察一下投资环境是不是好,过后还带回一大堆礼品,投资呢?没有!!还有的浙江骗子造假的功夫绝对是世界一流,什么世界名牌、中国驰名商标,都可以造得惟妙惟肖。还有就是全国各地正打击的黑心棉基本都是浙江人所为。还有一种街头骗术听说也是浙江人发明的:街头卖手机的,进口的最新款的手机只买市场价格的30%不到,非常让你动心,你想会不会是真的?肯定是真的,对放把卡放进去,OK!完全可以使,于是你肯定会买,但大等你掏钱完正拿手机要离开时,对方会对你说,等等,我的卡好象还在里面,于是他又把手机收回,打开检查,然后再交回给你,并说声对不起,非常有礼貌,不要以为你占了便宜,因为他中途已经掉包了,给回你的是,这样中途掉包的骗术还有比如大钱换小钱、外币等等,大家一定要注意。另外一种假手机的诈骗方式是干脆就用假的手机,但做的确实是非常真,简直是一模一样,但开机以后几秒钟就关机了,显示没有电,这样也使很多人上当受骗了。 十四、广西的骗子:在广州有一群广西帮,专门在火车站或汽车站行骗,你刚下火车或汽车的时候,你的朋友没有来接你,于是你可能会去公用电话亭打个电话或传呼,打手机的话你的朋友不一定会马上接,挂断后会立即有电话回过来,说“开始是谁打我电话或括机”?如果你说找谁谁时,他就说,他是谁谁的朋友,那个谁临时出差了,已经交代了我来接你,于是不久就有一个男人或女人过来接,你肯定很信任对方,这样的话,你上当的时候就来了,轻的行李钱被骗走,重的人也被卖掉,所以大家以后一定要小心,尤其是在广州火车站。 十五、云南的骗子:我的亲身经历,在深圳出差时,很早就被电话吵醒,对方非常热情地说:“来深圳了,也不告诉我一声,真不够朋友”,当我问他是谁时,他就会说:“连我是谁都不记得,你猜猜看”?我一下就知道对方是骗子了,因为曾经在媒体看过这样的骗术,于是我决定耍耍对方,就开始猜了:老王吧?不是!小王吧?还不是。林冰(淋病)?也不是。哦,我知道了,你是杨为(阳痿)。对了,还好没有忘记老朋友。呸,我根本在深圳就没有一个叫杨为的朋友。对方会说:这样吧,我请你到某某大酒店喝早茶,我们见面再说,我说行,完了盖下电话后继续大睡,让他等去吧。如果真的被骗去的话结果是这样的:你到了后会有一个或两个年轻人在等你,说他们是杨总的下属,说杨总刚好有什么事情,要耽搁一会再来,我们先陪你吃,在吃的过程中,有两种可能,如果是一个人来的话他会不停地打电话,然后说电话没电了,借你的电话使使,并说信号不好,走到外面去,这样的话电话就不见了。如果他们是两个人来的话,其中一个会打电话和所谓的杨总通电话,然后说杨总来了,我们一起去外面接他,另一个人会留在里面,等你出去的时候,他会把你的包拿走,和你在一起的那个人也会找机会溜走。我知道该类骗子比较多的是云南人。 中国骗子大全!

庆六一新版QQ登录加密算法java版

/**
* 加密WEBqq 传输时的密码
* @author weirhp@gmail.com
* http://weibo.com/weirhp
*/
public class EncodeQQPass {

public static void main(String[] args) {
System.out.println(encodePass(“yourpass”, “!CEY”,
“\\x00\\x00\\x00\\x00\\x35\\x33\\x5f\\x58”));
}

public static String encodePass(String password, String vcode, String uin) {
String[] us = uin.split(“\\\\x”);
byte[] uinByte = new byte[us.length – 1];
if (us.length == 9) {
for (int i = 1; i < us.length; i++) {
uinByte[i – 1] = getByte(Integer.parseInt(us[i], 16));
}
}
return md5(md5(getByte(hexchar2bin(md5(password)), uinByte))
+ vcode.toUpperCase());
}

public static String md5(byte[] source) {
String s = null;
char hexDigits[] = { ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’,
‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’ };
try {
java.security.MessageDigest md = java.security.MessageDigest
.getInstance(“MD5”);
md.update(source);
byte tmp[] = md.digest();
char str[] = new char[16 * 2];
int k = 0;
for (int i = 0; i < 16; i++) {
byte byte0 = tmp[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
s = new String(str);
} catch (Exception e) {
e.printStackTrace();
}
return s.toUpperCase();
}

public static String md5(String str) {
return md5(str.getBytes()).toUpperCase();
}

public static byte[] hexchar2bin(String str) {
byte[] bytes = new byte[str.length() / 2];
int j = 0;
for (int i = 0; i < str.length(); i = i + 2) {
int iv = Integer.parseInt(str.substring(i, i + 2), 16);
bytes[j++] = getByte(iv);
}
return bytes;
}

public static byte getByte(int intValue) {
int byteValue = 0;
int temp = intValue % 256;
if (intValue < 0) {
byteValue = temp < -128 ? 256 + temp : temp;
} else {
byteValue = temp > 127 ? temp – 256 : temp;
}
return (byte) byteValue;
}

public static byte[] getByte(byte[] b1, byte[] b2) {
byte[] bs = new byte[b1.length + b2.length];
int i = 0;
for (i = 0; i < b1.length; i++) {
bs[i] = b1[i];
}
for (int j = 0; j < b2.length; j++) {
bs[i + j] = b2[j];
}
return bs;
}
}

使用Java实现登陆WebQQ(带源码)

 使用Java中的URL 和 HttpURLConnection 就可以实现模拟网页登陆!
分析登陆的协议,可以使用HttpWatcher,蛮好用的!
目前就两种网页请求方式
Get和Post
我们可以自己先写好这两个方法,以便之后调用
这个就是Get请求方式了,参数就是URL地址

Java代码  收藏代码
  1. public static String get(String url) {
  2.     System.out.println(“get>>>” + url);
  3.     URL serverUrl;
  4.     HttpURLConnection conn;
  5.     StringBuffer res = new StringBuffer();
  6.     try {
  7.         serverUrl = new URL(url);
  8.         conn = (HttpURLConnection) serverUrl.openConnection();
  9.         conn.setRequestMethod(“GET”);// “POST” ,”GET”
  10.         conn.addRequestProperty(“Cookie”, cookie);
  11.         conn.addRequestProperty(“Accept-Charset”, “UTF-8;”);// GB2312,
  12.         conn.addRequestProperty(“User-Agent”,
  13.                 “Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Firefox/3.6.8”);
  14.         conn.connect();
  15.         if (conn.getHeaderFields().get(“Set-Cookie”) != null) {
  16.             for (String s : conn.getHeaderFields().get(“Set-Cookie”)) {
  17.                 cookie += s;
  18.             }
  19.         }
  20.         InputStream ins = conn.getInputStream();
  21.         String charset = “UTF-8”;
  22.         InputStreamReader inr = new InputStreamReader(ins, charset);
  23.         BufferedReader bfr = new BufferedReader(inr);
  24.         String line = “”;
  25.         do {
  26.             res.append(line);
  27.             line = bfr.readLine();
  28.             // System.out.println(line);
  29.         } while (line != null);
  30.         System.out.println(“Value>>” + res);
  31.     } catch (MalformedURLException e) {
  32.         // TODO Auto-generated catch block
  33.         e.printStackTrace();
  34.     } catch (IOException e) {
  35.     }
  36.     return res.toString();
  37. }

1.登陆前,我们需要判断此次登陆是否需要手动输入验证码。
地址(GET):http://ptlogin2.qq.com/check?uin=********(QQ号码)&appid=1003903(固定)&r=0.2664082343145449(随机18位  简单的说   0.后面+随机16位数)

返回值有两种
第一种:
ptui_checkVC(‘1′,’8a6143167c8ca486696cf01c3ea088d658b913d64b11289b’)
这种情况下,我们需要获得验证码图片并手动输入验证码。
此时我们可以将图片保存下来,然后使用SWING显示并输入,就可以得到验证码了。
第二种:
“ptui_checkVC(‘0′,’!OMD’);
这种情况下,!OMD就是我们需要的验证码了。

2.第一次登陆
得到验证码之后就可以进行第一次登陆,为什么是第一次?你试验下就知道了,当你此次登陆成功后,发现登陆的QQ并没有提示掉线或者别处登陆的,这是因为我们还需要后续的第二次登陆。

庆六一新版QQ登录加密算法java版


呵呵~verifycode我们第一步就得到了。QQ号我们也知道。就是参数p啦~
就是使用密码和验证码经过加密得到的啦。
想研究加密过程的同学可以百度下,很多的!
此段加密算法是在一个js脚本里,我们可以下下来这个脚本,然后直接调用。

Java代码  收藏代码
  1. public static String mdP(String p, String code){
  2.         Object t = null ;
  3.         try {
  4.             ScriptEngineManager m = new ScriptEngineManager();
  5.             ScriptEngine se = m.getEngineByName(“javascript”);
  6.             se.eval(new FileReader(new File(“comm.js”)));
  7.             t = se.eval(“md5(md5_3(\””+p+”\”)+\””+code.toUpperCase()+”\”);”);
  8.             return t.toString();
  9.         }catch (Exception e) {
  10.             e.printStackTrace();
  11.         }
  12.         return t.toString();
  13.     }

第一登陆后,TX会返回Cookie,我们需要保持,在之后的第二次登陆中使用。

3.第二次登陆
需要使用Post方法:http://d.web2.qq.com/channel/login2
POST数据:
r=%7B%22status%22%3A%22online%22%2C%22ptwebqq%22%3A%22” + ptwebqq + “%22%2C%22passwd_sig%22%3A%22%22%2C%22clientid%22%3A%22” + clientid + “%22%2C%22psessionid%22%3Anull%7D&clientid=” + clientid + “&psessionid=null
ptwebqq 就是我们在第一次登陆后获得的Cookie里的值,clientid是随机的的值,可以直接使用抓取到的值。
登陆成功后,会返回数据
{“retcode”:0,”result”:{“uin”:********(QQ号码),”cip”:3071582136,”index”:1078,”port”:53985,”status”:”hidden”,”vfwebqq”:”5ab2ce0743496ffa257aa4119f35e44324171aa08d3e14a4c506b7e392ca80b73e34551cef71a248″,”psessionid”:”8368046764001e636f6e6e7365727665725f7765627171403137322e32372e3138312e3835000062450000079e03620524ef666d0000000a406e4e53734a517a33556d000000285ab2ce0743496ffa257aa4119f35e44324171aa08d3e14a4c506b7e392ca80b73e34551cef71a248″}}

vfwebqq和psessionid在之后和获取好友,群信息,以及发送消息都要使用。

目前做到发送消息,不过老是返回{“retcode”:122,”errmsg”:”wrong web client3″}
Post数据也没有问题,不知道到底是为啥~
目前写的类也有点乱,打算使用HttpClient重新写~

附上源代码,谁要是解决了发消息的问题
给我说声啊~

JAVA 如何采用MD5加密算法加密

十六位的md5加密
private static void Md5(String plainText ) { 
try { 
MessageDigest md = MessageDigest.getInstance("MD5"); 
md.update(plainText.getBytes()); 
byte b[] = md.digest(); 

int i; 

StringBuffer buf = new StringBuffer(""); 
for (int offset = 0; offset < b.length; offset++) { 
i = b[offset]; 
if(i<0) i+= 256; 
if(i<16) 
buf.append("0"); 
buf.append(Integer.toHexString(i)); 
} 

System.out.println("result: " + buf.toString());//32位的加密 

System.out.println("result: " + buf.toString().substring(8,24));//16位的加密 

} catch (NoSuchAlgorithmException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 
} 

Md5("12312312312312"); 结果: 
result: ba56bab91016bcb37878e06c16e9e68f