
[英]How do you get an image from a “t.co” URL (Twitter specific images) for an iOS app?
[英]How do you get the “images” from a twitter feed to show in an iOS app
我有一个代码可以访问Twitter提要,并将文本放入表格中。 然后,我编辑了代码,以便可以以自定义方式在单独的视图中显示文本,但是我也想从推文中获取图像,尽管搜索了一个多小时,却找不到单个参考。 我已经看到了如何“发布”图像,但是要清楚一点,我需要从相关的推文中获取并“显示”图像。
以下是我处理Twitter Access的代码中的重点内容:
-(void)twitterTimeLine
{
ACAccountStore *account = [[ACAccountStore alloc] init];
ACAccountType *accountType = [account accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
[account requestAccessToAccountsWithType:accountType options:nil completion:^(BOOL granted, NSError *error) {
if (granted == YES)
{
NSArray *arrayOfAccounts = [account accountsWithAccountType:accountType];
if ([arrayOfAccounts count] > 0)
{
ACAccount *twitterAccount = [arrayOfAccounts lastObject]; // last account on list of accounts
NSURL *requestAPI = [NSURL URLWithString:@"https://api.twitter.com/1.1/statuses/user_timeline.json"];
NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init];
[parameters setObject:@"30" forKey:@"count"];
[parameters setObject:@"1" forKey:@"incude_entities"];
SLRequest *posts = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodGET URL:requestAPI parameters:parameters];
posts.account = twitterAccount;
[posts performRequestWithHandler:^(NSData *response, NSHTTPURLResponse *urlResponse, NSError *error) {
if (response)
{
// TODO: might want to check urlResponse.statusCode to stop early
NSError *jsonError; // use new instance here, you don't want to overwrite the error you got from the SLRequest
NSArray *array =[NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&jsonError];
if (array) {
if ([array isKindOfClass:[NSArray class]]) {
self.array = array;
NSLog(@"resulted array: %@",self.array);
}
else {
// This should never happen
NSLog(@"Not an array! %@ - %@", NSStringFromClass([array class]), array);
}
}
else {
// TODO: Handle error in release version, don't just dump out this information
NSLog(@"JSON Error %@", jsonError);
NSString *dataString = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
NSLog(@"Received data: %@", dataString ? dataString : response); // print string representation if response is a string, or print the raw data object
}
}
else {
// TODO: show error information to user if request failed
NSLog(@"request failed %@", error);
}
self.array = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];
if (self.array.count != 0)
{
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData]; // this part loads into table - important!
});
}
}];
}
}
else
{
NSLog(@"%@", [error localizedDescription]);
}
}];
}
这是我显示推文的方式
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellID = @"cellID";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
}
NSDictionary *tweet = _array[indexPath.row];
cell.textLabel.text = tweet[@"text"];
//NSString *element = [myArray objectAtIndex:2];
//NSString *element = myArray[2];
// I created some custom views to show the text, but kept the table for testing purposes
TemplateView *tempView = [viewArray objectAtIndex:testCounter];
tempView.TweetView.text = tweet[@"text"];
// -> this was what I was hoping for // tempView.ContentView.image = tweet[@"image"];
testCounter++;
if (testCounter >= 30)
{
testCounter = 0;
}
return cell;
}
我拿出了我认为需要关注的关键点:
tempView.TweetView.text = tweet[@"text"];
tempView.ContentView.image = tweet[@"image"];
//希望后者能够像第一个一样工作,但是显然不是那么简单
如果可能的话,这可能是不可能的,我如何从“链接”(URL)获取图像并确保它是图像而不是视频或其他网站?
我可以设置一个“单词搜索”来从推文中获取以http开头的文本,并希望从字符串中生成一个URL。
TwitterKit似乎并不公开支持图像。.我也有同样的愚蠢问题。 当使用内置的tableview和数据源时,API在内部保存图像。它需要一个listID和一个Slug。但是,当您希望通过JSON图像时,您就不走运了! 甚至TWTRTweet
对象也没有实体或媒体属性!
不知道谁能开发出如此糟糕的API。无论如何,我撤消了内部进行的服务器调用,发现它发送了其他“未记录”的参数。
例:
TWTRAPIClient *client = [[TWTRAPIClient alloc] init];
NSString *endpoint = @"https://api.twitter.com/1.1/statuses/user_timeline.json";
NSDictionary *params = @{@"screen_name":@"SCREEN_NAME_HERE",
@"count": @"30"};
即使您有@"include_entities" : @"true"
也不会返回MEDIA ..
解:
TWTRAPIClient *client = [[TWTRAPIClient alloc] init];
NSString *endpoint = @"https://api.twitter.com/1.1/statuses/user_timeline.json";
NSDictionary *params = @{@"screen_name":@"SCREEN_NAME_HERE",
@"count": @"30",
@"tweet_mode": @"extended"};
将tweet_mode
设置为extended
( tweet_mode
是未记录的参数)后,它现在将作为响应的一部分返回媒体。这包括“类型”,即图像的“照片”。
我们可以通过应用带有“ include_entities = true”的“ filter = images”查询来获取带有图像的推文。 它将提供有关媒体实体的推文,在其中我们可以看到type =“ photo”和其他相关数据。
例如: https : //api.twitter.com/1.1/search/tweets.json?q=nature&include_entities=true&filter=images
在Twitter开发人员控制台上尝试此查询,并查看响应格式: https : //dev.twitter.com/rest/tools/console
希望这会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.