Instagram Graph API - 快速避免“商业帐户转换前发布的媒体”错误

问题描述

我正在尝试通过 instagram Graph API 从 instagram 获取数据。为此,我使用了一个带有参数 limit 的 url,它返回一个 Json。限制总是大于 1,最多可以达到 12。限制代表您想要获得的最后帖子的数量

此限制必须等于用户在其 Instagram 上发布的帖子数量。如果您要求低于限制,您将无法获得所有帖子。如果结束,则 Json 响应是错误的。

Json 错误

{
   "error": {
      "message": "Invalid parameter","type": "OAuthException","code": 100,"error_data": {
         "blame_field_specs": [
            [
               ""
            ]
         ]
      },"error_subcode": 2108006,"is_transient": false,"error_user_title": "Media Posted Before Business Account Conversion","error_user_msg": "The media was posted before the most recent time that the user's account was converted to a business account from a personal account."
   }
}

到目前为止,我的想法是尝试 12 个 url,计算其中有多少是有效的并返回正确的限制。它一直运行良好,直到最近我发现 API 可能无法在 100% 的情况下返回错误

这是我的代码

//Find url limit
extension GetJson {
    class func findMediaLimit(IgBusinessAccount: String,token: String,Completion block: @escaping ((Int) -> ())) {
        
        let igBId = IgBusinessAccount
        let group = dispatchGroup()
        var mCount: [Int] = []
    
        
        for i in 1...12 {
            
            guard let encodedUrl = self.buildURLAPIGraph(IgBusinessAccount: igBId,token: token,i: i) else { return }
            
            
            group.enter()
            self.cURL(urlT: encodedUrl) { (Json) in
                
                if Json.username != nil {
                    print("\n\nR with \(i):")
                    print(Json.media ?? "no")
                    print("\n\n")
                    print(encodedUrl)
                    print("\n\n")
                    mCount.append(1)
                }
                
                group.leave()
            }
        }
        
        group.notify(queue: .main) {
            print("Media limit: \(mCount.count)")
            block(mCount.count)
        }
    }
}

在这里,我正在测试 Json 是否对 "Json.username != nil" 有效 但我发现即使有错误的限制,它有时也会进入条件,因为 API 有时无法返回错误

因此这不是避免“在企业帐户转换之前发布的媒体”的最佳方法

理想情况下,从 API 了解此限制会很棒,但我认为此功能不存在。否则有人知道我该怎么做吗?

解决方法

我的解决方法:

//Find url limit
extension GetJson {
    class func findMediaLimit(IgBusinessAccount: String,token: String,Completion block: @escaping ((Int) -> ())) {
        
        
        let igBId = IgBusinessAccount
        var mCount: [Int] = []
    
        let group = DispatchGroup()
        
        for i in 1...12 {
            
            //Test 12 urls to find the limit
            guard let encodedUrl = self.buildURLAPIGraph(IgBusinessAccount: igBId,token: token,i: i) else { return }
          
            group.enter()
            
            self.cURL(urlT: encodedUrl) { (Json) in
                
                if Json.username != nil { //means no error returned
                    
                    /*Hack: Api sometimes fail to return an error and returns a json,But the Json media's count is actually the limit to find*/
                    mCount.append(Json.media?.data.count ?? 0)
                }
                
                group.leave()
            }
        }
        
        group.notify(queue: .main) {
            let limit = mCount.max() ?? 0
            
            //print("Media limit: \(mCount.count)") old
            print("Media limit: \(limit)")
            
            block(limit)
        }
    }
}