2015-04-25 4 views
10

Я пытаюсь загрузить фотографии, опубликованные с определенным тегом в режиме реального времени. Я нашел в реальном времени api довольно бесполезным, поэтому я использую длинную стратегию опроса. Ниже псевдокод с комментариями тонкоматериальных ошибок в немGrabbing tagged instagram фото в реальном времени

newMediaCount = getMediaCount(); 
delta = newMediaCount - mediaCount; 
if (delta > 0) { 
    // if mediaCount changed by now, realDelta > delta, so realDelta - delta photos won't be grabbed and on next poll if mediaCount didn't change again realDelta - delta would be duplicated else ... 
    // if photo posted from private account last photo will be duplicated as counter changes but nothing is added to recent 
    recentMedia = getRecentMedia(delta); 
    // persist recentMedia 
    mediaCount = newMediaCount; 
} 

Второго вопрос можно решить с помощью набора какого-то я gueess. Но сначала меня действительно беспокоит. Я переместил два вызова instagram api как можно ближе, но этого достаточно?

Редактировать

Как Амир предложил я переписать код с использованием min/max_tag_id с. Но он по-прежнему пропускает фотографии. Я не мог найти лучшего способа проверить это, чем сохранить изображения на диске в течение некоторого времени и сравнить результат с instagram.com/explore/tags/.

public class LousyInstagramApiTest { 

    @Test 
    public void testFeedContinuity() throws Exception { 
     Instagram instagram = new Instagram(Settings.getClientId()); 
     final String TAG_NAME = "portrait"; 
     String id = instagram.getRecentMediaTags(TAG_NAME).getPagination().getMinTagId(); 
     HashtagEndpoint endpoint = new HashtagEndpoint(instagram, TAG_NAME, id); 

     for (int i = 0; i < 10; i++) { 
      Thread.sleep(3000); 
      endpoint.recentFeed().forEach(d -> { 
       try { 
        URL url = new URL(d.getImages().getLowResolution().getImageUrl()); 
        BufferedImage img = ImageIO.read(url); 
        ImageIO.write(img, "png", new File("D:\\tmp\\" + d.getId() + ".png")); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      }); 
     } 
    } 
} 

class HashtagEndpoint { 
    private final Instagram instagram; 
    private final String hashtag; 
    private String minTagId; 

    public HashtagEndpoint(Instagram instagram, String hashtag, String minTagId) { 
     this.instagram = instagram; 
     this.hashtag = hashtag; 
     this.minTagId = minTagId; 
    } 

    public List<MediaFeedData> recentFeed() throws InstagramException { 
     TagMediaFeed feed = instagram.getRecentMediaTags(hashtag, minTagId, null); 
     List<MediaFeedData> dataList = feed.getData(); 
     if (dataList.size() == 0) return Collections.emptyList(); 

     String maxTagId = feed.getPagination().getNextMaxTagId(); 
     if (maxTagId != null && maxTagId.compareTo(minTagId) > 0) dataList.addAll(paginateFeed(maxTagId)); 
     Collections.reverse(dataList); 
//  dataList.removeIf(d -> d.getId().compareTo(minTagId) < 0); 

     minTagId = feed.getPagination().getMinTagId(); 
     return dataList; 
    } 

    private Collection<? extends MediaFeedData> paginateFeed(String maxTagId) throws InstagramException { 
     System.out.println("pagination required"); 

     List<MediaFeedData> dataList = new ArrayList<>(); 
     do { 
      TagMediaFeed feed = instagram.getRecentMediaTags(hashtag, null, maxTagId); 
      maxTagId = feed.getPagination().getNextMaxTagId(); 
      dataList.addAll(feed.getData()); 
     } while (maxTagId.compareTo(minTagId) > 0); 
     return dataList; 
    } 

} 
+0

Почему вы находите в реальном времени API бесполезно? Я использую его прямо сейчас, и он работает хорошо. – Gonzalingui

+0

@Gonzalingui, потому что он не отправляет вам сами данные. Чтобы получить данные, вам нужно использовать одну из стратегий выше обеих из которых не работает. И вы не можете использовать это off-serverside, на котором я нахожусь. – user2418306

ответ

4

Использование Tag endpoints, чтобы получить последние средства массовой информации с требуемым тегом, он возвращается в его постраничной информации, которая привязана к наиболее недавно отмеченным средствам массовой информации во время вашего разговора с min_tag_id. Поскольку API также принимает параметр min_tag_id, вы можете передать это число из своего последнего запроса, чтобы получать только те носители, которые отмечены после вашего последнего запроса.

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

Вам также необходимо передать большой параметр count и следить за разбиением на фрагменты ответа, чтобы получить все данные, не теряя при этом, когда скорость тегирования будет быстрее, чем ваш опрос.

Update:
На основе вашего обновленного кода:

public List<MediaFeedData> recentFeed() throws InstagramException { 
    TagMediaFeed feed = instagram.getRecentMediaTags(hashtag, minTagId, null, 100000); 
    List<MediaFeedData> dataList = feed.getData(); 
    if (dataList.size() == 0) return Collections.emptyList(); 

    // follow the pagination 
    MediaFeed recentMediaNextPage = instagram.getRecentMediaNextPage(feed.getPagination()); 
    while (recentMediaNextPage.getPagination() != null) { 
     dataList.addAll(recentMediaNextPage.getData()); 
     recentMediaNextPage = instagram.getRecentMediaNextPage(recentMediaNextPage.getPagination()); 
    } 

    Collections.reverse(dataList); 

    minTagId = feed.getPagination().getMinTagId(); 
    return dataList; 
} 
+0

Благодарим вас за ответ, извините за поздний ответ. Я тестировал этот подход и сталкивался с неординарными результатами, которые, как я думал, не были определенными как «min_tag_id». Например. этот вызов https://api.instagram.com/v1/tags/partytools/media/recent?min_id=964461544535307126_444055843 не возвращает носитель с указанным идентификатором, на самом деле он возвращает только 6 последних сообщений. И если вы опустите «min_id» и выдаете счетчик или предоставляете оба, он дает только 6 последних записей. Вот мои тесты с использованием jInstagram: http://pastebin.com/EnPRwMLw. Шорткод используется с 9-й фотографии. – user2418306

+0

Этот подход привел к пропуску некоторых фотографий. – user2418306

+0

Вы делаете вещи немного сложнее, реализуя сами разбивку на страницы. Просто сделайте один звонок с помощью 'min_tag_id' и следуйте встроенной разбивке на страницы. См. Мой обновленный ответ. –

Смежные вопросы