ITI0011RUS:Tweets

Allikas: Kursused
Redaktsioon seisuga 16. märts 2015, kell 19:47 kasutajalt Aleksandr (arutelu | kaastöö) (Uus lehekülg: 'Вернуться на страницу предмета <div style="color: #F00">Задание дополняется!</div> Срок сдачи '''25. - 26....')
(erin) ←Vanem redaktsioon | Viimane redaktsiooni (erin) | Uuem redaktsioon→ (erin)
Mine navigeerimisribale Mine otsikasti

Вернуться на страницу предмета

Задание дополняется!

Срок сдачи 25. - 26. märts.

Описание задания

Программа должна делать запрос в социальную сеть Twitter и получать оттуда список твитов. Запрос делается на недавно добавленные твиты по заданному месторасположению и их список показывается пользователю.

Функционал:

  • Считвается место, которое задается пользователем (например, Tallinn)
  • Программа узнает географические координаты введенного места (широта, долгота)
  • полученные географические координаты используются, для задания точки и радиуса, где следует искать твиты
  • Используя Twitter API посылается запрос, в него передаются координаты точки центра и радиус.
  • Ответ Twitteri API принимается, оттуда считываются необходимые данные и выводятся на экран.
  • Программе можно задать место также в виде параметра при запуске.

Дополнительные части:

  • Буферизация мест в файл (чтобы не нужно было каждый раз искать, например, координаты Таллинна, которые не меняются).
  • Сортировка твитов
  • Интерактивное управление программой
  • Тестируемый код (составление программы в соответствии с шаблоном)

Дополнительная информация

Координаты места

Используем сервис OpenStreetMap Nominatim (Nominatim wiki leht). Следует отослать сервису запрос, в котором следует указать желаемое месторасположение, и в ответе получите координаты искомого места (шитору и долготу) и координаты квадрата, окружающего эту центральную точку (bounding box).

Пример запроса: http://nominatim.openstreetmap.org/search?q=Tallinn&format=xml

Отослав такой запрос получите результат (в целях компактности показана лишь самая важная часть ответа):

<searchresults timestamp="Sat, 13 Sep 14 21:47:21 +0000" 
attribution="Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright" 
querystring="Tallinn" polygon="false" 
exclude_place_ids="98174326,11438224,6000303521,6919504,6893196,86869124,15103978,5983246058" 
more_url="http://nominatim.openstreetmap.org/search?format=xml&
exclude_place_ids=98174326,11438224,6000303521,6919504,6893196,86869124,15103978,5983246058&accept-language=en-
US,en;q=0.5&q=Tallinn">
<place place_id="98174326" osm_type="relation" osm_id="2164745" place_rank="16" 
boundingbox="59.351806640625,59.5915794372559,24.5501689910889,24.9262847900391" lat="59.4372155" 
lon="24.7453688" display_name="Tallinn, Harju maakond, Estonia" class="place" type="city" 
importance="0.7819722223575" icon="http://nominatim.openstreetmap.org/images/mapicons/poi_place_city.p.20.png"/>
...
</searchresults>

В результате получите несколько различных мест с именем Tallinn (или в названии которых содержится это слово). Самая первая запись для нас подойдет. Таким образом, вы считываете первую запись под элементом "place". Поскольку для отсылки запроса в Twitter нам понадобятся координаты центра и радиус (поскольку ищем результаты с большой площади), то интересующие нас атрибуты "lat" и "lon" (широта и долгота), которые обозначают координаты центральной точки, а также атрибут "boundingbox", который задает линию, ограничивающие окрестности данной точки. В данном примере lat="59.4372155", lon="24.7453688", boundingbox="59.351806640625,59.5915794372559,24.5501689910889,24.9262847900391".

Область поиска в Twitter-е задается точкой центра и радиусом. В качестве центральной точки можно использовать полученные значения "lat" и "lon" напрямую. Для вычисления радиуса следует использовать значение "boundingbox". Поскольку радиус должен быть представлен в километрах, то следует то параметрам boundingbox высчитать радиус. Внимание, в различных областях земного шара длина широты может различаться. В рамках данного задания точно высчитать радиус не требуется. Будет достаточно приблизительного значения. Здесь в описании задания никакой конкретной формулы или примера не приведено - это вам следует придумать самим. Важно, чтобы города, чьи размеры заметно отличаются, давали бы разный радиус (New York > > Tallinn > Haapsalu).

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

Примечание. Для решения основной части достаточно и того, если вы будете пользоваться любым другим API (например, Google Maps).

Twitter API

Twitter API (https://dev.twitter.com/docs/api/1.1) позволяет делать программе запросы в Twitter . Для решения данного задания не требуется, чтобы вы были активным пользователем Twitter.

Для использования Twitteri API вам все же необходимо создать аккаунт. После логина, можете увидеть свои приложения на этой странице: https://apps.twitter.com/ (эта ссылка также доступна по адресу dev.twitter.com внизу страницы в списке "TOOLS"). Там создайте свое приложение, где в качестве домашней страницы можете записать любой адрес URL (хоть страницу этого предмета).

После того, как приложение создано, вы увидите его в списке своих приложений. Если откроете созданное приложение, то в разделе "API keys" увидите настройки приложения. Нас интересуют данные "API key" и "API secret". Эти два значения нужны для отправления запросов к Twitter API.

Сам запрос, который слеует использовать, описан здесь: https://dev.twitter.com/rest/public/search ja https://dev.twitter.com/rest/reference/get/search/tweets

Например, запрос может быть таким: https://api.twitter.com/1.1/search/tweets.json?q=&geocode=59.437215524.7453688,1km&result_type=recent

Ссылка выше может не дать никакого результата, если вы не залогинены. Она должна давать твиты с месторасположением Tallinn в радиусе 1 км.

Немного информации о том, как авторизовать приложение для использования Twitteri API: https://dev.twitter.com/oauth .

Для того, чтобы весь процесс не был слишком сложным, при решении задания советуем пользоваться библиотекой, которая может провести аутентификацию и отослать запрос за вам. Одна такая библиотека, о которой ниже также будет пара примеров кода, нахоится здесь: http://twitter4j.org/ . При желании, можете воспользоваться любой другой.

Если вы используете twitter4j, вам нужно получить следующий файл: twitter4j-core-4.0.2.jar. Когда скачаете архив в zip-формате, этот файл будет располагаться в директории "lib". Во время написания этого руководства текущая венсия библиотеки была 4.0.2, она может в любой момент измениться - соответственно, изменятся и имена файлов. Этот jar-файд следует добавить в свой проект Eclipse: project properties > java build path > libraries > add external jars ... и найдите этот файл.

Сконфигурировать библиотеку можно следующим образом: <source lang="java"> ConfigurationBuilder cb = new ConfigurationBuilder(); cb.setDebugEnabled(true) .setApplicationOnlyAuthEnabled(true); cb.setOAuthConsumerKey(TWITTER_CUSTOMER_KEY) .setOAuthConsumerSecret(TWITTER_CUSTOMER_SECRET);

TwitterFactory tf = new TwitterFactory(cb.build()); twitter4j.Twitter twitter = tf.getInstance();

OAuth2Token token; try { token = twitter.getOAuth2Token(); } catch (TwitterException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } </source>

В примере выше значения констант TWITTER_CUSTOMER_KEY и TWITTER_CUSTOMER_SECRET взяты из настроек приложения с веб страницы (application key и application secret соответственно). Альтернативно, можете настроить библиотеку при помощи конфигурационного файла, или другими способами (больше об этом можете прочитать на веб странице библиотеки, которую вы используете).

То, как отправить запрос выбранной библиотекой, вы должны выяснить сами. Об этом на странице библиотеки должна быть пара примеров. Здесь также один пример: https://github.com/yusuke/twitter4j/blob/master/twitter4j-core/src/test/java/twitter4j/SearchAPITest.java (Он взят из директории тестов. Часто тесты содержат больше примеров кода, чем сами примеры.)