凤凰山笔记

每日自动领取淘金币(java httpclient4)

从今天起,想连续写一个“自动签到”系列的博文,今天首先是每日自动领取淘宝金币的。

相信大家双十一大家都扫了不少货,我就买了个一zippo的打火机,呵呵~ 当时注意到原来淘金币可以抵钱啊,于是萌生了写一个每天定时领取淘金币程序的想法,最后使用httpclient4 解决了这个问题。

首先有这么几个头痛的问题,给大家分享一下:
1、必须使用淘宝账号来进行模拟登陆,如果是支付宝或者其他账号关联的就会出现验证码,这个就不好弄了
2、必须自己在机器上面手工登陆几天,然后点击签到领取淘金币,因为一开始领的时候总是有验证码,后来我联系手工领取了几天就没验证码了

话不多说,请感兴趣的童鞋看代码:

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import net.sf.json.JSONObject;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.CookieStore;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.params.CookiePolicy;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;

/**
 * @ClassName: Taobao
 * @Description: "一键淘"
 * @author kaedeen.com
 * @date 2013-11-13 下午1:19:28
 * 
 */
public class Taobao {

    private static final Logger logger = Logger.getLogger(Taobao.class);

    private static String loginUrl = "https://login.taobao.com/member/login.jhtml";

    private static String tbToken = null;// 淘宝领金币使用的token

    private static DefaultHttpClient httpclient = null;// HttpClient对象

    private static HttpResponse response = null;

    private String userName = "";// 用户名

    private String passWord = "";// 密码明文

    /**
     * 构造函数
     * 
     * @param userName
     * @param passWord
     */
    public Taobao(String userName, String passWord) {
        this.userName = userName;
        this.passWord = passWord;
    }

    /**
     * 登陆淘宝
     * 
     * @return
     * @throws IOException 
     * @throws ClientProtocolException 
     */
    public boolean login()  {

        if (null != httpclient) {
            return true;
        }

        httpclient = new DefaultHttpClient();
        // 设定cookie策略
        HttpClientParams.setCookiePolicy(httpclient.getParams(),
                CookiePolicy.BROWSER_COMPATIBILITY);
        // 登陆使用的表单数据
        List loginParams = new ArrayList();
        loginParams.add(new BasicNameValuePair("TPL_username", userName));
        loginParams.add(new BasicNameValuePair("TPL_password", passWord));

        //登陆post请求
        HttpPost loginPost = new HttpPost(loginUrl);
        loginPost.addHeader("Referer", loginUrl);
        loginPost.addHeader("Content-Type","application/x-www-form-urlencoded; charset=utf-8");
        loginPost.addHeader("User-Agent",
                        "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.2; Tablet PC 2.0)");
        loginPost.addHeader("Host", "login.taobao.com");

        try {

            loginPost.setEntity(new UrlEncodedFormEntity(loginParams,  HTTP.UTF_8));

            //获取登陆应答内容
            response = httpclient.execute(loginPost);

            if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
                String redirectUrl=getRedirectUrl();
                if(!"".equals(redirectUrl)){
                    //有重定向说明成功了,获取token
                    getTbToken(redirectUrl);
                }else{
                    logger.info("登陆请求出错,重定向失败!");
                    return false;
                }
            }else{
                logger.info("登陆请求出错,post返回状态:"+response.getStatusLine().getStatusCode());
                return false;
            }

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            loginPost.abort();
        }

        return true;
    }

    /**
     * 领取每日金币
     */
    @SuppressWarnings("rawtypes")
    public boolean getEveryDayCoins(){

        boolean flag=false;

        long t=System.currentTimeMillis();
        long enter_time=t-12345;

        String gainCoinUrl="http://vip.taobao.com/home/grant_everyday_coin.htm?t="+String.valueOf(t)
                +"&_tb_token_="+tbToken+"&checkCode=null" +
                "&enter_time="+String.valueOf(enter_time);

        HttpGet gainCoinGet1 =new HttpGet(gainCoinUrl);
        HttpResponse gainCoinResponse1;
        try {
            gainCoinResponse1 = httpclient.execute(gainCoinGet1);
            HttpEntity httpEntity = gainCoinResponse1.getEntity(); 
            String responseJsonStr = EntityUtils.toString(httpEntity);//取出应答字符串 
            //logger.info("领取金币应答字符串:"+responseJsonStr);
            Map map = JSONObject.fromObject(responseJsonStr);
            int code=(Integer)map.get("code");
            int daysTomorrow=(Integer)map.get("daysTomorrow");
            String coinTomorrow=(String) map.get("coinTomorrow");
            int coinNew=(Integer) map.get("coinNew");
            int coinOld=(Integer) map.get("coinOld");
            int coinGot=coinNew-coinOld;

            if(1==code){
                logger.info("成功领取"+coinGot+"个淘金币,已连领"+daysTomorrow+"天,当前金币数量"+coinNew+",明天可领"+coinTomorrow);
                flag=true;
            }else if(4==code){
                logger.info("哦? 需要输入验证码,领个淘金币还这么麻烦!");
            }else if(5==code){
                logger.info("验证码错误!");
            }else if(6==code){
                logger.info("这叫神马逻辑,有5个好友的用户才能天天领金币,当前淘金币数量"+coinNew);
            }else if(2==code){
                logger.info("今天运气不错,已经领了");
                flag=true;
            }else{
                logger.info("没见过这个code,问问淘宝客服?");
                flag=true;
            }

            //以防万一,再执行一次.....
            gainCoinResponse1 = httpclient.execute(gainCoinGet1);

        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            gainCoinGet1.abort();
        }

        return flag;
    }

    /**
     * 获取淘宝重定向url
     * @return
     */
    private String getRedirectUrl(){
        String redirectUrl="";
        HttpEntity resEntity =  response.getEntity();
        try {
            String bufferPageHtml=EntityUtils.toString(resEntity, HTTP.UTF_8);
            Pattern pattern1 = Pattern.compile("window.location = "(.*)";");
            Matcher m1 = pattern1.matcher(bufferPageHtml);
            if (m1.find()) {
                redirectUrl=m1.group(1);
                logger.info("redirectUrl:"+redirectUrl);
            } else {
                logger.error("获取redirectUrl失败!");
            }
        } catch (ParseException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return redirectUrl;
    }

    /**
     * 获取淘宝登陆令牌
     * 可以使用两种方式
     * 1.jsoup解析网页获取
     * 2.从httpclient对象的cookie中获取
     * @param redirectUrl
     */
    private void getTbToken(String redirectUrl){

        HttpGet itaobaoGet =new HttpGet(redirectUrl);
        try {
            httpclient.execute(itaobaoGet); 
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally{
            itaobaoGet.abort();
        }

        CookieStore cookiestore=httpclient.getCookieStore();
        List cookies=cookiestore.getCookies();
            if (cookies.isEmpty()) {    
                logger.info("cookies is null!");    
            } else {    
                for (int i = 0; i < cookies.size(); i++) {
                    Cookie cookie=cookies.get(i);
                    //logger.info( cookies.get(i).toString());  
                    if(cookie.getName().equals("_tb_token_")){
                        tbToken=cookie.getValue();
                        logger.info("淘宝令牌:"+tbToken);
                    }
                }    
            }
    }

}

测试的main函数很简单,也附上:

Taobao taobao=new Taobao(userName,passWord);
        taobao.login();
        taobao.getEveryDayCoins();
cloudroc wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
很惭愧,只做了些微小的工作,您的支持将鼓励我继续努力创作!