TIP

又在琢磨爬虫,我本以为像以前一样,没想到又不知道踩什么坑进去了。

这一次也是主要利用了三个接口,只需要一个BDUSS就可以了,到期时间在2028年,挺长的。一个是类似于登录的接口,用于拿到tbs,使用签到接口的时候需要用到这个参数,还有一个接口是用于获取贴吧列表的,万事必备。

HttpUrlConnection在安卓网络开发中曾经使用过,仍旧记得volley的post请求携带参数,总是返回参数错误信息,这次仍然使用的是HttpUrlConnection。get请求不必多说,借于前面的经验,我仍然像以前那么携带参数,如下代码所示。

URL url = new URL(SIGN_URL);
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("POST");
    connection.setDoOutput(true);
    connection.setDoInput(true);
    connection.setUseCaches(false);
    connection.setRequestProperty("connection","keep-alive");
    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
    connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36");
    connection.setRequestProperty("Cookie", "BDUSS="+BDUSS);//设置请求头
    connection.setRequestProperty("Content-Type", "application/json;charset=utf-8");//设置参数类型是json格式
    connection.connect();
    String body = "kw="+name+"&tbs="+tbs+"&sign="+enCodeMd5("kw="+name+"tbs="+tbs+"tiebaclient!!!");
    /**
     * 说起来都是泪,为什么这种方式不行,还非得弄成get添加参数的形式,唉。
     */
//  String body = "{\n" +
//                "  \"kw\": \""+name+"\"\n" +
//                "  \"tbs\": \""+tbs+"\"\n" +
//                "  \"sign\": \""+enCodeMd5("kw="+name+"tbs="+tbs+"tiebaclient!!!")+"\"\n" +
//                "}";
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream(), "UTF-8"));
        writer.write(body);
        writer.close();

注释的部分就是以前在安卓中post请求携带参数的格式,我满怀信心的这样写,结果就失败了,总是爆出一个参数错误,找了很久也没有怀疑是这个地方的问题。爬虫仍然是pythonphp比较多一点,因此,大多数参考他们的经验,python不得不说是真的好,请求参数就像是axios中那么清晰,php写的也很简洁,不过我不太熟悉。

python携带的参数是这样的

data = {
    'BDUSS': bduss,
    '_client_type': '2',
    '_client_id': 'wappc_1534235498291_488',
    '_client_version': '9.7.8.0',
    '_phone_imei': '000000000000000',
    'from': '1008621y',
    'page_no': '1',
    'page_size': '200',
    'model': 'MI+5',
    'net_type': '1',
    'timestamp': str(int(time.time())),
    'vcode_tag': '11',
}

php携带参数是这样的

$postdata='BDUSS='.urlencode($bduss).'&_client_version=8.1.0.4'.'&page_no=' . $pageno.'&page_size=100'.'&sign='.md5('BDUSS='.$bduss.'_client_version=8.1.0.4'.'page_no='.$pageno.'page_size=100'.'tiebaclient!!!');

两个都是post请求,可是php的却像是get请求,我以为只是php特有,没想到java也得那样写才行。我很不明白为什么不行,难道是后端识别的问题?以前明明用着好好的,可是还是出了问题。

String body = "kw="+name+"&tbs="+tbs+"&sign="+enCodeMd5("kw="+name+"tbs="+tbs+"tiebaclient!!!");

不过,最后还是想说,自动签到还是挺爽的。自动签到地址 (opens new window),欢迎fork

# 参考链接

httpUrlConnection参数详解 (opens new window)

HttpUrlConnection使用详解--转 (opens new window)