#19 串接 API (原本要)仿作IU Instagram頁面— (3)將 JSON 資料轉換成自訂型別顯示
Published in
7 min readMay 14, 2021
這篇本來是要解析 IU 的 instagram 然後做成一個美美的頁面的,
結果 code 剛寫好就發生一個不幸的消息,
串接 IG 的 JSON “https://www.instagram.com/公開帳號的id/?__a=1”
因為不是正式的 API,所以有時不能抓取,
而我也忘記存下原本的 JSON,
所以這篇只有 code,沒有成品……(哭倒)
先把紀錄 JSON 的重要步驟提供給同學們參考:
也可以先把 JSON 存在 asset 裡面備份:
接著就來解析 IG 的 JSON 吧!因為實在是太複雜了看得頭昏腦脹,在網路上翻到 Marso Yu 學長整理的 IG JSON 簡表,非常實用!
於是照著這個原則,做了相關的 swift 檔案:
真的很複雜……😓
拉出各自需要的表格及連結的頁面後,
開始取出 JSON 內的資料:
func fetchItems(){
let urlStr = "https://www.instagram.com/dlwlrma/?__a=1"
if let url = URL(string: urlStr){
URLSession.shared.dataTask(with: url) { data, response, error in
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .secondsSince1970
if let data = data{
do {
let instagramResult = try decoder.decode(InstagramResult.self, from: data)
self.userInfo = instagramResult.graphql.user
self.posts = (self.userInfo?.edge_owner_to_timeline_media.edges)!
DispatchQueue.main.async {
self.collectionView.reloadData()
}
} catch {
print(error)
}
}
}.resume() //一直想到彼得潘上課叮嚀說這個resume()不能忘記...
}
}
注意在取出貼文的圖案的時候,需要再做一次 JSON decoding:
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "\(PhotosCollectionViewCell.self)", for: indexPath) as? PhotosCollectionViewCell else {return UICollectionViewCell()}
let post = posts[indexPath.item]
//fetch Images (PhotoWall)
URLSession.shared.dataTask(with: post.node.display_url) { data, response, error in
if let data = data{
DispatchQueue.main.async {
cell.photoImageView.image = UIImage(data: data)
}
}
}.resume()
return cell
}
IG 上方個人頁面也有一個頭像,這邊也要再取一次 JSON decoding:
override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
guard let reusableView =
collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "\(InstagramCollectionReusableView.self)", for: indexPath) as? InstagramCollectionReusableView else {return UICollectionReusableView()}
//fetch instagram pics 取頭像並做成圓形的圖案
if let postImageurl = userInfo?.profile_pic_url{
URLSession.shared.dataTask(with: postImageurl) { data, url, error in
if let data = data{
do {
DispatchQueue.main.async {
reusableView.logoImageView.layer.cornerRadius = reusableView.logoImageView.frame.size.width/2 reusableView.logoImageView.image = UIImage(data: data)
}
} catch
{print(error)}
}
}.resume()
}
最後就是傳資料到下一頁放大顯示:
@IBSegueAction func showDetail(_ coder: NSCoder) -> detailTableViewController? {
guard let item = collectionView.indexPathsForSelectedItems?.first?.item
else {return nil}
return detailTableViewController(coder: coder, index: item)
}
附上 GitHub 在此:(tag 2.0)
希望早點可以把程式順利跑起來啊嗚嗚~~