Иллюстрированный пост в Facebook оказывается не в том месте - PullRequest
9 голосов
/ 21 февраля 2012

Я пытаюсь опубликовать изображение на странице Facebook с id = 226338660793052, но оно постоянно заканчивается в / me / photos.Что я делаю не так?

NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                   imageToSend, @"source",
                                   facebookMessageTextView.text, @"message",
                                   nil];
[facebook requestWithGraphPath:@"/226338660793052/photos" andParams:params andHttpMethod:@"POST" andDelegate:self]; 

Я не получаю сообщения об ошибке.Я ничего не получаю, за исключением того, что фотография попадает в мой собственный альбом, меня / фотографии, а не в альбом 226338660793052 / фотографии.

Но когда я просто отправляю сообщение на эту страницу, я получаюуспешное сообщение на временной шкале страницы:

NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                   @"http://www.bitsonthego.com", @"link",
                                   @"my profile", @"name",
                                   facebookMessageTextView.text, @"message",
                                   nil];
[facebook requestWithGraphPath:@"/226338660793052/feed" andParams:params andHttpMethod:@"POST" andDelegate:self]; 

Что мне здесь не хватает?Я знаю, что это должно быть возможно, так как я могу использовать браузер для загрузки изображения на нужную страницу как случайный пользователь без прав администратора.Я просто не могу сделать это из API графа.

ОБНОВЛЕНИЕ:

Я решил часть проблемы.Вы должны использовать страницу доступа access_token.Вот как вы его получите:

    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                   @"access_token",  @"fields",
                                   nil];
    FBRequest *request = [facebook requestWithGraphPath:@"226338660793052" andParams:params andDelegate:self];

Когда вы получите результат, вы добавите его в транзакцию выше:

    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                   image, @"source",
                                  [result objectForKey:@"access_token"], @"access_token",
                                   facebookMessageTextView.text, @"message",
                                   nil];

    FBRequest *request = [facebook requestWithGraphPath:[[result objectForKey:@"id"] stringByAppendingString:@"/photos"] andParams:params andHttpMethod:@"POST" andDelegate:self];

Но это не сработает, потому что Facebook.m заменит этот новый access_token на пользователя по умолчанию access_token, поэтому я внес изменение в Facebook.m около строки 166 с:

  if ([self isSessionValid]) {
        [params setValue:self.accessToken forKey:@"access_token"];
  }

на:

  if ([self isSessionValid]) {
    if ([params valueForKey:@"access_token"] == nil)
        [params setValue:self.accessToken forKey:@"access_token"];
  }

.код доступа, который вы указываете как часть параметров, из-за того, что Facebook.accessToken забит.Теперь это позволит опубликовать картинку на интересующей меня странице.

Однако это работает, потому что я являюсь администратором на рассматриваемой странице.Другие пользователи не смогут публиковать изображения, и изображения снова окажутся в их собственных альбомах, потому что запрос на получение access_token для страницы вернет ноль.

Согласно документации в Facebook, если страницанеограниченно, как эта страница, тогда должна быть возможность разместить на ней картинку:

ПРИМЕЧАНИЕ:

Для соединений, требующих токен доступа,Вы можете использовать любой действительный токен доступа, если страница общедоступна и не имеет ограничений.Соединения на страницах с ограниченным доступом требуют токена доступа пользователя и видны только пользователям, которые соответствуют критериям ограничения (например, возрасту), установленным на странице.

Я упоминал, что моя страница является открытой и не имеет ограничений?

Токены доступа к странице

Чтобы выполнять следующие операции как Страница, а не как текущий пользователь, вы должны использовать токен доступа Страницы, а не пользователятокен доступа, обычно используемый для чтения объектов Graph API.Этот токен доступа можно получить, введя HTTP GET для / USER_ID / account с разрешением manage_pages.Это вернет список страниц (включая страницы профиля приложения), к которым пользователь имеет административный доступ, вместе с access_tokens для этих страниц.Кроме того, вы можете получить токен доступа к странице для отдельной конкретной страницы, выполнив HTTP GET для / PAGE_ID? Fields = access_token с разрешением themanage_pages, как описано выше.Для публикации на странице также требуется разрешение publish_stream, если не указано иное.

Итак, как можно опубликовать изображение на общедоступной / неограниченной странице?Я могу сделать это из любого браузера, так что это возможно, но как это сделать с помощью Graph API?Учитывая, что я могу публиковать в фиде без shenanigans access_token, как насчет публикации изображения по-другому?

Итак, я пытаюсь опубликовать изображение, а не просто URL-адрес эскиза, вобщедоступная / неограниченная страница с использованием Graph API.

Ответы [ 3 ]

4 голосов
/ 24 сентября 2013

Моя проблема в данный момент!Я полагаю, что проблема заключается в переписанных строках, которые стали невозможными, поскольку SDK Facebook теперь является статической библиотекой, которую нельзя редактировать.Тем не менее, я понял, как создавать фотографии без необходимости менять SDK - я создаю новые данные токена с помощью строки токена, которую я получаю из приложения:

FBAccessTokenData *tokenData = [FBAccessTokenData createTokenFromString:tokenString permissions:[FBSession activeSession].accessTokenData.permissions expirationDate:[FBSession activeSession].accessTokenData.expirationDate loginType:FBSessionLoginTypeFacebookApplication refreshDate:nil];

затем я создаю новую FBSession с fb appID (и nullCacheInstance, как-то это кажется важным):

FBSession *sessionFb = [[FBSession alloc] initWithAppID:appID permissions:[NSArray arrayWithObjects: @"publish_stream", @"manage_pages", nil] urlSchemeSuffix:nil tokenCacheStrategy:[FBSessionTokenCachingStrategy nullCacheInstance]];

, а затем я открываю вновь созданный сеанс с созданным tokenData, устанавливаю этот новый сеанс как активныйсеанса, и это работает!

[sessionFb openFromAccessTokenData:tokenData completionHandler:^(FBSession *session, FBSessionState status, NSError *error)
 {
 }];

[FBSession setActiveSession:sessionFb];

Затем вызывается запрос для PageAppID / photos с параметрами Post и исходным изображением, и он публикует изображение на стене страницы Facebook как само собой!

[FBRequestConnection startWithGraphPath:[NSString stringWithFormat:@"%@/photos", PageAppID] parameters:params HTTPMethod:@"POST" completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
 }];

Я думаю, что смена activeSession - это то же самое, что смена строк в Facebook.m

надеюсь, что это кому-то поможет сегодня

0 голосов
/ 25 февраля 2012

Извините, если я неправильно понял ваш вопрос. Вы не можете напрямую публиковать сообщения на стене. В API Facebook нет способа добиться этого. Проверьте эту ссылку.

https://developers.facebook.com/docs/reference/api/

и ниже скриншот взят из этой ссылки.enter image description here

0 голосов
/ 21 февраля 2012

Попробуйте опубликовать в PAGE / posts вместо PAGE / photos и добавить к сообщению атрибут изображения. Подключение фотографий для фотографий, созданных администраторами страницы. См. https://developers.facebook.com/docs/reference/api/page/#posts для полного списка атрибутов соединения сообщений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...