Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Desktop клиент для Контакта


Автор: Atum 23.11.2010, 12:39
Пытаюсь разобраться с API контакта и как с ним работать из java .

Но знаний и информации по этой теме недостаточно .

что хочется получить ?! 
есть задача - авторизоваться пользователем и дать доступ своему приложению .... 
После авторизации получать сообщения пользователя ... иметь возможность из добавлять , удалять и восстанавливать.

что есть ... и какие проблемы возникли ... 

первое - это вход в контакт ... в описании API предлагают создать Браузер  для авторизации 
 если брать простой JEditorPane  и ставить ему setPage(url); то он некорректно отображает содержимое . и непонятно как он будет работать и как ждать от него ответ ...

Я хочу пойти по другому пути ... пока у меня не будет клиентского GUI ...

все операции ходу делать из когда и консоли ... для начала 

взял за основу ... HttpClient от apache

1. Авторизация 

Код

package vkclient;

import java.io.IOException;
import net.htmlparser.jericho.Element;
import net.htmlparser.jericho.Source;
import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;


public class Main {

    /**
     * @param args the command line arguments
     *
     */

    public static void main(String[] args) throws IOException {
        // TODO code application logic here
        System.out.println("!!!! begin !!!");
    
    HttpClient client = new HttpClient();
     
       // PROXY если есть прокси 
        //client.getHostConfiguration().setProxy(PROXY_HOST, PROXY_PORT);
        // Proxy login
       // Credentials defaultcreds = new UsernamePasswordCredentials("user", "user");
       // AuthScope authScope = new AuthScope(PROXY_HOST, PROXY_PORT);
        //client.getState().setProxyCredentials(authScope, defaultcreds);

        // Нужна ли эта строка
        // client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
        //

        // вопрос с чем работать с GET или POST
        // HttpMethod method = new GetMethod("http://vkontakte.ru/login.php");

        PostMethod post = new PostMethod("http://vkontakte.ru/login.php");

 
            client.executeMethod(post);

              String response = post.getResponseBodyAsString();
              System.out.println(response);
 
 
            System.out.println("!!!! end !!!");
}
 
}


получаем в response страницу авторизации ... 

вопрос как автоматически заполнить поля адреса и пароля и нажать на кнопку вход?


2. Авторизация Desktop приложения 

как описано в API для создания приложения надо получить id приложения , и дать ему доступ к сообщениям - выставить маску 4096



т.е. мое приложение должно авторизоваться по следующему URL 

    http://vkontakte.ru/login.php?

 app=11111&layout=popup&type=browser&settings=4096
 
у меня есть ID моего  приложения: 11111 , есть Защищенный ключ. 

Вызываю точно такой же код но с новой ссылкой - получаю в ответ страницу с требованием ввести логин пароль и кнопкой разрешить приложению доступ к моей информации...

Код


   PostMethod post = new PostMethod("http://vkontakte.ru/login.php?app=11111&layout=popup&type=browser&settings=4096");
   client.executeMethod(post);



в вопрос все тот же как теперь ввести логин пароль и отправить данные и разрешить доступ.

в Описании сказано  что в ответ я должен буду получить 

Цитата

то при успешной авторизации встроенный в приложении браузер будет перенаправлен на следующий URL-адрес: 

http://vkontakte.ru/api/login_success.html#session={"mid":66748,"sid":"ea56492j61334be88e2e8e1dccd21ef8d2f4606f26add88b2e1ee313e2","secret":"733mf8a8c5","expire":0,"sig":"f7afd3db2d3a8a08c849bb038fd52173"}


вот с этого Момента я уже ничего не понимаю что делать ... 
Цитата


После получения сессии взаимодействие с ВКонтакте API производится путем создания HTTP-запроса (POST или GET) к адресу API-сервиса http://api.vkontakte.ru/api.php. 



Какие параметры необходимо передавать при запросе?

подпись запроса создается сервером или руками?



sig = md5(midname1=value1name2=value2secret)


Самые для меня важные вопросы 


как вызывать функции 


messages.get 
 messages.send – посылает сообщение.
 messages.delete – удаляет сообщение.
 messages.restore – восстанавливает только что удаленное сообщение. 
 


Какой библиотекой пользоваться (Хочется примера и код)

Все кто можем помощь чем либо - буду очень признателен.



Автор: LSD 24.11.2010, 13:14
Цитата(Atum @  23.11.2010,  13:39 Найти цитируемый пост)
вопрос как автоматически заполнить поля адреса и пароля и нажать на кнопку вход?

На лицо явное непонимание того как работает браузер. Никаких полей заполнять не нужно, нужно послать GET или POST запрос с нужными полями.

Автор: Atum 24.11.2010, 17:13
Цитата(LSD @ 24.11.2010,  13:14)
Цитата(Atum @  23.11.2010,  13:39 Найти цитируемый пост)
вопрос как автоматически заполнить поля адреса и пароля и нажать на кнопку вход?

На лицо явное непонимание того как работает браузер. Никаких полей заполнять не нужно, нужно послать GET или POST запрос с нужными полями.


Хорошо , я уточняю ... пытаюсь заполнить поля таким образом ....
Код


        PostMethod post = new PostMethod("http://vkontakte.ru/login.php");

        post.getParams().setContentCharset(SITE_CHARSET);

        post.addParameter("act", "login");
        post.addParameter("try_to_login", "1");
        post.addParameter("email", "******");
        post.addParameter("pass", "*****");
        post.addParameter("app", "1111111");
        post.addParameter("layout", "popup");
        post.addParameter("type", "browser");
        post.addParameter("settings", "4096");



но чего то явно не хватает ?...

и к примеру  как нажать на кнопку разрешить? 

что мы должны получить в ответ ?! - пишут что ссылку с редиректом ... и параметрами сессии  как их вытащить? и пользоваться... 

Очень хочется увидеть ПРИМЕР ! 
хотя бы два запроса - один на авторизацию - второй на получение сообщений чтобы понять как это организовать .





Автор: Hidrag 24.11.2010, 17:25
Делается это так, ставится снифер, например http://www.httpwatch.com/.
Заходишь на сайт, и смотришь в  снифире какие данные к каким полям формы отправляются, соответственно прописываешь их в апликухе. Далее смотришь что возвращается (куки там, идентификатор сессии, еще что-нибудь) и прописываешь их у себя. По сути программа имитирует пользователя, отправляет запросы - получает ответы, если заполнишь правильно все http header'ы то для сайта это будет выглядеть как пользователь с указанного в хедерах браузера.

Автор: Hidrag 24.11.2010, 17:45
а вот тут примеры:
http://forum.vingrad.ru/forum/topic-208331/anchor-entry1493331/0.html

Автор: LSD 24.11.2010, 18:10
Hidrag, все верно описал, для случая когда ты пытаешься имитировать пользователя. Ну разве что кроме того, что возможно еще потребуется UserAgent поставить.

Но ты вроде писал, что пытаешься использовать API контакта, а там уже все может быть по другому. Надо смотреть документацию.

Автор: Atum 25.11.2010, 12:01
смотрю документацию и ничего не могу понять ... потому что опыта работы с сетью и браузерами практически нет (совсем нет). 

Поэтому и хочется увидеть один пример - с двумя запросами - авторизацией - получением ответа ... анализом ответа ... и посылкой следующего запроса ... итд... странно что тема социальных сетей очень популярная .... но вот красивых и прозрачных примеров нигде нет... ибо те люди которые в этом хорошо разбираются понимают это все очень хорошо, и им такие документы ненужны... а что делать таким кто только начинает разбираться в премудростях работы сетей ?! 

Автор: LSD 25.11.2010, 12:04
Может стоит начать с ответа на вопрос какой из двух вариантов работы с вконтегом ты выбрал? smile 

Автор: Atum 25.11.2010, 12:45
смотрю документацию и ничего не могу понять ... потому что опыта работы с сетью и браузерами практически нет (совсем нет). 

Поэтому и хочется увидеть один пример - с двумя запросами - авторизацией - получением ответа ... анализом ответа ... и посылкой следующего запроса ... итд... странно что тема социальных сетей очень популярная .... но вот красивых и прозрачных примеров нигде нет... ибо те люди которые в этом хорошо разбираются понимают это все очень хорошо, и им такие документы ненужны... а что делать таким кто только начинает разбираться в премудростях работы сетей ?!

Добавлено через 51 секунду
Думаю я определился -  будет POST.

Автор: LSD 25.11.2010, 13:56
Еще раз: ты будешь имитировать пользователя или использовать API вконтега для внешних приложений (в этом случае не помешала бы ссылка на документацию)? 

Автор: Atum 25.11.2010, 15:42
Хочу использовать API 

вот линк

http://vkontakte.ru/developers.php?id=-1_21239305&s=1

Автор: COVD 28.11.2010, 18:26
Цитата

Пытаюсь разобраться с API контакта и как с ним работать из java 

Atum, а зачем?
Мне вообще удивительно, что они предоставляют такое API. Все эти сети живут с рекламы, очевидно, которую они добавляют в свой интерфейс. Предоставление возможности использования другого интерфейса, неконтролируемого владельцем сети, снижает, по идее, их доходы. Кроме того, расширяет возможности нелегитимного использования сети. Рассылка спама, например.  

Автор: Atum 29.11.2010, 11:29
Цитата

Atum, а зачем?

 занимаюсь самообразованием.

Автор: LSD 29.11.2010, 19:20
1. Авторизуешься:
Код

        HttpClient client = new HttpClient();

        PostMethod post = new PostMethod("http://vkontakte.ru/login.php");
        post.setParameter("app", "1862639");
        post.setParameter("layout", "popup");
        post.setParameter("type", "browser");
        post.setParameter("settings", "130");

        int code = client.executeMethod(post);

        String redirectLocation;
        Header locationHeader = post.getResponseHeader("location");
        if (locationHeader != null) {
            redirectLocation = locationHeader.getValue();
        } else {
            // The response is invalid and did not provide the new location for
            // the resource.  Report an error or possibly handle the response
            // like a 404 Not Found error.
        }

http://hc.apache.org/httpclient-3.x/redirects.html

2.  Из locationHeader получаешь значение параметра session и распарсиваешь его как JSON.

3. Формируешь необходимые параметры. Они перечислены в Какие параметры необходимо передавать при запросе? и плюс параметры необходимые для вызываемого метода (в примере это были uids и fields. И засовываешь их в SortedMap, затем вычисляешь sig
Код

package com.db.gpf.gpfs.test;

import org.apache.commons.codec.binary.Hex;
import org.apache.log4j.Logger;

import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;

public class App {
    private static final Logger logger = Logger.getLogger(App.class);
    private static final Set<String> IGNORING_PARAMS;
    private static final Charset CHARSET = Charset.forName("UTF-8");

    static {
        ConfigurableToStringStyle.init("to-string-builder.properties");

        HashSet<String> set = new HashSet<String>();
        set.add("sid");
        IGNORING_PARAMS = Collections.unmodifiableSet(set);
    }

    private MessageDigest md5;
    private String userId;
    private String secret;

    public App(String userId, String secret) throws NoSuchAlgorithmException {
        md5 = MessageDigest.getInstance("MD5");
        this.userId = userId;
        this.secret = secret;
    }

    public String getChecksum(SortedMap<String, String> arguments) {
        StringBuilder buffer = new StringBuilder(512);
        buffer.append(userId);
        for (Map.Entry<String, String> entry : arguments.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
            if (IGNORING_PARAMS.contains(key)) {
                continue;
            }
            buffer.append(key).append('=').append(value);
        }
        buffer.append(secret);
        byte[] bytes = buffer.toString().getBytes(CHARSET);
        byte[] md5 = this.md5.digest(bytes);
        return Hex.encodeHexString(md5);
    }

    public static void main(String[] args) throws Exception {
        App app = new App("100172", "655df68ded");

        SortedMap<String, String> params = new TreeMap<String, String>();
        params.put("api_id", "1854119");
        params.put("fields", "photo,sex");
        params.put("format", "JSON");
        params.put("method", "getProfiles");
        params.put("sid", "25094e01b4fa6824a6d84a65b5b3a09998e17d18d91ba7d9059689da");
        params.put("uids", "100172");
        params.put("v", "3.0");

        String sig = app.getChecksum(params);

        logger.info(sig);

        params.put("sig", sig);
    }
}


После чего можешь посылать POST или GET на http://api.vkontakte.ru/api.php с этими параметрами.

Автор: Atum 3.12.2010, 19:13
LSD, огромное  спасибо за пример .

Первая трудность с которой пришлось столкнуться - 

locationHeader  null 

Цитата

Код

  Header locationHeader = post.getResponseHeader("location");



Делаю первый запрос с помощью GET как описано в api  но не получаю никаких параметров 

Код


      GetMethod  get = new GetMethod("http://vkontakte.ru/login.php?app=2021521&layout=popup&type=browser&settings=4096");

      client.executeMethod(get);
    



как я понимаю тут должно быть три основных шага ... первый 

пусть будет по get и два по пост :

Первый авторизация  нашего приложения : 

Код


      GetMethod  get = new GetMethod("http://vkontakte.ru/login.php?app=2021521&layout=popup&type=browser&settings=4096");

      client.executeMethod(get);
    



в ответе мы должны получить app_hash  параметр 
второе 

отправить POST запрос на страницу http://login.vk.com/ после чего получить новое значение app_hash 

(авторизация пользователя его маил и логин )
Код

act=login
app=2021521;
app_hash= полученный хэш
email=email
pass=****
permanent=1

http://login.vk.com/




отправить POST запрос на страницу vkontakte.ru/login.php, где мы уже будем получать данные сессии путем парсинга.

Код


s=...
act=auth_result
m=4
parmanent=1
expire=""'
app=2021521
app_hash=...

// выполнить POST
   'http://vkontakte.ru/login.php'

//получить 
mid
sid
secret



где 

    expire – Время истечения сессии в формате UNIX
     mid – ID пользователя в ВКонтакте
     secret – Специально сгенерированный секрет сессии
     sid – Идентификатор сессии


Автор: LSD 7.12.2010, 19:22
Для начала надо разобраться, почему ты не получаешь редирект на login_success.html.

1. Проверь какой код возвращает executeMethod() он должен быть 3ХХ
2. Попробуй получить редирект от какого нибудь сокращателя ссылок.

Автор: Halavshik 9.12.2010, 01:58
Народ, можно просьбу, как для идиота объясните по шагам как все это реализовать начиная со слов открываем новый проект в eclipse smile 

Автор: LSD 9.12.2010, 17:09
Цитата(Atum @  3.12.2010,  20:13 Найти цитируемый пост)
locationHeader  null 

Для того чтобы он был не null надо надо отключить переход по редиректам:
Код

HttpClient httpClient = new HttpClient();
GetMethod method = new GetMethod("http://goo.gl/m4wUv");
method.setFollowRedirects(false);
int code = httpClient.executeMethod(method);
if (code >= 300 && code <= 399) {
    String redirectLocation;
    Header locationHeader = method.getResponseHeader("location");
    if (locationHeader != null) {
        redirectLocation = locationHeader.getValue();
        logger.info(redirectLocation);
    } else {
        logger.info("LocationHeader is null");
    }
}

Автор: SaloS 27.1.2011, 12:08
Привет, у меня также проблема с десктоп клиентом (хоть и на .NET). Я все получил, но при попытке отправить запрос к апи всегда выдается ответ Invalid signature. Я уже все перепроверил. Я смотрю флешевского клиента, на котором все работает стянул параметры, подставил, все совпадает. А с десктопа ни в какую. Прикол в том, что если не посылать sid такой же ответ. Проверил через снифер, сид отправляется.
Если у кого-то работает авторизация, можете проверить, что я не так делаю.
mid = 3943076
secret = e4d924d097
сигнатура считается для строки
3943076api_id=1890159fields=uid,first_name,last_name,nickname,sex,bdate,photo,photo_medium,photo_bigmethod=getProfilestest_mode=1uids=3943076v=3.0e4d924d097

Ответ с сервера
Код

<?xml version="1.0" encoding="utf-8"?>
<error>
 <error_code>4</error_code>
 <error_msg>Incorrect signature</error_msg>
 <request_params list="true">
  <param>
   <key>api_id</key>
   <value>1890159</value>
  </param>
  <param>
   <key>fields</key>
   <value>uid,first_name,last_name,nickname,sex,bdate,photo,photo_medium,photo_big</value>
  </param>
  <param>
   <key>method</key>
   <value>getProfiles</value>
  </param>
  <param>
   <key>test_mode</key>
   <value>1</value>
  </param>
  <param>
   <key>uids</key>
   <value>3943076</value>
  </param>
  <param>
   <key>v</key>
   <value>3.0</value>
  </param>
  <param>
   <key>sig</key>
   <value>0ffb823d4551260f32d501c188d09bed</value>
  </param>
  <param>
   <key>sid</key>
   <value>71b252ea47d3262667b3e4b45f4341bf1099bf9044e07e44b78038dc11</value>
  </param>
 </request_params>
</error>



Что я неправильно делаю я не пойму. Остается только возможность что я неправильно получаю secret и sid. Но как это проверить. Вроде сверялся, все правильно.

Добавлено через 5 минут и 40 секунд
Оказалось, надо было создать именно desktop приложение. Если использовать флеш - оно не хотело

Автор: kkorsakoff 31.1.2011, 15:55
У меня получалось так: sid не шлю, sig шлю, mid не вставляю в подпись. Начинаю сразу с api_id.
MD5 беру от строки
Код

api_id=XXXXXXXfields=uid,first_name,last_name,nickname,domain,sex,bdate,city,country,timezone,photo,photo_medium,photo_big,has_mobile,rate,contacts,educationformat=JSONmethod=getProfilesuids=XXXXXXXv=3.0XXXXXXXXXXX

где XXX, понятно дело - реальные значения.
Запрос выполняю такой 
Код

http://api.vkontakte.ru/api.php?api_id=XXXXXXX&fields=uid,first_name,last_name,nickname,domain,sex,bdate,city,country,timezone,photo,photo_medium,photo_big,has_mobile,rate,contacts,education&format=JSON&method=getProfiles&sig=XXXXXXXXXXXXXX&uids=XXXXXX&v=3.0

Автор: gektor333 2.2.2011, 01:11
Сталкнулся с проблемой из этой области:
Использую httpClient для парсинга страниц с целью поиска интересующей информации. Сайты, с которыми предстоит работать предоставляют сервис аналогично www.sciencedirect.com. На запрос каждой страницы генерируется мд5, который передается в качестве параметра запроса. Есть ли какая-то возможность програмно послать запрос на сервер для генерации мд5 нужной страницы? Думал, что можно запустить паука, который с главной страницы начнет ползти по всем ссылкам и записывать их в локальную базу данных... Как в таких случаях обработку проводят?

Автор: Atum 14.2.2012, 16:19
За этот год все немного изменилось ! 

поэтому кто интересуется как создать клиента который бы постил новости на ленту группы отвечаю : 

(я использовал apache  HttpClient  и org.scribe)


Самое ценное - это получение Code -  функция которая работает в несколько этапов и ее нужно корректировать 
в зависимости от количества редиректов которые создает контакт
(если приложение не установлено - то в первый вызов надо добавить в код согласие на то что приложение получит права на доступ к вашим данным)


стандартная цепочка редиректов такая : (после того как ввели  https://api.vkontakte.ru/oauth/authorize)

Request URL:https://login.vk.com/?act=login&soft=1

Request URL:http://oauth.vkontakte.ru/oauth/authorize

Request URL:https://oauth.vkontakte.ru/grant_access

http://api.vkontakte.ru/blank.html#code=12a242bbf6de2285ce


В данном примере проблема с капчей не решается.

Код

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package vkclient;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ResponseHandler;
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.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.scribe.builder.*;
import org.scribe.builder.api.*;
import org.scribe.model.*;
import org.scribe.oauth.*;
/**
 *
 * @author Atum
 */
public class NewMain {
  private static final String NETWORK_NAME = "Vkontakte.ru";
  private static final String PROTECTED_RESOURCE_URL = "https://api.vkontakte.ru/method/wall.post"; //wall.post //notes.add
  private static final String clientId = "";
  private static final String apiSecret = "";
  
  
  private static final Token EMPTY_TOKEN = null;
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
     OAuthService service = new ServiceBuilder()
                                  .provider(VkontakteApi.class)
                                  .apiKey(clientId)
                                  .apiSecret(apiSecret)
                                  .scope("wall,offline,friends") // replace with desired scope notify,friends,wall,audio,notes,messages,offline
                                  .callback("http://api.vkontakte.ru/blank.html") //для приложения
                                  .build();
 
 
 
    String authorizationUrl = service.getAuthorizationUrl(EMPTY_TOKEN);
    String code = getCode(authorizationUrl);
    Verifier verifier = new Verifier(code);
    
    Token accessToken = service.getAccessToken(EMPTY_TOKEN, verifier);
    OAuthRequest request = new OAuthRequest(Verb.POST, PROTECTED_RESOURCE_URL);
  
    request.addBodyParameter("owner_id", "-clubID");
    request.addBodyParameter("from_group", "1");
    //attachments 
    request.addBodyParameter("attachments", "http://forum.vingrad.ru/");
    
    
    
    service.signRequest(accessToken, request);
    Response response = request.send();
      
    System.out.println(response.getCode());
    System.out.println(response.getBody());
    
  
    
    }
    
       public final static String getCode(String authorizationUrl) throws IOException{
           String code = null;
           
            DefaultHttpClient httpclient = new DefaultHttpClient();
            HttpGet httpget = new HttpGet(authorizationUrl);

            
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            String responseBody = httpclient.execute(httpget, responseHandler);

          String str_to = findKey(responseBody,"name=\"to\" value=\"","\"");
         
          HttpPost httppost = new HttpPost("https://login.vk.com/?act=login&soft=1");
         
                 List <NameValuePair> postform = new ArrayList<NameValuePair>(); 
         postform.add(new BasicNameValuePair("q", "1"));
         postform.add(new BasicNameValuePair("ip_h", "IP"));
         postform.add(new BasicNameValuePair("from_host", "api.vkontakte.ru"));
         postform.add(new BasicNameValuePair("to", str_to));
         postform.add(new BasicNameValuePair("expire", "0"));    
         postform.add(new BasicNameValuePair("email", "login")); 
         postform.add(new BasicNameValuePair("pass", "password")); 

         httppost.setEntity(new UrlEncodedFormEntity(postform, HTTP.UTF_8));
                 HttpResponse response = httpclient.execute(httppost);
         httppost.abort();
                 String HeaderLocation = response.getFirstHeader("location").getValue();
                 
                 httppost = new HttpPost(HeaderLocation);
         response = httpclient.execute(httppost);
         httppost.abort();
                 
                 HeaderLocation = response.getFirstHeader("location").getValue();
                 
                 
                 httppost = new HttpPost(HeaderLocation);
         response = httpclient.execute(httppost);
         httppost.abort();
                 
                HeaderLocation = response.getFirstHeader("location").getValue();
                
                code = HeaderLocation.split("=")[1];
            
         return code;
       }
    
  
    private static  final String findKey( String source, String patternbegin, String patternend )
    {
        int startkey = source.indexOf(patternbegin);
        if( startkey > -1 )
        {
            int stopkey = source.indexOf(patternend,startkey+patternbegin.length());
            if( stopkey > -1 )
            {
                String key = source.substring(startkey+patternbegin.length(), stopkey);
                return key;
            }
        }
        return null;
    }
    
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)