Java调用飞信API

简介: Java调用飞信API
//由于某些原因,现在只有http://w.ibtf.net/f.php?phone=xxxxxx&pwd=xxx&to=xxxx&msg=xxxx&type=x
//package com.test等破解方式才能发送短信,但发送短信条数有限,所以网友们
//在下边记得把网址和参数改为以上这种方式,当然如果有能力的话也可以到淘宝购买飞信API接口,
//相关请看<a target=_blank href="http://www.wuchuimeng.com/30.html">http://www.wuchuimeng.com/30.html</a>
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.UUID;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONArray;
import org.json.JSONObject;
public class Test {
    private static Log log = LogFactory.getLog(Test.class);
    public static void main(String[] args) {
        //测试发短信,注意:相同手机号,相同好友的请求的调用间隔要超过30秒(除非好友中包含你自己的手机号),否则不成功
        boolean b = fetchToSendSMS("138XXXXXXXX", "12345678", new String[] { "138XXXXXXXX" }, "TestMessage");
        System.out.println("Send Message result:" + b);
        //测试取得好友列表
        // JSONArray friends = fetchToGetFriends("138XXXXXXXX", "12345678");
        // System.out.println("friends:\r\n"+ (friends == null ? "null" : friends.toString()));
        //测试添加好友
        // int result = fetchToAddFriend("138XXXXXXXX", "12345678","138XXXXXXXX","自己姓名", "对方姓名");
        // System.out.println("Add Friend result:"+result);
        //测试发送定时短信(注意是太平洋时间,所以2009-10-09 01:00 是北京时间09:00)
        // String sid = fetchToSendScheduleMsg("138XXXXXXXX", "12345678", new String[]{"138XXXXXXXX"}, "TestScheduleMessage", "2009-10-09 01:00");
        // System.out.println("sid:"+sid);
        //测试删除定时短信
        // boolean b2 = fetchToDeleteScheduleMsg("138XXXXXXXX", "12345678", new String[]{"aglmZXRpb25saWJyGgsSB0FjY291bnQYAQwLEgdNZXNzYWdlGCQM")};
        // System.out.println("schedule message delete result:"+b2);
        //测试能否登录(以测试密码是否正确)
        // boolean b3 = fetchToLoginTest("138XXXXXXXX", "12345678"};
        // System.out.println("login test result:"+b3);
        //测试取得好友回复消息
        // JSONArray messages = fetchToCheckMessages("138XXXXXXXX", "12345678");
        // System.out.println("messages:\r\n"+ (messages == null ? "null" : messages.toString()));
    }
    private static final int TRY_TIMES = 3;
    private static final int TIME_OUT = 30000;
    private static final String BASE_URL = "http://fetionlib.appspot.com"; //BASE_URL 目前用http://fetion.xinghuo.org.ru 比较稳定
    / * 具体responseCode的代码含义:202-成功 400-参数格式错误 401-密码错误 404-可能不是好友等原因无法发送成功 406-     *太频繁 408-超时 500-服务器错误 503-系统维护
     *@param message
     *            短信内容,字数不能超过180字
     */
    public static boolean fetchToSendSMS(String mobile, String password,
            String[] friends, String message) {
        // 加上UUID的目的是防止这样的情况,在服务器上已经成功发送短信,却在返回结果过程中遇到错误,
        // 而导致客户端继续尝试请求,此时让服务器根据UUID分辨出该请求已经发送过,避免再次发送短信。
        String uuid = UUID.randomUUID().toString();
        for (int i = 0; i < TRY_TIMES; i++) {
             int responseCode = 0;
            try {
                URL postUrl = new URL(BASE_URL + "/restlet/fetion");
                HttpURLConnection connection = (HttpURLConnection) postUrl
                        .openConnection();
                connection.setConnectTimeout(TIME_OUT);
                connection.setReadTimeout(TIME_OUT);
                connection.setDoOutput(true);
                connection.setRequestMethod("POST");
                connection.setUseCaches(false);
                connection.setInstanceFollowRedirects(true);
                connection.setRequestProperty("Content-Type",
                        "application/x-www-form-urlencoded");
                connection.connect();
                DataOutputStream out = new DataOutputStream(connection
                        .getOutputStream());
                String content = "mobile=" + mobile + "&uuid=" + uuid
                        + "&password=" + password + "&friend=" + convertArrayToJSONString(friends)
                        + "&message=" + URLEncoder.encode(message, "utf-8");
                out.writeBytes(content);
                out.flush();
                out.close();
                responseCode = connection.getResponseCode();
                connection.disconnect();
                if (responseCode == 202)
                    return true;
                else
                    return false;
            } catch (Exception e) {
                log.warn("error fetchToSendSMS, exception:" + e.getMessage()
                        + ". tried " + i + " times");
            }
        }
        return false;
    }
    /**
       *取得好友列表
       */
      public static JSONArray fetchToGetFriends(String mobile, String password) {
            String uuid = UUID.randomUUID().toString();
            for (int i = 0; i < TRY_TIMES; i++) {
                  try {
                        URL postUrl = new URL(BASE_URL + "/restlet/fetion/friendsList");
                        HttpURLConnection connection = (HttpURLConnection) postUrl
                                    .openConnection();
                        connection.setConnectTimeout(TIME_OUT);
                        connection.setReadTimeout(TIME_OUT);
                        connection.setDoOutput(true);
                        connection.setRequestMethod("POST");
                        connection.setUseCaches(false);
                        connection.setInstanceFollowRedirects(true);
                        connection.setRequestProperty("Content-Type",
                                    "application/x-www-form-urlencoded");
                        connection.connect();
                        DataOutputStream out = new DataOutputStream(connection
                                    .getOutputStream());
                        String content = "mobile=" + mobile + "&uuid=" + uuid
                                    + "&password=" + password;
                        out.writeBytes(content);
                        out.flush();
                        out.close();
                        int responseCode = connection.getResponseCode();
                        if (responseCode == 202) {
                              BufferedReader reader = new BufferedReader(
                                          new InputStreamReader(connection.getInputStream(), "UTF-8")); //读取结果
                              StringBuffer sb = new StringBuffer();
                              String line;
                              while ((line = reader.readLine()) != null) {
                                    sb.append(line);
                              }
                              reader.close();
                              connection.disconnect();
                              return new JSONArray(sb.toString());
                        } else {
                              connection.disconnect();
                        }
                  } catch (Exception e) {
                        log.warn("error fetchToGetFriends, exception:" + e.getMessage()
                                    + ". tried " + i + " times");
                  }
            }
            return null;
      }
    /**
     *邀请好友 
     */
    public static int fetchToAddFriend(String mobile, String password,
            String friend, String desc, String nickname) {
        String uuid = UUID.randomUUID().toString();
        for (int i = 0; i < TRY_TIMES; i++) {
            int responseCode = 0;
            try {
                URL postUrl = new URL(BASE_URL + "/restlet/fetion/friend");
                HttpURLConnection connection = (HttpURLConnection) postUrl
                        .openConnection();
                connection.setConnectTimeout(TIME_OUT);
                connection.setReadTimeout(TIME_OUT);
                connection.setDoOutput(true);
                connection.setRequestMethod("POST");
                connection.setUseCaches(false);
                connection.setInstanceFollowRedirects(true);
                connection.setRequestProperty("Content-Type",
                        "application/x-www-form-urlencoded");
                connection.connect();
                DataOutputStream out = new DataOutputStream(connection
                        .getOutputStream());
                String content = "mobile=" + mobile + "&uuid=" + uuid
                        + "&password=" + password + "&friend=" + friend
                        + "&desc=" + URLEncoder.encode(desc, "utf-8")
                        + "&nickname=" + URLEncoder.encode(nickname, "utf-8");
                out.writeBytes(content);
                out.flush();
                out.close();
                responseCode = connection.getResponseCode();
                if (responseCode == 202) {
                    BufferedReader reader = new BufferedReader(
                            new InputStreamReader(connection.getInputStream(), "UTF-8")); // 读取结果
                    StringBuffer sb = new StringBuffer();
                    String line;
                    while ((line = reader.readLine()) != null) {
                        sb.append(line);
                    }
                    reader.close();
                    connection.disconnect();
                    JSONObject jo = new JSONObject(sb.toString());
                    return jo.getInt("action");
                } else {
                    connection.disconnect();
                    return -1;
                }
            } catch (Exception e) {
                log.warn("error fetchToAddFriend, exception:" + e.getMessage()
                        + ". tried " + i + " times");
            }
        }
        return -1;
    }
    /**
     *发送定时短信
     */
    public static String fetchToSendScheduleMsg(String mobile, String password,
            String[] friends, String message, String date) {
        String uuid = UUID.randomUUID().toString();
        for (int i = 0; i < TRY_TIMES; i++) {
            try {
                URL postUrl = new URL(BASE_URL + "/restlet/fetion/schedule");
                HttpURLConnection connection = (HttpURLConnection) postUrl
                        .openConnection();
                connection.setConnectTimeout(TIME_OUT);
                connection.setReadTimeout(TIME_OUT);
                connection.setDoOutput(true);
                connection.setRequestMethod("POST");
                connection.setUseCaches(false);
                connection.setInstanceFollowRedirects(true);
                connection.setRequestProperty("Content-Type",
                        "application/x-www-form-urlencoded");
                connection.connect();
                DataOutputStream out = new DataOutputStream(connection
                        .getOutputStream());
                String content = "mobile=" + mobile + "&uuid=" + uuid
                        + "&password=" + password + "&friend=" + convertArrayToJSONString(friends)
                        + "&schedule=" + date.replace(" ", "%20") + "&message="
                        + URLEncoder.encode(message, "utf-8");
                out.writeBytes(content);
                out.flush();
                out.close();
                int responseCode = connection.getResponseCode();
                if (responseCode == 202) {
                    BufferedReader reader = new BufferedReader(
                            new InputStreamReader(connection.getInputStream(), "UTF-8")); // 读取结果
                    StringBuffer sb = new StringBuffer();
                    String line;
                    while ((line = reader.readLine()) != null) {
                        sb.append(line);
                    }
                    reader.close();
                    connection.disconnect();
                    JSONObject jo = new JSONObject(sb.toString());
                    return jo.getString("sid");
                } else {
                    connection.disconnect();
                    return null;
                }
            } catch (Exception e) {
                log.warn("error fetchToSaveSchedule, exception:"
                        + e.getMessage() + ". tried " + i + " times");
            }
        }
        return null;
    }
    /**
     *删除定时短信 
     * 注意:相同手机号调用间隔要超过30秒,否则不成功(responseCode:406)
     * 
     *@param sid
     *            发送定时短信时返回的那些sid号码(不能超过10个sid),多个用数组的形式,程序会转换成JSON提交
     * 
     */
    public static boolean fetchToDeleteScheduleMsg(String mobile,
            String password, String[] sids) {
        String uuid = UUID.randomUUID().toString();
        for (int i = 0; i < TRY_TIMES; i++) {
            try {
                URL postUrl = new URL(BASE_URL + "/restlet/fetion/scheduleDelete");
                HttpURLConnection connection = (HttpURLConnection) postUrl
                        .openConnection();
                connection.setConnectTimeout(TIME_OUT);
                connection.setReadTimeout(TIME_OUT);
                connection.setDoOutput(true);
                connection.setRequestMethod("POST");
                connection.setUseCaches(false);
                connection.setInstanceFollowRedirects(true);
                connection.setRequestProperty("Content-Type",
                        "application/x-www-form-urlencoded");
                connection.connect();
                DataOutputStream out = new DataOutputStream(connection
                        .getOutputStream());
                String content = "mobile=" + mobile + "&uuid=" + uuid
                        + "&password=" + password + "&sids="
                        + convertArrayToJSONString(sids);
                out.writeBytes(content);
                out.flush();
                out.close();
                int responseCode = connection.getResponseCode();
                connection.disconnect();
                if (responseCode == 202)
                    return true;
                else
                    return false;
            } catch (Exception e) {
                log.warn("error fetchToDeleteSchedule, exception:"
                        + e.getMessage() + ". tried " + i + " times");
            }
        }
        return false;
    }
    /**
     *测试能否登录成功 
     * 注意:相同手机号调用间隔要超过30秒,否则不成功(responseCode:406)
     */
    public static boolean fetchToLoginTest(String mobile, String password) {
        String uuid = UUID.randomUUID().toString();
        for (int i = 0; i < TRY_TIMES; i++) {
            try {
                URL postUrl = new URL(BASE_URL + "/restlet/fetion/loginTest");
                HttpURLConnection connection = (HttpURLConnection) postUrl
                        .openConnection();
                connection.setConnectTimeout(TIME_OUT);
                connection.setReadTimeout(TIME_OUT);
                connection.setDoOutput(true);
                connection.setRequestMethod("POST");
                connection.setUseCaches(false);
                connection.setInstanceFollowRedirects(true);
                connection.setRequestProperty("Content-Type",
                        "application/x-www-form-urlencoded");
                connection.connect();
                DataOutputStream out = new DataOutputStream(connection
                        .getOutputStream());
                String content = "mobile=" + mobile + "&uuid=" + uuid
                        + "&password=" + password;
                out.writeBytes(content);
                out.flush();
                out.close();
                int responseCode = connection.getResponseCode();
                connection.disconnect();
                if (responseCode == 202)
                    return true;
                else
                    return false;
            } catch (Exception e) {
                log.warn("error fetchToLoginTest, exception:" + e.getMessage()
                        + ". tried " + i + " times");
            }
        }
        return false;
    }
    /**
       *取得好友回复消息 (仅供POST使用,暂不提供GET方式)(本功能刚上线,仅测试)
       * 注意:相同手机号调用间隔要超过55秒(一般60秒调用一次),否则不成功(responseCode:406)
       * 
       * 返回JSONArray,其中date是接收的时间(格式为yyyy-MM-dd HH:mm,太平洋时间),uri是好友的uri,您可以通过获取       *好友列表来查看这个uri对应到哪个好友
       * 所以如果启用接受消息API功能,除了每分钟调用这个API以外,期间如果调用其他API,在每个API后面POST的时候要多        *一个&keepLogin=true,
       * 如果不加或者keepLogin=false,该次调用完API后程序会将飞信注销。
       * 
       */
      public static JSONArray fetchToCheckMessages(String mobile, String password) {
            String uuid = UUID.randomUUID().toString();
            for (int i = 0; i < TRY_TIMES; i++) {
                  try {
                        URL postUrl = new URL(BASE_URL + "/restlet/fetion/checkMessage");
                        HttpURLConnection connection = (HttpURLConnection) postUrl
                                    .openConnection();
                        connection.setConnectTimeout(TIME_OUT);
                        connection.setReadTimeout(TIME_OUT);
                        connection.setDoOutput(true);
                        connection.setRequestMethod("POST");
                        connection.setUseCaches(false);
                        connection.setInstanceFollowRedirects(true);
                        connection.setRequestProperty("Content-Type",
                                    "application/x-www-form-urlencoded");
                        connection.connect();
                        DataOutputStream out = new DataOutputStream(connection
                                    .getOutputStream());
                        String content = "mobile=" + mobile + "&uuid=" + uuid
                                    + "&password=" + password;+ "&keepLogin=true"
                        out.writeBytes(content);
                        out.flush();
                        out.close();
                        int responseCode = connection.getResponseCode();
                        if (responseCode == 202) {
                              BufferedReader reader = new BufferedReader(
                                          new InputStreamReader(connection.getInputStream(), "UTF-8"));//读取结果
                              StringBuffer sb = new StringBuffer();
                              String line;
                              while ((line = reader.readLine()) != null) {
                                    sb.append(line);
                              }
                              reader.close();
                              connection.disconnect();
                              return new JSONArray(sb.toString());
                        } else {
                              connection.disconnect();
                        }
                  } catch (Exception e) {
                        log.warn("error fetchToCheckMessages, exception:" + e.getMessage()
                                    + ". tried " + i + " times");
                  }
            }
            return null;
      }
    //把数组转化成JSONString
    private static String convertArrayToJSONString(String[] arr) throws Exception {
           JSONArray ja = new JSONArray();
           for (String a : arr)
                 ja.put(a);//ja.add(a);//?
           return URLEncoder.encode(ja.toString(), "UTF-8");
     }
}
目录
相关文章
|
15天前
|
Java API Spring
打造未来电商新引擎:揭秘Java可扩展API设计,让支付与物流灵活如丝,引领电商时代潮流!
【8月更文挑战第30天】本文通过电商平台案例,探讨了如何设计可扩展的Java API。首先定义支付和物流服务的接口与抽象类,然后实现具体服务,接着引入工厂模式或依赖注入管理服务实例,最后通过配置实现灵活扩展。这种设计确保了应用架构的灵活性和长期稳定性。
35 3
|
16天前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
47 0
|
24天前
|
Java 编译器 API
Java新手必看:轻松掌握API文档使用技巧!
API是预定义的接口,允许开发人员使用一组例程及协议而无需了解内部实现细节。Java API文档详述了标准类库,支持平台无关性和安全性,确保Java程序跨平台的一致性行为。Java类可通过单文件或多文件定义,并支持内部类及包组织。常用API如`Scanner`用于输入处理,`Random`生成随机数,`ArrayList`提供动态列表管理,而`Arrays`和`Math`分别简化数组操作和数学计算。掌握这些API能显著提升Java开发效率。
|
3天前
|
Java API C++
Java 8 Stream Api 中的 peek 操作
本文介绍了Java中`Stream`的`peek`操作,该操作通过`Consumer&lt;T&gt;`函数消费流中的每个元素,但不改变元素类型。文章详细解释了`Consumer&lt;T&gt;`接口及其使用场景,并通过示例代码展示了`peek`操作的应用。此外,还对比了`peek`与`map`的区别,帮助读者更好地理解这两种操作的不同用途。作者为码农小胖哥,原文发布于稀土掘金。
Java 8 Stream Api 中的 peek 操作
|
7天前
|
安全 Java API
【性能与安全的双重飞跃】JDK 22外部函数与内存API:JNI的继任者,引领Java新潮流!
【9月更文挑战第7天】JDK 22外部函数与内存API的发布,标志着Java在性能与安全性方面实现了双重飞跃。作为JNI的继任者,这一新特性不仅简化了Java与本地代码的交互过程,还提升了程序的性能和安全性。我们有理由相信,在外部函数与内存API的引领下,Java将开启一个全新的编程时代,为开发者们带来更加高效、更加安全的编程体验。让我们共同期待Java在未来的辉煌成就!
34 11
|
8天前
|
安全 Java API
【本地与Java无缝对接】JDK 22外部函数和内存API:JNI终结者,性能与安全双提升!
【9月更文挑战第6天】JDK 22的外部函数和内存API无疑是Java编程语言发展史上的一个重要里程碑。它不仅解决了JNI的诸多局限和挑战,还为Java与本地代码的互操作提供了更加高效、安全和简洁的解决方案。随着FFM API的逐渐成熟和完善,我们有理由相信,Java将在更多领域展现出其强大的生命力和竞争力。让我们共同期待Java编程新纪元的到来!
33 11
|
5天前
|
监控 Java 大数据
【Java内存管理新突破】JDK 22:细粒度内存管理API,精准控制每一块内存!
【9月更文挑战第9天】虽然目前JDK 22的确切内容尚未公布,但我们可以根据Java语言的发展趋势和社区的需求,预测细粒度内存管理API可能成为未来Java内存管理领域的新突破。这套API将为开发者提供前所未有的内存控制能力,助力Java应用在更多领域发挥更大作用。我们期待JDK 22的发布,期待Java语言在内存管理领域的持续创新和发展。
|
7天前
|
Java API 数据处理
【Java的SIMD革命】JDK 22向量API:释放硬件潜能,让Java应用性能飙升!
【9月更文挑战第7天】 JDK 22向量API的发布标志着Java编程语言在SIMD技术领域的重大突破。这一新特性不仅释放了现代硬件的潜能,更让Java应用性能实现了飙升。我们有理由相信,在未来的发展中,Java将继续引领编程语言的潮流,为开发者们带来更加高效、更加强大的编程体验。让我们共同期待Java在SIMD技术的推动下开启一个全新的性能提升时代!
|
8天前
|
Java API 开发者
【Java字节码操控新篇章】JDK 22类文件API预览:解锁Java底层的无限可能!
【9月更文挑战第6天】JDK 22的类文件API为Java开发者们打开了一扇通往Java底层世界的大门。通过这个API,我们可以更加深入地理解Java程序的工作原理,实现更加灵活和强大的功能。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来!
|
6天前
|
Java API 开发者
【Java字节码的掌控者】JDK 22类文件API:解锁Java深层次的奥秘,赋能开发者无限可能!
【9月更文挑战第8天】JDK 22类文件API的引入,为Java开发者们打开了一扇通往Java字节码操控新世界的大门。通过这个API,我们可以更加深入地理解Java程序的底层行为,实现更加高效、可靠和创新的Java应用。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来,并积极探索类文件API带来的无限可能!